/* Registers a representation. It this is ever made public, it should first be * made thread-safe, and it should check if the name is already registered. */ static void register_repr(MVMThreadContext *tc, MVMString *name, MVMREPROps *repr) { /* Allocate an ID. */ MVMuint32 ID = tc->instance->num_reprs; /* Allocate a hash entry for the name-to-ID. Could one day be unified with MVMREPROps, I suppose. */ MVMREPRHashEntry *entry = calloc(sizeof(MVMREPRHashEntry), 1); entry->value = ID; /* Bump the repr count */ tc->instance->num_reprs++; /* Stash ID and name. */ repr->ID = ID; repr->name = name; /* Name should become a permanent GC root. */ MVM_gc_root_add_permanent(tc, (MVMCollectable **)&repr->name); /* Enter into registry. */ if (tc->instance->repr_registry) tc->instance->repr_registry = realloc(tc->instance->repr_registry, tc->instance->num_reprs * sizeof(MVMREPROps *)); else tc->instance->repr_registry = malloc(tc->instance->num_reprs * sizeof(MVMREPROps *)); tc->instance->repr_registry[ID] = repr; MVM_string_flatten(tc, name); MVM_HASH_BIND(tc, tc->instance->repr_name_to_id_hash, name, entry); /* Add default "not implemented" function table implementations. */ if (!repr->elems) repr->elems = default_elems; if (!repr->attr_funcs) add_default_attr_funcs(tc, repr); if (!repr->box_funcs) add_default_box_funcs(tc, repr); if (!repr->pos_funcs) add_default_pos_funcs(tc, repr); if (!repr->ass_funcs) add_default_ass_funcs(tc, repr); }
/* Registers a representation. It this is ever made public, it should first be * made thread-safe. */ static void register_repr(PARROT_INTERP, STRING *name, REPROps *repr) { INTVAL ID = num_reprs; num_reprs++; if (repr_registry) repr_registry = (REPROps **)mem_sys_realloc(repr_registry, num_reprs * sizeof(REPROps *)); else repr_registry = (REPROps **)mem_sys_allocate(num_reprs * sizeof(REPROps *)); repr_registry[ID] = repr; VTABLE_set_integer_keyed_str(interp, repr_name_to_id_map, name, ID); repr->ID = ID; repr->name = name; if (!repr->attr_funcs) add_default_attr_funcs(interp, repr); if (!repr->box_funcs) add_default_box_funcs(interp, repr); if (!repr->pos_funcs) add_default_pos_funcs(interp, repr); if (!repr->ass_funcs) add_default_ass_funcs(interp, repr); if (!repr->elems) repr->elems = default_elems; }