2017-03-28 23:02 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* include/hbcomp.h
  * include/hbcompdf.h
  * include/hberrors.h
  * include/hbexprb.c
  * src/common/expropt1.c
  * src/compiler/hbgenerr.c
  * src/compiler/hbmain.c
    + added new macros HB_ET_MACRO_NOLIST and HB_ET_MACRO_NOPARE
    % use new HB_ET_MACRO_* macros
    + added new compile time error:
         "Code block contains both macro and with object messages ':%s'"
      NOTE: -kd compiler switch allows to compile codeblocks with macros
            and declared symbols / with object messages
    * replaced hb_compErrorCodeblock() with hb_compErrorCodeblockDecl() and
      hb_compErrorCodeblockWith()
    + added new C function hb_compPushMacroVar()
    * code simplification
    ; added few comments

  * utils/hbtest/rt_math.prg
    * extended test code for macro messages and macro <op>=, pre/post ++/--
      operations

  * src/vm/hvm.c
    ! protection against executing hb_threadStateNew() during GC pass
      inside hb_vmRequestReenterExt()

  * src/vm/garbage.c
    ! add volatile attribute to s_bCollecting variable
    * small modification in hb_gcAll() parameter

  * src/rtl/errsys.prg
    ; minor comment cleanup

  * doc/xhb-diff.txt
    * extended a little bit section STRONG TYPED VARIABLES
This commit is contained in:
Przemysław Czerpak
2017-03-28 23:02:28 +02:00
parent 5f1da37fd2
commit 9153285bdf
13 changed files with 215 additions and 113 deletions

View File

