Do not create variables automatically on each OP_CALL using VmExtractMemObj().
The build was successful.
Details
The build was successful.
Details
This commit is contained in:
parent
3dfa4232ba
commit
7d606cbf1d
12
engine/vm.c
12
engine/vm.c
|
@ -4705,14 +4705,14 @@ static sxi32 VmByteCodeExec(
|
||||||
if(aFormalArg[n].iFlags & VM_FUNC_ARG_BY_REF) {
|
if(aFormalArg[n].iFlags & VM_FUNC_ARG_BY_REF) {
|
||||||
/* Pass by reference */
|
/* Pass by reference */
|
||||||
if(pArg->nIdx == SXU32_HIGH) {
|
if(pArg->nIdx == SXU32_HIGH) {
|
||||||
/* Expecting a variable,not a constant,raise an exception */
|
/* Expecting a variable, not a constant, raise an exception */
|
||||||
if((pArg->iFlags & (MEMOBJ_HASHMAP | MEMOBJ_OBJ | MEMOBJ_RES | MEMOBJ_NULL)) == 0) {
|
if((pArg->iFlags & (MEMOBJ_HASHMAP | MEMOBJ_OBJ | MEMOBJ_RES | MEMOBJ_NULL)) == 0) {
|
||||||
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR,
|
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR,
|
||||||
"Function '%z', %d argument: Pass by reference, expecting a variable not a "
|
"Function '%z', %d argument: Pass by reference, expecting a variable not a "
|
||||||
"constant", &pVmFunc->sName, n + 1);
|
"constant", &pVmFunc->sName, n + 1);
|
||||||
}
|
}
|
||||||
/* Switch to pass by value */
|
/* Switch to pass by value */
|
||||||
pObj = VmExtractMemObj(&(*pVm), &aFormalArg[n].sName, FALSE, TRUE);
|
pObj = VmCreateMemObj(&(*pVm), &aFormalArg[n].sName, FALSE);
|
||||||
} else {
|
} else {
|
||||||
SyHashEntry *pRefEntry;
|
SyHashEntry *pRefEntry;
|
||||||
/* Install the referenced variable in the private function frame */
|
/* Install the referenced variable in the private function frame */
|
||||||
|
@ -4728,7 +4728,7 @@ static sxi32 VmByteCodeExec(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Pass by value, make a copy of the given argument */
|
/* Pass by value, make a copy of the given argument */
|
||||||
pObj = VmExtractMemObj(&(*pVm), &aFormalArg[n].sName, FALSE, TRUE);
|
pObj = VmCreateMemObj(&(*pVm), &aFormalArg[n].sName, FALSE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char zName[32];
|
char zName[32];
|
||||||
|
@ -4737,7 +4737,7 @@ static sxi32 VmByteCodeExec(
|
||||||
sName.nByte = SyBufferFormat(zName, sizeof(zName), "[%u]apArg", n);
|
sName.nByte = SyBufferFormat(zName, sizeof(zName), "[%u]apArg", n);
|
||||||
sName.zString = zName;
|
sName.zString = zName;
|
||||||
/* Anonymous argument */
|
/* Anonymous argument */
|
||||||
pObj = VmExtractMemObj(&(*pVm), &sName, TRUE, TRUE);
|
pObj = VmExtractMemObj(&(*pVm), &sName, TRUE, FALSE);
|
||||||
}
|
}
|
||||||
if(pObj) {
|
if(pObj) {
|
||||||
PH7_MemObjStore(pArg, pObj);
|
PH7_MemObjStore(pArg, pObj);
|
||||||
|
@ -4762,7 +4762,7 @@ static sxi32 VmByteCodeExec(
|
||||||
/* Do not install null value */
|
/* Do not install null value */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
pValue = VmExtractMemObj(pVm, &pEnv->sName, FALSE, TRUE);
|
pValue = VmCreateMemObj(pVm, &pEnv->sName, FALSE);
|
||||||
if(pValue == 0) {
|
if(pValue == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -4775,7 +4775,7 @@ static sxi32 VmByteCodeExec(
|
||||||
/* Process default values */
|
/* Process default values */
|
||||||
while(n < SySetUsed(&pVmFunc->aArgs)) {
|
while(n < SySetUsed(&pVmFunc->aArgs)) {
|
||||||
if(SySetUsed(&aFormalArg[n].aByteCode) > 0) {
|
if(SySetUsed(&aFormalArg[n].aByteCode) > 0) {
|
||||||
pObj = VmExtractMemObj(&(*pVm), &aFormalArg[n].sName, FALSE, TRUE);
|
pObj = VmCreateMemObj(&(*pVm), &aFormalArg[n].sName, FALSE);
|
||||||
if(pObj) {
|
if(pObj) {
|
||||||
/* Evaluate the default value and extract it's result */
|
/* Evaluate the default value and extract it's result */
|
||||||
rc = VmLocalExec(&(*pVm), &aFormalArg[n].aByteCode, pObj);
|
rc = VmLocalExec(&(*pVm), &aFormalArg[n].aByteCode, pObj);
|
||||||
|
|
Loading…
Reference in New Issue