>  In src/objects.c:Parrot_add_attribute() there is the todo item:
>
>  /* TODO escape NUL char */
>
>  I think this applies to calling real_exception just afterwards.

According a discussion in #parrot this function and some related parts
is dead code. The attached patch removes it.

-- 
Salu2
Index: src/oo.c
===================================================================
--- src/oo.c	(revisión: 27376)
+++ src/oo.c	(copia de trabajo)
@@ -768,116 +768,6 @@
 
 /*
 
-=item C<PMC * Parrot_single_subclass>
-
-Subclass a class. Single parent class, nice and straightforward. If
-C<child_class> is C<NULL>, this is an anonymous subclass we're creating,
-function.
-
-=cut
-
-*/
-
-PARROT_API
-PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-PMC *
-Parrot_single_subclass(PARROT_INTERP, ARGIN(PMC *base_class), ARGIN_NULLOK(PMC *name))
-{
-    PMC      *child_class, *parents, *temp_pmc, *mro;
-    SLOTTYPE *child_class_array;
-    int       parent_is_class;
-
-    /* Set the classname, if we have one */
-    if (!PMC_IS_NULL(name)) {
-        fail_if_type_exists(interp, name);
-    }
-    else {
-        /* RT#45975 not really threadsafe but good enough for now */
-        static int anon_count;
-        STRING * const child_class_name =
-            Parrot_sprintf_c(interp, "%c%canon_%d", 0, 0, ++anon_count);
-        name             = pmc_new(interp, enum_class_String);
-        VTABLE_set_string_native(interp, name, child_class_name);
-    }
-
-    /* ParrotClass is the baseclass anyway, so build just a new class */
-    if (base_class == interp->vtables[enum_class_Class]->pmc_class)
-        return pmc_new_init(interp, enum_class_Class, name);
-
-    parent_is_class = PObj_is_class_TEST(base_class);
-    child_class     = pmc_new(interp, enum_class_Class);
-
-    /* Hang an array off the data pointer */
-    set_attrib_array_size(child_class, PCD_MAX);
-    child_class_array = PMC_data_typed(child_class, SLOTTYPE *);
-    set_attrib_flags(child_class);
-
-    /* We will have five entries in this array */
-
-    /* We have the same number of attributes as our parent */
-    CLASS_ATTRIB_COUNT(child_class) = parent_is_class ?
-                                        CLASS_ATTRIB_COUNT(base_class) : 0;
-
-    /* Our parent class array has a single member in it */
-    parents = pmc_new(interp, enum_class_ResizablePMCArray);
-
-    VTABLE_set_integer_native(interp, parents, 1);
-    VTABLE_set_pmc_keyed_int(interp, parents, 0, base_class);
-
-    set_attrib_num(child_class, child_class_array, PCD_PARENTS, parents);
-    set_attrib_num(child_class, child_class_array, PCD_CLASS_NAME, name);
-
-    /* Our mro list is a clone of our parent's mro list,
-     * with our self unshifted onto the beginning */
-    mro = VTABLE_clone(interp, base_class->vtable->mro);
-    VTABLE_unshift_pmc(interp, mro, child_class);
-
-    /* But we have no attributes of our own. Yet */
-    temp_pmc = pmc_new(interp, enum_class_ResizablePMCArray);
-    set_attrib_num(child_class, child_class_array, PCD_CLASS_ATTRIBUTES,
-        temp_pmc);
-
-    parrot_class_register(interp, name, child_class, base_class, mro);
-    rebuild_attrib_stuff(interp, child_class);
-
-    if (!parent_is_class) {
-        /* we append one attribute to hold the PMC */
-        Parrot_add_attribute(interp, child_class,
-                CONST_STRING(interp, "__value"));
-        /*
-         * then create a vtable derived from ParrotObject and
-         * deleg_pmc - the ParrotObject vtable is already built
-         */
-        create_deleg_pmc_vtable(interp, child_class, 1);
-    }
-    else {
-        /*
-         * if any parent isa PMC, then still individual vtables might
-         * be overridden in this subclass
-         */
-        int i;
-        int       any_pmc_parent = 0;
-        const int n              = VTABLE_elements(interp, mro);
-
-        /* 0 = this, 1 = parent (handled above), 2 = grandpa */
-        for (i = 2; i < n; ++i) {
-            const PMC * const parent = VTABLE_get_pmc_keyed_int(interp, mro, i);
-            if (!PObj_is_class_TEST(parent)) {
-                any_pmc_parent = 1;
-                break;
-            }
-        }
-        if (any_pmc_parent)
-            create_deleg_pmc_vtable(interp, child_class, 0);
-    }
-
-    return child_class;
-}
-
-
-/*
-
 =item C<PMC * Parrot_class_lookup>
 
 Looks for the class named C<class_name> and returns it if it exists.
@@ -1798,59 +1688,6 @@
 }
 
 
-/*
-
-=item C<INTVAL Parrot_add_attribute>
-
-Adds the attribute C<attr> to the class.
-
-   Life is ever so much easier if a class keeps its attributes at the
-   end of the attribute array, since we don't have to insert and
-   reorder attributes. Inserting's no big deal, especially since we're
-   going to break horribly if you insert into a class that's been
-   subclassed, but it'll do for now.
-
-=cut
-
-*/
-
-PARROT_API
-INTVAL
-Parrot_add_attribute(PARROT_INTERP, ARGIN(PMC *_class), ARGIN(STRING *attr))
-{
-    STRING *full_attr_name;
-    SLOTTYPE * const class_array = (SLOTTYPE *)PMC_data(_class);
-    STRING   * const class_name  = VTABLE_get_string(interp,
-            get_attrib_num(class_array, PCD_CLASS_NAME));
-    PMC      * const attr_array  = get_attrib_num(class_array, PCD_CLASS_ATTRIBUTES);
-    PMC      * const attr_hash   = get_attrib_num(class_array, PCD_ATTRIBUTES);
-    INTVAL           idx         = VTABLE_elements(interp, attr_array);
-
-    VTABLE_set_integer_native(interp, attr_array, idx + 1);
-    VTABLE_set_string_keyed_int(interp, attr_array, idx, attr);
-
-    full_attr_name = string_concat(interp, class_name,
-            string_from_cstring(interp, "\0", 1), 0);
-
-    full_attr_name = string_concat(interp, full_attr_name, attr, 0);
-
-    /* RT#45989 escape NUL char */
-    if (VTABLE_exists_keyed_str(interp, attr_hash, full_attr_name))
-        real_exception(interp, NULL, 1,
-                "Attribute '%Ss' already exists", full_attr_name);
-
-    /*
-     * RT#45993 check if someone is trying to add attributes to a parent class
-     * while there are already child class attrs
-     */
-    idx = CLASS_ATTRIB_COUNT(_class)++;
-    VTABLE_set_integer_keyed_str(interp, attr_hash, attr, idx);
-    VTABLE_set_integer_keyed_str(interp, attr_hash, full_attr_name, idx);
-
-    return idx;
-}
-
-
 /* ************************************************************************ */
 /* ********* BELOW HERE IS NEW PPD15 IMPLEMENTATION RELATED STUFF ********* */
 /* ************************************************************************ */
Index: src/ops/object.ops
===================================================================
--- src/ops/object.ops	(revisión: 27376)
+++ src/ops/object.ops	(copia de trabajo)
@@ -469,12 +469,9 @@
 
 inline op addattribute(invar PMC, in STR) :object_classes {
     STRING * const class_name  = string_from_literal(interp, "Class");
-    STRING * const pclass_name = string_from_literal(interp, "ParrotClass");
 
     if (VTABLE_isa(interp, $1, class_name))
         VTABLE_add_attribute(interp, $1, $2, PMCNULL);
-    else if (VTABLE_isa(interp, $1, pclass_name))
-        Parrot_add_attribute(interp, $1, $2);
     else
         real_exception(interp, NULL, INVALID_OPERATION,
             "Cannot add attribute to non-class");

Reply via email to