@@ -839,9 +839,12 @@ static HB_EXPR_FUNC( hb_compExprUseRef )
PHB_EXPR pExp = pSelf->value.asReference;
if( pExp->ExprType == HB_ET_MACRO )
{
pExp->value.asMacro.SubType = HB_ET_MACRO_REFER;
HB_EXPR_USE( pExp, HB_EA_PUSH_PCODE );
break;
if( pExp->value.asMacro.SubType == HB_ET_MACRO_VAR )
{
pExp->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pExp, HB_EA_PUSH_PCODE );
break;
}
}
else if( pExp->ExprType == HB_ET_ARRAYAT )
{
@@ -1039,19 +1042,13 @@ static HB_EXPR_FUNC( hb_compExprUseList )
case HB_EA_REDUCE:
pSelf = hb_compExprReduceList( pSelf, HB_COMP_PARAM );
if( HB_SUPPORT_XBASE && pSelf->ExprType == HB_ET_LIST )
if( HB_SUPPORT_XBASE && pSelf->ExprType == HB_ET_LIST &&
hb_compExprListLen( pSelf ) == 1 )
{
if( hb_compExprListLen( pSelf ) == 1 )
{
PHB_EXPR pExpr = pSelf->value.asList.pExprList;
if( pExpr->ExprType == HB_ET_MACRO &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_SYMBOL &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_REFER &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_ALIASED )
{
pExpr->value.asMacro.SubType |= HB_ET_MACRO_PARE;
}
}
PHB_EXPR pExpr = pSelf->value.asList.pExprList;
if( pExpr->ExprType == HB_ET_MACRO &&
( pExpr->value.asMacro.SubType & HB_ET_MACRO_NOPARE ) == 0 )
pExpr->value.asMacro.SubType |= HB_ET_MACRO_PARE;
}
if( HB_SUPPORT_HARBOUR )
pSelf = hb_compExprListStrip( pSelf, HB_COMP_PARAM );
@@ -1091,12 +1088,8 @@ static HB_EXPR_FUNC( hb_compExprUseList )
if( HB_SUPPORT_XBASE )
{
if( pExpr->ExprType == HB_ET_MACRO &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_SYMBOL &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_REFER &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_ALIASED )
{
( pExpr->value.asMacro.SubType & HB_ET_MACRO_NOPARE ) == 0 )
pExpr->value.asMacro.SubType |= HB_ET_MACRO_PARE;
}
}
if( pExpr->pNext )
@@ -1122,12 +1115,8 @@ static HB_EXPR_FUNC( hb_compExprUseList )
if( HB_SUPPORT_XBASE )
{
if( pExpr->ExprType == HB_ET_MACRO &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_SYMBOL &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_REFER &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_ALIASED )
{
( pExpr->value.asMacro.SubType & HB_ET_MACRO_NOPARE ) == 0 )
pExpr->value.asMacro.SubType |= HB_ET_MACRO_PARE;
}
}
HB_EXPR_USE( pExpr, HB_EA_PUSH_POP );
@@ -1401,10 +1390,7 @@ static HB_EXPR_FUNC( hb_compExprUseArrayAt )
{
if( HB_SUPPORT_XBASE )
{
if( pSelf->value.asList.pIndex->value.asMacro.SubType != HB_ET_MACRO_SYMBOL &&
pSelf->value.asList.pIndex->value.asMacro.SubType != HB_ET_MACRO_REFER &&
pSelf->value.asList.pIndex->value.asMacro.SubType != HB_ET_MACRO_ALIASED &&
( pSelf->value.asList.pIndex->value.asMacro.SubType & HB_ET_MACRO_PARE ) == 0 )
if( ( pSelf->value.asList.pIndex->value.asMacro.SubType & HB_ET_MACRO_NOLIST ) == 0 )
{
pSelf->value.asList.pIndex->value.asMacro.SubType |= HB_ET_MACRO_LIST;
fMacroIndex = HB_TRUE;
@@ -1456,9 +1442,9 @@ static HB_EXPR_FUNC( hb_compExprUseArrayAt )
else if( pList->ExprType == HB_ET_MACRO &&
pList->value.asMacro.SubType == HB_ET_MACRO_VAR )
{
pList->value.asMacro.SubType = HB_ET_MACRO_REFER;
pList->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pList, HB_EA_PUSH_PCODE );
pList->value.asMacro.SubType = HB_ET_MACRO_VAR;
pList->value.asMacro.SubType &= ~HB_ET_MACRO_REFER;
}
else
HB_EXPR_USE( pList, HB_EA_PUSH_PCODE );
@@ -1478,14 +1464,12 @@ static HB_EXPR_FUNC( hb_compExprUseArrayAt )
case HB_EA_POP_PCODE:
{
HB_BOOL fMacroIndex = HB_FALSE;
if( pSelf->value.asList.pIndex->ExprType == HB_ET_MACRO )
{
if( HB_SUPPORT_XBASE )
{
if( pSelf->value.asList.pIndex->value.asMacro.SubType != HB_ET_MACRO_SYMBOL &&
pSelf->value.asList.pIndex->value.asMacro.SubType != HB_ET_MACRO_REFER &&
pSelf->value.asList.pIndex->value.asMacro.SubType != HB_ET_MACRO_ALIASED &&
( pSelf->value.asList.pIndex->value.asMacro.SubType & HB_ET_MACRO_PARE ) == 0 )
if( ( pSelf->value.asList.pIndex->value.asMacro.SubType & HB_ET_MACRO_NOLIST ) == 0 )
{
pSelf->value.asList.pIndex->value.asMacro.SubType |= HB_ET_MACRO_LIST;
fMacroIndex = HB_TRUE;
@@ -1539,9 +1523,9 @@ static HB_EXPR_FUNC( hb_compExprUseArrayAt )
else if( pList->ExprType == HB_ET_MACRO &&
pList->value.asMacro.SubType == HB_ET_MACRO_VAR )
{
pList->value.asMacro.SubType = HB_ET_MACRO_REFER;
pList->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pList, HB_EA_PUSH_PCODE );
pList->value.asMacro.SubType = HB_ET_MACRO_VAR;
pList->value.asMacro.SubType &= ~HB_ET_MACRO_REFER;
}
else
HB_EXPR_USE( pList, HB_EA_PUSH_PCODE );
@@ -1608,9 +1592,7 @@ static HB_EXPR_FUNC( hb_compExprUseMacro )
* 'szMacro' is a variable name
*/
#if ! defined( HB_MACRO_SUPPORT )
int iEarlyEvalPass = HB_COMP_PARAM->functions.pLast->iEarlyEvalPass;
HB_GEN_FUNC1( PushVar, pSelf->value.asMacro.szMacro );
HB_COMP_PARAM->functions.pLast->iEarlyEvalPass = iEarlyEvalPass;
hb_compPushMacroVar( HB_COMP_PARAM, pSelf->value.asMacro.szMacro );
#else
HB_GEN_FUNC1( PushVar, pSelf->value.asMacro.szMacro );
#endif
@@ -1646,10 +1628,16 @@ static HB_EXPR_FUNC( hb_compExprUseMacro )
if( pSelf->value.asMacro.SubType == HB_ET_MACRO_SYMBOL )
HB_GEN_FUNC1( PCode1, HB_P_MACROSYMBOL );
else if( pSelf->value.asMacro.SubType == HB_ET_MACRO_REFER )
else if( pSelf->value.asMacro.SubType & HB_ET_MACRO_REFER )
HB_GEN_FUNC1( PCode1, HB_P_MACROPUSHREF );
else if( pSelf->value.asMacro.SubType != HB_ET_MACRO_ALIASED )
else if( pSelf->value.asMacro.SubType == HB_ET_MACRO_ALIASED )
{
/* NOTE: pcode for alias context is generated in
* hb_compExprUseAliasVar()
*/
}
else
{
if( HB_SUPPORT_XBASE )
{
@@ -1678,10 +1666,6 @@ static HB_EXPR_FUNC( hb_compExprUseMacro )
/* Always add byte to pcode indicating requested macro compiler flag. */
HB_GEN_FUNC1( PCode1, ( HB_BYTE ) HB_MACRO_GENFLAGS );
}
/* NOTE: pcode for alias context is generated in
* hb_compExprUseAliasVar()
*/
break;
case HB_EA_POP_PCODE:
@@ -1700,9 +1684,7 @@ static HB_EXPR_FUNC( hb_compExprUseMacro )
* 'szMacro' is a variable name
*/
#if ! defined( HB_MACRO_SUPPORT )
int iEarlyEvalPass = HB_COMP_PARAM->functions.pLast->iEarlyEvalPass;
HB_GEN_FUNC1( PushVar, pSelf->value.asMacro.szMacro );
HB_COMP_PARAM->functions.pLast->iEarlyEvalPass = iEarlyEvalPass;
hb_compPushMacroVar( HB_COMP_PARAM, pSelf->value.asMacro.szMacro );
#else
HB_GEN_FUNC1( PushVar, pSelf->value.asMacro.szMacro );
#endif
@@ -4547,9 +4529,7 @@ static HB_BOOL hb_compExprCodeblockPush( PHB_EXPR pSelf, int iEarlyEvalPass, HB_
while( pExpr )
{
if( pExpr->ExprType == HB_ET_MACRO &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_SYMBOL &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_REFER &&
pExpr->value.asMacro.SubType != HB_ET_MACRO_ALIASED )
( pExpr->value.asMacro.SubType & HB_ET_MACRO_NOPARE ) == 0 )
{
/* Clipper allows for list expressions in a codeblock
* macro := "1,2"
@@ -4643,11 +4623,18 @@ static void hb_compExprCodeblockEarly( PHB_EXPR pSelf, HB_COMP_DECL )
}
else
{
/* everything else is macro compiled at runtime
* {|| &variable+1} => &( '{|| &variable+1}' )
/* generate code to check if macroexpression refers to local, static
* or field variables and generate error in such case or disable
* iEarlyEvalPass when -kd (MACRODECL) switch is used.
* In the 2nd case hb_compExprCodeblockPush() returns true and generated
* code is accepted otherwise discarded and we have to generate macro
* codeblock compiled at runtime.
*/
if( ! hb_compExprCodeblockPush( pSelf, 1, HB_COMP_PARAM ) )
{
/* -kd is not necessary, everything else is macro compiled at runtime
* {|| &variable+1} => &( '{|| &variable+1}' )
*/
HB_BOOL fMacroText = ( HB_COMP_PARAM->supported & HB_COMPFLAG_MACROTEXT ) != 0;
HB_COMP_PARAM->supported |= HB_COMPFLAG_MACROTEXT;
HB_COMP_PARAM->functions.pLast->iEarlyEvalPass = 2;
@@ -4890,7 +4877,7 @@ static void hb_compExprPushOperEq( PHB_EXPR pSelf, HB_BYTE bOpEq, HB_COMP_DECL )
if( usType == HB_ET_MACRO_VAR )
{
/* NOTE: direct type change */
pSelf->value.asOperator.pLeft->value.asMacro.SubType = HB_ET_MACRO_REFER;
pSelf->value.asOperator.pLeft->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
HB_EXPR_USE( pSelf->value.asOperator.pRight, HB_EA_PUSH_PCODE );
HB_GEN_FUNC1( PCode1, bNewOp );
@@ -5041,7 +5028,7 @@ static void hb_compExprUseOperEq( PHB_EXPR pSelf, HB_BYTE bOpEq, HB_COMP_DECL )
if( usType == HB_ET_MACRO_VAR )
{
/* NOTE: direct type change */
pSelf->value.asOperator.pLeft->value.asMacro.SubType = HB_ET_MACRO_REFER;
pSelf->value.asOperator.pLeft->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
HB_EXPR_USE( pSelf->value.asOperator.pRight, HB_EA_PUSH_PCODE );
HB_GEN_FUNC1( PCode1, bNewOp );
@@ -5155,7 +5142,7 @@ static void hb_compExprPushPreOp( PHB_EXPR pSelf, HB_BYTE bOper, HB_COMP_DECL )
{
HB_USHORT usType = pSelf->value.asOperator.pLeft->value.asMacro.SubType;
/* NOTE: direct type change */
pSelf->value.asOperator.pLeft->value.asMacro.SubType = HB_ET_MACRO_REFER;
pSelf->value.asOperator.pLeft->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
pSelf->value.asOperator.pLeft->value.asMacro.SubType = usType;
@@ -5262,7 +5249,7 @@ static void hb_compExprPushPostOp( PHB_EXPR pSelf, HB_BYTE bOper, HB_COMP_DECL )
{
HB_USHORT usType = pSelf->value.asOperator.pLeft->value.asMacro.SubType;
/* NOTE: direct type change */
pSelf->value.asOperator.pLeft->value.asMacro.SubType = HB_ET_MACRO_REFER;
pSelf->value.asOperator.pLeft->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
pSelf->value.asOperator.pLeft->value.asMacro.SubType = usType;
@@ -5371,7 +5358,7 @@ static void hb_compExprUsePreOp( PHB_EXPR pSelf, HB_BYTE bOper, HB_COMP_DECL )
{
HB_USHORT usType = pSelf->value.asOperator.pLeft->value.asMacro.SubType;
/* NOTE: direct type change */
pSelf->value.asOperator.pLeft->value.asMacro.SubType = HB_ET_MACRO_REFER;
pSelf->value.asOperator.pLeft->value.asMacro.SubType |= HB_ET_MACRO_REFER;
HB_EXPR_USE( pSelf->value.asOperator.pLeft, HB_EA_PUSH_PCODE );
pSelf->value.asOperator.pLeft->value.asMacro.SubType = usType;
@@ -5454,10 +5441,6 @@ static void hb_compExprUseAliasMacro( PHB_EXPR pAliasedVar, HB_BYTE bAction, HB_
*/
HB_GEN_FUNC2( PushString, pAlias->value.asSymbol.name, strlen( pAlias->value.asSymbol.name ) + 1 );
HB_EXPR_USE( pVar, HB_EA_PUSH_PCODE );
if( bAction == HB_EA_PUSH_PCODE )
HB_GEN_FUNC1( PCode1, HB_P_MACROPUSHALIASED );
else
HB_GEN_FUNC1( PCode1, HB_P_MACROPOPALIASED );
}
else if( pVar->ExprType == HB_ET_VARIABLE )
{
@@ -5466,21 +5449,18 @@ static void hb_compExprUseAliasMacro( PHB_EXPR pAliasedVar, HB_BYTE bAction, HB_
*/
HB_EXPR_USE( pAlias, HB_EA_PUSH_PCODE );
HB_GEN_FUNC2( PushString, pVar->value.asSymbol.name, strlen( pVar->value.asSymbol.name ) + 1 );
if( bAction == HB_EA_PUSH_PCODE )
HB_GEN_FUNC1( PCode1, HB_P_MACROPUSHALIASED );
else
HB_GEN_FUNC1( PCode1, HB_P_MACROPOPALIASED );
}
else
{
HB_EXPR_USE( pAlias, HB_EA_PUSH_PCODE );
HB_EXPR_USE( pVar, HB_EA_PUSH_PCODE );
if( bAction == HB_EA_PUSH_PCODE )
HB_GEN_FUNC1( PCode1, HB_P_MACROPUSHALIASED );
else
HB_GEN_FUNC1( PCode1, HB_P_MACROPOPALIASED );
}
if( bAction == HB_EA_PUSH_PCODE )
HB_GEN_FUNC1( PCode1, HB_P_MACROPUSHALIASED );
else
HB_GEN_FUNC1( PCode1, HB_P_MACROPOPALIASED );
/* Always add byte to pcode indicating requested macro compiler flag. */
HB_GEN_FUNC1( PCode1, ( HB_BYTE ) HB_MACRO_GENFLAGS );
}