From fbcac4615bb684305846a41d851881e42eac1e8f Mon Sep 17 00:00:00 2001 From: Antonio Linares Date: Mon, 10 May 1999 12:38:50 +0000 Subject: [PATCH] Harbour own OBJs support. I had to remove Gonzalo main() as the makefile refuses such a long command line --- harbour/source/vm/hvm.c | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index d71e06d166..6fc674d316 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -1,7 +1,3 @@ -/* - * $Id$ - */ - /* The Harbour virtual machine */ /* Please note the following comments we may use everywhere @@ -97,6 +93,7 @@ typedef struct _SYMBOLS } SYMBOLS, * PSYMBOLS; /* structure to keep track of all modules symbol tables */ void ProcessSymbols( PSYMBOL pSymbols, WORD wSymbols ); /* statics symbols initialization */ +void ProcessObjSymbols ( void ); /* process Harbour generated OBJ symbols */ void DoInitFunctions( int argc, char * argv[] ); /* executes all defined PRGs INIT functions */ void DoExitFunctions( void ); /* executes all defined PRGs EXIT functions */ void LogSymbols( void ); /* displays all dynamic symbols */ @@ -129,6 +126,14 @@ extern ULONG ulMemoryMaxBlocks; /* maximum number of used memory blocks */ extern ULONG ulMemoryConsumed; /* memory size consumed */ extern ULONG ulMemoryMaxConsumed; /* memory max size consumed */ +typedef struct +{ + WORD wSymbols; /* module local symbol table symbols amount */ + PSYMBOL pSymbols; /* module local symbol table address */ +} OBJSYMBOLS, * POBJSYMBOLS; /* structure used from Harbour generated OBJs */ + +extern POBJSYMBOLS HB_FIRSTSYMBOL, HB_LASTSYMBOL; + STACK stack; int iHBDEBUG = 0; /* if 1 traces the virtual machine activity */ SYMBOL symEval = { "__EVAL", FS_PUBLIC, DoBlock, 0 }; /* symbol to evaluate codeblocks */ @@ -166,9 +171,11 @@ BYTE bErrorLevel = 0; /* application exit errorlevel */ StackInit(); NewDynSym( &symEval ); /* initialize dynamic symbol for evaluating codeblocks */ InitializeSets(); /* initialize Sets */ + ProcessObjSymbols(); /* initialize Harbour generated OBJs symbols */ DoInitFunctions( argc, argv ); /* process defined INIT functions */ PushSymbol( pSymStart ); /* pushes first FS_PUBLIC defined symbol to the stack */ + PushNil(); /* places NIL at self */ for( i = 1; i < argc; i++ ) /* places application parameters on the stack */ @@ -1765,6 +1772,13 @@ void ProcessSymbols( PSYMBOL pModuleSymbols, WORD wModuleSymbols ) /* module sym { PSYMBOLS pNewSymbols, pLastSymbols; WORD w; + static int iObjChecked = 0; + + if( ! iObjChecked ) + { + iObjChecked = 1; + ProcessObjSymbols(); /* to asure Harbour OBJ symbols are processed first */ + } pNewSymbols = ( PSYMBOLS ) _xgrab( sizeof( SYMBOLS ) ); pNewSymbols->pModuleSymbols = pModuleSymbols; @@ -1792,6 +1806,23 @@ void ProcessSymbols( PSYMBOL pModuleSymbols, WORD wModuleSymbols ) /* module sym } } +void ProcessObjSymbols( void ) +{ + POBJSYMBOLS pObjSymbols = ( POBJSYMBOLS ) &HB_FIRSTSYMBOL; + + static int iDone = 0; + + if( ! iDone ) + { + iDone = 1; + while( pObjSymbols < ( POBJSYMBOLS ) ( &HB_LASTSYMBOL - 1 ) ) + { + ProcessSymbols( pObjSymbols->pSymbols, pObjSymbols->wSymbols ); + pObjSymbols++; + } + } +} + void ReleaseLocalSymbols( void ) { PSYMBOLS pDestroy;