Klaas-Jan Stol wrote:
I think it should be something like this:

      /* RT46099 Check we don't already have this parent. */

         /* If we have already added a method with this name... */
        if (VTABLE_exists_keyed_str(interp, _class->all_parents,
VTABLE_name(interp, parent))) {
            real_exception(interp, NULL, E_NotImplementedError,
                "This class already has this parent.");
        }

Great start. Change "method" to "parent" in the comment. You'll want to check the immediate parents of the class, not all inherited parents, so you need to be looking at _class->parents, instead of _class->all_parents. And, unlike methods, parents are stored as an array of class objects, not a hash keyed by class name, so you'll need to loop over the parents array and check 'VTABLE_is_same' on each.

Also, it'd be good to add more information to the real_exception message, like:

            real_exception(interp, NULL, E_NotImplementedError,
                "The class '%S' already has a parent class '%S'. "
                "It may have been supplied by a role.",
                VTABLE_get_string(interp, SELF),
                VTABLE_get_string(interp, parent));


can't test this, parrot does not build in pdd15 branch.
it should be more or less like this, based on impl of add_attribute.

the headerfile classobject.h is missing in the branch, while it is there in
trunk. Is this right?

The pdd15oo branch does build (since Saturday), and passes most of its tests. Try 'make realclean', as some files have moved (classobject.h, for example, is now include/parrot/oo_private.h).

btw, the type of exception should be changed, also for other methods.

Agreed.

Thanks!
Allison

Reply via email to