Matt Diephouse wrote:
It looks like the PMC variant is correct in this case, because Object
isn't actually a class. There's a class flag for PMCs that sets
whether or not they are a class and Object doesn't have this set.
When you call the PMC variant of isa, it calls Parrot_object_isa, and
that has this code:
/* if this is not a class */
if (!PObj_is_class_TEST(pmc)) {
pmc = VTABLE_get_class(interp, pmc);
}
So since Object isn't a class, it calls the get_class vtable and gets
the Class pmc. It then tests the object to see if it's a Class, which
it obviously isn't.
You should always get the same answer from the 'isa' opcode, whether you
pass in a string or a PMC. In this case, object.pmc should override the
'isa' vtable method to delegate the lookup to the object's class.
(ParrotObject.pmc inherits an overridden 'isa' from ParrotClass.pmc.)
Ultimately, both variants of the 'isa' opcode should call the vtable
'isa' (preserving encapsulation, allowing vtable overriding, etc.) This
means the vtable isa needs to be able to handle keyed lookup. (Unless we
reverse the decision of RT#39045.)
An object should never report that it 'isa' Object, it should only
report an 'isa' relationship to the classes it inherited from.
(Different HLLs will have different notional hierarchies, and we don't
want Parrot's low-level implementation details to be visible in the mix.)
Allison