From b3fe893ee161c98930fb3a2ba6edd467fdc798c8 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 20 Sep 2006 18:24:33 +0000 Subject: [PATCH] 2006-09-20 20:22 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/contrib/rdd_ads/ads1.c ! fixed casting for C++ compilation * harbour/source/compiler/harbour.c ! fixed removing locals frame - bSkipFrame was not initialized * harbour/include/hbapi.h * harbour/source/vm/estack.c * harbour/source/vm/hvm.c * harbour/source/vm/itemapi.c * harbour/source/vm/proc.c * moved current line number information from hb_struSymbol to current stack state to keep 16 bytes size for HB_ITEM on 32bit systems with 4 bytes alignment --- harbour/ChangeLog | 16 ++++++++++++++++ harbour/contrib/rdd_ads/ads1.c | 2 +- harbour/include/hbapi.h | 4 ++-- harbour/source/compiler/harbour.c | 7 +++++-- harbour/source/vm/estack.c | 31 ++++++++++++++++--------------- harbour/source/vm/hvm.c | 25 +++++++++++-------------- harbour/source/vm/itemapi.c | 8 ++++---- harbour/source/vm/proc.c | 4 ++-- 8 files changed, 57 insertions(+), 40 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 99d27f4378..1e5181d05d 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,22 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ + * harbour/include/hbexprop.h + * harbour/source/common/expropt2.c + % Compile-time optimization added for expressions below: + SToD(""), SToD(), HB_SToD(), HB_SToD(""), HB_SToD() + ! Tabs converted to spaces. + + * harbour/source/common/hbdate.c + * harbour/source/rtl/dates.c + * Copyright cosmetic cleanup. + +2006-09-20 21:02 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/vm/codebloc.c + ! fixed detaching locals in variable parameters functions + +2006-09-20 20:22 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/contrib/rdd_ads/ads1.c ! fixed casting for C++ compilation * harbour/source/compiler/harbour.c diff --git a/harbour/contrib/rdd_ads/ads1.c b/harbour/contrib/rdd_ads/ads1.c index fef4e056b6..31dd09292f 100644 --- a/harbour/contrib/rdd_ads/ads1.c +++ b/harbour/contrib/rdd_ads/ads1.c @@ -2508,7 +2508,7 @@ static ERRCODE adsCreate( ADSAREAP pArea, LPDBOPENINFO pCreateInfo ) if( uiFldLen == 0 ) { - uiFldLen = strlen( ucBuffer ); // should have been set by sprintf above. + uiFldLen = strlen( ( char * ) ucBuffer ); // should have been set by sprintf above. } if( uiFldLen >= uiLen ) { diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index b15218f6a8..58a0b89576 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -231,6 +231,7 @@ typedef struct _HB_STACK_STATE ULONG ulPrivateBase; /* memvars base offset of previous func/proc */ USHORT uiClass; /* class when message is sent */ USHORT uiMethod; /* number of class method */ + USHORT uiLineNo; /* current line number */ } HB_STACK_STATE, * PHB_STACK_STATE; /* used to save/restore stack state in hb_vmDo)_ */ @@ -243,8 +244,8 @@ struct hb_struArray struct hb_struBlock { struct _HB_CODEBLOCK * value; - USHORT lineno; USHORT paramcnt; + USHORT lineno; USHORT hclass; USHORT method; }; @@ -321,7 +322,6 @@ struct hb_struSymbol { PHB_SYMB value; PHB_STACK_STATE stackstate; /* function stack state */ - USHORT lineno; USHORT paramcnt; /* number of passed parameters in function call */ USHORT paramdeclcnt; /* number of declared parameters in function definition */ }; diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index 50cbfba00a..6a29d5e2bd 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -3713,8 +3713,11 @@ static void hb_compOptimizeFrames( PFUNCTION pFunc ) pFunc->pCode[ 2 ] = ( BYTE )( pFunc->wParamCount ); bSkipFRAME = FALSE; } - else if( pFunc->pCode[ 0 ] == HB_P_FRAME ) - bSkipFRAME = TRUE; + else + /* Skip LOCALs frame only when function is not declared with + * variable number of parameters (HB_P_VFRAME) + */ + bSkipFRAME = pFunc->pCode[ 0 ] == HB_P_FRAME; if( pFunc->bFlags & FUN_USES_STATICS ) { diff --git a/harbour/source/vm/estack.c b/harbour/source/vm/estack.c index b2eb393bb5..49a6a1eb32 100644 --- a/harbour/source/vm/estack.c +++ b/harbour/source/vm/estack.c @@ -244,14 +244,13 @@ HB_ITEM_PTR hb_stackNewFrame( HB_STACK_STATE * pStack, USHORT uiParams ) pStack->lBaseItem = hb_stack.pBase - hb_stack.pItems; pStack->lStatics = hb_stack.lStatics; pStack->ulPrivateBase = hb_memvarGetPrivatesBase(); - pStack->uiClass = pStack->uiMethod = 0; + pStack->uiClass = pStack->uiMethod = pStack->uiLineNo = 0; pItem->item.asSymbol.stackstate = pStack; - pItem->item.asSymbol.lineno = 0; pItem->item.asSymbol.paramcnt = uiParams; /* set default value of 'paramdeclcnt' - it will be updated * in hb_vmVFrame only - */ + */ pItem->item.asSymbol.paramdeclcnt = uiParams; hb_stack.pBase = pBase; @@ -453,10 +452,10 @@ void hb_stackBaseProcInfo( char * szProcName, USHORT * puiProcLine ) * This function is called by FM module and has to be ready for execution * before stack initialization, [druzus]; */ - if( hb_stack.pPos > hb_stack.pBase ) + if( hb_stack.pPos > hb_stack.pBase && HB_IS_SYMBOL( * hb_stack.pBase ) ) { strcpy( szProcName, ( * hb_stack.pBase )->item.asSymbol.value->szName ); - * puiProcLine = ( * hb_stack.pBase )->item.asSymbol.lineno; + * puiProcLine = ( * hb_stack.pBase )->item.asSymbol.stackstate->uiLineNo; } else { @@ -473,7 +472,9 @@ void hb_stackDispLocal( void ) HB_TRACE(HB_TR_DEBUG, ("hb_stackDispLocal()")); printf( hb_conNewLine() ); - printf( HB_I_("Virtual Machine Stack Dump at %s(%i):"), ( *(hb_stack.pBase) )->item.asSymbol.value->szName, ( *(hb_stack.pBase) )->item.asSymbol.lineno ); + printf( HB_I_("Virtual Machine Stack Dump at %s(%i):"), + ( *hb_stack.pBase )->item.asSymbol.value->szName, + ( *hb_stack.pBase )->item.asSymbol.stackstate->uiLineNo ); printf( hb_conNewLine() ); printf( "--------------------------" ); @@ -552,14 +553,14 @@ void hb_stackDispCall( void ) pBase = hb_stack.pItems + ( *pBase )->item.asSymbol.stackstate->lBaseItem; - if( ( *( pBase + 1 ) )->type == HB_IT_ARRAY ) + if( HB_IS_OBJECT( *( pBase + 1 ) ) ) sprintf( buffer, HB_I_("Called from %s:%s(%i)"), hb_objGetClsName( *(pBase + 1) ), ( *pBase )->item.asSymbol.value->szName, - ( *pBase )->item.asSymbol.lineno ); + ( *pBase )->item.asSymbol.stackstate->uiLineNo ); else sprintf( buffer, HB_I_("Called from %s(%i)"), ( *pBase )->item.asSymbol.value->szName, - ( *pBase )->item.asSymbol.lineno ); + ( *pBase )->item.asSymbol.stackstate->uiLineNo ); hb_conOutErr( buffer, 0 ); hb_conOutErr( hb_conNewLine(), 0 ); @@ -609,14 +610,14 @@ LONG WINAPI hb_UnhandledExceptionFilter( struct _EXCEPTION_POINTERS * ExceptionI { char buffer[ HB_SYMBOL_NAME_LEN + HB_SYMBOL_NAME_LEN + 32 ]; - if( ( *( pBase + 1 ) )->type == HB_IT_ARRAY ) + if( HB_IS_OBJECT( *( pBase + 1 ) ) ) sprintf( buffer, HB_I_("Called from %s:%s(%i)\n"), hb_objGetClsName( *(pBase + 1) ), ( *pBase )->item.asSymbol.value->szName, - ( *pBase )->item.asSymbol.lineno ); + ( *pBase )->item.asSymbol.stackstate->uiLineNo ); else sprintf( buffer, HB_I_("Called from %s(%i)\n"), ( *pBase )->item.asSymbol.value->szName, - ( *pBase )->item.asSymbol.lineno ); + ( *pBase )->item.asSymbol.stackstate->uiLineNo ); strcat( msg, buffer ); @@ -655,14 +656,14 @@ ULONG _System OS2TermHandler(PEXCEPTIONREPORTRECORD p1, do { - if( ( *( pBase + 1 ) )->type == HB_IT_ARRAY ) + if( HB_IS_OBJECT( *( pBase + 1 ) ) ) fprintf( stderr, HB_I_("Called from %s:%s(%i)\n"), hb_objGetClsName( *(pBase + 1) ), ( *pBase )->item.asSymbol.value->szName, - ( *pBase )->item.asSymbol.lineno ); + ( *pBase )->item.asSymbol.stackstate->uiLineNo ); else fprintf( stderr, HB_I_("Called from %s(%i)\n"), ( *pBase )->item.asSymbol.value->szName, - ( *pBase )->item.asSymbol.lineno ); + ( *pBase )->item.asSymbol.stackstate->uiLineNo ); pBase = hb_stack.pItems + ( *pBase )->item.asSymbol.stackstate->lBaseItem; } diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index cdc43223c3..b2bf3d98ae 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -969,11 +969,13 @@ HB_EXPORT void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) case HB_P_LINE: - HB_TRACE(HB_TR_INFO, ("Opcode: HB_P_LINE: %s (%i)", (hb_stackBaseItem())->item.asSymbol.value->szName, (hb_stackBaseItem())->item.asSymbol.lineno)); + HB_TRACE(HB_TR_INFO, ("Opcode: HB_P_LINE: %s (%i)", + hb_stackBaseItem()->item.asSymbol.value->szName, + hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo)); - (hb_stackBaseItem())->item.asSymbol.lineno = HB_PCODE_MKUSHORT( &( pCode[ w + 1 ] ) ); + hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo = HB_PCODE_MKUSHORT( &( pCode[ w + 1 ] ) ); if( s_bDebugging && s_bDebugShowLines ) - hb_vmDebuggerShowLine( (hb_stackBaseItem())->item.asSymbol.lineno ); + hb_vmDebuggerShowLine( hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo ); w += 3; break; @@ -4250,7 +4252,6 @@ static void hb_vmPushObjectVarRef( void ) static HARBOUR hb_vmDoBlock( void ) { PHB_ITEM pBlock; - USHORT uiLine; int iParam; HB_TRACE(HB_TR_DEBUG, ("hb_vmDoBlock()")); @@ -4269,15 +4270,11 @@ static HARBOUR hb_vmDoBlock( void ) /* set the current line number to a line where the codeblock was defined */ - uiLine = hb_stackBaseItem()->item.asSymbol.lineno; - hb_stackBaseItem()->item.asSymbol.lineno = pBlock->item.asBlock.lineno; - hb_stackBaseItem()->item.asSymbol.stackstate->uiClass = pBlock->item.asBlock.hclass; + hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo = pBlock->item.asBlock.lineno; + hb_stackBaseItem()->item.asSymbol.stackstate->uiClass = pBlock->item.asBlock.hclass; hb_stackBaseItem()->item.asSymbol.stackstate->uiMethod = pBlock->item.asBlock.method; hb_codeblockEvaluate( pBlock ); - - /* restore stack pointers */ - hb_stackBaseItem()->item.asSymbol.lineno = uiLine; } /* Evaluates a passed codeblock item with no arguments passed to a codeblock @@ -4855,7 +4852,7 @@ static void hb_vmPushBlock( const BYTE * pCode, PHB_SYMB pSymbols, USHORT usLen pItem->item.asBlock.paramcnt = HB_PCODE_MKUSHORT( pCode ); /* store the line number where the codeblock was defined */ - pItem->item.asBlock.lineno = hb_stackBaseItem()->item.asSymbol.lineno; + pItem->item.asBlock.lineno = hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo; pItem->item.asBlock.hclass = hb_stackBaseItem()->item.asSymbol.stackstate->uiClass; pItem->item.asBlock.method = hb_stackBaseItem()->item.asSymbol.stackstate->uiMethod; } @@ -4886,7 +4883,7 @@ static void hb_vmPushBlockShort( const BYTE * pCode, PHB_SYMB pSymbols, USHORT u pItem->item.asBlock.paramcnt = 0; /* store the line number where the codeblock was defined */ - pItem->item.asBlock.lineno = hb_stackBaseItem()->item.asSymbol.lineno; + pItem->item.asBlock.lineno = hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo; pItem->item.asBlock.hclass = hb_stackBaseItem()->item.asSymbol.stackstate->uiClass; pItem->item.asBlock.method = hb_stackBaseItem()->item.asSymbol.stackstate->uiMethod; } @@ -4915,7 +4912,7 @@ static void hb_vmPushMacroBlock( BYTE * pCode, PHB_SYMB pSymbols ) pItem->item.asBlock.paramcnt = HB_PCODE_MKUSHORT( &( pCode[ 3 ] ) ); /* store the line number where the codeblock was defined */ - pItem->item.asBlock.lineno = hb_stackBaseItem()->item.asSymbol.lineno; + pItem->item.asBlock.lineno = hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo; pItem->item.asBlock.hclass = hb_stackBaseItem()->item.asSymbol.stackstate->uiClass; pItem->item.asBlock.method = hb_stackBaseItem()->item.asSymbol.stackstate->uiMethod; } @@ -6340,7 +6337,7 @@ HB_EXPORT void hb_xvmSetLine( USHORT uiLine ) { HB_TRACE(HB_TR_DEBUG, ("hb_xvmSetLine(%hu)", uiLine)); - hb_stackBaseItem()->item.asSymbol.lineno = uiLine; + hb_stackBaseItem()->item.asSymbol.stackstate->uiLineNo = uiLine; if( s_bDebugging && s_bDebugShowLines ) hb_vmDebuggerShowLine( uiLine ); } diff --git a/harbour/source/vm/itemapi.c b/harbour/source/vm/itemapi.c index 14fa1b87c2..21dc1d2046 100644 --- a/harbour/source/vm/itemapi.c +++ b/harbour/source/vm/itemapi.c @@ -1136,10 +1136,10 @@ HB_EXPORT PHB_ITEM hb_itemPutSymbol( PHB_ITEM pItem, PHB_SYMB pSym ) pItem = hb_itemNew( NULL ); pItem->type = HB_IT_SYMBOL; - pItem->item.asSymbol.value = pSym; - pItem->item.asSymbol.stackstate = NULL; - pItem->item.asSymbol.lineno = 0; - pItem->item.asSymbol.paramcnt = 0; + pItem->item.asSymbol.value = pSym; + pItem->item.asSymbol.stackstate = NULL; + pItem->item.asSymbol.paramcnt = + pItem->item.asSymbol.paramdeclcnt = 0; return pItem; } diff --git a/harbour/source/vm/proc.c b/harbour/source/vm/proc.c index 4aafdc2904..b1a3687e82 100644 --- a/harbour/source/vm/proc.c +++ b/harbour/source/vm/proc.c @@ -96,7 +96,7 @@ HB_FUNC( PROCLINE ) long lOffset = hb_stackBaseProcOffset( hb_parni( 1 ) + 1 ); if( lOffset >= 0 ) - hb_retni( hb_stackItem( lOffset )->item.asSymbol.lineno ); + hb_retni( hb_stackItem( lOffset )->item.asSymbol.stackstate->uiLineNo ); else hb_retni( 0 ); } @@ -248,7 +248,7 @@ BOOL hb_procinfo( int iLevel, char * szName, USHORT * puiLine, char * szFile ) } if( puiLine ) - * puiLine = pBase->item.asSymbol.lineno; + * puiLine = pBase->item.asSymbol.stackstate->uiLineNo; if( szFile ) {