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