From e47eef7d978b8012c6a1485bfeab4e577c439a4b Mon Sep 17 00:00:00 2001 From: belliash Date: Fri, 27 Jul 2018 20:01:45 +0200 Subject: [PATCH] Fix error reporting --- engine/oop.c | 29 ++++++++++++++--------------- engine/vm.c | 6 +++--- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/engine/oop.c b/engine/oop.c index 9782758..478edc2 100644 --- a/engine/oop.c +++ b/engine/oop.c @@ -218,7 +218,7 @@ PH7_PRIVATE sxi32 PH7_ClassInstallMethod(ph7_class *pClass, ph7_class_method *pM * Any other return value indicates failure and the upper layer must generate an appropriate * error message. */ -PH7_PRIVATE sxi32 PH7_ClassInherit(ph7_class *pSub, ph7_class *pBase) { +PH7_PRIVATE sxi32 PH7_ClassInherit(ph7_vm *pVm, ph7_class *pSub, ph7_class *pBase) { ph7_class_method *pMeth; ph7_class_attr *pAttr; SyHashEntry *pEntry; @@ -236,12 +236,12 @@ PH7_PRIVATE sxi32 PH7_ClassInherit(ph7_class *pSub, ph7_class *pBase) { pAttr = (ph7_class_attr *)pEntry->pUserData; pName = &pAttr->sName; if((pEntry = SyHashGet(&pSub->hAttr, (const void *)pName->zString, pName->nByte)) != 0) { - if(pAttr->iProtection == PH7_CLASS_PROT_PRIVATE && - ((ph7_class_attr *)pEntry->pUserData)->iProtection != PH7_CLASS_PROT_PUBLIC) { + if(pAttr->iProtection == PH7_CLASS_PROT_PRIVATE && ((ph7_class_attr *)pEntry->pUserData)->iProtection != PH7_CLASS_PROT_PUBLIC) { /* Cannot redeclare private attribute */ -// PH7_GenCompileError(&(*pGen), E_WARNING, ((ph7_class_attr *)pEntry->pUserData)->nLine, -// "Private attribute '%z::%z' redeclared inside child class '%z'", -// &pBase->sName, pName, &pSub->sName); + rc = VmErrorFormat(pVm, PH7_CTX_ERR, "Private attribute '%z::%z' redeclared inside child class '%z'", &pBase->sName, pName, &pSub->sName); + if(rc == SXERR_ABORT) { + return SXERR_ABORT; + } } continue; } @@ -261,20 +261,19 @@ PH7_PRIVATE sxi32 PH7_ClassInherit(ph7_class *pSub, ph7_class *pBase) { if((pEntry = SyHashGet(&pSub->hMethod, (const void *)pName->zString, pName->nByte)) != 0) { if(pMeth->iFlags & PH7_CLASS_ATTR_FINAL) { /* Cannot Overwrite final method */ -// rc = PH7_GenCompileError(&(*pGen), E_ERROR, ((ph7_class_method *)pEntry->pUserData)->nLine, -// "Cannot Overwrite final method '%z:%z' inside child class '%z'", -// &pBase->sName, pName, &pSub->sName); -// if(rc == SXERR_ABORT) { -// return SXERR_ABORT; -// } + rc = VmErrorFormat(&(*pVm), PH7_CTX_ERR, "Cannot overwrite final method '%z:%z()' inside child class '%z'", &pBase->sName, pName, &pSub->sName); + if(rc == SXERR_ABORT) { + return SXERR_ABORT; + } } continue; } else { if(pMeth->iFlags & PH7_CLASS_ATTR_ABSTRACT) { /* Abstract method must be defined in the child class */ -// PH7_GenCompileError(&(*pGen), E_WARNING, pMeth->nLine, -// "Abstract method '%z:%z' must be defined inside child class '%z'", -// &pBase->sName, pName, &pSub->sName); + rc = VmErrorFormat(&(*pVm), PH7_CTX_ERR, "Abstract method '%z:%z()' must be defined inside child class '%z'", &pBase->sName, pName, &pSub->sName); + if(rc == SXERR_ABORT) { + return SXERR_ABORT; + } continue; } } diff --git a/engine/vm.c b/engine/vm.c index 4324695..df1ee90 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -627,7 +627,7 @@ static int VmOverloadCompare(SyString *pFirst, SyString *pSecond) { } /* Forward declaration */ static sxi32 VmLocalExec(ph7_vm *pVm, SySet *pByteCode, ph7_value *pResult); -static sxi32 VmErrorFormat(ph7_vm *pVm, sxi32 iErr, const char *zFormat, ...); +sxi32 VmErrorFormat(ph7_vm *pVm, sxi32 iErr, const char *zFormat, ...); /* * Select the appropriate VM function for the current call context. * This is the implementation of the powerful 'function overloading' feature @@ -2267,7 +2267,7 @@ static sxi32 VmThrowErrorAp( * Simple boring wrapper function. * ------------------------------------ */ -static sxi32 VmErrorFormat(ph7_vm *pVm, sxi32 iErr, const char *zFormat, ...) { +sxi32 VmErrorFormat(ph7_vm *pVm, sxi32 iErr, const char *zFormat, ...) { va_list ap; sxi32 rc; va_start(ap, zFormat); @@ -4533,7 +4533,7 @@ static sxi32 VmByteCodeExec( /* Trying to inherit from final class */ VmErrorFormat(&(*pVm), PH7_CTX_ERR, "Class '%z' cannot inherit from final class '%z'", &pClass->sName.zString, &apExtends->zString); } - rc = PH7_ClassInherit(pClass, pBase); + rc = PH7_ClassInherit(pVm, pClass, pBase); if(rc != SXRET_OK) { break; }