On Sunday 05 August 2007 21:59:11 chromatic wrote: > Actually, use this patch instead.
Unless you like bugs, use THIS patch. I mean it. -- c
=== include/parrot/hll.h ================================================================== --- include/parrot/hll.h (revision 5224) +++ include/parrot/hll.h (local) @@ -71,6 +71,13 @@ /* HEADERIZER END: src/hll.c */ +enum { + e_HLL_name, + e_HLL_lib, + e_HLL_typemap, + e_HLL_MAX +} HLL_enum_t; + #endif /* PARROT_HLL_H_GUARD */ /* === src/hll.c ================================================================== --- src/hll.c (revision 5224) +++ src/hll.c (local) @@ -68,14 +68,6 @@ /* HEADERIZER END: static */ - -enum { - e_HLL_name, - e_HLL_lib, - e_HLL_typemap, - e_HLL_MAX -} HLL_enum_t; - /* for shared HLL data, do COW stuff */ #define START_READ_HLL_INFO(interp, hll_info) #define END_READ_HLL_INFO(interp, hll_info) @@ -133,9 +126,9 @@ /* register dynlib */ name = constant_pmc_new_noinit(interp, enum_class_String); ASSERT_CONST_STRING(hll_lib); VTABLE_set_string_native(interp, name, hll_lib); - VTABLE_set_pmc_keyed_int(interp, entry, e_HLL_lib, name); + VTABLE_set_pmc_keyed_int(interp, entry, e_HLL_lib, PMCNULL); END_WRITE_HLL_INFO(interp, hll_info); === src/pmc/parrotinterpreter.pmc ================================================================== --- src/pmc/parrotinterpreter.pmc (revision 5224) +++ src/pmc/parrotinterpreter.pmc (local) @@ -605,50 +605,47 @@ } void thawfinish(visit_info *info) { - INTVAL i, n, m; - PMC *hll_info, *entry, *lib_pmc, *new_info, *ns_hash; - STRING *lib_name, *hll_name; + PMC *hll_info = INTERP->HLL_info; + PMC *new_info = PMC_pmc_val(SELF); + INTVAL n = VTABLE_elements(INTERP, hll_info); + INTVAL m = VTABLE_elements(INTERP, new_info); - hll_info = INTERP->HLL_info; - n = VTABLE_elements(INTERP, hll_info); - new_info = PMC_pmc_val(SELF); + INTVAL i; + PMC_pmc_val(SELF) = NULL; - m = VTABLE_elements(INTERP, new_info); /* merge new_info */ /* TODO compare old entries */ - for (i = n; i < m; ++i) { - entry = VTABLE_get_pmc_keyed_int(INTERP, new_info, i); - lib_pmc = VTABLE_get_pmc_keyed_int(INTERP, entry, 1); + + for (i = 0; i < m; ++i) { + PMC *entry = VTABLE_get_pmc_keyed_int(INTERP, new_info, i); + PMC *lib_pmc = VTABLE_get_pmc_keyed_int(INTERP, entry, e_HLL_lib); + PMC *name_pmc = VTABLE_get_pmc_keyed_int(INTERP, entry, e_HLL_name); + + STRING *lib_name = NULL; + STRING *hll_name = NULL; + if (!PMC_IS_NULL(lib_pmc)) { lib_name = VTABLE_get_string(INTERP, lib_pmc); - if (lib_name->strlen) - Parrot_load_lib(INTERP, lib_name, NULL); + PObj_constant_SET(lib_name); } - entry = VTABLE_get_pmc_keyed_int(INTERP, entry, 0); - if (!PMC_IS_NULL(entry)) { - hll_name = VTABLE_get_string(INTERP, entry); - /* create HLL namespace */ - hll_name = string_downcase(INTERP, hll_name); - /* HLL type mappings aren't yet created, we can't create - * a namespace in HLL's flavor yet - maybe promote the - * ns_hash to another type later, if mappings provide one? - * XXX - FIXME - */ - ns_hash = - Parrot_make_namespace_keyed_str(interp, - interp->root_namespace, - hll_name); + if (!PMC_IS_NULL(name_pmc)) { + hll_name = VTABLE_get_string(INTERP, name_pmc); + PObj_constant_SET(hll_name); + } - /* cache HLLs toplevel namespace */ - VTABLE_set_pmc_keyed_int(INTERP, - INTERP->HLL_namespace, i, ns_hash); + if (hll_name || lib_name) { + INTVAL id = Parrot_register_HLL(INTERP, hll_name, lib_name); + PMC *tmap = VTABLE_get_pmc_keyed_int(INTERP, entry, + e_HLL_typemap); + + if (PMC_IS_NULL(tmap)) + continue; + + VTABLE_set_pmc_keyed_int(INTERP, hll_info, id, tmap); + dod_register_pmc(INTERP, tmap); } } - - /* TODO destruct old HLL_info are constants */ - if (m > n) - INTERP->HLL_info = new_info; } METHOD void run_gc() {