A PASM version of the test case is:
newclass P16, "A"
subclass P16, P16, "B"
subclass P16, P16, "C"
end
I think I've figured out what's happening here. Stepping through the
code with gdb shows that the first subclassing works fine, but the second
blows up in Parrot_single_subclass at line 233:
temp_pmc =
VTABLE_clone(interpreter,
VTABLE_get_pmc_keyed_int(interpreter,
(PMC *)PMC_data(base_class), PCD_ALL_PARENTS));
This fetches the parent class's parent array, which is an Array PMC,
and which at this point contains a single entry -- a ParrotClass PMC
corresponding to class "A".
We then call the clone method of this array, in order to copy it to
temp_pmc.
This in turn calls list_clone in order to copy its data, and since our
list is comprised of a single PMC, list_clone calls its clone vtable
method.
BUT: this PMC is a ParrotClass, and there isn't currently a clone method
implemented for ParrotClass, so we fall back on the default option, which
is to throw an exception and die.
The only reason that this works the first time that we create a subclass
is that at that point the parent's parent list is empty.
An obvious fix for this would be to implement a clone method for
ParrotClass, but I'm not sure if this really makes sense, as we could
then potentially end up with multiple PMCs representing the same class.
(Also, implies that objects in deeply nested classes would have a
considerable memory overhead, since they'd each have to drag around PMCs
for each of their parent classes).
Simon