20000425-03:38 GMT+1 Victor Szakats <info@szelvesz.hu>

This commit is contained in:
Viktor Szakats
2000-04-25 01:38:22 +00:00
parent b5049ddb98
commit 94ffc45414
11 changed files with 233 additions and 220 deletions

View File

@@ -1,3 +1,17 @@
20000425-03:38 GMT+1 Victor Szakats <info@szelvesz.hu>
* include/hbpcode.h
* source/compiler/hbpcode.c
* source/compiler/harbour.c
* source/compiler/genc.c
* source/vm/hvm.c
* Some pcode names changed
JUMPSHORT->JUMPNEAR
JUMPNEAR* -> JUMP*NEAR
JUMPFAR* -> JUMP*FAR
(so that the size specifier is a postfix)
% Some minor formatting and optimization in HVM.C
20000425-03:20 GMT+1 Victor Szakats <info@szelvesz.hu>
* source/compiler/hbusage.c

View File

@@ -77,7 +77,7 @@ LDFLAGS = $(LDFLAGS)
# Macros to access our library names
#
TOOLS_LIB = $(LIB_DIR)\tools.lib
TOOLS_LIB = $(LIB_DIR)\libmisc.lib
HARBOUR_EXE = $(BIN_DIR)\harbour.exe

View File

@@ -76,7 +76,7 @@ LDFLAGS = $(LDFLAGS)
# Macros to access our library names
#
TOOLS_LIB = $(LIB_DIR)\misc.lib
TOOLS_LIB = $(LIB_DIR)\libmisc.lib
HARBOUR_EXE = $(BIN_DIR)\harbour.exe

View File

@@ -69,15 +69,15 @@ typedef enum
HB_P_DUPLTWO, /* places a copy of the latest two virtual machine stack value on to the stack */
HB_P_INC, /* increments the latest value on the virtual machine stack */
HB_P_INSTRING, /* checks if the second latest value on the stack is a substring of the latest one */
HB_P_JUMPSHORT, /* jumps to a relative offset 1 Byte */
HB_P_JUMPNEAR, /* jumps to a relative offset 1 Byte */
HB_P_JUMP, /* jumps to a relative offset 2 Bytes */
HB_P_JUMPFAR, /* jumps to a relative offset 3 Bytes */
HB_P_JUMPSHORTFALSE, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPFALSENEAR, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPFALSE, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPFARFALSE, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPSHORTTRUE, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPFALSEFAR, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPTRUENEAR, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPTRUE, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPFARTRUE, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_JUMPTRUEFAR, /* checks a logic expression of the stack and jumps to a relative offset */
HB_P_LESSEQUAL, /* checks if the second latest value on the stack is less equal that the latest one, leaves the result only */
HB_P_LESS, /* checks if the second latest value on the stack is less that the lastest one */
HB_P_LINE, /* currently compiled source code line number */
@@ -159,8 +159,8 @@ typedef enum
HB_P_TRUE, /* pushes true on the virtual machine stack */
HB_P_ZERO, /* places a ZERO on the virtual machine stack */
HB_P_ONE, /* places a ONE on the virtual machine stack */
/*NOTE: * This have to be the last definition */
HB_P_LAST_PCODE /* this defines the number of defined pcodes */
/* NOTE: This have to be the last definition */
HB_P_LAST_PCODE /* this defines the number of defined pcodes */
} HB_PCODE;
#endif /* HB_PCODE_H_ */

View File

