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
This commit is contained in:
Przemyslaw Czerpak
2006-09-20 18:24:33 +00:00
parent b6bed767c0
commit b3fe893ee1
8 changed files with 57 additions and 40 deletions

View File

@@ -8,6 +8,22 @@
2002-12-01 13:30 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
* harbour/include/hbexprop.h
* harbour/source/common/expropt2.c
% Compile-time optimization added for expressions below:
SToD(""), SToD(), HB_SToD(<cDate>), 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

View File

@@ -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 )
{

View File

@@ -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 */
};

View File

@@ -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 )
{

View File

@@ -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;
}

View File

@@ -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 );
}

View File

@@ -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;
}

View File

@@ -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 )
{