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() {