diff --git a/engine/compiler.c b/engine/compiler.c index ed6c32a..08b296e 100644 --- a/engine/compiler.c +++ b/engine/compiler.c @@ -3215,7 +3215,7 @@ loop: } pGen->pIn++; /* Jump the equal sign */ /* Allocate a new class attribute */ - pCons = PH7_NewClassAttr(pGen->pVm, pName, nLine, iProtection, iFlags, 0); + pCons = PH7_NewClassAttr(pGen->pVm, &pClass->sName, pName, nLine, iProtection, iFlags, 0); if(pCons == 0) { PH7_GenCompileError(pGen, E_ERROR, nLine, "PH7 is running out-of-memory"); } @@ -3308,7 +3308,7 @@ loop: PH7_GenCompileError(pGen, E_ERROR, nLine, "Expected '=' or ';' after attribute name '%z'", pName); } /* Allocate a new class attribute */ - pAttr = PH7_NewClassAttr(pGen->pVm, pName, nLine, iProtection, iFlags, nType); + pAttr = PH7_NewClassAttr(pGen->pVm, &pClass->sName, pName, nLine, iProtection, iFlags, nType); if(pAttr == 0) { PH7_GenCompileError(pGen, E_ERROR, nLine, "PH7 engine is running out-of-memory"); } diff --git a/engine/oop.c b/engine/oop.c index 0d47be1..51f16fa 100644 --- a/engine/oop.c +++ b/engine/oop.c @@ -67,7 +67,7 @@ PH7_PRIVATE ph7_class *PH7_NewRawClass(ph7_vm *pVm, const SyString *pName) { * Allocate and initialize a new class attribute. * Return a pointer to the class attribute on success. NULL otherwise. */ -PH7_PRIVATE ph7_class_attr *PH7_NewClassAttr(ph7_vm *pVm, const SyString *pName, sxu32 nLine, sxi32 iProtection, sxi32 iFlags, sxu32 nType) { +PH7_PRIVATE ph7_class_attr *PH7_NewClassAttr(ph7_vm *pVm, const SyString *pClass, const SyString *pName, sxu32 nLine, sxi32 iProtection, sxi32 iFlags, sxu32 nType) { ph7_class_attr *pAttr; char *zName; pAttr = (ph7_class_attr *)SyMemBackendPoolAlloc(&pVm->sAllocator, sizeof(ph7_class_attr)); @@ -82,9 +82,16 @@ PH7_PRIVATE ph7_class_attr *PH7_NewClassAttr(ph7_vm *pVm, const SyString *pName, SyMemBackendPoolFree(&pVm->sAllocator, pAttr); return 0; } + SyStringInitFromBuf(&pAttr->sName, zName, pName->nByte); + /* Duplicate class name */ + zName = SyMemBackendStrDup(&pVm->sAllocator, pClass->zString, pClass->nByte); + if(zName == 0) { + SyMemBackendPoolFree(&pVm->sAllocator, pAttr); + return 0; + } + SyStringInitFromBuf(&pAttr->sClass, zName, pName->nByte); /* Initialize fields */ SySetInit(&pAttr->aByteCode, &pVm->sAllocator, sizeof(VmInstr)); - SyStringInitFromBuf(&pAttr->sName, zName, pName->nByte); pAttr->iProtection = iProtection; pAttr->nIdx = SXU32_HIGH; pAttr->iFlags = iFlags; diff --git a/include/ph7int.h b/include/ph7int.h index b0c86e5..04e9a1c 100644 --- a/include/ph7int.h +++ b/include/ph7int.h @@ -1066,6 +1066,7 @@ struct ph7_class { * in an instance of the following structure. */ struct ph7_class_attr { + SyString sClass; /* Class name */ SyString sName; /* Attribute name */ sxi32 iFlags; /* Attribute configuration [i.e: static, variable, constant, etc.] */ sxi32 iProtection; /* Protection level [i.e: public, private, protected] */ @@ -1756,7 +1757,7 @@ PH7_PRIVATE sxi32 PH7_ParseIniString(ph7_context *pCtx, const char *zIn, sxu32 n /* oo.c function prototypes */ PH7_PRIVATE ph7_class_info *PH7_NewClassInfo(ph7_vm *pVm, const SyString *pName); PH7_PRIVATE ph7_class *PH7_NewRawClass(ph7_vm *pVm, const SyString *pName); -PH7_PRIVATE ph7_class_attr *PH7_NewClassAttr(ph7_vm *pVm, const SyString *pName, sxu32 nLine, sxi32 iProtection, sxi32 iFlags, sxu32 nType); +PH7_PRIVATE ph7_class_attr *PH7_NewClassAttr(ph7_vm *pVm, const SyString *pClass, const SyString *pName, sxu32 nLine, sxi32 iProtection, sxi32 iFlags, sxu32 nType); PH7_PRIVATE ph7_class_method *PH7_NewClassMethod(ph7_vm *pVm, ph7_class *pClass, const SyString *pName, sxu32 nLine, sxi32 iProtection, sxi32 iFlags, sxi32 iFuncFlags); PH7_PRIVATE ph7_class_method *PH7_ClassExtractMethod(ph7_class *pClass, const char *zName, sxu32 nByte);