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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user