ChangeLog: 19990727-20:15
This commit is contained in:
@@ -1,3 +1,55 @@
|
||||
19990727-20:15 GMT+2 Ryszard Glab <rglab@imid.med.pl>
|
||||
|
||||
*source/compiler/harbour.y
|
||||
* static variables can be initialized using the codeblocks
|
||||
that calls functions. However static variables still cannot
|
||||
be initialized with direct function call.
|
||||
* changed the symbol created for function that initialize
|
||||
static variable to: '(_INITSTATICS)' and generated function is
|
||||
named now hb_INITSTATICS - this allows to create an user
|
||||
defined function or memvar named _INITSTATICS
|
||||
* the _INITSTATICS function (used to initialize static variables)
|
||||
have the scope equal to (FS_INIT | FS_EXIT) - to distinguish
|
||||
this function from other INIT functions. All _INITSTATICS
|
||||
functions defined in the application have to be called
|
||||
before normal INIT functions are called.
|
||||
|
||||
*source/vm/hvm.c
|
||||
* All _INITSTATICS functions defined in the application are
|
||||
called before normal INIT procedures - this allows to use
|
||||
static variables in INIT procedures
|
||||
|
||||
*tests/working/initexit.prg
|
||||
* updated code to test cooperation of INIT procedures with
|
||||
static variables
|
||||
|
||||
*include/rdd.api
|
||||
+ added forward declaration for struct _RDDFUNCS
|
||||
|
||||
*source/rtl/natmsg/msgbas.c
|
||||
*source/rtl/natmsg/msgcat.c
|
||||
*source/rtl/natmsg/msgcz852.c
|
||||
*source/rtl/natmsg/msgczkam.c
|
||||
*source/rtl/natmsg/msgdut.c
|
||||
*source/rtl/natmsg/msgeo.c
|
||||
*source/rtl/natmsg/msgfre.c
|
||||
*source/rtl/natmsg/msggal.c
|
||||
*source/rtl/natmsg/msgger.c
|
||||
*source/rtl/natmsg/msghu.c
|
||||
*source/rtl/natmsg/msgia.c
|
||||
*source/rtl/natmsg/msgita.c
|
||||
*source/rtl/natmsg/msgkor.c
|
||||
*source/rtl/natmsg/msgpl852.c
|
||||
*source/rtl/natmsg/msgplmaz.c
|
||||
*source/rtl/natmsg/msgpor.c
|
||||
*source/rtl/natmsg/msgr1251.c
|
||||
*source/rtl/natmsg/msgru866.c
|
||||
*source/rtl/natmsg/msgspa.c
|
||||
*source/rtl/natmsg/msguk.c
|
||||
*source/rtl/natmsg/msgyu852.c
|
||||
* corrected bug in hb_ErrorNetDescription
|
||||
(was "<=" instead of "<" ;-)
|
||||
|
||||
19990727-19:48 GMT+1 Bruno Cantero <bruno@issnet.net>
|
||||
* source/rdd/dbcmd.c
|
||||
Fixed a GFP (Paul, test it)
|
||||
|
||||
@@ -455,6 +455,7 @@ typedef struct
|
||||
*
|
||||
* Informaci¢n para administrar el rea de trabajo
|
||||
*/
|
||||
struct _RDDFUNCS;
|
||||
|
||||
typedef struct _AREA
|
||||
{
|
||||
|
||||
@@ -2148,7 +2148,10 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
|
||||
if( pFunc->cScope & FS_STATIC || pFunc->cScope & FS_INIT || pFunc->cScope & FS_EXIT )
|
||||
fprintf( yyc, "static " );
|
||||
|
||||
fprintf( yyc, "HARBOUR HB_%s( void );\n", pFunc->szName );
|
||||
if( pFunc == _pInitFunc )
|
||||
fprintf( yyc, "HARBOUR hb_INITSTATICS( void );\n" );
|
||||
else
|
||||
fprintf( yyc, "HARBOUR HB_%s( void );\n", pFunc->szName );
|
||||
pFunc = pFunc->pNext;
|
||||
}
|
||||
/* write functions prototypes for called functions outside this PRG */
|
||||
@@ -2173,36 +2176,47 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
|
||||
wSym = 0; /* symbols counter */
|
||||
while( pSym )
|
||||
{
|
||||
fprintf( yyc, "{ \"%s\", ", pSym->szName );
|
||||
if( pSym->szName[ 0 ] == '(' )
|
||||
{
|
||||
/* Since the normal function cannot be INIT and EXIT at the same time
|
||||
* we are using these two bits to mark the special function used to
|
||||
* initialize static variables
|
||||
*/
|
||||
fprintf( yyc, "{ \"(_INITSTATICS)\", FS_INIT | FS_EXIT, hb_INITSTATICS, 0}" );
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf( yyc, "{ \"%s\", ", pSym->szName );
|
||||
|
||||
if( pSym->cScope & FS_STATIC )
|
||||
fprintf( yyc, "FS_STATIC" );
|
||||
|
||||
else if( pSym->cScope & FS_INIT )
|
||||
fprintf( yyc, "FS_INIT" );
|
||||
|
||||
else if( pSym->cScope & FS_EXIT )
|
||||
fprintf( yyc, "FS_EXIT" );
|
||||
|
||||
else
|
||||
fprintf( yyc, "FS_PUBLIC" );
|
||||
|
||||
if( pSym->cScope & VS_MEMVAR )
|
||||
fprintf( yyc, " | FS_MEMVAR" );
|
||||
|
||||
if( ( pSym->cScope != FS_MESSAGE ) && ( pSym->cScope & FS_MESSAGE ) ) /* only for non public symbols */
|
||||
fprintf( yyc, " | FS_MESSAGE" );
|
||||
|
||||
/* specify the function address if it is a defined function or an
|
||||
external called function */
|
||||
if( GetFunction( pSym->szName ) ) /* is it a function defined in this module */
|
||||
fprintf( yyc, ", HB_%s, 0 }", pSym->szName );
|
||||
else if( GetFuncall( pSym->szName ) ) /* is it a function called from this module */
|
||||
fprintf( yyc, ", HB_%s, 0 }", pSym->szName );
|
||||
else
|
||||
fprintf( yyc, ", 0, 0 }" ); /* memvar */
|
||||
}
|
||||
++wSym;
|
||||
|
||||
if( pSym->cScope & FS_STATIC )
|
||||
fprintf( yyc, "FS_STATIC" );
|
||||
|
||||
else if( pSym->cScope & FS_INIT )
|
||||
fprintf( yyc, "FS_INIT" );
|
||||
|
||||
else if( pSym->cScope & FS_EXIT )
|
||||
fprintf( yyc, "FS_EXIT" );
|
||||
|
||||
else
|
||||
fprintf( yyc, "FS_PUBLIC" );
|
||||
|
||||
if( pSym->cScope & VS_MEMVAR )
|
||||
fprintf( yyc, " | FS_MEMVAR" );
|
||||
|
||||
if( ( pSym->cScope != FS_MESSAGE ) && ( pSym->cScope & FS_MESSAGE ) ) /* only for non public symbols */
|
||||
fprintf( yyc, " | FS_MESSAGE" );
|
||||
|
||||
/* specify the function address if it is a defined function or an
|
||||
external called function */
|
||||
if( GetFunction( pSym->szName ) ) /* is it a function defined in this module */
|
||||
fprintf( yyc, ", HB_%s, 0 }", pSym->szName );
|
||||
else if( GetFuncall( pSym->szName ) ) /* is it a function called from this module */
|
||||
fprintf( yyc, ", HB_%s, 0 }", pSym->szName );
|
||||
else
|
||||
fprintf( yyc, ", 0, 0 }" ); /* memvar */
|
||||
|
||||
if( pSym != symbols.pLast )
|
||||
fprintf( yyc, ",\n" );
|
||||
|
||||
@@ -2221,7 +2235,10 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
|
||||
if( pFunc->cScope != FS_PUBLIC )
|
||||
fprintf( yyc, "static " );
|
||||
|
||||
fprintf( yyc, "HARBOUR HB_%s( void )\n{\n static BYTE pcode[] = { \n", pFunc->szName );
|
||||
if( pFunc == _pInitFunc ) /* Is it (_INITSTATICS) */
|
||||
fprintf( yyc, "HARBOUR hb_INITSTATICS( void )\n{\n static BYTE pcode[] = { \n" );
|
||||
else
|
||||
fprintf( yyc, "HARBOUR HB_%s( void )\n{\n static BYTE pcode[] = { \n", pFunc->szName );
|
||||
|
||||
lPCodePos = 0;
|
||||
while( lPCodePos < pFunc->lPCodePos )
|
||||
@@ -2779,7 +2796,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
|
||||
{
|
||||
GetSymbol( _pInitFunc->szName, &w );
|
||||
w = FixSymbolPos( w );
|
||||
fprintf( yyc, " HB_P_SFRAME, %i, %i,\t\t/* symbol _INITSTATICS */\n",
|
||||
fprintf( yyc, " HB_P_SFRAME, %i, %i,\t\t/* symbol (_INITSTATICS) */\n",
|
||||
LOBYTE( w ), HIBYTE( w ) );
|
||||
}
|
||||
lPCodePos += 3;
|
||||
@@ -2789,7 +2806,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
|
||||
{
|
||||
GetSymbol( _pInitFunc->szName, &w );
|
||||
w = FixSymbolPos( w );
|
||||
fprintf( yyc, " HB_P_STATICS, %i, %i,\t\t/* symbol _INITSTATICS */\n",
|
||||
fprintf( yyc, " HB_P_STATICS, %i, %i,\t\t/* symbol (_INITSTATICS) */\n",
|
||||
LOBYTE( w ), HIBYTE( w ) );
|
||||
lPCodePos += 3;
|
||||
}
|
||||
@@ -4644,9 +4661,10 @@ void StaticDefStart( void )
|
||||
functions.pLast->bFlags |= FUN_USES_STATICS;
|
||||
if( ! _pInitFunc )
|
||||
{
|
||||
_pInitFunc =FunctionNew( yy_strdup("_INITSTATICS"), FS_INIT );
|
||||
_pInitFunc =FunctionNew( yy_strdup("(_INITSTATICS)"), FS_INIT );
|
||||
_pInitFunc->pOwner =functions.pLast;
|
||||
_pInitFunc->bFlags =FUN_USES_STATICS | FUN_PROCEDURE;
|
||||
_pInitFunc->cScope =FS_INIT | FS_EXIT;
|
||||
functions.pLast =_pInitFunc;
|
||||
PushInteger( 1 ); /* the number of static variables is unknown now */
|
||||
GenPCode3( HB_P_STATICS, 0, 0 );
|
||||
@@ -4695,8 +4713,10 @@ void StaticDefEnd( WORD wCount )
|
||||
*/
|
||||
void StaticAssign( void )
|
||||
{
|
||||
if( iVarScope == VS_STATIC )
|
||||
_pInitFunc->bFlags |= FUN_ILLEGAL_INIT;
|
||||
if( iVarScope == VS_STATIC && functions.pLast->szName )
|
||||
/* function call is allowed if it is inside a codeblock
|
||||
*/
|
||||
_pInitFunc->bFlags |= FUN_ILLEGAL_INIT;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -75,7 +75,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -76,7 +76,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -90,7 +90,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -90,7 +90,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -70,7 +70,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -72,7 +72,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -76,7 +76,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -76,7 +76,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -71,7 +71,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -119,7 +119,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -74,7 +74,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -76,7 +76,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -73,7 +73,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -74,7 +74,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -74,7 +74,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -74,7 +74,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -71,7 +71,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -71,7 +71,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -71,7 +71,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -71,7 +71,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -74,7 +74,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -90,7 +90,7 @@ static char *genericErrors[] =
|
||||
|
||||
char *hb_ErrorNatDescription( ULONG ulGenError )
|
||||
{
|
||||
if( ulGenError <= sizeof(genericErrors)/sizeof(char*) )
|
||||
if( ulGenError < sizeof(genericErrors)/sizeof(char*) )
|
||||
return genericErrors[ ulGenError ];
|
||||
else
|
||||
return genericErrors[ 0 ];
|
||||
|
||||
@@ -135,6 +135,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 DoInitStatics( void ); /* executes all _INITSTATICS functions */
|
||||
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 */
|
||||
@@ -248,6 +249,11 @@ BYTE bErrorLevel = 0; /* application exit errorlevel */
|
||||
/* Initialize symbol table with runtime support functions */
|
||||
InitSymbolTable();
|
||||
|
||||
/* Call functions that initializes static variables
|
||||
* Static variables have to be initialized before any INIT functions
|
||||
* because INIT function can use static variables
|
||||
*/
|
||||
DoInitStatics();
|
||||
DoInitFunctions( argc, argv ); /* process defined INIT functions */
|
||||
|
||||
#ifdef HARBOUR_START_PROCEDURE
|
||||
@@ -2083,7 +2089,7 @@ void StackInit( void )
|
||||
void SFrame( PSYMBOL pSym ) /* sets the statics frame for a function */
|
||||
{
|
||||
/* _INITSTATICS is now the statics frame. Statics() changed it! */
|
||||
stack.iStatics = ( int ) pSym->pFunPtr; /* pSym is { "_INITSTATICS", FS_INIT, _INITSTATICS } for each PRG */
|
||||
stack.iStatics = ( int ) pSym->pFunPtr; /* pSym is { "$_INITSTATICS", FS_INIT | FS_EXIT, _INITSTATICS } for each PRG */
|
||||
HB_DEBUG( "SFrame\n" );
|
||||
}
|
||||
|
||||
@@ -2176,15 +2182,43 @@ void ReleaseLocalSymbols( void )
|
||||
}
|
||||
}
|
||||
|
||||
void DoExitFunctions( void )
|
||||
/* This calls all _INITSTATICS functions defined in the application.
|
||||
* We are using a special symbol's scope (FS_INIT | FS_EXIT) to mark
|
||||
* this function. These two bits cannot be marked at the same
|
||||
* time for normal user defined functions.
|
||||
*/
|
||||
void DoInitStatics( void )
|
||||
{
|
||||
PSYMBOLS pLastSymbols = pSymbols;
|
||||
WORD w;
|
||||
SYMBOLSCOPE scope;
|
||||
|
||||
do {
|
||||
for( w = 0; w < pLastSymbols->wModuleSymbols; w++ )
|
||||
{
|
||||
if( ( pLastSymbols->pModuleSymbols + w )->cScope & FS_EXIT )
|
||||
scope =( pLastSymbols->pModuleSymbols + w )->cScope & (FS_EXIT | FS_INIT);
|
||||
if( scope == (FS_INIT | FS_EXIT) )
|
||||
{
|
||||
PushSymbol( pLastSymbols->pModuleSymbols + w );
|
||||
PushNil();
|
||||
Do( 0 );
|
||||
}
|
||||
}
|
||||
pLastSymbols = pLastSymbols->pNext;
|
||||
} while( pLastSymbols );
|
||||
}
|
||||
|
||||
void DoExitFunctions( void )
|
||||
{
|
||||
PSYMBOLS pLastSymbols = pSymbols;
|
||||
WORD w;
|
||||
SYMBOLSCOPE scope;
|
||||
|
||||
do {
|
||||
for( w = 0; w < pLastSymbols->wModuleSymbols; w++ )
|
||||
{
|
||||
scope =( pLastSymbols->pModuleSymbols + w )->cScope & (FS_EXIT | FS_INIT);
|
||||
if( scope == FS_EXIT )
|
||||
{
|
||||
PushSymbol( pLastSymbols->pModuleSymbols + w );
|
||||
PushNil();
|
||||
@@ -2199,11 +2233,13 @@ void DoInitFunctions( int argc, char * argv[] )
|
||||
{
|
||||
PSYMBOLS pLastSymbols = pSymbols;
|
||||
WORD w;
|
||||
SYMBOLSCOPE scope;
|
||||
|
||||
do {
|
||||
for( w = 0; w < pLastSymbols->wModuleSymbols; w++ )
|
||||
{
|
||||
if( ( pLastSymbols->pModuleSymbols + w )->cScope & FS_INIT )
|
||||
scope =( pLastSymbols->pModuleSymbols + w )->cScope & (FS_EXIT | FS_INIT);
|
||||
if( scope == FS_INIT )
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
@@ -2,34 +2,60 @@
|
||||
// $Id$
|
||||
//
|
||||
|
||||
// Testing Harbour INIT and EXIT functions
|
||||
// Testing Harbour INIT and EXIT functions and initialization
|
||||
// of static variables
|
||||
|
||||
STATIC static_var_accessed_in_INIT_function:=10000.15
|
||||
MEMVAR _initStatics
|
||||
|
||||
function Main()
|
||||
STATIC static_var:="MAIN()"
|
||||
|
||||
QOut( "Hello from Main()" )
|
||||
QOut( "Hello from:", static_var )
|
||||
static_var_accessed_in_INIT_function++
|
||||
Qout( "global static=", static_var_accessed_in_INIT_function )
|
||||
|
||||
// Use PUBLIC variable created in INIT procedure
|
||||
Qout( "PUBLIC variable created in INIT procedure=", _initStatics )
|
||||
|
||||
return nil
|
||||
|
||||
init function SecondOne()
|
||||
STATIC static_var:="SECOND()"
|
||||
|
||||
QOut( "Hello from Second()" )
|
||||
QOut( "Hello from:", static_var )
|
||||
static_var_accessed_in_INIT_function++
|
||||
Qout( "global static=", static_var_accessed_in_INIT_function )
|
||||
|
||||
return nil
|
||||
|
||||
init function Third()
|
||||
STATIC static_var:="THIRD()"
|
||||
|
||||
QOut( "Hello from Third()" )
|
||||
QOut( "Hello from:", static_var )
|
||||
static_var_accessed_in_INIT_function++
|
||||
Qout( "global static=", static_var_accessed_in_INIT_function )
|
||||
|
||||
return nil
|
||||
|
||||
exit function Fifth()
|
||||
STATIC static_var:="FIFTH()"
|
||||
|
||||
QOut( "Hello from Fifth()" )
|
||||
QOut( "Hello from:", static_var )
|
||||
static_var_accessed_in_INIT_function--
|
||||
Qout( "global static=", static_var_accessed_in_INIT_function )
|
||||
|
||||
return nil
|
||||
|
||||
exit function Sixth()
|
||||
STATIC static_var:="SIXTH()"
|
||||
|
||||
QOut( "Hello from Sixth()" )
|
||||
QOut( "Hello from:", static_var )
|
||||
static_var_accessed_in_INIT_function--
|
||||
Qout( "global static=", static_var_accessed_in_INIT_function )
|
||||
|
||||
return nil
|
||||
|
||||
INIT PROCEDURE _INITSTATICS()
|
||||
PUBLIC _initStatics:="_INITSTATICS"
|
||||
RETURN
|
||||
Reference in New Issue
Block a user