Browse Source

Strictly check for data type of static variable declaration.

pull/50/head
Rafal Kupiec 3 years ago
parent
commit
f927667d85
Signed by: belliash GPG Key ID: 4E829243E0CFE6B4
  1. 2
      engine/compiler.c
  2. 4
      engine/vm.c
  3. 1
      include/ph7int.h

2
engine/compiler.c

@ -2595,6 +2595,8 @@ static sxi32 PH7_CompileVar(ph7_gen_state *pGen) {
/* Restore default bytecode container */
PH7_VmSetByteCodeContainer(pGen->pVm, pInstrContainer);
}
/* Set static variable type */
sStatic.iFlags = nType;
/* Finally save the compiled static variable in the appropriate container */
SySetPut(&pFunc->aStatic, (const void *)&sStatic);
} else {

4
engine/vm.c

@ -4949,6 +4949,10 @@ static sxi32 VmByteCodeExec(
/* Evaluate initialization expression (Any complex expression) */
VmLocalExec(&(*pVm), &pStatic->aByteCode, pObj);
}
if(pObj->iFlags != pStatic->iFlags) {
PH7_VmThrowError(&(*pVm), PH7_CTX_ERR,
"Value does not match the data type of '$%z' variable", &pStatic->sName);
}
pObj->nIdx = pStatic->nIdx;
} else {
continue;

1
include/ph7int.h

@ -959,6 +959,7 @@ struct ph7_vm_func_arg {
*/
struct ph7_vm_func_static_var {
SyString sName; /* Static variable name */
sxi32 iFlags; /* Control flags */
SySet aByteCode; /* Compiled initialization expression */
sxu32 nIdx; /* Object index in the global memory object container */
};

Loading…
Cancel
Save