Resolve __CLASS__ at compile time.
The build was successful.
Details
The build was successful.
Details
Ticket: #45: __CLASS__ constant must be resolved at compile time, not run time. Otherwise it returns incorrect data.
This commit is contained in:
parent
3e18a5b8e8
commit
dbe373d537
|
@ -1236,6 +1236,28 @@ static sxi32 PH7_GenStateLoadLiteral(ph7_gen_state *pGen) {
|
||||||
/* Emit the load constant instruction */
|
/* Emit the load constant instruction */
|
||||||
PH7_VmEmitInstr(pGen->pVm, PH7_OP_LOADC, 0, nIdx, 0, 0);
|
PH7_VmEmitInstr(pGen->pVm, PH7_OP_LOADC, 0, nIdx, 0, 0);
|
||||||
return SXRET_OK;
|
return SXRET_OK;
|
||||||
|
} else if(pStr->nByte == sizeof("__CLASS__") - 1 && SyMemcmp(pStr->zString, "__CLASS__", sizeof("__CLASS__") - 1) == 0) {
|
||||||
|
GenBlock *pBlock = pGen->pCurrent;
|
||||||
|
while(pBlock && (pBlock->iFlags & GEN_BLOCK_CLASS) == 0) {
|
||||||
|
/* Point to the upper block */
|
||||||
|
pBlock = pBlock->pParent;
|
||||||
|
}
|
||||||
|
if(pBlock == 0) {
|
||||||
|
/* Called in the global scope,load NULL */
|
||||||
|
PH7_VmEmitInstr(pGen->pVm, PH7_OP_LOADC, 0, 0, 0, 0);
|
||||||
|
} else {
|
||||||
|
/* Extract the target class */
|
||||||
|
ph7_class_info *pClassInfo = (ph7_class_info *)pBlock->pUserData;
|
||||||
|
pObj = PH7_ReserveConstObj(pGen->pVm, &nIdx);
|
||||||
|
if(pObj == 0) {
|
||||||
|
PH7_GenCompileError(pGen, E_ERROR, pToken->nLine, "Fatal, PH7 engine is running out of memory");
|
||||||
|
return SXERR_ABORT;
|
||||||
|
}
|
||||||
|
PH7_MemObjInitFromString(pGen->pVm, pObj, &pClassInfo->sName);
|
||||||
|
/* Emit the load constant instruction */
|
||||||
|
PH7_VmEmitInstr(pGen->pVm, PH7_OP_LOADC, 0, nIdx, 0, 0);
|
||||||
|
}
|
||||||
|
return SXRET_OK;
|
||||||
} else if((pStr->nByte == sizeof("__FUNCTION__") - 1 &&
|
} else if((pStr->nByte == sizeof("__FUNCTION__") - 1 &&
|
||||||
SyMemcmp(pStr->zString, "__FUNCTION__", sizeof("__FUNCTION__") - 1) == 0) ||
|
SyMemcmp(pStr->zString, "__FUNCTION__", sizeof("__FUNCTION__") - 1) == 0) ||
|
||||||
(pStr->nByte == sizeof("__METHOD__") - 1 &&
|
(pStr->nByte == sizeof("__METHOD__") - 1 &&
|
||||||
|
|
|
@ -1100,7 +1100,6 @@ static void PH7_static_Const(ph7_value *pVal, void *pUserData) {
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* self
|
* self
|
||||||
* __CLASS__
|
|
||||||
* Expand the name of the current class. NULL otherwise.
|
* Expand the name of the current class. NULL otherwise.
|
||||||
*/
|
*/
|
||||||
static void PH7_self_Const(ph7_value *pVal, void *pUserData) {
|
static void PH7_self_Const(ph7_value *pVal, void *pUserData) {
|
||||||
|
@ -1274,7 +1273,6 @@ static const ph7_builtin_constant aBuiltIn[] = {
|
||||||
{"EXTR_PREFIX_IF_EXISTS", PH7_EXTR_PREFIX_IF_EXISTS_Const},
|
{"EXTR_PREFIX_IF_EXISTS", PH7_EXTR_PREFIX_IF_EXISTS_Const},
|
||||||
{"static", PH7_static_Const },
|
{"static", PH7_static_Const },
|
||||||
{"self", PH7_self_Const },
|
{"self", PH7_self_Const },
|
||||||
{"__CLASS__", PH7_self_Const },
|
|
||||||
{"parent", PH7_parent_Const }
|
{"parent", PH7_parent_Const }
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue