Author: leo
Date: Tue Mar  7 10:10:15 2006
New Revision: 11814

Modified:
   trunk/src/hll.c

Log:
Namespaces 5 - create namespace on HLL registration

* create lowercased HLL name as a toplevel namespace entry, when
  an HLL is registered 


Modified: trunk/src/hll.c
==============================================================================
--- trunk/src/hll.c     (original)
+++ trunk/src/hll.c     Tue Mar  7 10:10:15 2006
@@ -17,7 +17,7 @@
    interpreter->HLL_info
 
    @HLL_info = [
-     [ hll_name, hll_lib, { core_type => HLL_type, ... } ],
+     [ hll_name, hll_lib, namespace, { core_type => HLL_type, ... } ],
      ...
      ]
 
@@ -58,6 +58,14 @@
 #include "parrot/dynext.h"
 #include <assert.h>
 
+enum {
+    e_HLL_name,
+    e_HLL_lib,
+    e_HLL_namespace,
+    e_HLL_typemap,
+    e_HLL_MAX
+} HLL_enum_t;
+
 static STRING*
 string_as_const_string(Interp* interpreter, STRING *src)
 {
@@ -71,7 +79,7 @@
 Parrot_register_HLL(Interp *interpreter,
        STRING *hll_name, STRING *hll_lib)
 {
-    PMC *hll_info, *entry, *name, *type_hash;
+    PMC *hll_info, *entry, *name, *type_hash, *ns_hash;
     INTVAL idx;
 
     idx = Parrot_get_HLL_id(interpreter, hll_name);
@@ -80,24 +88,46 @@
     /* TODO LOCK or disallow in threads */
     hll_info = interpreter->HLL_info;
     idx = VTABLE_elements(interpreter, hll_info);
+    /*
+     * ATT: all items that are owned by the HLL_info structure
+     *      have to be created as constant objects, because
+     *      this structure isn't marked by DOD/GC
+     */ 
     entry = constant_pmc_new(interpreter, enum_class_FixedPMCArray);
     VTABLE_push_pmc(interpreter, hll_info, entry);
 
-    VTABLE_set_integer_native(interpreter, entry, 3);
+    VTABLE_set_integer_native(interpreter, entry, e_HLL_MAX);
 
+    /* register HLL name */
     name = constant_pmc_new_noinit(interpreter, enum_class_String);
     hll_name = string_as_const_string(interpreter, hll_name);
     VTABLE_set_string_native(interpreter, name, hll_name);
-    VTABLE_set_pmc_keyed_int(interpreter, entry, 0, name);
+    VTABLE_set_pmc_keyed_int(interpreter, entry, e_HLL_name, name);
+
+    /* create HLL namespace */
+    hll_name = string_downcase(interpreter, hll_name);
+    /* HLL type mappings aren't yet created, we can't create
+     * a namespace in HLL's flavor yet - mabe promote the
+     * ns_hash to another type, if mappings provide one
+     *
+     * TODO need better APIT to append namespaces
+     */
+    ns_hash  = pmc_new(interpreter, enum_class_NameSpace);
+    VTABLE_set_pmc_keyed_str(interpreter, interpreter->stash_hash,
+            hll_name, ns_hash);
+    VTABLE_set_pmc_keyed_int(interpreter, entry, e_HLL_namespace, ns_hash);
 
+    /* register HLL lib */
     name = constant_pmc_new_noinit(interpreter, enum_class_String);
     if (!hll_lib)
         hll_lib = const_string(interpreter, "");
     hll_lib = string_as_const_string(interpreter, hll_lib);
     VTABLE_set_string_native(interpreter, name, hll_lib);
-    VTABLE_set_pmc_keyed_int(interpreter, entry, 1, name);
+    VTABLE_set_pmc_keyed_int(interpreter, entry, e_HLL_lib, name);
+
+    /* register HLL typemap */
     type_hash = Parrot_new_INTVAL_hash(interpreter, PObj_constant_FLAG);
-    VTABLE_set_pmc_keyed_int(interpreter, entry, 2, type_hash);
+    VTABLE_set_pmc_keyed_int(interpreter, entry, e_HLL_typemap, type_hash);
     if (string_length(interpreter, hll_lib)) {
         /* load lib */
         Parrot_load_lib(interpreter, hll_lib, NULL);
@@ -118,7 +148,7 @@
     n = VTABLE_elements(interpreter, hll_info);
     for (i = 0; i < n; ++i) {
         entry = VTABLE_get_pmc_keyed_int(interpreter, hll_info, i);
-        name_pmc = VTABLE_get_pmc_keyed_int(interpreter, entry, 0);
+        name_pmc = VTABLE_get_pmc_keyed_int(interpreter, entry, e_HLL_name);
         name = VTABLE_get_string(interpreter, name_pmc);
         if (!string_equal(interpreter, name, hll_name))
             return i;
@@ -142,7 +172,7 @@
     }
     entry = VTABLE_get_pmc_keyed_int(interpreter, hll_info, hll_id);
     assert(!PMC_IS_NULL(entry));
-    type_hash = VTABLE_get_pmc_keyed_int(interpreter, entry, 2);
+    type_hash = VTABLE_get_pmc_keyed_int(interpreter, entry, e_HLL_typemap);
     assert(!PMC_IS_NULL(type_hash));
     hash = PMC_struct_val(type_hash);
     hash_put(interpreter, hash, (void*)core_type, (void*)hll_type);
@@ -169,7 +199,7 @@
                 "no such HLL id (%vd)", hll_id);
     }
     entry = VTABLE_get_pmc_keyed_int(interpreter, hll_info, hll_id);
-    type_hash = VTABLE_get_pmc_keyed_int(interpreter, entry, 2);
+    type_hash = VTABLE_get_pmc_keyed_int(interpreter, entry, e_HLL_typemap);
     if (PMC_IS_NULL(type_hash))
         return core_type;
     hash = PMC_struct_val(type_hash);

Reply via email to