From 9e06322b57cac8974c99fe8f97a7ffad729d49a2 Mon Sep 17 00:00:00 2001 From: belliash Date: Mon, 15 Apr 2019 17:04:44 +0200 Subject: [PATCH] Implement VmCreateMemObj(). --- engine/vm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/engine/vm.c b/engine/vm.c index 1ba3b26..02cf18a 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -1331,6 +1331,58 @@ PH7_PRIVATE ph7_value *PH7_ReserveMemObj(ph7_vm *pVm) { pObj->nIdx = nIdx; return pObj; } +/* + * Creates a variable value in the top active VM frame. + * Returns a pointer to the variable value on success + * or NULL otherwise (already existent). + */ +static ph7_value *VmCreateMemObj( + ph7_vm *pVm, /* Target VM */ + const SyString *pName, /* Variable name */ + sxbool bDup /* True to duplicate variable name */ +) { + sxu32 nIdx; + sxi32 rc; + SyHashEntry *pEntry; + /* Query the top active frame */ + pEntry = SyHashGet(&pVm->pFrame->hVar, (const void *)pName->zString, pName->nByte); + if(pEntry) { + /* Variable already exists */ + return 0; + } + ph7_value *pObj; + VmSlot sLocal; + char *zName = (char *)pName->zString; + pObj = PH7_ReserveMemObj(&(*pVm)); + if(pObj == 0) { + return 0; + } + nIdx = pObj->nIdx; + if(bDup) { + /* Duplicate name */ + zName = SyMemBackendStrDup(&pVm->sAllocator, pName->zString, pName->nByte); + if(zName == 0) { + return 0; + } + } + /* Link to the top active VM frame */ + rc = SyHashInsert(&pVm->pFrame->hVar, zName, pName->nByte, SX_INT_TO_PTR(nIdx)); + if(rc != SXRET_OK) { + /* Return the slot to the free pool */ + sLocal.nIdx = nIdx; + sLocal.pUserData = 0; + SySetPut(&pVm->aFreeObj, (const void *)&sLocal); + return 0; + } + /* Register local variable */ + sLocal.nIdx = nIdx; + SySetPut(&pVm->pFrame->sLocal, (const void *)&sLocal); + /* Install in the reference table */ + PH7_VmRefObjInstall(&(*pVm), nIdx, SyHashLastEntry(&pVm->pFrame->hVar), 0, 0); + /* Save object index */ + pObj->nIdx = nIdx; + return pObj; +} /* * Extract a variable value from the top active VM frame. * Return a pointer to the variable value on success.