diff --git a/engine/vm.c b/engine/vm.c index 9f6d005..53423b1 100644 --- a/engine/vm.c +++ b/engine/vm.c @@ -6402,7 +6402,8 @@ static int VmQueryInterfaceSet(ph7_class *pClass, SySet *pSet) { * Otherwise FALSE is returned. */ static int VmInstanceOf(ph7_class *pThis, ph7_class *pClass) { - ph7_class *pParent; + SyHashEntry *pEntry; + ph7_class *pDerived, *pParent; sxi32 rc; if(pThis == pClass) { /* Instance of the same class */ @@ -6413,20 +6414,34 @@ static int VmInstanceOf(ph7_class *pThis, ph7_class *pClass) { if(rc) { return TRUE; } - /* Check parent classes */ - pParent = pThis->pBase; - while(pParent) { - if(pParent == pClass) { + /* Check derived classes */ + SyHashResetLoopCursor(&pThis->hDerived); + while((pEntry = SyHashGetNextEntry(&pThis->hDerived)) != 0) { + pDerived = (ph7_class *) pEntry->pUserData; + if(pDerived == pClass) { /* Same instance */ return TRUE; } /* Check the implemented interfaces */ - rc = VmQueryInterfaceSet(pClass, &pParent->aInterface); + rc = VmQueryInterfaceSet(pClass, &pDerived->aInterface); if(rc) { return TRUE; } - /* Point to the parent class */ - pParent = pParent->pBase; + /* Check parent classes */ + pParent = pDerived->pBase; + while(pParent) { + if(pParent == pClass) { + /* Same instance */ + return TRUE; + } + /* Check the implemented interfaces */ + rc = VmQueryInterfaceSet(pClass, &pParent->aInterface); + if(rc) { + return TRUE; + } + /* Point to the parent class */ + pParent = pParent->pBase; + } } /* Not an instance of the the given class */ return FALSE;