20000508-22:50 GMT-8 Ron Pinkas <Ron@Profit-Master.com>

* source/compiler/harbour.l
     - Removed un used token DECLARE_

   * source/compiler/harbour.y
     ! Fixed warning about conflict
     ! Verified all calls to hb_compVariableAdd() to use hb_comp_cVarType (and VT_OFFSET_* constants) as 2nd parameter
     + Added rules to support syntax of declartion of variable by reference parameter.

   * include/hbcomp.h
     + Added :
	#define VT_OFFSET_BYREF             60
	#define VT_OFFSET_VARIANT           90
	#define VT_OFFSET_OPTIONAL          90

   * source/compiler/harbour.c
     * Minor cleanup in hb_compVariableAdd()

   * source/compiler/hbpcode.c
     * Modified hb_compStrongType() to use VT_OFFSET_* constants.

   * source/compiler/hbgenerr.c
     * Changed "number" to "#" in HB_COMP_WARN_PARAM_TYPE message.

   * tests/testwarn.prg
     + Added code to demonstrate new "Declared Refernced Paramater" syntax:
         DECLARE FRead( nHandle As Num, @cBufferVar As Char, nBytes As Num ) AS Num
This commit is contained in:
Ron Pinkas
2000-05-09 06:08:45 +00:00
parent 7a8c4b7e5c
commit d3cba77156
8 changed files with 184 additions and 115 deletions

View File

@@ -1,4 +1,34 @@
20000508-22:50 GMT-8 Ron Pinkas <Ron@Profit-Master.com>
* source/compiler/harbour.l
- Removed un used token DECLARE_
* source/compiler/harbour.y
! Fixed warning about conflict
! Verified all calls to hb_compVariableAdd() to use hb_comp_cVarType (and VT_OFFSET_* constants) as 2nd parameter
+ Added rules to support syntax of declartion of variable by reference parameter.
* include/hbcomp.h
+ Added :
#define VT_OFFSET_BYREF 60
#define VT_OFFSET_VARIANT 90
#define VT_OFFSET_OPTIONAL 90
* source/compiler/harbour.c
* Minor cleanup in hb_compVariableAdd()
* source/compiler/hbpcode.c
* Modified hb_compStrongType() to use VT_OFFSET_* constants.
* source/compiler/hbgenerr.c
* Changed "number" to "#" in HB_COMP_WARN_PARAM_TYPE message.
* tests/testwarn.prg
+ Added code to demonstrate new "Declared Refernced Paramater" syntax:
DECLARE FRead( nHandle As Num, @cBufferVar As Char, nBytes As Num ) AS Num
20000508-22:50 GMT-3 Luiz Rafael Culik <culik@sl.conex.net>
*doc/genhtm.rsp
+Added lang.txt to HBDOC response file
*doc/en/compiler.txt

View File

@@ -181,6 +181,10 @@ void hb_compPCodeEval( PFUNCTION, HB_PCODE_FUNC_PTR *, void * );
#define VU_INITIALIZED 1
#define VU_USED 2
#define VT_OFFSET_BYREF 60
#define VT_OFFSET_VARIANT 90
#define VT_OFFSET_OPTIONAL 90
/*
* flags for bFlags member
*/

View File

@@ -474,11 +474,15 @@ void hb_compVariableAdd( char * szVarName, BYTE cValueType )
pDeclared->cParamTypes = ( BYTE * ) hb_xgrab( 1 );
/* Store declared type of this parameter into the parameters type list. */
/*
if ( cValueType == '-' )
/* Optional parameter */
// Optional parameter
pDeclared->cParamTypes[ pDeclared->iParamCount - 1 ] = hb_comp_cVarType + 100;
else
pDeclared->cParamTypes[ pDeclared->iParamCount - 1 ] = hb_comp_cVarType;
*/
pDeclared->cParamTypes[ pDeclared->iParamCount - 1 ] = cValueType;
return;
}

View File

