From 83ffb5a4bb7c773ed65c7aac2f1c8c5e9e1c1dae Mon Sep 17 00:00:00 2001 From: Ryszard Glab Date: Sun, 14 Jan 2001 14:11:28 +0000 Subject: [PATCH] ChangeLog 2001-01-14 15:15 UTC+0100 --- harbour/ChangeLog | 11 +++++++++++ harbour/include/hbapi.h | 3 ++- harbour/source/vm/codebloc.c | 6 ++---- harbour/source/vm/hvm.c | 11 ++++++++++- harbour/source/vm/itemapi.c | 4 +--- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index dffc92469b..7f14659011 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,14 @@ +2001-01-14 15:15 UTC+0100 Ryszard Glab + + *include/hbapi.h + *modified union in 'asRefer' structure + + *source/vm/codebloc.c + *source/vm/hvm.c + *source/vm/itemapi.c + *fixed support for detached local variables passed by + the reference + 2001-01-13 02:25 UTC-0800 Ron Pinkas * source/compiler/genc.c * source/compiler/harbour.c diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index ecf291e52d..54371ad8ce 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -168,6 +168,7 @@ struct hb_struPointer struct hb_struRefer { union { + struct _HB_CODEBLOCK * block; /* codeblock */ struct _HB_ITEM ** itemsbase; /* static variables */ struct _HB_ITEM ** *itemsbasePtr; /* local variables */ } BasePtr; @@ -420,7 +421,7 @@ extern HB_CODEBLOCK_PTR hb_codeblockNew( BYTE * pBuffer, USHORT uiLocals, USHORT extern HB_CODEBLOCK_PTR hb_codeblockMacroNew( BYTE * pBuffer, USHORT usLen ); extern void hb_codeblockDelete( HB_ITEM_PTR pItem ); /* delete a codeblock */ extern PHB_ITEM hb_codeblockGetVar( PHB_ITEM pItem, LONG iItemPos ); /* get local variable referenced in a codeblock */ -extern PHB_ITEM hb_codeblockGetRef( PHB_ITEM pItem, PHB_ITEM pRefer ); /* get local variable passed by reference */ +extern PHB_ITEM hb_codeblockGetRef( HB_CODEBLOCK_PTR pCBlock, PHB_ITEM pRefer ); /* get local variable passed by reference */ extern void hb_codeblockEvaluate( HB_ITEM_PTR pItem ); /* evaluate a codeblock */ /* memvars subsystem */ diff --git a/harbour/source/vm/codebloc.c b/harbour/source/vm/codebloc.c index 8327d3c150..5fe95ad0e4 100644 --- a/harbour/source/vm/codebloc.c +++ b/harbour/source/vm/codebloc.c @@ -302,11 +302,9 @@ PHB_ITEM hb_codeblockGetVar( PHB_ITEM pItem, LONG iItemPos ) /* Get local variable passed by reference */ -PHB_ITEM hb_codeblockGetRef( PHB_ITEM pItem, PHB_ITEM pRefer ) +PHB_ITEM hb_codeblockGetRef( HB_CODEBLOCK_PTR pCBlock, PHB_ITEM pRefer ) { - HB_CODEBLOCK_PTR pCBlock = pItem->item.asBlock.value; - - HB_TRACE(HB_TR_DEBUG, ("hb_codeblockGetRef(%p, %p)", pItem, pRefer)); + HB_TRACE(HB_TR_DEBUG, ("hb_codeblockGetRef(%p, %p)", pCBlock, pRefer)); return pCBlock->pLocals - pRefer->item.asRefer.value; } diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 6f9eefb541..ca2d7b0976 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -3516,7 +3516,16 @@ static void hb_vmPushLocalByRef( SHORT iLocal ) /* we store its stack offset instead of a pointer to support a dynamic stack */ pTop->item.asRefer.value = iLocal; pTop->item.asRefer.offset = hb_stackBaseOffset(); - pTop->item.asRefer.BasePtr.itemsbasePtr = &hb_stack.pItems; + if( iLocal >= 0 ) + pTop->item.asRefer.BasePtr.itemsbasePtr = &hb_stack.pItems; + else + { + /* store direct codeblock address because an item where a codeblock + * is stored can be no longer placed on the eval stack at the time + * of a codeblock evaluation or variable access + */ + pTop->item.asRefer.BasePtr.block = (hb_stackSelfItem())->item.asBlock.value; + } hb_stackPush(); } diff --git a/harbour/source/vm/itemapi.c b/harbour/source/vm/itemapi.c index 3b7b9a6c70..7979b7548a 100644 --- a/harbour/source/vm/itemapi.c +++ b/harbour/source/vm/itemapi.c @@ -1143,9 +1143,7 @@ PHB_ITEM hb_itemUnRef( PHB_ITEM pItem ) { /* local variable referenced in a codeblock */ - HB_ITEM_PTR *pLocal; - pLocal = *( pItem->item.asRefer.BasePtr.itemsbasePtr ) + pItem->item.asRefer.offset; - pItem = hb_codeblockGetRef( *pLocal, pItem ); + pItem = hb_codeblockGetRef( pItem->item.asRefer.BasePtr.block, pItem ); } } }