diff --git a/harbour/ChangeLog b/harbour/ChangeLog index ae5a1ad7af..2ca0ffdafc 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,4 +1,34 @@ +20000508-22:50 GMT-8 Ron Pinkas + + * 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 + *doc/genhtm.rsp +Added lang.txt to HBDOC response file *doc/en/compiler.txt diff --git a/harbour/include/hbcomp.h b/harbour/include/hbcomp.h index f8ddab5b56..1df5425a06 100644 --- a/harbour/include/hbcomp.h +++ b/harbour/include/hbcomp.h @@ -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 */ diff --git a/harbour/source/compiler/harbour.c b/harbour/source/compiler/harbour.c index 43e282ddc1..66d375be92 100644 --- a/harbour/source/compiler/harbour.c +++ b/harbour/source/compiler/harbour.c @@ -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; } diff --git a/harbour/source/compiler/harbour.l b/harbour/source/compiler/harbour.l index 88a74b9fd6..ea1c239430 100644 --- a/harbour/source/compiler/harbour.l +++ b/harbour/source/compiler/harbour.l @@ -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_ diff --git a/harbour/source/compiler/harbour.y b/harbour/source/compiler/harbour.y index 7968f98014..1afcf10ddf 100644 --- a/harbour/source/compiler/harbour.y +++ b/harbour/source/compiler/harbour.y @@ -195,7 +195,7 @@ char * hb_comp_szAnnounce = NULL; /* ANNOUNCEd procedure */ %type NUM_INTEGER %type NUM_LONG %type FunScope AsType AsArray -%type Params ParamList DecParams DecParamList OptParams +%type Params ParamList DecParams DecList FormalList OptList Optional %type IfBegin VarList ExtVarList %type FieldList %type 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 { $$ = 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, $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 diff --git a/harbour/source/compiler/hbgenerr.c b/harbour/source/compiler/hbgenerr.c index e0b0df8144..c9b846334b 100644 --- a/harbour/source/compiler/hbgenerr.c +++ b/harbour/source/compiler/hbgenerr.c @@ -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", diff --git a/harbour/source/compiler/hbpcode.c b/harbour/source/compiler/hbpcode.c index e8a9c64d7e..3a3a7d1b65 100644 --- a/harbour/source/compiler/hbpcode.c +++ b/harbour/source/compiler/hbpcode.c @@ -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 */ diff --git a/harbour/tests/testwarn.prg b/harbour/tests/testwarn.prg index 19fe3f1e45..0db02f5ac8 100644 --- a/harbour/tests/testwarn.prg +++ b/harbour/tests/testwarn.prg @@ -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