# New Ticket Created by  Stephane Payrard 
# Please include the string:  [perl #59202]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=59202 >


class names is now (always) a ResizableStringArray so we get a crash
instead of printing an error message.

 rakudo
> class A::A {} ; class A::A {};
Class A::A already registered!

To be on the safe side, the code supports the old format.

Note that  there is still a problem to be solved.

> class A::A {} ; class A::A {};
Class A::A already registered!
> class A::A {}
compilers/imcc/pbc.c:1734: failed assertion
'sig_arr->vtable->base_type == enum_class_FixedIntegerArray'

In the process of investigating this bug, I added a get_string method
to ResizableStringArray that may useful
in its own right.



--- src/oo.c.orig       2008-09-22 16:59:06.000000000 +0200
+++ src/oo.c    2008-09-22 17:12:36.000000000 +0200
@@ -603,10 +603,12 @@
 static void
 fail_if_type_exists(PARROT_INTERP, ARGIN(PMC *name))
 {
-    INTVAL      type;
+    INTVAL         type;
+    STRING *       classname;

-    PMC * const classname_hash = interp->class_hash;
-    PMC * const type_pmc       = (PMC *)VTABLE_get_pointer_keyed(interp,
+    STRING * const separator      = string_from_cstring(interp, "::", 0);
+    PMC *    const classname_hash = interp->class_hash;
+    PMC *    const type_pmc       = (PMC *)VTABLE_get_pointer_keyed(interp,
                                         classname_hash, name);

     if (PMC_IS_NULL(type_pmc)
@@ -615,10 +617,15 @@
     else
         type = VTABLE_get_integer(interp, type_pmc);

-    if (type > enum_type_undef)
+    if (type > enum_type_undef) {
+        if (name->vtable->base_type == enum_class_ResizableStringArray)
+            classname = string_join( interp, separator, name);
+        else
+            classname = string_escape_string(interp,
VTABLE_get_string(interp, name));
+
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-            "Class %Ss already registered!\n",
-            string_escape_string(interp, VTABLE_get_string(interp, name)));
+            "Class %Ss already registered!\n", classname);
+    }

     if (type < enum_type_undef)
         Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,


-- 
cognominal stef

Reply via email to