See ChangeLog entry 19990520-19:35 EST David G. Holm <dholm@jsd-llc.com>

This commit is contained in:
David G. Holm
1999-05-21 00:41:27 +00:00
parent 935a8d3b4b
commit f34cf412e7
4 changed files with 46 additions and 27 deletions

View File

@@ -1,3 +1,12 @@
19990520-19:35 EST David G. Holm <dholm@jsd-llc.com>
Thanks go to "Victor Szel" <info@szelvesz.hu>
* source/compiler/harbour.l
- Saves number of decimal places in double constants
* source/compiler/harbour.y
- Includes number of decimal places when creating pcode for _PUSHDOUBLE
* source/vm/hvm.c
- Pcode for _PUSHDOUBLE extracts number of decimal places
Thu May 20 16:03:24 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
* source/rtl/dates.c:

View File

@@ -717,25 +717,33 @@ Separator {SpaceTab}|{Comment}|{LineCont}
{InvalidNumber} GenError( ERR_NUMERIC_FORMAT, NULL, NULL );
{Number} { yylval.dNumber = atof( yytext );
if( strchr( yytext, '.' ) )
{Number} { char * ptr;
yylval.dNum.dNumber = atof( yytext );
ptr = strchr( yytext, '.' );
if( ptr )
{
yylval.dNum.bDec = strlen( ptr + 1 );
return DOUBLE;
}
else
{
if( ( double )SHRT_MIN <= yylval.dNumber &&
yylval.dNumber <= ( double )SHRT_MAX )
if( ( double )SHRT_MIN <= yylval.dNum.dNumber &&
yylval.dNum.dNumber <= ( double )SHRT_MAX )
{
yylval.iNumber = ( int ) yylval.dNumber;
yylval.iNumber = ( int ) yylval.dNum.dNumber;
return INTEGER;
}
else if( ( double )LONG_MIN <= yylval.dNumber &&
yylval.dNumber <= ( double )LONG_MAX )
else if( ( double )LONG_MIN <= yylval.dNum.dNumber &&
yylval.dNum.dNumber <= ( double )LONG_MAX )
{
yylval.lNumber = ( long ) yylval.dNumber;
yylval.lNumber = ( long ) yylval.dNum.dNumber;
return INTLONG;
}
else
{
yylval.dNum.bDec = 0;
return DOUBLE;
}
}
}
@@ -755,7 +763,8 @@ Separator {SpaceTab}|{Comment}|{LineCont}
}
else
{
yylval.dNumber = lNumber;
yylval.dNum.dNumber = lNumber;
yylval.dNum.bDec = 0;
return DOUBLE;
}
}

View File

@@ -166,7 +166,7 @@ void Line( void ); /* generates the pcode with the currentl
void LineBody( void ); /* generates the pcode with the currently compiled source code line */
void Message( char * szMsgName ); /* sends a message to an object */
void PopId( char * szVarName ); /* generates the pcode to pop a value from the virtual machine stack onto a variable */
void PushDouble( double fNumber ); /* Pushes a number on the virtual machine stack */
void PushDouble( double fNumber, BYTE bDec ); /* Pushes a number on the virtual machine stack */
void PushId( char * szVarName ); /* generates the pcode to push a variable value to the virtual machine stack */
void PushIdByRef( char * szVarName ); /* generates the pcode to push a variable by reference to the virtual machine stack */
void PushInteger( int iNumber ); /* Pushes a integer number on the virtual machine stack */
@@ -375,7 +375,11 @@ PATHNAMES *_pIncludePath = NULL;
char * string; /* to hold a string returned by lex */
int iNumber; /* to hold a number returned by lex */
long lNumber; /* to hold a long number returned by lex */
double dNumber; /* to hold a double number returned by lex */
struct
{
double dNumber; /* to hold a double number returned by lex */
unsigned char bDec; /* to hold the number of decimal points in the value */
} dNum;
void * pVoid; /* to hold any memory structure we may need */
};
@@ -414,8 +418,8 @@ PATHNAMES *_pIncludePath = NULL;
/*the highest precedence*/
%type <string> IDENTIFIER LITERAL FunStart MethStart IdSend
%type <dNumber> DOUBLE ObjectData
%type <iNumber> ArgList ElemList ExpList FunCall FunScope IncDec Logical Params ParamList
%type <dNum> DOUBLE ObjectData
%type <iNumber> ArgList ElemList ExpList FunCall FunScope IncDec Logical Params ParamList
%type <iNumber> INTEGER BlockExpList Argument IfBegin VarId VarList MethParams ObjFunCall
%type <iNumber> MethCall BlockList FieldList
%type <lNumber> INTLONG WhileBegin BlockBegin
@@ -561,7 +565,7 @@ ObjFunCall : FunCall ':' { Function( $1 ); $$ = $1; }
;
Expression : NIL { PushNil(); }
| DOUBLE { PushDouble( $1 ); }
| DOUBLE { PushDouble( $1.dNumber,$1.bDec ); }
| INTEGER { PushInteger( $1 ); }
| INTLONG { PushLong( $1 ); }
| LITERAL { PushString( $1 ); }
@@ -2213,11 +2217,12 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
int i;
++lPCodePos;
fprintf( yyc, " _PUSHDOUBLE, " );
for( i = 0; i < sizeof( double ); ++i )
for( i = 0; i < sizeof( double ) + sizeof( BYTE ); ++i )
fprintf( yyc, "%i, ", ( ( BYTE * ) pFunc->pCode )[ lPCodePos + i ] );
fprintf( yyc, "/* %f */\n",
fprintf( yyc, "/* %.*f, %d */\n",
*( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) ] ) ),
*( ( double * ) &( pFunc->pCode[ lPCodePos ] ) ) );
lPCodePos += sizeof( double );
lPCodePos += sizeof( double ) + sizeof( BYTE );
}
break;
@@ -2909,15 +2914,11 @@ void PushNil( void )
}
/* generates the pcode to push a double number on the virtual machine stack */
void PushDouble( double dNumber )
void PushDouble( double dNumber, BYTE bDec )
{
if( dNumber )
{
GenPCode1( _PUSHDOUBLE );
GenPCodeN( ( BYTE * ) &dNumber, sizeof( double ) );
}
else
GenPCode1( _ZERO );
GenPCode1( _PUSHDOUBLE );
GenPCodeN( ( BYTE * ) &dNumber, sizeof( double ) );
GenPCode1( bDec );
}
/* generates the pcode to push a integer number on the virtual machine stack */

View File

@@ -469,8 +469,8 @@ void VirtualMachine( PBYTE pCode, PSYMBOL pSymbols )
break;
case _PUSHDOUBLE:
PushDouble( * ( double * ) ( &pCode[ w + 1 ] ), hb_set.HB_SET_DECIMALS );
w += 1 + sizeof( double );
PushDouble( * ( double * ) ( &pCode[ w + 1 ] ), ( WORD ) * ( BYTE * ) &pCode[ w + 1 + sizeof( double ) ] );
w += 1 + sizeof( double ) + 1;
break;
case _PUSHINT: