1) New syntax for method declaration, now requiring a strict data type to be passed (i.e. void main()), 2) New syntax for attributes declaration, als orequiring a strict data type before variable name (i.e. string $str).
This commit is contained in:
parent
128f4bba01
commit
c26f8cd777
|
@ -3592,7 +3592,6 @@ static sxi32 PH7_GenStateCompileClassMethod(
|
||||||
sxi32 rc;
|
sxi32 rc;
|
||||||
/* Extract visibility level */
|
/* Extract visibility level */
|
||||||
iProtection = PH7_GetProtectionLevel(iProtection);
|
iProtection = PH7_GetProtectionLevel(iProtection);
|
||||||
pGen->pIn++; /* Jump the 'function' keyword */
|
|
||||||
iFuncFlags = 0;
|
iFuncFlags = 0;
|
||||||
if(pGen->pIn >= pGen->pEnd) {
|
if(pGen->pIn >= pGen->pEnd) {
|
||||||
/* Invalid method name */
|
/* Invalid method name */
|
||||||
|
@ -3869,15 +3868,6 @@ static sxi32 PH7_CompileClassInterface(ph7_gen_state *pGen) {
|
||||||
PH7_GenCompileError(&(*pGen), E_WARNING, pGen->pIn->nLine, "interface: Access type must be public");
|
PH7_GenCompileError(&(*pGen), E_WARNING, pGen->pIn->nLine, "interface: Access type must be public");
|
||||||
nKwrd = PH7_KEYWORD_PUBLIC;
|
nKwrd = PH7_KEYWORD_PUBLIC;
|
||||||
}
|
}
|
||||||
if(nKwrd != PH7_KEYWORD_PUBLIC && nKwrd != PH7_KEYWORD_FUNCTION && nKwrd != PH7_KEYWORD_CONST && nKwrd != PH7_KEYWORD_STATIC) {
|
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
|
||||||
"Expecting method signature or constant declaration inside interface '%z'", pName);
|
|
||||||
if(rc == SXERR_ABORT) {
|
|
||||||
/* Error count limit reached,abort immediately */
|
|
||||||
return SXERR_ABORT;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
if(nKwrd == PH7_KEYWORD_PUBLIC) {
|
if(nKwrd == PH7_KEYWORD_PUBLIC) {
|
||||||
/* Advance the stream cursor */
|
/* Advance the stream cursor */
|
||||||
pGen->pIn++;
|
pGen->pIn++;
|
||||||
|
@ -3890,19 +3880,11 @@ static sxi32 PH7_CompileClassInterface(ph7_gen_state *pGen) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
/* Extract the keyword */
|
||||||
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
if(nKwrd != PH7_KEYWORD_FUNCTION && nKwrd != PH7_KEYWORD_CONST && nKwrd != PH7_KEYWORD_STATIC) {
|
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
|
||||||
"Expecting method signature or constant declaration inside interface '%z'", pName);
|
|
||||||
if(rc == SXERR_ABORT) {
|
|
||||||
/* Error count limit reached,abort immediately */
|
|
||||||
return SXERR_ABORT;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(nKwrd == PH7_KEYWORD_CONST) {
|
if(nKwrd == PH7_KEYWORD_CONST) {
|
||||||
/* Parse constant */
|
/* Process constant declaration */
|
||||||
rc = PH7_GenStateCompileClassConstant(&(*pGen), 0, 0, pClass);
|
rc = PH7_GenStateCompileClassConstant(&(*pGen), 0, 0, pClass);
|
||||||
if(rc != SXRET_OK) {
|
if(rc != SXRET_OK) {
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
|
@ -3917,8 +3899,7 @@ static sxi32 PH7_CompileClassInterface(ph7_gen_state *pGen) {
|
||||||
iFlags |= PH7_CLASS_ATTR_STATIC;
|
iFlags |= PH7_CLASS_ATTR_STATIC;
|
||||||
/* Advance the stream cursor */
|
/* Advance the stream cursor */
|
||||||
pGen->pIn++;
|
pGen->pIn++;
|
||||||
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0
|
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0) {
|
||||||
|| SX_PTR_TO_INT(pGen->pIn->pUserData) != PH7_KEYWORD_FUNCTION) {
|
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Expecting method signature inside interface '%z'", pName);
|
"Expecting method signature inside interface '%z'", pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
|
@ -3927,9 +3908,65 @@ static sxi32 PH7_CompileClassInterface(ph7_gen_state *pGen) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
/* Extract the keyword */
|
||||||
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
|
if(nKwrd == PH7_KEYWORD_PRIVATE || nKwrd == PH7_KEYWORD_PROTECTED) {
|
||||||
|
/* Emit a warning and switch to public visibility */
|
||||||
|
PH7_GenCompileError(&(*pGen), E_WARNING, pGen->pIn->nLine, "interface: Access type must be public");
|
||||||
|
nKwrd = PH7_KEYWORD_PUBLIC;
|
||||||
}
|
}
|
||||||
|
if(nKwrd == PH7_KEYWORD_PUBLIC) {
|
||||||
|
/* Advance the stream cursor */
|
||||||
|
pGen->pIn++;
|
||||||
|
/* Extract the keyword */
|
||||||
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if((nKwrd & PH7_KEYWORD_TYPEDEF) == 0) {
|
||||||
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
|
"Unexpected token '%z', expecting data type for method signature inside interface '%z'",
|
||||||
|
&pGen->pIn->sData, pName);
|
||||||
|
if(rc == SXERR_ABORT) {
|
||||||
|
/* Error count limit reached,abort immediately */
|
||||||
|
return SXERR_ABORT;
|
||||||
|
}
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
sxu32 nType;
|
||||||
|
sxu32 nKey = (sxu32)(SX_PTR_TO_INT(pGen->pIn->pUserData));
|
||||||
|
if(nKey & PH7_KEYWORD_BOOL) {
|
||||||
|
nType = MEMOBJ_BOOL;
|
||||||
|
} else if(nKey & PH7_KEYWORD_CALLBACK) {
|
||||||
|
nType = MEMOBJ_CALL;
|
||||||
|
} else if(nKey & PH7_KEYWORD_CHAR) {
|
||||||
|
nType = MEMOBJ_CHAR;
|
||||||
|
} else if(nKey & PH7_KEYWORD_FLOAT) {
|
||||||
|
nType = MEMOBJ_REAL;
|
||||||
|
} else if(nKey & PH7_KEYWORD_INT) {
|
||||||
|
nType = MEMOBJ_INT;
|
||||||
|
} else if(nKey & PH7_KEYWORD_MIXED) {
|
||||||
|
nType = MEMOBJ_MIXED;
|
||||||
|
} else if(nKey & PH7_KEYWORD_OBJECT) {
|
||||||
|
nType = MEMOBJ_OBJ;
|
||||||
|
} else if(nKey & PH7_KEYWORD_RESOURCE) {
|
||||||
|
nType = MEMOBJ_RES;
|
||||||
|
} else if(nKey & PH7_KEYWORD_STRING) {
|
||||||
|
nType = MEMOBJ_STRING;
|
||||||
|
} else if(nKey & PH7_KEYWORD_VOID) {
|
||||||
|
nType = MEMOBJ_VOID;
|
||||||
|
} else {
|
||||||
|
PH7_GenCompileError(&(*pGen), E_ERROR, pGen->pIn->nLine, "Invalid return data type '%z'", &pGen->pIn->sData);
|
||||||
|
}
|
||||||
|
pGen->pIn++; /* Jump the return data type */
|
||||||
|
if(pGen->pIn->nType & PH7_TK_OSB && pGen->pIn[1].nType & PH7_TK_CSB) {
|
||||||
|
pGen->pIn += 2;
|
||||||
|
nType |= MEMOBJ_HASHMAP;
|
||||||
|
}
|
||||||
|
if(pGen->pIn->nType & PH7_TK_DOLLAR/*'$'*/) {
|
||||||
|
PH7_GenCompileError(&(*pGen), E_ERROR, pGen->pIn->nLine, "Attributes cannot be declared inside interface '%z'", pName);
|
||||||
|
} else {
|
||||||
/* Process method signature */
|
/* Process method signature */
|
||||||
rc = PH7_GenStateCompileClassMethod(&(*pGen), 0, 0, iFlags, FALSE/* Only method signature*/, pClass);
|
rc = PH7_GenStateCompileClassMethod(&(*pGen), nType, 0, iFlags, FALSE/* Only method signature*/, pClass);
|
||||||
if(rc != SXRET_OK) {
|
if(rc != SXRET_OK) {
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
return SXERR_ABORT;
|
return SXERR_ABORT;
|
||||||
|
@ -3938,6 +3975,7 @@ static sxi32 PH7_CompileClassInterface(ph7_gen_state *pGen) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* Install the interface */
|
/* Install the interface */
|
||||||
rc = PH7_VmInstallClass(pGen->pVm, pClass);
|
rc = PH7_VmInstallClass(pGen->pVm, pClass);
|
||||||
if(iP1) {
|
if(iP1) {
|
||||||
|
@ -4122,9 +4160,9 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
/* End of class body */
|
/* End of class body */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if((pGen->pIn->nType & (PH7_TK_KEYWORD | PH7_TK_DOLLAR)) == 0) {
|
if((pGen->pIn->nType & PH7_TK_KEYWORD) == 0) {
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Unexpected token '%z'. Expecting attribute declaration inside class '%z'",
|
"Unexpected token '%z'. Expecting attribute or method declaration inside class '%z'",
|
||||||
&pGen->pIn->sData, pName);
|
&pGen->pIn->sData, pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
/* Error count limit reached,abort immediately */
|
/* Error count limit reached,abort immediately */
|
||||||
|
@ -4135,15 +4173,14 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
/* Assume public visibility */
|
/* Assume public visibility */
|
||||||
iProtection = PH7_KEYWORD_PUBLIC;
|
iProtection = PH7_KEYWORD_PUBLIC;
|
||||||
iAttrflags = 0;
|
iAttrflags = 0;
|
||||||
if(pGen->pIn->nType & PH7_TK_KEYWORD) {
|
|
||||||
/* Extract the current keyword */
|
/* Extract the current keyword */
|
||||||
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
if(nKwrd == PH7_KEYWORD_PUBLIC || nKwrd == PH7_KEYWORD_PRIVATE || nKwrd == PH7_KEYWORD_PROTECTED) {
|
if(nKwrd == PH7_KEYWORD_PUBLIC || nKwrd == PH7_KEYWORD_PRIVATE || nKwrd == PH7_KEYWORD_PROTECTED) {
|
||||||
iProtection = nKwrd;
|
iProtection = nKwrd;
|
||||||
pGen->pIn++; /* Jump the visibility token */
|
pGen->pIn++; /* Jump the visibility token */
|
||||||
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & (PH7_TK_KEYWORD | PH7_TK_DOLLAR)) == 0) {
|
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0) {
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Unexpected token '%z'. Expecting attribute declaration inside class '%z'",
|
"Unexpected token '%z'. Expecting attribute or method declaration inside class '%z'",
|
||||||
&pGen->pIn->sData, pName);
|
&pGen->pIn->sData, pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
/* Error count limit reached,abort immediately */
|
/* Error count limit reached,abort immediately */
|
||||||
|
@ -4151,17 +4188,6 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if(pGen->pIn->nType & PH7_TK_DOLLAR) {
|
|
||||||
/* Attribute declaration */
|
|
||||||
rc = PH7_GenStateCompileClassAttr(&(*pGen), iProtection, iAttrflags, pClass);
|
|
||||||
if(rc != SXRET_OK) {
|
|
||||||
if(rc == SXERR_ABORT) {
|
|
||||||
return SXERR_ABORT;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* Extract the keyword */
|
/* Extract the keyword */
|
||||||
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
}
|
}
|
||||||
|
@ -4179,17 +4205,9 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
/* Static method or attribute,record that */
|
/* Static method or attribute,record that */
|
||||||
iAttrflags |= PH7_CLASS_ATTR_STATIC;
|
iAttrflags |= PH7_CLASS_ATTR_STATIC;
|
||||||
pGen->pIn++; /* Jump the static keyword */
|
pGen->pIn++; /* Jump the static keyword */
|
||||||
if(pGen->pIn < pGen->pEnd && (pGen->pIn->nType & PH7_TK_KEYWORD)) {
|
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0) {
|
||||||
/* Extract the keyword */
|
|
||||||
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
|
||||||
if(nKwrd == PH7_KEYWORD_PUBLIC || nKwrd == PH7_KEYWORD_PRIVATE || nKwrd == PH7_KEYWORD_PROTECTED) {
|
|
||||||
iProtection = nKwrd;
|
|
||||||
pGen->pIn++; /* Jump the visibility token */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & (PH7_TK_KEYWORD | PH7_TK_DOLLAR)) == 0) {
|
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Unexpected token '%z',Expecting method,attribute or constant declaration inside class '%z'",
|
"Unexpected token '%z',Expecting attribute or method declaration inside class '%z'",
|
||||||
&pGen->pIn->sData, pName);
|
&pGen->pIn->sData, pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
/* Error count limit reached,abort immediately */
|
/* Error count limit reached,abort immediately */
|
||||||
|
@ -4197,16 +4215,11 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if(pGen->pIn->nType & PH7_TK_DOLLAR) {
|
/* Extract the keyword */
|
||||||
/* Attribute declaration */
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
rc = PH7_GenStateCompileClassAttr(&(*pGen), iProtection, iAttrflags, pClass);
|
if(nKwrd == PH7_KEYWORD_PUBLIC || nKwrd == PH7_KEYWORD_PRIVATE || nKwrd == PH7_KEYWORD_PROTECTED) {
|
||||||
if(rc != SXRET_OK) {
|
iProtection = nKwrd;
|
||||||
if(rc == SXERR_ABORT) {
|
pGen->pIn++; /* Jump the visibility token */
|
||||||
return SXERR_ABORT;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
/* Extract the keyword */
|
/* Extract the keyword */
|
||||||
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
|
@ -4228,10 +4241,11 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
iAttrflags |= PH7_CLASS_ATTR_STATIC;
|
iAttrflags |= PH7_CLASS_ATTR_STATIC;
|
||||||
pGen->pIn++; /* Jump the static keyword */
|
pGen->pIn++; /* Jump the static keyword */
|
||||||
}
|
}
|
||||||
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0 ||
|
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0 ||
|
||||||
SX_PTR_TO_INT(pGen->pIn->pUserData) != PH7_KEYWORD_FUNCTION) {
|
((nKwrd & PH7_KEYWORD_TYPEDEF) == 0 && pGen->pIn[2].nType != PH7_TK_LPAREN)) {
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Unexpected token '%z',Expecting method declaration after 'virtual' keyword inside class '%z'",
|
"Unexpected token '%z', expecting method declaration after 'virtual' keyword inside class '%z'",
|
||||||
&pGen->pIn->sData, pName);
|
&pGen->pIn->sData, pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
/* Error count limit reached, abort immediately */
|
/* Error count limit reached, abort immediately */
|
||||||
|
@ -4239,7 +4253,6 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
nKwrd = PH7_KEYWORD_FUNCTION;
|
|
||||||
} else if(nKwrd == PH7_KEYWORD_FINAL) {
|
} else if(nKwrd == PH7_KEYWORD_FINAL) {
|
||||||
/* final method ,record that */
|
/* final method ,record that */
|
||||||
iAttrflags |= PH7_CLASS_ATTR_FINAL;
|
iAttrflags |= PH7_CLASS_ATTR_FINAL;
|
||||||
|
@ -4258,10 +4271,11 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
iAttrflags |= PH7_CLASS_ATTR_STATIC;
|
iAttrflags |= PH7_CLASS_ATTR_STATIC;
|
||||||
pGen->pIn++; /* Jump the static keyword */
|
pGen->pIn++; /* Jump the static keyword */
|
||||||
}
|
}
|
||||||
|
nKwrd = SX_PTR_TO_INT(pGen->pIn->pUserData);
|
||||||
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0 ||
|
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_KEYWORD) == 0 ||
|
||||||
SX_PTR_TO_INT(pGen->pIn->pUserData) != PH7_KEYWORD_FUNCTION) {
|
((nKwrd & PH7_KEYWORD_TYPEDEF) == 0 && pGen->pIn[2].nType != PH7_TK_LPAREN)) {
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Unexpected token '%z',Expecting method declaration after 'final' keyword inside class '%z'",
|
"Unexpected token '%z', expecting method declaration after 'final' keyword inside class '%z'",
|
||||||
&pGen->pIn->sData, pName);
|
&pGen->pIn->sData, pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
/* Error count limit reached, abort immediately */
|
/* Error count limit reached, abort immediately */
|
||||||
|
@ -4269,11 +4283,10 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
nKwrd = PH7_KEYWORD_FUNCTION;
|
|
||||||
}
|
}
|
||||||
if(nKwrd != PH7_KEYWORD_FUNCTION && nKwrd != PH7_KEYWORD_VAR) {
|
if((nKwrd & PH7_KEYWORD_TYPEDEF) == 0) {
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
||||||
"Unexpected token '%z',Expecting method declaration inside class '%z'",
|
"Unexpected token '%z', expecting data type for attribute or method declaration inside class '%z'",
|
||||||
&pGen->pIn->sData, pName);
|
&pGen->pIn->sData, pName);
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
/* Error count limit reached,abort immediately */
|
/* Error count limit reached,abort immediately */
|
||||||
|
@ -4281,22 +4294,42 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
}
|
}
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if(nKwrd == PH7_KEYWORD_VAR) {
|
sxu32 nType;
|
||||||
pGen->pIn++; /* Jump the 'var' keyword */
|
sxu32 nKey = (sxu32)(SX_PTR_TO_INT(pGen->pIn->pUserData));
|
||||||
if(pGen->pIn >= pGen->pEnd || (pGen->pIn->nType & PH7_TK_DOLLAR/*'$'*/) == 0) {
|
if(nKey & PH7_KEYWORD_BOOL) {
|
||||||
rc = PH7_GenCompileError(pGen, E_ERROR, pGen->pIn->nLine,
|
nType = MEMOBJ_BOOL;
|
||||||
"Expecting attribute declaration after 'var' keyword");
|
} else if(nKey & PH7_KEYWORD_CALLBACK) {
|
||||||
if(rc == SXERR_ABORT) {
|
nType = MEMOBJ_CALL;
|
||||||
/* Error count limit reached,abort immediately */
|
} else if(nKey & PH7_KEYWORD_CHAR) {
|
||||||
return SXERR_ABORT;
|
nType = MEMOBJ_CHAR;
|
||||||
|
} else if(nKey & PH7_KEYWORD_FLOAT) {
|
||||||
|
nType = MEMOBJ_REAL;
|
||||||
|
} else if(nKey & PH7_KEYWORD_INT) {
|
||||||
|
nType = MEMOBJ_INT;
|
||||||
|
} else if(nKey & PH7_KEYWORD_MIXED) {
|
||||||
|
nType = MEMOBJ_MIXED;
|
||||||
|
} else if(nKey & PH7_KEYWORD_OBJECT) {
|
||||||
|
nType = MEMOBJ_OBJ;
|
||||||
|
} else if(nKey & PH7_KEYWORD_RESOURCE) {
|
||||||
|
nType = MEMOBJ_RES;
|
||||||
|
} else if(nKey & PH7_KEYWORD_STRING) {
|
||||||
|
nType = MEMOBJ_STRING;
|
||||||
|
} else if(nKey & PH7_KEYWORD_VOID) {
|
||||||
|
nType = MEMOBJ_VOID;
|
||||||
|
} else {
|
||||||
|
PH7_GenCompileError(&(*pGen), E_ERROR, pGen->pIn->nLine, "Invalid return data type '%z'", &pGen->pIn->sData);
|
||||||
}
|
}
|
||||||
goto done;
|
pGen->pIn++; /* Jump the return data type */
|
||||||
|
if(pGen->pIn->nType & PH7_TK_OSB && pGen->pIn[1].nType & PH7_TK_CSB) {
|
||||||
|
pGen->pIn += 2;
|
||||||
|
nType |= MEMOBJ_HASHMAP;
|
||||||
}
|
}
|
||||||
|
if(pGen->pIn->nType & PH7_TK_DOLLAR/*'$'*/) {
|
||||||
/* Attribute declaration */
|
/* Attribute declaration */
|
||||||
rc = PH7_GenStateCompileClassAttr(&(*pGen), iProtection, iAttrflags, pClass);
|
rc = PH7_GenStateCompileClassAttr(&(*pGen), iProtection, iAttrflags, pClass);
|
||||||
} else {
|
} else {
|
||||||
/* Process method declaration */
|
/* Process method declaration */
|
||||||
rc = PH7_GenStateCompileClassMethod(&(*pGen), 0, iProtection, iAttrflags, TRUE, pClass);
|
rc = PH7_GenStateCompileClassMethod(&(*pGen), nType, iProtection, iAttrflags, TRUE, pClass);
|
||||||
}
|
}
|
||||||
if(rc != SXRET_OK) {
|
if(rc != SXRET_OK) {
|
||||||
if(rc == SXERR_ABORT) {
|
if(rc == SXERR_ABORT) {
|
||||||
|
@ -4305,16 +4338,6 @@ static sxi32 PH7_GenStateCompileClass(ph7_gen_state *pGen, sxi32 iFlags) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* Attribute declaration */
|
|
||||||
rc = PH7_GenStateCompileClassAttr(&(*pGen), iProtection, iAttrflags, pClass);
|
|
||||||
if(rc != SXRET_OK) {
|
|
||||||
if(rc == SXERR_ABORT) {
|
|
||||||
return SXERR_ABORT;
|
|
||||||
}
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* Install the class */
|
/* Install the class */
|
||||||
rc = PH7_VmInstallClass(pGen->pVm, pClass);
|
rc = PH7_VmInstallClass(pGen->pVm, pClass);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user