Enable classes to inherit or implement built-in classes
This commit is contained in:
parent
eb30745e6e
commit
5fb05d4ef7
31
engine/oop.c
31
engine/oop.c
|
@ -336,6 +336,22 @@ PH7_PRIVATE sxi32 PH7_ClassInterfaceInherit(ph7_class *pSub, ph7_class *pBase) {
|
||||||
SyHashEntry *pEntry;
|
SyHashEntry *pEntry;
|
||||||
SyString *pName;
|
SyString *pName;
|
||||||
sxi32 rc;
|
sxi32 rc;
|
||||||
|
/* Copy flags */
|
||||||
|
if( pBase->iFlags & PH7_CLASS_THROWABLE ){
|
||||||
|
pSub->iFlags |= PH7_CLASS_THROWABLE;
|
||||||
|
}
|
||||||
|
if( pBase->iFlags & PH7_CLASS_ARRAYACCESS ){
|
||||||
|
pSub->iFlags |= PH7_CLASS_ARRAYACCESS;
|
||||||
|
}
|
||||||
|
if( pBase->iFlags & PH7_CLASS_COUNTABLE ){
|
||||||
|
pSub->iFlags |= PH7_CLASS_COUNTABLE;
|
||||||
|
}
|
||||||
|
if( pBase->iFlags & PH7_CLASS_TRAVERSE ){
|
||||||
|
pSub->iFlags |= PH7_CLASS_TRAVERSE;
|
||||||
|
}
|
||||||
|
if( pBase->iFlags & PH7_CLASS_CALLABLE ){
|
||||||
|
pSub->iFlags |= PH7_CLASS_CALLABLE;
|
||||||
|
}
|
||||||
/* Install in the derived hashtable */
|
/* Install in the derived hashtable */
|
||||||
SyHashInsert(&pBase->hDerived, (const void *)SyStringData(&pSub->sName), SyStringLength(&pSub->sName), pSub);
|
SyHashInsert(&pBase->hDerived, (const void *)SyStringData(&pSub->sName), SyStringLength(&pSub->sName), pSub);
|
||||||
SyHashResetLoopCursor(&pBase->hAttr);
|
SyHashResetLoopCursor(&pBase->hAttr);
|
||||||
|
@ -389,6 +405,19 @@ PH7_PRIVATE sxi32 PH7_ClassImplement(ph7_class *pMain, ph7_class *pInterface) {
|
||||||
SyHashEntry *pEntry;
|
SyHashEntry *pEntry;
|
||||||
SyString *pName;
|
SyString *pName;
|
||||||
sxi32 rc;
|
sxi32 rc;
|
||||||
|
/* Copy flags */
|
||||||
|
if( pInterface->iFlags & PH7_CLASS_THROWABLE ){
|
||||||
|
pMain->iFlags |= PH7_CLASS_THROWABLE;
|
||||||
|
}
|
||||||
|
if( pInterface->iFlags & PH7_CLASS_ARRAYACCESS ){
|
||||||
|
pMain->iFlags |= PH7_CLASS_ARRAYACCESS;
|
||||||
|
}
|
||||||
|
if( pInterface->iFlags & PH7_CLASS_COUNTABLE ){
|
||||||
|
pMain->iFlags |= PH7_CLASS_COUNTABLE;
|
||||||
|
}
|
||||||
|
if( pInterface->iFlags & PH7_CLASS_TRAVERSE ){
|
||||||
|
pMain->iFlags |= PH7_CLASS_TRAVERSE;
|
||||||
|
}
|
||||||
/* First off,copy all constants declared inside the interface */
|
/* First off,copy all constants declared inside the interface */
|
||||||
SyHashResetLoopCursor(&pInterface->hAttr);
|
SyHashResetLoopCursor(&pInterface->hAttr);
|
||||||
while((pEntry = SyHashGetNextEntry(&pInterface->hAttr)) != 0) {
|
while((pEntry = SyHashGetNextEntry(&pInterface->hAttr)) != 0) {
|
||||||
|
@ -821,7 +850,7 @@ PH7_PRIVATE sxi32 PH7_ClassInstanceCmp(ph7_class_instance *pLeft, ph7_class_inst
|
||||||
* are identical if and only if they refer to the same instance
|
* are identical if and only if they refer to the same instance
|
||||||
* of the same class.
|
* of the same class.
|
||||||
*/
|
*/
|
||||||
return !(pLeft == pRight);
|
return pLeft != pRight;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Attribute comparison.
|
* Attribute comparison.
|
||||||
|
|
Loading…
Reference in New Issue