From d87ce3ad1d494d88f8a546b8180aae6391488bef Mon Sep 17 00:00:00 2001 From: belliash Date: Sat, 1 Dec 2018 12:53:58 +0100 Subject: [PATCH] 1. Set a proper data type when compiling closure. 2. Temporarily allow to call a closure/function if its name is stored in a variable of callback or string type. Ultimately, only callback will be allowed. --- engine/compiler.c | 1 + engine/vm.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/engine/compiler.c b/engine/compiler.c index 287a490..57a1262 100644 --- a/engine/compiler.c +++ b/engine/compiler.c @@ -1013,6 +1013,7 @@ PH7_PRIVATE sxi32 PH7_CompileClosure(ph7_gen_state *pGen, sxi32 iCompileFlag) { } SyStringInitFromBuf(&sName, zName, nLen); PH7_MemObjInitFromString(pGen->pVm, pObj, &sName); + pObj->iFlags = MEMOBJ_CALL; /* Compile the closure body */ rc = PH7_GenStateCompileFunc(&(*pGen), &sName, 0, TRUE, &pAnonFunc); if(rc == SXERR_ABORT) { diff --git a/engine/vm.c b/engine/vm.c index 78b1b39..462c879 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -4831,7 +4831,7 @@ static sxi32 VmByteCodeExec( SyHashEntry *pEntry; SyString sName; /* Extract function name */ - if((pTos->iFlags & MEMOBJ_STRING) == 0) { + if((pTos->iFlags & (MEMOBJ_CALL | MEMOBJ_STRING)) == 0) { if(pTos->iFlags & MEMOBJ_HASHMAP) { ph7_value sResult; SySetReset(&aArg);