@@ -110,7 +110,7 @@ Separator {SpaceTab}
%x STRING1 STRING2 STRING3
%x NEXT_ BREAK_ CASE_ DO_ WHILE_ WITH_ END_ EXIT_ EXTERNAL_ FIELD_
%x FOR_ FUNCTION_ IIF_ IF_ IN_ INIT_ LOCAL_ LOOP_ DECLARE_
%x FOR_ FUNCTION_ IIF_ IF_ IN_ INIT_ LOCAL_ LOOP_
%x MEMVAR_ PARAM_ PRIVATE_ PUBLIC_ STATIC_ RETURN_ RECOVER_
%x INVALIDNUM_ OTHERWISE_ PROCEDURE_
%x OPTIONAL_

View File

@@ -195,7 +195,7 @@ char * hb_comp_szAnnounce = NULL; /* ANNOUNCEd procedure */
%type <valInteger> NUM_INTEGER
%type <valLong> NUM_LONG
%type <iNumber> FunScope AsType AsArray
%type <iNumber> Params ParamList DecParams DecParamList OptParams
%type <iNumber> Params ParamList DecParams DecList FormalList OptList Optional
%type <iNumber> IfBegin VarList ExtVarList
%type <iNumber> FieldList
%type <lNumber> WhileBegin
@@ -261,10 +261,10 @@ Line : LINE NUM_INTEGER LITERAL Crlf
Function : FunScope FUNCTION IdentName { hb_comp_cVarType = ' '; hb_compFunctionAdd( $3, ( HB_SYMBOLSCOPE ) $1, 0 ); } Params Crlf {}
| FunScope PROCEDURE IdentName { hb_comp_cVarType = ' '; hb_compFunctionAdd( $3, ( HB_SYMBOLSCOPE ) $1, FUN_PROCEDURE ); } Params Crlf {}
| FunScope DECLARE_FUN IdentName { hb_compDeclaredAdd( $3 ); hb_comp_szDeclaredFun = $3 ; } DecParams AsType Crlf { if( hb_comp_pLastDeclared )
hb_comp_pLastDeclared->cType = hb_comp_cVarType;
hb_comp_szDeclaredFun = NULL;
hb_comp_cVarType = ' '; }
| DECLARE_FUN IdentName { hb_compDeclaredAdd( $2 ); hb_comp_szDeclaredFun = $2; } DecParams AsType Crlf { if( hb_comp_pLastDeclared )
hb_comp_pLastDeclared->cType = hb_comp_cVarType;
hb_comp_szDeclaredFun = NULL;
hb_comp_cVarType = ' '; }
;
FunScope : { $$ = HB_FS_PUBLIC; }
@@ -273,25 +273,33 @@ FunScope : { $$ = HB_FS_PUBLIC; }
| EXIT { $$ = HB_FS_EXIT; }
;
DecParams : { $$ = 0; }
| '(' ')' { $$ = 0; }
| '(' { hb_comp_iVarScope = VS_PARAMETER; } DecParamList ')' { $$ = $3; }
Params : { $$ = 0; }
| '(' ')' { $$ = 0; }
| '(' { hb_comp_iVarScope = VS_PARAMETER; } ParamList ')' { $$ = $3; }
;
DecParamList : IdentName AsType { hb_compVariableAdd( $1, ' ' ); $$ = 1; }
| DecParamList ',' IdentName AsType { hb_compVariableAdd( $3, $4 ); $$++; }
| DecParamList OptParams
;
DecParams : { $$ = 0; }
| '(' DecList ')' { $$ = $2; }
;
OptParams : ',' OPTIONAL IdentName AsType { hb_compVariableAdd( $3, '-' ); $$ = 3; }
| OptParams ',' OPTIONAL IdentName AsType { hb_compVariableAdd( $4, '-' ); $$++; }
DecList : { $$ = 0; }
| FormalList
| FormalList OptList
;
Params : { $$ = 0; }
| '(' ')' { $$ = 0; }
| '(' { hb_comp_iVarScope = VS_PARAMETER; } ParamList ')' { $$ = $3; }
FormalList : IdentName AsType { hb_compVariableAdd( $1, hb_comp_cVarType ); $$ = 1; }
| '@' IdentName AsType { hb_compVariableAdd( $2, hb_comp_cVarType + VT_OFFSET_BYREF ); $$ = 2; }
| FormalList ',' IdentName AsType { hb_compVariableAdd( $3, hb_comp_cVarType ); $$++; }
;
OptList : Optional
| OptList Optional
;
Optional : ',' OPTIONAL IdentName AsType { hb_compVariableAdd( $3, hb_comp_cVarType + VT_OFFSET_OPTIONAL ); $$ = 3; }
| ',' OPTIONAL '@' IdentName AsType { hb_compVariableAdd( $4, hb_comp_cVarType + VT_OFFSET_OPTIONAL + VT_OFFSET_BYREF ); $$ = 4; }
;
AsType : /* not specified */ { hb_comp_cVarType = ' '; }
| AS_NUMERIC { hb_comp_cVarType = 'N'; }
| AS_CHARACTER { hb_comp_cVarType = 'C'; }
@@ -322,8 +330,8 @@ AsArray : AS_ARRAY { hb_comp_cVarType = 'A'; }
| AS_VARIANT_ARRAY { hb_comp_cVarType = 'A'; }
;
ParamList : IdentName AsType { hb_compVariableAdd( $1, ' ' ); $$ = 1; }
| ParamList ',' IdentName AsType { hb_compVariableAdd( $3, $4 ); $$++; }
ParamList : IdentName AsType { hb_compVariableAdd( $1, hb_comp_cVarType ); $$ = 1; }
| ParamList ',' IdentName AsType { hb_compVariableAdd( $3, hb_comp_cVarType ); $$++; }
;
/* NOTE: This alllows the use of Expression as a statement.
@@ -1085,7 +1093,7 @@ ExtVarDef : VarDef
}
;
VarDef : IdentName AsType { hb_compVariableAdd( $1, $2 ); }
VarDef : IdentName AsType { hb_compVariableAdd( $1, hb_comp_cVarType ); }
{
if( hb_comp_iVarScope == VS_STATIC )
{
@@ -1099,7 +1107,7 @@ VarDef : IdentName AsType { hb_compVariableAdd( $1, $2 ); }
}
| IdentName AsType { $<iNumber>$ = hb_comp_iVarScope;
hb_compVariableAdd( $1, $2 );
hb_compVariableAdd( $1, hb_comp_cVarType );
}
INASSIGN Expression
{
@@ -1141,16 +1149,16 @@ DimIndex : '[' Expression { $$ = hb_compExprNewArgList( $2 ); }
FieldsDef : FIELD { hb_comp_iVarScope = VS_FIELD; } FieldList Crlf
;
FieldList : IdentName AsType { $$=hb_compFieldsCount(); hb_compVariableAdd( $1, $2 ); }
| FieldList ',' IdentName AsType { hb_compVariableAdd( $3, $4 ); }
FieldList : IdentName AsType { $$=hb_compFieldsCount(); hb_compVariableAdd( $1, hb_comp_cVarType ); }
| FieldList ',' IdentName AsType { hb_compVariableAdd( $3, hb_comp_cVarType ); }
| FieldList IN IdentName { hb_compFieldSetAlias( $3, $<iNumber>1 ); }
;
MemvarDef : MEMVAR { hb_comp_iVarScope = VS_MEMVAR; } MemvarList Crlf
;
MemvarList : IdentName AsType { hb_compVariableAdd( $1, ' ' ); }
| MemvarList ',' IdentName { hb_compVariableAdd( $3, ' ' ); }
MemvarList : IdentName AsType { hb_compVariableAdd( $1, hb_comp_cVarType ); }
| MemvarList ',' IdentName AsType { hb_compVariableAdd( $3, hb_comp_cVarType ); }
;
ExecFlow : IfEndif

View File

@@ -106,7 +106,7 @@ char * hb_comp_szWarnings[] =
"3Can\'t use array index with non-array",
"3Incompatible return type: \'%s\' expected: \'%s\'",
"3Invalid number of parameters: %s expected: %s",
"3Incompatible parameter number %s expected: \'%s\'",
"3Incompatible parameter # %s expected: \'%s\'",
"3Duplicate Declaration of Function %s",
"3Function \'%s\' conflicting with its declaration",
"3Variable \'%s\' used but never initialized",

View File

@@ -236,7 +236,7 @@ void hb_compStrongType( int iSize )
PCOMDECLARED pDeclared;
ULONG ulPos = pFunc->lPCodePos - iSize;
SHORT wVar = 0;
char szType1[32], szType2[32], cType, cSubType1 = 0, cSubType2 = 0;
BYTE szType1[32], szType2[32], cType, cSubType1 = 0, cSubType2 = 0;
BYTE bLast1, bLast2;
/* Make sure we have enough stack space. */
@@ -274,8 +274,8 @@ void hb_compStrongType( int iSize )
sprintf( szType1, "%c", pDeclared->cType );
/* Variant as SubType. */
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
strcpy( szType2, "Variant.SubType\[NIL]" );
@@ -305,9 +305,10 @@ void hb_compStrongType( int iSize )
{
int iParamCount = hb_comp_iParamCount, iOptionals = 0;
/* First, find how many optionals. */
while ( --iParamCount >= 0 )
{
if ( hb_comp_cParamTypes[ iParamCount ] > 122 )
if ( hb_comp_cParamTypes[ iParamCount ] == ( ' ' + VT_OFFSET_OPTIONAL ) || hb_comp_cParamTypes[ iParamCount ] >= ( 'A' + VT_OFFSET_OPTIONAL ) )
iOptionals++;
else
break;
@@ -315,31 +316,37 @@ void hb_compStrongType( int iSize )
//printf( "\nOptionals: %i\n", iOptionals );
/* Now, check the types. */
if( wVar >= ( hb_comp_iParamCount - iOptionals ) && wVar <= hb_comp_iParamCount )
{
BYTE iOffset = 0, iParamBase = pFunc->iStackIndex - wVar;
BYTE iOffset = 0, iParamBase = pFunc->iStackIndex - wVar, cFormalType;
while ( iOffset < wVar )
{
if ( pFunc->pStack[ iParamBase + iOffset ] > 122 )
/* cSubType1 = */( pFunc->pStack[ iParamBase + iOffset ] -= 100 );
cFormalType = hb_comp_cParamTypes[ iOffset ];
if ( hb_comp_cParamTypes[ iOffset ] > 122 )
hb_comp_cParamTypes[ iOffset ] -= 100;
if ( cFormalType == ( ' ' + VT_OFFSET_OPTIONAL ) || cFormalType >= ( 'A' + VT_OFFSET_OPTIONAL ) )
cFormalType -= VT_OFFSET_OPTIONAL;
if ( hb_comp_cParamTypes[ iOffset ] != ' ' && hb_comp_cParamTypes[ iOffset ] != pFunc->pStack[ iParamBase + iOffset ] )
if ( cFormalType != ' ' && cFormalType != pFunc->pStack[ iParamBase + iOffset ] )
{
if ( cFormalType > ( 'A' + VT_OFFSET_BYREF ) )
sprintf( szType2, "@%c", cFormalType - VT_OFFSET_BYREF );
else
sprintf( szType2, "%c", cFormalType );
sprintf( szType1, "%i", iOffset + 1 );
sprintf( szType2, "%c", hb_comp_cParamTypes[ iOffset ] );
hb_compGenWarning( hb_comp_szWarnings, 'W', HB_COMP_WARN_PARAM_TYPE, szType1, szType2 );
}
iOffset++;
}
}
else
{
sprintf( szType1, "%i", wVar );
sprintf( szType2, "%i", hb_comp_iParamCount );
sprintf( szType2, "%i", hb_comp_iParamCount - iOptionals );
hb_compGenWarning( hb_comp_szWarnings, 'W', HB_COMP_WARN_PARAM_COUNT, szType1, szType2 );
}
}
@@ -387,8 +394,8 @@ void hb_compStrongType( int iSize )
case HB_P_DEC :
case HB_P_INC :
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
strcpy( szType1, "Variant.SubType\[NIL]" );
@@ -420,8 +427,8 @@ void hb_compStrongType( int iSize )
/* TODO Error Message after finalizing all possible pcodes. */
break;
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
strcpy( szType1, "Variant.SubType\[NIL]" );
@@ -449,11 +456,11 @@ void hb_compStrongType( int iSize )
/* TODO Error Message after finalizing all possible pcodes. */
break;
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= VT_OFFSET_VARIANT );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
strcpy( szType1, "Variant.SubType\[NIL]" );
@@ -523,11 +530,11 @@ void hb_compStrongType( int iSize )
//printf( "\nTop: %c Bottom: %c Typ-SubType: %c Bottom->SubType: %c\n", pFunc->pStack[ pFunc->iStackIndex], pFunc->pStack[ pFunc->iStackIndex - 1 ], pFunc->pStack[ pFunc->iStackIndex] - 100, pFunc->pStack[ pFunc->iStackIndex - 1 ] - 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= VT_OFFSET_VARIANT );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
strcpy( szType1, "Variant.SubType\[NIL]" );
@@ -611,11 +618,11 @@ void hb_compStrongType( int iSize )
/* TODO Error Message after finalizing all possible pcodes. */
break;
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= VT_OFFSET_VARIANT );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
sprintf( szType1, "Variant.SubType\[NIL]" );
@@ -685,11 +692,11 @@ void hb_compStrongType( int iSize )
/* TODO Error Message after finalizing all possible pcodes. */
break;
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= VT_OFFSET_VARIANT );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
sprintf( szType1, "Variant.SubType\[NIL]" );
@@ -756,11 +763,11 @@ void hb_compStrongType( int iSize )
/* TODO Error Message after finalizing all possible pcodes. */
break;
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 122 )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex - 1 ] > 'z' )
cSubType1 = ( pFunc->pStack[ pFunc->iStackIndex - 1 ] -= VT_OFFSET_VARIANT );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= 100 );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
cSubType2 = ( pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT );
if ( cSubType1 && cSubType1 == '-' )
sprintf( szType1, "Variant.SubType\[NIL]" );
@@ -920,7 +927,7 @@ void hb_compStrongType( int iSize )
pVar = pFunc->pMemvars;
while ( pVar )
{
if ( pVar->cType > 122 )
if ( pVar->cType > 'z' )
pVar->cType = ' ';
pVar = pVar->pNext;
@@ -931,6 +938,7 @@ void hb_compStrongType( int iSize )
break;
case HB_P_PUSHLOCALNEAR :
case HB_P_PUSHLOCALREF :
case HB_P_PUSHLOCAL :
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHLOCALNEAR )
wVar = ( SHORT ) pFunc->pCode[ ulPos + 1 ];
@@ -960,18 +968,21 @@ void hb_compStrongType( int iSize )
/* Mark as used */
pVar->iUsed |= VU_USED;
pFunc->pStack[ pFunc->iStackIndex++ ] = pVar->cType;
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHLOCALREF )
pFunc->pStack[ pFunc->iStackIndex++ ] = pVar->cType + VT_OFFSET_BYREF;
else
pFunc->pStack[ pFunc->iStackIndex++ ] = pVar->cType;
}
else
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHLOCALREF )
pFunc->pStack[ pFunc->iStackIndex++ ] = '@';
else
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
break;
case HB_P_PUSHLOCALREF :
/* QUESTION: Fall from above, or use a "REFERENCED" type. */
pFunc->pStack[ pFunc->iStackIndex++ ] = 'R';
break;
case HB_P_PUSHSTATICREF :
case HB_P_PUSHSTATIC :
pTmp = hb_comp_functions.pFirst;
wVar = pFunc->pCode[ ulPos + 1 ] + pFunc->pCode[ ulPos + 2 ] * 256;
@@ -993,17 +1004,19 @@ void hb_compStrongType( int iSize )
/* Mark as used */
pVar->iUsed |= VU_USED;
pFunc->pStack[ pFunc->iStackIndex++ ] = pVar->cType;
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHSTATICREF )
pFunc->pStack[ pFunc->iStackIndex++ ] = pVar->cType + VT_OFFSET_BYREF;
else
pFunc->pStack[ pFunc->iStackIndex++ ] = pVar->cType;
}
else
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHSTATICREF )
pFunc->pStack[ pFunc->iStackIndex++ ] = '@';
else
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
break;
case HB_P_PUSHSTATICREF :
/* Question use type "REFERENCE" or the base type of the var */
pFunc->pStack[ pFunc->iStackIndex++ ] = 'R';
case HB_P_PUSHVARIABLE :
/* Type can not be detrmined at compile time. */
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
@@ -1032,13 +1045,17 @@ void hb_compStrongType( int iSize )
/* Fall through - don't add break */
case HB_P_PUSHMEMVARREF :
case HB_P_PUSHMEMVAR :
if ( ! pSym )
pSym = hb_compSymbolGetPos( pFunc->pCode[ ulPos + 1 ] + pFunc->pCode[ ulPos + 2 ] * 256 );
if ( pSym )
{
pFunc->pStack[ pFunc->iStackIndex++ ] = pSym->cType;
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHMEMVARREF )
pFunc->pStack[ pFunc->iStackIndex++ ] = pSym->cType + VT_OFFSET_BYREF;
else
pFunc->pStack[ pFunc->iStackIndex++ ] = pSym->cType;
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHMEMVAR && pSym->szName )
{
@@ -1061,7 +1078,6 @@ void hb_compStrongType( int iSize )
if ( pVar )
{
pFunc->pStack[ pFunc->iStackIndex - 1 ] = pVar->cType;
//printf( "\nPused: %s Type: %c SubType: %c\n", pVar->szName, pVar->cType, pVar->cType - 100 );
if ( ! ( pVar->iUsed & VU_INITIALIZED ) )
@@ -1069,18 +1085,21 @@ void hb_compStrongType( int iSize )
/* Mark as used */
pVar->iUsed |= VU_USED;
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHMEMVARREF )
pFunc->pStack[ pFunc->iStackIndex - 1 ] = pVar->cType + VT_OFFSET_BYREF;
else
pFunc->pStack[ pFunc->iStackIndex - 1 ] = pVar->cType;
}
}
else
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
if ( pFunc->pCode[ ulPos ] == HB_P_PUSHMEMVARREF )
pFunc->pStack[ pFunc->iStackIndex++ ] = '@';
else
pFunc->pStack[ pFunc->iStackIndex++ ] = ' ';
break;
case HB_P_PUSHMEMVARREF :
/* Question use type "REFERENCE" or the base type of the var */
pFunc->pStack[ pFunc->iStackIndex++ ] = 'R';
break;
/* Arrays. */
case HB_P_ARRAYDIM :
@@ -1147,8 +1166,8 @@ void hb_compStrongType( int iSize )
{
BYTE cVarType = pFunc->pStack[ pFunc->iStackIndex - 1 ];
if ( cVarType > 122 )
cVarType -= 100;
if ( cVarType > 'z' )
cVarType -= VT_OFFSET_VARIANT;
if ( cVarType == ' ' )
{
@@ -1182,11 +1201,11 @@ void hb_compStrongType( int iSize )
{
BYTE cVarType = pFunc->pStack[ pFunc->iStackIndex - 1 ], cElementType = pFunc->pStack[ pFunc->iStackIndex - 2 ];
if ( cVarType > 122 )
cVarType -= 100;
if ( cVarType > 'z' )
cVarType -= VT_OFFSET_VARIANT;
if ( cElementType > 122 )
cElementType -= 100;
if ( cElementType > 'z' )
cElementType -= VT_OFFSET_VARIANT;
if ( cVarType == ' ' )
hb_compGenWarning( hb_comp_szWarnings, 'W', HB_COMP_WARN_OPERAND_SUSPECT, "A", NULL );
@@ -1348,14 +1367,14 @@ void hb_compStrongType( int iSize )
//printf( "\nSymbol: %s Variable: %s Type: %c #%i Function: %s\n", pSym->szName, pVar->szName, pVar->cType, wVar, pFunc->szName );
/* Allow any type into a Variant, and record the subtype */
if ( pVar->cType == ' ' || pVar->cType > 122 )
if ( pVar->cType == ' ' || pVar->cType > 'z' )
{
if ( pFunc->pStack[ pFunc->iStackIndex ] == ' ' )
pVar->cType = ' ';
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ];
else
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ] + 100;
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ] + VT_OFFSET_VARIANT;
//printf( "\nSymbol: %s Variable: %s Assigned Type: \'%c\' SubType: %c #%i Stack: %i\n", pSym->szName, pVar->szName, pVar->cType, pVar->cType - 100, wVar, pFunc->iStackIndex );
}
@@ -1366,8 +1385,8 @@ void hb_compStrongType( int iSize )
//printf( "Variable: %s Type: \'%c\' SubType: %c Comparing: %c Recorded: %s\n", pSym->szName, pVar->cType, pVar->cType - 100, pFunc->pStack[ pFunc->iStackIndex ], szType );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
pFunc->pStack[ pFunc->iStackIndex ] -= 100;
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT;
if ( pFunc->pStack[ pFunc->iStackIndex ] == '-' )
; /* NIL allowed into all types */
@@ -1386,22 +1405,22 @@ void hb_compStrongType( int iSize )
else
{
/* Allow any type into a Variant, and record the subtype */
if ( pSym->cType == ' ' || pSym->cType > 122 )
if ( pSym->cType == ' ' || pSym->cType > 'z' )
{
if ( pFunc->pStack[ pFunc->iStackIndex ] == ' ' )
pSym->cType = ' ';
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pSym->cType = pFunc->pStack[ pFunc->iStackIndex ];
else
pSym->cType = pFunc->pStack[ pFunc->iStackIndex ] + 100;
pSym->cType = pFunc->pStack[ pFunc->iStackIndex ] + VT_OFFSET_VARIANT;
}
else
{
char szType[2];
sprintf( szType, "%c", pSym->cType );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
pFunc->pStack[ pFunc->iStackIndex ] -= 100;
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT;
if ( pFunc->pStack[ pFunc->iStackIndex ] == '-' )
; /* NIL allowed into all types */
@@ -1454,22 +1473,22 @@ void hb_compStrongType( int iSize )
pVar->iUsed |= VU_INITIALIZED;
/* Allow any type into a Variant, and record the subtype */
if ( pVar->cType == ' ' || pVar->cType > 122 )
if ( pVar->cType == ' ' || pVar->cType > 'z' )
{
if ( pFunc->pStack[ pFunc->iStackIndex ] == ' ' )
pVar->cType = ' ';
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ];
else
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ] + 100;
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ] + VT_OFFSET_VARIANT;
}
else
{
char szType[2];
sprintf( szType, "%c", pVar->cType );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
pFunc->pStack[ pFunc->iStackIndex ] -= 100;
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT;
if ( pFunc->pStack[ pFunc->iStackIndex ] == '-' )
; /* NIL allowed into all types */
@@ -1504,22 +1523,22 @@ void hb_compStrongType( int iSize )
pVar->iUsed |= VU_INITIALIZED;
/* Allow any type into a Variant, and record the subtype */
if ( pVar->cType == ' ' || pVar->cType > 122 )
if ( pVar->cType == ' ' || pVar->cType > 'z' )
{
if ( pFunc->pStack[ pFunc->iStackIndex ] == ' ' )
pVar->cType = ' ';
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
else if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ];
else
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ] + 100;
pVar->cType = pFunc->pStack[ pFunc->iStackIndex ] + VT_OFFSET_VARIANT;
}
else
{
char szType[2];
sprintf( szType, "%c", pVar->cType );
if ( pFunc->pStack[ pFunc->iStackIndex ] > 122 )
pFunc->pStack[ pFunc->iStackIndex ] -= 100;
if ( pFunc->pStack[ pFunc->iStackIndex ] > 'z' )
pFunc->pStack[ pFunc->iStackIndex ] -= VT_OFFSET_VARIANT;
if ( pFunc->pStack[ pFunc->iStackIndex ] == '-' )
; /* NIL allowed into all types */

View File

@@ -51,7 +51,7 @@
DECLARE FUNCTION nMyFunc( cVar AS STRING, nVar AS NUMERIC ) AS NUMERIC
DECLARE FUNCTION cOtherFunc( cVar as char, optional nVar as num, optional other as variant ) AS CHAR
DECLARE FUNCTION cOtherFunc( @cVar as char, optional nVar as num, optional other as variant ) AS CHAR
DECLARE FUNCTION cOtherFunc( ) AS CHAR
@@ -68,10 +68,10 @@ MEMVAR Var1 AS CHAR
STATIC lGlobal AS LOGICAL
PROCEDURE THEMAIN()
PROCEDURE THEMAIN( optional )
STATIC lStatic := 0
LOCAL cVar AS CHAR := 'Hello'
LOCAL cVar AS CHAR := [declare function]
FIELD b AS NUM
USE TEMP
@@ -81,8 +81,12 @@ PROCEDURE THEMAIN()
PRIVATE TEST AS CHAR
IF optional
? 'Ok'
ENDIF
x := cOtherFunc( 'A' )
x := cOtherFunc( 1 )
x := cOtherFunc( @Test )
x := cOtherFunc( 'A', 'A', 'A' )
M->TEST := "TEST" //OK - no warnings here