diff --git a/harbour/ChangeLog b/harbour/ChangeLog index f98af6167c..74ba697bdb 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,17 @@ +20000502-01:14 GMT+1 Victor Szakats + + * include/hbcomp.h + * include/hbexprb.c + * include/hbmacro.h + * source/compiler/genc.c + * source/compiler/harbour.c + * source/compiler/hbpcode.c + * source/vm/hvm.c + * source/vm/macro.c + + Added width info to the PUSHDOUBLE pcode, to be Clipper compatible. + Note that the width is not yet calculated at compiled time, but the + possibility is already there. + 20000501-23:25 GMT+1 Victor Szakats * include/Makefile diff --git a/harbour/include/hbcomp.h b/harbour/include/hbcomp.h index 35ff0a2136..bcb452652a 100644 --- a/harbour/include/hbcomp.h +++ b/harbour/include/hbcomp.h @@ -229,7 +229,7 @@ extern void hb_compLinePushIfInside( void ); /* generates the pcode with the c extern void hb_compGenMessage( char * szMsgName ); /* sends a message to an object */ extern void hb_compGenMessageData( char * szMsg ); /* generates an underscore-symbol name for a data assignment */ extern void hb_compGenPopVar( char * szVarName ); /* generates the pcode to pop a value from the virtual machine stack onto a variable */ -extern void hb_compGenPushDouble( double fNumber, BYTE bDec ); /* Pushes a number on the virtual machine stack */ +extern void hb_compGenPushDouble( double dNumber, BYTE bWidth, BYTE bDec ); /* Pushes a number on the virtual machine stack */ extern void hb_compGenPushFunCall( char * ); /* generates the pcode to push function's call */ extern void hb_compGenPushVar( char * szVarName ); /* generates the pcode to push a variable value to the virtual machine stack */ extern void hb_compGenPushVarRef( char * szVarName ); /* generates the pcode to push a variable by reference to the virtual machine stack */ diff --git a/harbour/include/hbexprb.c b/harbour/include/hbexprb.c index 6baa822ac3..d73a79d69b 100644 --- a/harbour/include/hbexprb.c +++ b/harbour/include/hbexprb.c @@ -278,7 +278,7 @@ static HB_EXPR_FUNC( hb_compExprUseNumeric ) break; case HB_EA_PUSH_PCODE: if( pSelf->value.asNum.NumType == HB_ET_DOUBLE ) - HB_EXPR_PCODE2( hb_compGenPushDouble, pSelf->value.asNum.dVal, pSelf->value.asNum.bDec ); + HB_EXPR_PCODE3( hb_compGenPushDouble, pSelf->value.asNum.dVal, -1, pSelf->value.asNum.bDec ); else HB_EXPR_PCODE1( hb_compGenPushLong, pSelf->value.asNum.lVal ); break; diff --git a/harbour/include/hbmacro.h b/harbour/include/hbmacro.h index 5676e4b93b..2f9049ac60 100644 --- a/harbour/include/hbmacro.h +++ b/harbour/include/hbmacro.h @@ -126,7 +126,7 @@ extern void hb_compGenPushAliasedVar( char * szVarName, char * szAlias, long lWorkarea, HB_MACRO_DECL ); extern void hb_compGenPushLogical( int iTrueFalse, HB_MACRO_DECL ); -extern void hb_compGenPushDouble( double dNumber, BYTE bDec, HB_MACRO_DECL ); +extern void hb_compGenPushDouble( double dNumber, BYTE bWidth, BYTE bDec, HB_MACRO_DECL ); extern void hb_compGenPushFunCall( char * szFunName, HB_MACRO_DECL ); extern void hb_compGenPushString( char * szText, ULONG ulStrLen, HB_MACRO_DECL ); extern void hb_compCodeBlockStart( HB_MACRO_DECL ); diff --git a/harbour/source/compiler/genc.c b/harbour/source/compiler/genc.c index f472fb8cc4..9e5f5afc69 100644 --- a/harbour/source/compiler/genc.c +++ b/harbour/source/compiler/genc.c @@ -1117,17 +1117,18 @@ static HB_GENC_FUNC( hb_p_pushdouble ) { int i; - fprintf( cargo->yyc, "\tHB_P_PUSHDOUBLE, " ); + fprintf( cargo->yyc, "\tHB_P_PUSHDOUBLE," ); ++lPCodePos; - for( i = 0; i < sizeof( double ) + sizeof( BYTE ); ++i ) - fprintf( cargo->yyc, "%i,", ( ( BYTE * ) pFunc->pCode )[ lPCodePos + i ] ); - if( cargo->bVerbose ) fprintf( cargo->yyc, "\t/* %.*f, %d */", + for( i = 0; i < sizeof( double ) + sizeof( BYTE ) + sizeof( BYTE ); ++i ) + fprintf( cargo->yyc, " %i,", ( ( BYTE * ) pFunc->pCode )[ lPCodePos + i ] ); + if( cargo->bVerbose ) fprintf( cargo->yyc, "\t/* %.*f, %d, %d */", *( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) ] ) ), *( ( double * ) &( pFunc->pCode[ lPCodePos ] ) ), - *( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) ] ) ) ); + *( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) ] ) ), + *( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) + sizeof( BYTE ) ] ) ) ); fprintf( cargo->yyc, "\n" ); - return sizeof( double ) + sizeof( BYTE ) + 1; + return sizeof( double ) + sizeof( BYTE ) + sizeof( BYTE ) + 1; } static HB_GENC_FUNC( hb_p_pushfield ) diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index 349bfee2f2..a3363d9a60 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -2270,17 +2270,18 @@ void hb_compGenPushNil( void ) } /* generates the pcode to push a double number on the virtual machine stack */ -void hb_compGenPushDouble( double dNumber, BYTE bDec ) +void hb_compGenPushDouble( double dNumber, BYTE bWidth, BYTE bDec ) { - BYTE pBuffer[ sizeof( double ) + 2 ]; + BYTE pBuffer[ sizeof( double ) + sizeof( BYTE ) + sizeof( BYTE ) ]; - pBuffer[0] = HB_P_PUSHDOUBLE; + pBuffer[ 0 ] = HB_P_PUSHDOUBLE; - memcpy( ( BYTE * )&(pBuffer[1]), ( BYTE * ) &dNumber, sizeof( double ) ); + memcpy( ( BYTE * ) &( pBuffer[ 1 ] ), ( BYTE * ) &dNumber, sizeof( double ) ); - pBuffer[ sizeof( double ) + 1 ] = bDec; + pBuffer[ 1 + sizeof( double ) ] = bWidth; + pBuffer[ 1 + sizeof( double ) + sizeof( BYTE ) ] = bDec; - hb_compGenPCodeN( pBuffer, sizeof( double ) + 2, 1 ); + hb_compGenPCodeN( pBuffer, 1 + sizeof( double ) + sizeof( BYTE ) + sizeof( BYTE ), 1 ); } void hb_compGenPushFunCall( char * szFunName ) diff --git a/harbour/source/compiler/hbpcode.c b/harbour/source/compiler/hbpcode.c index a75709860d..a58e3c2c02 100644 --- a/harbour/source/compiler/hbpcode.c +++ b/harbour/source/compiler/hbpcode.c @@ -144,11 +144,11 @@ static BYTE s_pcode_len[] = { 3, /* HB_P_PUSHLOCAL, */ 2, /* HB_P_PUSHLOCALNEAR, */ 3, /* HB_P_PUSHLOCALREF, */ - 1+sizeof(long), /* HB_P_PUSHLONG, */ + 1 + sizeof( long ), /* HB_P_PUSHLONG, */ 3, /* HB_P_PUSHMEMVAR, */ 3, /* HB_P_PUSHMEMVARREF, */ 1, /* HB_P_PUSHNIL, */ - 2+sizeof(double), /* HB_P_PUSHDOUBLE, */ + 1 + sizeof( double ) + sizeof( BYTE ) + sizeof( BYTE ), /* HB_P_PUSHDOUBLE, */ 1, /* HB_P_PUSHSELF, */ 3, /* HB_P_PUSHSTATIC, */ 3, /* HB_P_PUSHSTATICREF, */ diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 51109b06a8..a06b375d75 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -897,8 +897,10 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols ) break; case HB_P_PUSHDOUBLE: - hb_vmPushDoubleConst( * ( double * ) ( &pCode[ w + 1 ] ), -1, ( int ) * ( BYTE * ) &pCode[ w + 1 + sizeof( double ) ] ); - w += 1 + sizeof( double ) + 1; + hb_vmPushDoubleConst( * ( double * ) ( &pCode[ w + 1 ] ), + ( int ) * ( BYTE * ) &pCode[ w + 1 + sizeof( double ) ], + ( int ) * ( BYTE * ) &pCode[ w + 1 + sizeof( double ) + sizeof( BYTE ) ] ); + w += 1 + sizeof( double ) + sizeof( BYTE ) + sizeof( BYTE ); break; case HB_P_PUSHSTR: @@ -3102,17 +3104,18 @@ static void hb_vmPushDoubleConst( double dNumber, int iWidth, int iDec ) if( dNumber >= 1000000000.0 ) { - /* TODO: The width calculation should be made at compile time, and the - info should be stored in the code. Thus this huge ugly and slow - hack can be replaced. [vszakats] */ - - HB_SYMBOL_UNUSED( iWidth ); + /* NOTE: If the width info is not provided by the pcode stream, + it will be determined at runtime with a relatively slow + method. [vszakats] */ + if( iWidth == -1 ) { char buffer[ 360 ]; sprintf( buffer, "%.*f", 0, dNumber ); hb_stack.pPos->item.asDouble.length = strlen( buffer ) + 1; } + else + hb_stack.pPos->item.asDouble.length = iWidth; if( iDec ) hb_stack.pPos->item.asDouble.length--; diff --git a/harbour/source/vm/macro.c b/harbour/source/vm/macro.c index 1f04c32c94..9ab0ba677e 100644 --- a/harbour/source/vm/macro.c +++ b/harbour/source/vm/macro.c @@ -1094,10 +1094,11 @@ void hb_compGenPushLogical( int iTrueFalse, HB_MACRO_DECL ) } /* generates the pcode to push a double number on the virtual machine stack */ -void hb_compGenPushDouble( double dNumber, BYTE bDec, HB_MACRO_DECL ) +void hb_compGenPushDouble( double dNumber, BYTE bWidth, BYTE bDec, HB_MACRO_DECL ) { hb_compGenPCode1( HB_P_PUSHDOUBLE, HB_MACRO_PARAM ); hb_compGenPCodeN( ( BYTE * ) &dNumber, sizeof( double ), HB_MACRO_PARAM ); + hb_compGenPCode1( bWidth, HB_MACRO_PARAM ); hb_compGenPCode1( bDec, HB_MACRO_PARAM ); }