@@ -32,6 +32,7 @@
* their web site at http://www.gnu.org/).
*
*/
#include <assert.h>
#include "hbcomp.h"
@@ -42,16 +43,14 @@ static void hb_compGenCCompact( PFUNCTION pFunc, FILE * yyc );
/* helper structure to pass information */
typedef struct HB_stru_genc_info
{
FILE *yyc;
FILE * yyc;
BOOL bVerbose;
USHORT iNestedCodeblock;
}
HB_GENC_INFO, *HB_GENC_INFO_PTR;
} HB_GENC_INFO, * HB_GENC_INFO_PTR;
#define HB_GENC_FUNC( func ) HB_PCODE_FUNC( func, HB_GENC_INFO_PTR )
typedef HB_GENC_FUNC( HB_GENC_FUNC_ );
typedef HB_GENC_FUNC_ *HB_GENC_FUNC_PTR;
typedef HB_GENC_FUNC( HB_GENC_FUNC_ );
typedef HB_GENC_FUNC_ * HB_GENC_FUNC_PTR;
void hb_compGenCCode( PHB_FNAME pFileName ) /* generates the C language output */
{
@@ -467,9 +466,9 @@ static HB_GENC_FUNC( hb_p_instring )
return 1;
}
static HB_GENC_FUNC( hb_p_jumpshort )
static HB_GENC_FUNC( hb_p_jumpnear )
{
fprintf( cargo->yyc, "\tHB_P_JUMPSHORT, %i,",
fprintf( cargo->yyc, "\tHB_P_JUMPNEAR, %i,",
pFunc->pCode[ lPCodePos + 1 ] );
if( cargo->bVerbose )
{
@@ -520,9 +519,9 @@ static HB_GENC_FUNC( hb_p_jumpfar )
return 4;
}
static HB_GENC_FUNC( hb_p_jumpshortfalse )
static HB_GENC_FUNC( hb_p_jumpfalsenear )
{
fprintf( cargo->yyc, "\tHB_P_JUMPSHORTFALSE, %i,",
fprintf( cargo->yyc, "\tHB_P_JUMPFALSENEAR, %i,",
pFunc->pCode[ lPCodePos + 1 ] );
if( cargo->bVerbose )
{
@@ -555,9 +554,9 @@ static HB_GENC_FUNC( hb_p_jumpfalse )
return 3;
}
static HB_GENC_FUNC( hb_p_jumpfarfalse )
static HB_GENC_FUNC( hb_p_jumpfalsefar )
{
fprintf( cargo->yyc, "\tHB_P_JUMPFARFALSE, %i, %i, %i,",
fprintf( cargo->yyc, "\tHB_P_JUMPFALSEFAR, %i, %i, %i,",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pFunc->pCode[ lPCodePos + 3 ] );
@@ -573,9 +572,9 @@ static HB_GENC_FUNC( hb_p_jumpfarfalse )
return 4;
}
static HB_GENC_FUNC( hb_p_jumpshorttrue )
static HB_GENC_FUNC( hb_p_jumptruenear )
{
fprintf( cargo->yyc, "\tHB_P_JUMPSHORTTRUE, %i,",
fprintf( cargo->yyc, "\tHB_P_JUMPTRUENEAR, %i,",
pFunc->pCode[ lPCodePos + 1 ] );
if( cargo->bVerbose )
{
@@ -606,9 +605,9 @@ static HB_GENC_FUNC( hb_p_jumptrue )
return 3;
}
static HB_GENC_FUNC( hb_p_jumpfartrue )
static HB_GENC_FUNC( hb_p_jumptruefar )
{
fprintf( cargo->yyc, "\tHB_P_JUMPFARTRUE, %i, %i, %i,",
fprintf( cargo->yyc, "\tHB_P_JUMPTRUEFAR, %i, %i, %i,",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pFunc->pCode[ lPCodePos + 3 ] );
@@ -906,8 +905,8 @@ static HB_GENC_FUNC( hb_p_poplocal )
{
SHORT wVar = * ( ( SHORT * ) &( pFunc->pCode )[ lPCodePos + 1 ] );
/* Variable with negative order are local variables
* referenced in a codeblock -handle it with care
*/
* referenced in a codeblock -handle it with care
*/
if( cargo->iNestedCodeblock )
{
@@ -1140,8 +1139,8 @@ static HB_GENC_FUNC( hb_p_pushlocal )
{
SHORT wVar = * ( ( SHORT * ) &( pFunc->pCode )[ lPCodePos + 1 ] );
/* Variable with negative order are local variables
* referenced in a codeblock -handle it with care
*/
* referenced in a codeblock -handle it with care
*/
if( cargo->iNestedCodeblock )
{
@@ -1195,8 +1194,8 @@ static HB_GENC_FUNC( hb_p_pushlocalref )
{
SHORT wVar = * ( ( SHORT * ) &( pFunc->pCode )[ lPCodePos + 1 ] );
/* Variable with negative order are local variables
* referenced in a codeblock -handle it with care
*/
* referenced in a codeblock -handle it with care
*/
if( cargo->iNestedCodeblock )
{
@@ -1461,7 +1460,7 @@ static HB_GENC_FUNC( hb_p_seqrecover )
return 1;
}
static HB_GENC_FUNC( hb_p_sframe )
static HB_GENC_FUNC( hb_p_sframe )
{
fprintf( cargo->yyc, "\tHB_P_SFRAME, %i, %i,",
pFunc->pCode[ lPCodePos + 1 ],
@@ -1565,15 +1564,15 @@ static HB_GENC_FUNC_PTR s_verbose_table[] = {
hb_p_dupltwo,
hb_p_inc,
hb_p_instring,
hb_p_jumpshort,
hb_p_jumpnear,
hb_p_jump,
hb_p_jumpfar,
hb_p_jumpshortfalse,
hb_p_jumpfalsenear,
hb_p_jumpfalse,
hb_p_jumpfarfalse,
hb_p_jumpshorttrue,
hb_p_jumpfalsefar,
hb_p_jumptruenear,
hb_p_jumptrue,
hb_p_jumpfartrue,
hb_p_jumptruefar,
hb_p_lessequal,
hb_p_less,
hb_p_line,
@@ -1662,13 +1661,13 @@ static void hb_compGenCReadable( PFUNCTION pFunc, FILE * yyc )
HB_GENC_INFO genc_info;
/* Make sure that table is correct */
assert( HB_P_LAST_PCODE == sizeof(s_verbose_table)/sizeof(HB_GENC_FUNC_PTR) );
assert( HB_P_LAST_PCODE == sizeof( s_verbose_table ) / sizeof( HB_GENC_FUNC_PTR ) );
genc_info.iNestedCodeblock = 0;
genc_info.bVerbose = ( hb_comp_iGenCOutput == HB_COMPGENC_VERBOSE );
genc_info.yyc = yyc;
hb_compPCodeEval( pFunc, (HB_PCODE_FUNC_PTR *)s_verbose_table, (void *)&genc_info );
hb_compPCodeEval( pFunc, ( HB_PCODE_FUNC_PTR * ) s_verbose_table, ( void * ) &genc_info );
if( genc_info.bVerbose )
fprintf( yyc, "/* %05li */\n", pFunc->lPCodePos );

View File

@@ -1335,7 +1335,7 @@ ULONG hb_compGenJump( LONG lOffset )
}
else if( lOffset >= -128 && lOffset <= 127 )
{
hb_compGenPCode3( HB_P_JUMPSHORT, HB_LOBYTE( lOffset ), HB_P_NOOP );
hb_compGenPCode3( HB_P_JUMPNEAR, HB_LOBYTE( lOffset ), HB_P_NOOP );
hb_compGenPCode1( HB_P_NOOP );
}
else if( lOffset >= SHRT_MIN && lOffset <= SHRT_MAX )
@@ -1363,12 +1363,12 @@ ULONG hb_compGenJumpFalse( LONG lOffset )
/* Just a place holder, it might be a far jump...*/
if( lOffset == 0 )
{
hb_compGenPCode3( HB_P_JUMPFARFALSE, 0, 0 );
hb_compGenPCode3( HB_P_JUMPFALSEFAR, 0, 0 );
hb_compGenPCode1( 0 );
}
else if( lOffset >= -128 && lOffset <= 127 )
{
hb_compGenPCode3( HB_P_JUMPSHORTFALSE, HB_LOBYTE( lOffset ), HB_P_NOOP );
hb_compGenPCode3( HB_P_JUMPFALSENEAR, HB_LOBYTE( lOffset ), HB_P_NOOP );
hb_compGenPCode1( HB_P_NOOP );
}
else if( lOffset >= SHRT_MIN && lOffset <= SHRT_MAX )
@@ -1378,7 +1378,7 @@ ULONG hb_compGenJumpFalse( LONG lOffset )
}
else if( lOffset >= (-8388608L) && lOffset <= 8388607L )
{
hb_compGenPCode3( HB_P_JUMPFARFALSE, HB_LOBYTE( lOffset ), HB_HIBYTE( lOffset ) );
hb_compGenPCode3( HB_P_JUMPFALSEFAR, HB_LOBYTE( lOffset ), HB_HIBYTE( lOffset ) );
hb_compGenPCode1( ( BYTE ) ( ( ( USHORT ) ( lOffset ) >> 16 ) & 0xFF ) );
}
else
@@ -1396,12 +1396,12 @@ ULONG hb_compGenJumpTrue( LONG lOffset )
/* Just a place holder, it might be a far jump...*/
if( lOffset == 0 )
{
hb_compGenPCode3( HB_P_JUMPFARTRUE, 0, 0 );
hb_compGenPCode3( HB_P_JUMPTRUEFAR, 0, 0 );
hb_compGenPCode1( 0 );
}
else if( lOffset >= -128 && lOffset <= 127 )
{
hb_compGenPCode3( HB_P_JUMPSHORTTRUE, HB_LOBYTE( lOffset ), HB_P_NOOP );
hb_compGenPCode3( HB_P_JUMPTRUENEAR, HB_LOBYTE( lOffset ), HB_P_NOOP );
hb_compGenPCode1( HB_P_NOOP );
}
else if( lOffset >= SHRT_MIN && lOffset <= SHRT_MAX )
@@ -1411,7 +1411,7 @@ ULONG hb_compGenJumpTrue( LONG lOffset )
}
else if( lOffset >= (-8388608L) && lOffset <= 8388607L )
{
hb_compGenPCode3( HB_P_JUMPFARTRUE, HB_LOBYTE( lOffset ), HB_HIBYTE( lOffset ) );
hb_compGenPCode3( HB_P_JUMPTRUEFAR, HB_LOBYTE( lOffset ), HB_HIBYTE( lOffset ) );
hb_compGenPCode1( ( BYTE ) ( ( ( USHORT ) ( lOffset ) >> 16 ) & 0xFF ) );
}
else
@@ -1435,48 +1435,48 @@ void hb_compGenJumpThere( ULONG ulFrom, ULONG ulTo )
switch( pCode[ ( ULONG ) ( ulFrom - 1 ) ] )
{
/*
case HB_P_JUMPSHORT :
case HB_P_JUMPNEAR :
break;
case HB_P_JUMPSHORTTRUE :
case HB_P_JUMPTRUENEAR :
break;
case HB_P_JUMPSHORTFALSE :
case HB_P_JUMPFALSENEAR :
break;
case HB_P_JUMP :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPSHORT;
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPNEAR;
pCode[ ( ULONG ) ( ulFrom + 1 ) ] = HB_P_NOOP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPTRUE :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPSHORTTRUE;
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPTRUENEAR;
pCode[ ( ULONG ) ( ulFrom + 1 ) ] = HB_P_NOOP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPFALSE :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPSHORTFALSE;
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPFALSENEAR;
pCode[ ( ULONG ) ( ulFrom + 1 ) ] = HB_P_NOOP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
*/
case HB_P_JUMPFAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPSHORT;
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPNEAR;
pCode[ ( ULONG ) ( ulFrom + 1 ) ] = HB_P_NOOP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPFARTRUE :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPSHORTTRUE;
case HB_P_JUMPTRUEFAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPTRUENEAR;
pCode[ ( ULONG ) ( ulFrom + 1 ) ] = HB_P_NOOP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPFARFALSE :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPSHORTFALSE;
case HB_P_JUMPFALSEFAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPFALSENEAR;
pCode[ ( ULONG ) ( ulFrom + 1 ) ] = HB_P_NOOP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
@@ -1539,17 +1539,17 @@ void hb_compGenJumpThere( ULONG ulFrom, ULONG ulTo )
switch( pCode[ ( ULONG ) ( ulFrom - 1 ) ] )
{
/*
case HB_P_JUMPSHORT :
case HB_P_JUMPNEAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMP;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPSHORTTRUE :
case HB_P_JUMPTRUENEAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPTRUE;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPSHORTFALSE :
case HB_P_JUMPFALSENEAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPFALSE;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
@@ -1569,12 +1569,12 @@ void hb_compGenJumpThere( ULONG ulFrom, ULONG ulTo )
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPFARTRUE :
case HB_P_JUMPTRUEFAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPTRUE;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
case HB_P_JUMPFARFALSE :
case HB_P_JUMPFALSEFAR :
pCode[ ( ULONG ) ( ulFrom - 1 ) ] = HB_P_JUMPFALSE;
pCode[ ( ULONG ) ( ulFrom + 2 ) ] = HB_P_NOOP;
break;
@@ -2514,9 +2514,9 @@ static void hb_compOptimizeJumps( void )
{
switch( pCode[ pJumps[ iJump ] ] )
{
case HB_P_JUMPSHORT :
case HB_P_JUMPSHORTFALSE :
case HB_P_JUMPSHORTTRUE :
case HB_P_JUMPNEAR :
case HB_P_JUMPFALSENEAR :
case HB_P_JUMPTRUENEAR :
{
ulOffset = pCode[ pJumps[ iJump ] + 1 ];

View File

@@ -32,6 +32,7 @@
* their web site at http://www.gnu.org/).
*
*/
#include <assert.h>
#include "hbcomp.h"
@@ -62,15 +63,15 @@ static BYTE s_pcode_len[] = {
1, /* HB_P_DUPLTWO, */
1, /* HB_P_INC, */
1, /* HB_P_INSTRING, */
2, /* HB_P_JUMPSHORT, */
2, /* HB_P_JUMPNEAR, */
3, /* HB_P_JUMP, */
4, /* HB_P_JUMPFAR, */
2, /* HB_P_JUMPSHORTFALSE, */
2, /* HB_P_JUMPFALSENEAR, */
3, /* HB_P_JUMPFALSE, */
4, /* HB_P_JUMPFARFALSE, */
2, /* HB_P_JUMPSHORTTRUE, */
4, /* HB_P_JUMPFALSEFAR, */
2, /* HB_P_JUMPTRUENEAR, */
3, /* HB_P_JUMPTRUE, */
4, /* HB_P_JUMPFARTRUE, */
4, /* HB_P_JUMPTRUEFAR, */
1, /* HB_P_LESSEQUAL, */
1, /* HB_P_LESS, */
3, /* HB_P_LINE, */
@@ -154,7 +155,7 @@ static BYTE s_pcode_len[] = {
1 /* HB_P_ONE, */
};
void hb_compPCodeEval( PFUNCTION pFunc, HB_PCODE_FUNC_PTR *pFunctions, void *cargo )
void hb_compPCodeEval( PFUNCTION pFunc, HB_PCODE_FUNC_PTR * pFunctions, void * cargo )
{
ULONG ulPos = 0;
USHORT usSkip;
@@ -162,7 +163,7 @@ void hb_compPCodeEval( PFUNCTION pFunc, HB_PCODE_FUNC_PTR *pFunctions, void *car
HB_PCODE_FUNC_PTR pCall;
/* Make sure that table is correct */
assert( sizeof(s_pcode_len) == HB_P_LAST_PCODE );
assert( sizeof( s_pcode_len ) == HB_P_LAST_PCODE );
while( ulPos < pFunc->lPCodePos )
{

View File

@@ -92,27 +92,21 @@ void hb_compPrintUsage( char * szSelf )
*/
void hb_compPrintCredits( void )
{
/* NOTE: This list was semi-automatically generated by searching for all
Copyright headers in the core Harbour source files.
(GREP "copyright [12]" and GREP "public domain")
[vszakats] */
printf( "\n"
"Credits: The Harbour Team at www.harbour-project.org\n"
"\n"
"Developers and documentation:\n"
"\n"
"A White <awhite@user.rose.com>\n"
"Alexander S.Kresin <alex@belacy.belgorod.su>\n"
"April White <awhite@user.rose.com>\n"
"Alexander S. Kresin <alex@belacy.belgorod.su>\n"
"Andi Jahja <andij@aonlippo.co.id>\n"
"Antonio Linares <alinares@fivetech.com>\n"
"Bil Simser <bsimser@home.com>\n"
"Brian Hays <bhays@abacuslaw.com>\n"
"Bruno Cantero <bruno@issnet.net>\n"
"Chen Kedem <niki@actcom.co.il>\n"
"Dave Pearson <davep@davep.org>\n"
"David G. Holm <dholm@jsd-llc.com>\n"
"Eddie Runia <eddie@runia.com>\n"
"Felipe G. Coury <fcoury@flexsys-ci.com>\n"
"Felipe G. Coury <fcoury@creation.com.br>\n"
"Gonzalo A. Diethelm <gonzalo.diethelm@iname.com>\n"
"Ignacio Ortiz de Zuniga <ignacio@fivetech.com>\n"
"Janica Lubos <janica@fornax.elf.stuba.sk>\n"
@@ -123,19 +117,15 @@ void hb_compPrintCredits( void )
"Matteo Baccan <baccan@isanet.it>\n"
"Matthew Hamilton <mhamilton@bunge.com.au>\n"
"Nicolas del Pozo <niko@geroa.com>\n"
"Patrick Mast <harbour@winfakt.com>\n"
"Paul Tucker <ptucker@sympatico.ca>\n"
"Peter Townsend <cephas@tpgi.com.au>\n"
"Phil Barnett <philb@iag.net>\n"
"Ron Pinkas <ron@profit-Master.com>\n"
"Ryszard Glab <rglab@imid.med.pl>\n"
"Tim Stone <timstone@mstrlink.com>\n"
"Victor Szakats <info@szelvesz.hu>\n"
"Vladimir Kazimirchik <v_kazimirchik@yahoo.com>\n"
"\n"
"Major contributors:"
"\n"
"Dave Pearson <davep@davep.org>\n"
"Patrick Mast <harbour@winfakt.com>\n"
"Tim Stone <timstone@mstrlink.com>\n"
);
}

View File

@@ -42,6 +42,7 @@
#if defined( OS_UNIX_COMPATIBLE )
#include <unistd.h> /* read() function requires it */
#include <termios.h>
#endif
static SHORT s_iRow;
@@ -53,6 +54,10 @@ static BOOL s_bBlink;
static int s_iFilenoStdout;
static USHORT s_uiDispCount;
#if defined( OS_UNIX_COMPATIBLE )
static struct termios startup_attributes;
#endif
void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Init()"));
@@ -60,6 +65,22 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
HB_SYMBOL_UNUSED( iFilenoStdin );
HB_SYMBOL_UNUSED( iFilenoStderr );
#if defined( OS_UNIX_COMPATIBLE )
{
struct termios ta;
tcgetattr( STDIN_FILENO, &startup_attributes );
atexit( restore_input_mode );
tcgetattr( STDIN_FILENO, &ta );
ta.c_lflag &= ~( ICANON | ECHO );
ta.c_iflag &= ~ICRNL;
ta.c_cc[ VMIN ] = 0;
ta.c_cc[ VTIME ] = 0;
tcsetattr( STDIN_FILENO, TCSAFLUSH, &ta );
}
#endif
s_uiDispCount = 0;
s_iRow = 0;
@@ -79,6 +100,10 @@ void hb_gt_Init( int iFilenoStdin, int iFilenoStdout, int iFilenoStderr )
void hb_gt_Exit( void )
{
HB_TRACE(HB_TR_DEBUG, ("hb_gt_Exit()"));
#if defined( OS_UNIX_COMPATIBLE )
tcsetattr( STDIN_FILENO, TCSANOW, &startup_attributes );
#endif
}
int hb_gt_ReadKey( HB_inkey_enum eventmask )

View File

@@ -636,7 +636,7 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
hb_stack.pPos->type = HB_IT_LONG;
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + ( pCode[ w + 3 ] * 65536 );
if ( lOffset > 8388607L )
if( lOffset > 8388607L )
lOffset = ( lOffset - 16777216 );
hb_stack.pPos->item.asLong.value = w + lOffset;
@@ -696,7 +696,7 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
* skip outside of SEQUENCE structure
*/
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + ( pCode[ w + 3 ] * 65536 );
if ( lOffset > 8388607L )
if( lOffset > 8388607L )
lOffset = ( lOffset - 16777216 );
w += lOffset;
@@ -732,54 +732,34 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
/* Jumps */
case HB_P_JUMPSHORT:
case HB_P_JUMPNEAR:
lOffset = pCode[ w + 1 ];
if ( lOffset > 127 )
if( lOffset > 127 )
lOffset -= 256 ;
/*
if( lOffset )
w += lOffset;
else
w += 2;
*/
w += lOffset;
break;
case HB_P_JUMP:
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 );
if ( lOffset > SHRT_MAX )
if( lOffset > SHRT_MAX )
lOffset -= 65536;
/*
if( lOffset )
w += lOffset;
else
w += 3;
*/
w += lOffset;
break;
case HB_P_JUMPFAR:
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + ( pCode[ w + 3 ] * 65536 );
if ( lOffset > 8388607L )
if( lOffset > 8388607L )
lOffset -= 16777216L;
/*
if( lOffset )
w += lOffset;
else
w += 4;
*/
w += lOffset;
break;
case HB_P_JUMPSHORTFALSE:
case HB_P_JUMPFALSENEAR:
if( ! hb_vmPopLogical() )
{
lOffset = pCode[ w + 1 ];
if ( lOffset > 127 )
if( lOffset > 127 )
lOffset -= 256;
w += lOffset;
@@ -792,7 +772,7 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
if( ! hb_vmPopLogical() )
{
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 );
if ( lOffset > SHRT_MAX )
if( lOffset > SHRT_MAX )
lOffset -= 65536;
w += lOffset;
@@ -801,11 +781,11 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
w += 3;
break;
case HB_P_JUMPFARFALSE:
case HB_P_JUMPFALSEFAR:
if( ! hb_vmPopLogical() )
{
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + ( pCode[ w + 3 ] * 65536 );
if ( lOffset > 8388607L )
if( lOffset > 8388607L )
lOffset -= 16777216L;
w += lOffset;
@@ -814,11 +794,11 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
w += 4;
break;
case HB_P_JUMPSHORTTRUE:
case HB_P_JUMPTRUENEAR:
if( hb_vmPopLogical() )
{
lOffset = pCode[ w + 1 ];
if ( lOffset > 127 )
if( lOffset > 127 )
lOffset -= 256;
w += lOffset;
@@ -831,7 +811,7 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
if( hb_vmPopLogical() )
{
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 );
if ( lOffset > SHRT_MAX )
if( lOffset > SHRT_MAX )
lOffset -= 65536;
w += lOffset;
@@ -840,11 +820,11 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
w += 3;
break;
case HB_P_JUMPFARTRUE:
case HB_P_JUMPTRUEFAR:
if( hb_vmPopLogical() )
{
lOffset = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) + ( pCode[ w + 3 ] * 65536 );
if ( lOffset > 8388607L )
if( lOffset > 8388607L )
lOffset -= 16777216L;
w += lOffset;
@@ -856,12 +836,16 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
/* Push */
case HB_P_TRUE:
hb_vmPushLogical( TRUE );
hb_stack.pPos->type = HB_IT_LOGICAL;
hb_stack.pPos->item.asLogical.value = TRUE;
hb_stackPush();
w++;
break;
case HB_P_FALSE:
hb_vmPushLogical( FALSE );
hb_stack.pPos->type = HB_IT_LOGICAL;
hb_stack.pPos->item.asLogical.value = FALSE;
hb_stackPush();
w++;
break;
@@ -919,12 +903,12 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
break;
case HB_P_PUSHSTR:
{
USHORT uiSize = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 );
hb_vmPushString( ( char * ) pCode + w + 3, ( ULONG ) uiSize );
w += ( 3 + uiSize );
}
{
USHORT uiSize = pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 );
hb_vmPushString( ( char * ) pCode + w + 3, ( ULONG ) uiSize );
w += ( 3 + uiSize );
break;
}
case HB_P_PUSHSTRSHORT:
hb_vmPushString( ( char * ) pCode + w + 2, ( ULONG ) pCode[ w + 1 ] );
@@ -1161,133 +1145,133 @@ void hb_vmExecute( const BYTE * pCode, PHB_SYMB pSymbols )
/* macro compiled opcodes - we are using symbol address here */
case HB_P_MMESSAGE:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmMessage( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmMessage( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPOPALIASEDFIELD:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmPopAliasedField( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmPopAliasedField( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPOPALIASEDVAR:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmPopAliasedVar( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmPopAliasedVar( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPOPFIELD:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
/* Pops a value from the eval stack and uses it to set
* a new value of the given field
*/
hb_stackDec();
hb_rddPutFieldValue( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_itemClear( hb_stack.pPos );
HB_TRACE(HB_TR_INFO, ("(hb_vmMPopField)"));
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
/* Pops a value from the eval stack and uses it to set
* a new value of the given field
*/
hb_stackDec();
hb_rddPutFieldValue( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_itemClear( hb_stack.pPos );
HB_TRACE(HB_TR_INFO, ("(hb_vmMPopField)"));
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPOPMEMVAR:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_stackDec();
hb_memvarSetValue( ( *pDynSym )->pSymbol, hb_stack.pPos );
hb_itemClear( hb_stack.pPos );
HB_TRACE(HB_TR_INFO, ("(hb_vmMPopMemvar)"));
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_stackDec();
hb_memvarSetValue( ( *pDynSym )->pSymbol, hb_stack.pPos );
hb_itemClear( hb_stack.pPos );
HB_TRACE(HB_TR_INFO, ("(hb_vmMPopMemvar)"));
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHALIASEDFIELD:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmPushAliasedField( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmPushAliasedField( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHALIASEDVAR:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmPushAliasedVar( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmPushAliasedVar( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHBLOCK:
{
/*NOTE: the pcode is stored in dynamically allocated memory
* We need to handle it with more care than compile-time
* codeblocks
*/
/* +0 -> _pushblock
* +1 +2 -> size of codeblock
* +3 +4 -> number of expected parameters
* +5 -> pcode bytes
*/
hb_vmPushMacroBlock( ( BYTE * ) ( pCode + w ), pSymbols );
w += ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) );
}
{
/*NOTE: the pcode is stored in dynamically allocated memory
* We need to handle it with more care than compile-time
* codeblocks
*/
/* +0 -> _pushblock
* +1 +2 -> size of codeblock
* +3 +4 -> number of expected parameters
* +5 -> pcode bytes
*/
hb_vmPushMacroBlock( ( BYTE * ) ( pCode + w ), pSymbols );
w += ( pCode[ w + 1 ] + ( pCode[ w + 2 ] * 256 ) );
break;
}
case HB_P_MPUSHFIELD:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
/* It pushes the current value of the given field onto the eval stack
*/
hb_rddGetFieldValue( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_stackPush();
HB_TRACE(HB_TR_INFO, ("(hb_vmMPushField)"));
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
/* It pushes the current value of the given field onto the eval stack
*/
hb_rddGetFieldValue( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_stackPush();
HB_TRACE(HB_TR_INFO, ("(hb_vmMPushField)"));
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHMEMVAR:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_memvarGetValue( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_stackPush();
HB_TRACE(HB_TR_INFO, ("(hb_vmMPushMemvar)"));
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_memvarGetValue( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_stackPush();
HB_TRACE(HB_TR_INFO, ("(hb_vmMPushMemvar)"));
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHMEMVARREF:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_memvarGetRefer( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_stackPush();
HB_TRACE(HB_TR_INFO, ("(hb_vmMPushMemvarRef)"));
w += sizeof( HB_DYNS_PTR ) + 1;
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_memvarGetRefer( hb_stack.pPos, ( *pDynSym )->pSymbol );
hb_stackPush();
HB_TRACE(HB_TR_INFO, ("(hb_vmMPushMemvarRef)"));
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHSYM:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmPushSymbol( ( *pDynSym )->pSymbol );
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmPushSymbol( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
case HB_P_MPUSHVARIABLE:
{
HB_DYNS_PTR *pDynSym = ( HB_DYNS_PTR *) ( pCode + w + 1 );
hb_vmPushVariable( ( *pDynSym )->pSymbol );
}
{
HB_DYNS_PTR * pDynSym = ( HB_DYNS_PTR * ) ( pCode + w + 1 );
hb_vmPushVariable( ( *pDynSym )->pSymbol );
w += sizeof( HB_DYNS_PTR ) + 1;
break;
}
/* misc */

View File

@@ -10,7 +10,7 @@ ROOT = ../../
PRG_SOURCES=\
hbrun.prg \
exttools.prg \
external.prg \
PRG_MAIN=hbrun.prg