Dan, I've been playing about with the new object stuff you added today, and I've noticed a couple of problems.
Firstly, when your doing the initialization for a new ParrotClass PMC, you create an Array to hold various other PMCs, but you don't size the array; this means that when you later try to put things in it in Parrot_new_class, it dies with: Array index out of bounds! The simplest solution is just to specify the size, as in the patch below. ------------ The other problem I noticed was that in a bunch of the ops you're using code like: PMC *class = VTABLE_get_pmc_keyed(interpreter, interpreter->class_hash, key_new_string(interpreter, $2)); to get the ParrotClass PMC, and then seeing whether it's a valid class by checking whether class is NULL. For instance, in findclass, you have: if (VTABLE_get_pmc_keyed(interpreter, interpreter->class_hash, key_new_string(interpreter, $2))) { $1 = 1; } else { $1 = 0; } Unfortunately, this doesn't do what you intend. When you look up a non-existent entry in a PerlHash, it creates and returns a PerlUndef PMC, so the class pointer that you get is always non-NULL, even though it isn't necessarily a ParrotClass. Consequently, in the example above, findclass always returns true. I'm not sure what the best fix is here. Simon --- classes/parrotclass.pmc Wed Jul 16 22:28:40 2003 +++ classes/parrotclass.pmc.new Wed Jul 16 22:28:35 2003 @@ -32,6 +32,8 @@ void init () { /* Hang an array off the data pointer, empty of course */ PMC_data(SELF) = pmc_new(interpreter, enum_class_Array); + /* We will have five entries in this array */ + VTABLE_set_integer_native(interpreter, (PMC*)PMC_data(SELF), (INTVAL)5); /* No attributes to start with */ SELF->obj.u.int_val = 0; /* But we are a class, really */