diff --git a/docs/inter-module/2-frm.html b/docs/inter-module/2-frm.html index 9b4f111a4..ed6b7bd3d 100644 --- a/docs/inter-module/2-frm.html +++ b/docs/inter-module/2-frm.html @@ -133,6 +133,13 @@
+    inter_frame Inter::Frame::root_frame(inter_tree *I) {
+        inter_frame P = Inter::Warehouse::find_room(I, 2, NULL, NULL);
+        P.data[ID_IFLD] = (inter_t) NOP_IST;
+        P.data[LEVEL_IFLD] = 0;
+        return P;
+    }
+
     inter_frame Inter::Frame::fill_0(inter_bookmark *IBM, int S, inter_error_location *eloc, inter_t level) {
         inter_frame P = Inter::Warehouse::find_room(IBM->read_into, 2, eloc, Inter::Bookmarks::package(IBM));
         P.data[ID_IFLD] = (inter_t) S;
@@ -235,6 +242,8 @@
 
 

+

The function Inter::Frame::root_frame is used in 2/iim (§3).

+

The function Inter::Frame::fill_0 is used in 4/tnc (§1), 4/tcc (§1).

The function Inter::Frame::fill_1 is used in 4/tvc (§2), 4/tpc2 (§2), 4/tpc7 (§2), 5/tcc (§2), 5/tec (§2), 5/trc2 (§2).

@@ -321,7 +330,7 @@ if (trace_inter_insertion) Inter::Defn::write_construct_text(DL, F); inter_t F_level = F.data[LEVEL_IFLD]; if (F_level == 0) { - Inter::add_to_frame_list(&(I->global_material), F); + Inter::Frame::place(F, AS_LAST_CHILD_OF_ICPLACEMENT, I->root_definition_frame); if ((Inter::Bookmarks::get_placement(at) == AFTER_ICPLACEMENT) || (Inter::Bookmarks::get_placement(at) == IMMEDIATELY_AFTER_ICPLACEMENT)) Inter::Bookmarks::set_ref(at, F); diff --git a/docs/inter-module/2-iibf.html b/docs/inter-module/2-iibf.html index 88c775c4c..c872ff4e3 100644 --- a/docs/inter-module/2-iibf.html +++ b/docs/inter-module/2-iibf.html @@ -183,13 +183,13 @@ that's the end of the list and therefore the block.
-        int first_one = TRUE;
+        int resource_counter = 0;
         while (BinaryFiles::read_int32(fh, &X)) {
             if (X == NO_IRSRC) break;
 
-            inter_t n = 1;
-            if (first_one == FALSE) n = Inter::Warehouse::create_resource(warehouse);
-            first_one = FALSE;
+            resource_counter++;
+            inter_t n = (inter_t) resource_counter;
+            if (resource_counter >= 3) n = Inter::Warehouse::create_resource(warehouse);
             inter_resource_holder *res = &(warehouse->stored_resources[n]);
 
             switch (X) {
@@ -396,25 +396,20 @@ that's the end of the list and therefore the block.
         unsigned int nid;
         if (BinaryFiles::read_int32(fh, &nid) == FALSE) Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete");
         inter_package *parent = NULL;
-        if (p != 0) {
-            parent = Inter::get_package(I, p);
-            if (parent == NULL) Inter::Binary::read_error(&eloc, ftell(fh), I"packages not well founded");
-        }
+        if (p != 0) parent = Inter::get_package(I, p);
         if (res->stored_package == NULL) {
             res->stored_package = Inter::Packages::new(I, n);
         }
+        if (cl) Inter::Packages::make_codelike(res->stored_package);
+        if (nid == 0) Inter::Packages::make_rootlike(res->stored_package);
         if (sc != 0) Inter::Packages::set_scope(res->stored_package, Inter::get_symbols_table(I, sc));
         if (nid != 0) {
             inter_symbol *pack_name = Inter::SymbolsTables::symbol_from_id(parent?(Inter::Packages::scope(parent)):Inter::get_global_symbols(I), nid);
-            if (pack_name == NULL) {
-                LOG("Parent is $6\n", parent);
-                if (parent) Inter::Binary::read_error(&eloc, ftell(fh), I"package name can't be found in scope");
-                else Inter::Binary::read_error(&eloc, ftell(fh), I"package name can't be found in globals");
-            } else {
+            if (pack_name)
                 Inter::Packages::set_name(res->stored_package, pack_name);
-            }
+            else
+                Inter::Binary::read_error(&eloc, ftell(fh), I"unable to retrieve package name");
         }
-        if (cl) Inter::Packages::make_codelike(res->stored_package);
 

@@ -434,7 +429,10 @@ that's the end of the list and therefore the block. else BinaryFiles::write_int32(fh, (unsigned int) par->index_n); BinaryFiles::write_int32(fh, (unsigned int) Inter::Packages::is_codelike(P)); BinaryFiles::write_int32(fh, (unsigned int) P->package_scope->n_index); - BinaryFiles::write_int32(fh, (unsigned int) P->package_name->symbol_ID); + if (P->package_name) + BinaryFiles::write_int32(fh, (unsigned int) P->package_name->symbol_ID); + else + BinaryFiles::write_int32(fh, 0); }
@@ -482,6 +480,10 @@ enough that the slot exists for the eventual list to be stored in. while (BinaryFiles::read_int32(fh, &X)) { if (X == 0) break; inter_symbols_table *from_T = Inter::get_symbols_table(I, X); + if (from_T == NULL) { + WRITE_TO(STDERR, "It's %d\n", X); + internal_error("no from_T"); + } unsigned int from_ID = 0; while (BinaryFiles::read_int32(fh, &from_ID)) { if (from_ID == 0) break; @@ -492,8 +494,11 @@ enough that the slot exists for the eventual list to be stored in. if (BinaryFiles::read_int32(fh, &to_ID) == FALSE) Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete"); inter_symbols_table *to_T = Inter::get_symbols_table(I, to_T_id); + if (from_T == NULL) internal_error("no to_T"); inter_symbol *from_S = Inter::SymbolsTables::symbol_from_id(from_T, from_ID); + if (from_S == NULL) internal_error("no from_S"); inter_symbol *to_S = Inter::SymbolsTables::symbol_from_id(to_T, to_ID); + if (to_S == NULL) internal_error("no to_S"); Inter::SymbolsTables::equate(from_S, to_S); } } diff --git a/docs/inter-module/2-iim.html b/docs/inter-module/2-iim.html index 2ce16c36a..b93e0d049 100644 --- a/docs/inter-module/2-iim.html +++ b/docs/inter-module/2-iim.html @@ -43,8 +43,8 @@
     typedef struct inter_tree {
         struct inter_warehouse *warehouse;
-        inter_t global_symbols_table_ID;
-        struct inter_frame_list global_material;
+        struct inter_frame root_definition_frame;
+        struct inter_package *root_package;
         struct inter_package *main_package;
         MEMORY_MANAGEMENT
     } inter_tree;
@@ -52,7 +52,7 @@
 
 

-

The structure inter_tree is accessed in 2/tw, 2/pck, 2/frm and here.

+

The structure inter_tree is accessed in 2/pck, 2/frm and here.

§3.

@@ -60,14 +60,14 @@
     inter_tree *Inter::create(void) {
         inter_tree *I = CREATE(inter_tree);
-        I->global_material.spare_storage = NULL;
-        I->global_material.storage_used = 0;
-        I->global_material.storage_capacity = 0;
         I->main_package = NULL;
 
         I->warehouse = Inter::Warehouse::new(I);
-        I->global_symbols_table_ID = Inter::create_symbols_table(I);
-
+        inter_t N = Inter::create_symbols_table(I);
+        I->root_package = Inter::get_package(I, Inter::create_package(I));
+        I->root_definition_frame = Inter::Frame::root_frame(I);
+        Inter::Packages::make_rootlike(I->root_package);
+        Inter::Packages::set_scope(I->root_package, Inter::get_symbols_table(I, N));
         return I;
     }
 
@@ -86,7 +86,7 @@
     }
 
     inter_symbols_table *Inter::get_global_symbols(inter_tree *I) {
-        return Inter::get_symbols_table(I, I->global_symbols_table_ID);
+        return Inter::Packages::scope(I->root_package);
     }
 
     inter_symbols_table *Inter::get_symbols_table(inter_tree *I, inter_t n) {
@@ -193,7 +193,7 @@
 
 

The function Inter::create_symbols_table is used in 4/tpc3 (§2).

-

The function Inter::get_global_symbols is used in 2/st (§8, §9, §11), 2/bkm (§2), 4/tpc3 (§2), 5/tic (§2).

+

The function Inter::get_global_symbols is used in 2/tw (§2), 2/st (§8, §9, §11), 2/bkm (§2), 4/tpc3 (§2), 5/tic (§2).

The function Inter::get_symbols_table is used in 2/frm (§2), 2/iibf (§1.5.3, §1.6).

@@ -312,8 +312,7 @@ } inter_error_stash; void Inter::traverse_global_list(inter_tree *from, void (*visitor)(inter_tree *, inter_frame, void *), void *state, int filter) { - inter_frame P; - LOOP_THROUGH_INTER_FRAME_LIST(P, (&(from->global_material))) { + PROTECTED_LOOP_THROUGH_INTER_CHILDREN(P, (from->root_definition_frame)) { if ((filter == 0) || ((filter > 0) && (P.data[ID_IFLD] == (inter_t) filter)) || ((filter < 0) && (P.data[ID_IFLD] != (inter_t) -filter))) @@ -385,7 +384,7 @@

The function Inter::sixth_child appears nowhere else.

-

The function Inter::add_to_frame_list is used in 2/frm (§5), 4/tpc5 (§2), 4/tpc6 (§2).

+

The function Inter::add_to_frame_list is used in 4/tpc5 (§2), 4/tpc6 (§2).

The function Inter::traverse_global_list is used in 2/iibf (§1.1.5), 2/iitf (§2).

diff --git a/docs/inter-module/2-pck.html b/docs/inter-module/2-pck.html index 6f2b0672c..3c09697cb 100644 --- a/docs/inter-module/2-pck.html +++ b/docs/inter-module/2-pck.html @@ -39,6 +39,7 @@ define CODELIKE_PACKAGE_FLAG 1 define LINKAGE_PACKAGE_FLAG 2 define USED_PACKAGE_FLAG 4 + define ROOT_PACKAGE_FLAG 8

§3.

@@ -77,8 +78,20 @@ } } + int Inter::Packages::is_rootlike(inter_package *pack) { + if ((pack) && (pack->package_flags & ROOT_PACKAGE_FLAG)) return TRUE; + return FALSE; + } + + void Inter::Packages::make_rootlike(inter_package *pack) { + if (pack) { + pack->package_flags |= ROOT_PACKAGE_FLAG; + } + } + inter_package *Inter::Packages::parent(inter_package *pack) { if (pack) { + if (Inter::Packages::is_rootlike(pack)) return NULL; inter_frame D = Inter::Symbols::defining_frame(pack->package_name); inter_t P_index = Inter::Frame::get_parent_index(D); if (P_index == 0) return NULL; @@ -91,7 +104,8 @@ void Inter::Packages::unmark_all(void) { inter_package *pack; LOOP_OVER(pack, inter_package) - CodeGen::unmark(pack->package_name); + if (pack->package_name) + CodeGen::unmark(pack->package_name); } void Inter::Packages::set_scope(inter_package *P, inter_symbols_table *T) { @@ -239,11 +253,15 @@

The function Inter::Packages::make_linklike is used in 4/tpc3 (§2).

+

The function Inter::Packages::is_rootlike appears nowhere else.

+ +

The function Inter::Packages::make_rootlike is used in 2/iim (§3), 2/iibf (§1.5.3).

+

The function Inter::Packages::parent is used in 2/iim (§4), 2/st (§11), 2/iibf (§1.1.3.3), 3/dfn (§5).

The function Inter::Packages::unmark_all appears nowhere else.

-

The function Inter::Packages::set_scope is used in 2/iibf (§1.5.3), 4/tpc3 (§2).

+

The function Inter::Packages::set_scope is used in 2/iim (§3), 2/iibf (§1.5.3), 4/tpc3 (§2).

The function Inter::Packages::set_name is used in 2/iibf (§1.5.3), 4/tpc3 (§2).

@@ -269,7 +287,7 @@

The function Inter::Packages::container is used in 2/bkm (§2), 2/vi (§1), 3/dfn (§5), 5/tlc (§2), 5/tlc2 (§2), 5/trc (§2), 5/tlc3 (§2).

-

The function Inter::Packages::scope is used in 2/st (§4, §8, §9, §10, §11), 2/bkm (§2), 2/iibf (§1.5.3), 2/vi (§1), 4/tac (§2), 4/tpc3 (§2), 4/tkc (§2), 4/tcc2 (§2), 4/tic (§2), 4/tpc5 (§2), 4/tpc6 (§2), 5/tlc (§2), 5/tlc2 (§2), 5/trc (§2), 5/tvc (§2).

+

The function Inter::Packages::scope is used in 2/iim (§3), 2/st (§4, §8, §9, §10, §11), 2/bkm (§2), 2/iibf (§1.5.3), 2/vi (§1), 4/tac (§2), 4/tpc3 (§2), 4/tkc (§2), 4/tcc2 (§2), 4/tic (§2), 4/tpc5 (§2), 4/tpc6 (§2), 5/tlc (§2), 5/tlc2 (§2), 5/trc (§2), 5/tvc (§2).

The function Inter::Packages::scope_of is used in 2/st (§7), 4/tmc (§2), 4/tkc (§2), 4/tdc (§2), 4/tvc2 (§2), 4/tcc2 (§2), 4/trc (§2), 4/tic (§2), 4/tpc5 (§2), 5/tvc (§2), 5/tcc2 (§2).

diff --git a/docs/inter-module/2-tw.html b/docs/inter-module/2-tw.html index 132fa4590..b679aff7b 100644 --- a/docs/inter-module/2-tw.html +++ b/docs/inter-module/2-tw.html @@ -111,7 +111,11 @@ while (IS->next_room) IS = IS->next_room; inter_frame F = Inter::Warehouse::find_room_in_room(IS, n); F.repo_segment->bytecode[F.index + PREFRAME_ORIGIN] = Inter::Warehouse::store_origin(warehouse, eloc); - F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = I->global_symbols_table_ID; + inter_symbols_table *T = Inter::get_global_symbols(I); + if (T) + F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = (inter_t) T->n_index; + else + F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = 1; Inter::Frame::attach_package(F, Inter::Packages::to_PID(owner)); return F; } diff --git a/inform7/Tests/test-pl.interpipeline b/inform7/Tests/test-pl.interpipeline index abff59a1a..f06446a63 100644 --- a/inform7/Tests/test-pl.interpipeline +++ b/inform7/Tests/test-pl.interpipeline @@ -6,4 +6,5 @@ assimilate make-identifiers-unique resolve-external-symbols reconcile-verbs +generate 0:/main/template inventory -> *log generate inform6 -> *out diff --git a/inter/inter-module/Chapter 2/Frames.w b/inter/inter-module/Chapter 2/Frames.w index 0d85b1b29..555353ac0 100644 --- a/inter/inter-module/Chapter 2/Frames.w +++ b/inter/inter-module/Chapter 2/Frames.w @@ -83,6 +83,13 @@ int Inter::Frame::eq(inter_frame *F1, inter_frame *F2) { } @ = +inter_frame Inter::Frame::root_frame(inter_tree *I) { + inter_frame P = Inter::Warehouse::find_room(I, 2, NULL, NULL); + P.data[ID_IFLD] = (inter_t) NOP_IST; + P.data[LEVEL_IFLD] = 0; + return P; +} + inter_frame Inter::Frame::fill_0(inter_bookmark *IBM, int S, inter_error_location *eloc, inter_t level) { inter_frame P = Inter::Warehouse::find_room(IBM->read_into, 2, eloc, Inter::Bookmarks::package(IBM)); P.data[ID_IFLD] = (inter_t) S; @@ -239,7 +246,7 @@ void Inter::Frame::insert(inter_frame F, inter_bookmark *at) { if (trace_inter_insertion) Inter::Defn::write_construct_text(DL, F); inter_t F_level = F.data[LEVEL_IFLD]; if (F_level == 0) { - Inter::add_to_frame_list(&(I->global_material), F); + Inter::Frame::place(F, AS_LAST_CHILD_OF_ICPLACEMENT, I->root_definition_frame); if ((Inter::Bookmarks::get_placement(at) == AFTER_ICPLACEMENT) || (Inter::Bookmarks::get_placement(at) == IMMEDIATELY_AFTER_ICPLACEMENT)) Inter::Bookmarks::set_ref(at, F); diff --git a/inter/inter-module/Chapter 2/Inter in Binary Files.w b/inter/inter-module/Chapter 2/Inter in Binary Files.w index 865f370d4..c2d2ccbc5 100644 --- a/inter/inter-module/Chapter 2/Inter in Binary Files.w +++ b/inter/inter-module/Chapter 2/Inter in Binary Files.w @@ -105,13 +105,13 @@ that's the end of the list and therefore the block. @e PACKAGE_IRSRC @ = - int first_one = TRUE; + int resource_counter = 0; while (BinaryFiles::read_int32(fh, &X)) { if (X == NO_IRSRC) break; - inter_t n = 1; - if (first_one == FALSE) n = Inter::Warehouse::create_resource(warehouse); - first_one = FALSE; + resource_counter++; + inter_t n = (inter_t) resource_counter; + if (resource_counter >= 3) n = Inter::Warehouse::create_resource(warehouse); inter_resource_holder *res = &(warehouse->stored_resources[n]); switch (X) { @@ -256,25 +256,20 @@ that's the end of the list and therefore the block. unsigned int nid; if (BinaryFiles::read_int32(fh, &nid) == FALSE) Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete"); inter_package *parent = NULL; - if (p != 0) { - parent = Inter::get_package(I, p); - if (parent == NULL) Inter::Binary::read_error(&eloc, ftell(fh), I"packages not well founded"); - } + if (p != 0) parent = Inter::get_package(I, p); if (res->stored_package == NULL) { res->stored_package = Inter::Packages::new(I, n); } + if (cl) Inter::Packages::make_codelike(res->stored_package); + if (nid == 0) Inter::Packages::make_rootlike(res->stored_package); if (sc != 0) Inter::Packages::set_scope(res->stored_package, Inter::get_symbols_table(I, sc)); if (nid != 0) { inter_symbol *pack_name = Inter::SymbolsTables::symbol_from_id(parent?(Inter::Packages::scope(parent)):Inter::get_global_symbols(I), nid); - if (pack_name == NULL) { - LOG("Parent is $6\n", parent); - if (parent) Inter::Binary::read_error(&eloc, ftell(fh), I"package name can't be found in scope"); - else Inter::Binary::read_error(&eloc, ftell(fh), I"package name can't be found in globals"); - } else { + if (pack_name) Inter::Packages::set_name(res->stored_package, pack_name); - } + else + Inter::Binary::read_error(&eloc, ftell(fh), I"unable to retrieve package name"); } - if (cl) Inter::Packages::make_codelike(res->stored_package); @ = inter_package *P = res->stored_package; @@ -284,7 +279,10 @@ that's the end of the list and therefore the block. else BinaryFiles::write_int32(fh, (unsigned int) par->index_n); BinaryFiles::write_int32(fh, (unsigned int) Inter::Packages::is_codelike(P)); BinaryFiles::write_int32(fh, (unsigned int) P->package_scope->n_index); - BinaryFiles::write_int32(fh, (unsigned int) P->package_name->symbol_ID); + if (P->package_name) + BinaryFiles::write_int32(fh, (unsigned int) P->package_name->symbol_ID); + else + BinaryFiles::write_int32(fh, 0); } @ We do nothing here, because frame lists are built new on reading. It's @@ -300,6 +298,10 @@ enough that the slot exists for the eventual list to be stored in. while (BinaryFiles::read_int32(fh, &X)) { if (X == 0) break; inter_symbols_table *from_T = Inter::get_symbols_table(I, X); + if (from_T == NULL) { + WRITE_TO(STDERR, "It's %d\n", X); + internal_error("no from_T"); + } unsigned int from_ID = 0; while (BinaryFiles::read_int32(fh, &from_ID)) { if (from_ID == 0) break; @@ -310,8 +312,11 @@ enough that the slot exists for the eventual list to be stored in. if (BinaryFiles::read_int32(fh, &to_ID) == FALSE) Inter::Binary::read_error(&eloc, ftell(fh), I"bytecode incomplete"); inter_symbols_table *to_T = Inter::get_symbols_table(I, to_T_id); + if (from_T == NULL) internal_error("no to_T"); inter_symbol *from_S = Inter::SymbolsTables::symbol_from_id(from_T, from_ID); + if (from_S == NULL) internal_error("no from_S"); inter_symbol *to_S = Inter::SymbolsTables::symbol_from_id(to_T, to_ID); + if (to_S == NULL) internal_error("no to_S"); Inter::SymbolsTables::equate(from_S, to_S); } } diff --git a/inter/inter-module/Chapter 2/Inter in Memory.w b/inter/inter-module/Chapter 2/Inter in Memory.w index f42d23b77..f50c4ada3 100644 --- a/inter/inter-module/Chapter 2/Inter in Memory.w +++ b/inter/inter-module/Chapter 2/Inter in Memory.w @@ -29,8 +29,8 @@ To store bytecode-like intermediate code in memory. = typedef struct inter_tree { struct inter_warehouse *warehouse; - inter_t global_symbols_table_ID; - struct inter_frame_list global_material; + struct inter_frame root_definition_frame; + struct inter_package *root_package; struct inter_package *main_package; MEMORY_MANAGEMENT } inter_tree; @@ -38,14 +38,14 @@ typedef struct inter_tree { @ = inter_tree *Inter::create(void) { inter_tree *I = CREATE(inter_tree); - I->global_material.spare_storage = NULL; - I->global_material.storage_used = 0; - I->global_material.storage_capacity = 0; I->main_package = NULL; I->warehouse = Inter::Warehouse::new(I); - I->global_symbols_table_ID = Inter::create_symbols_table(I); - + inter_t N = Inter::create_symbols_table(I); + I->root_package = Inter::get_package(I, Inter::create_package(I)); + I->root_definition_frame = Inter::Frame::root_frame(I); + Inter::Packages::make_rootlike(I->root_package); + Inter::Packages::set_scope(I->root_package, Inter::get_symbols_table(I, N)); return I; } @@ -64,7 +64,7 @@ inter_t Inter::create_symbols_table(inter_tree *I) { } inter_symbols_table *Inter::get_global_symbols(inter_tree *I) { - return Inter::get_symbols_table(I, I->global_symbols_table_ID); + return Inter::Packages::scope(I->root_package); } inter_symbols_table *Inter::get_symbols_table(inter_tree *I, inter_t n) { @@ -252,8 +252,7 @@ typedef struct inter_error_stash { } inter_error_stash; void Inter::traverse_global_list(inter_tree *from, void (*visitor)(inter_tree *, inter_frame, void *), void *state, int filter) { - inter_frame P; - LOOP_THROUGH_INTER_FRAME_LIST(P, (&(from->global_material))) { + PROTECTED_LOOP_THROUGH_INTER_CHILDREN(P, (from->root_definition_frame)) { if ((filter == 0) || ((filter > 0) && (P.data[ID_IFLD] == (inter_t) filter)) || ((filter < 0) && (P.data[ID_IFLD] != (inter_t) -filter))) diff --git a/inter/inter-module/Chapter 2/Packages.w b/inter/inter-module/Chapter 2/Packages.w index 00e5be833..eb9565999 100644 --- a/inter/inter-module/Chapter 2/Packages.w +++ b/inter/inter-module/Chapter 2/Packages.w @@ -20,6 +20,7 @@ typedef struct inter_package { @d CODELIKE_PACKAGE_FLAG 1 @d LINKAGE_PACKAGE_FLAG 2 @d USED_PACKAGE_FLAG 4 +@d ROOT_PACKAGE_FLAG 8 @ = inter_package *Inter::Packages::new(inter_tree *I, inter_t n) { @@ -55,8 +56,20 @@ void Inter::Packages::make_linklike(inter_package *pack) { } } +int Inter::Packages::is_rootlike(inter_package *pack) { + if ((pack) && (pack->package_flags & ROOT_PACKAGE_FLAG)) return TRUE; + return FALSE; +} + +void Inter::Packages::make_rootlike(inter_package *pack) { + if (pack) { + pack->package_flags |= ROOT_PACKAGE_FLAG; + } +} + inter_package *Inter::Packages::parent(inter_package *pack) { if (pack) { + if (Inter::Packages::is_rootlike(pack)) return NULL; inter_frame D = Inter::Symbols::defining_frame(pack->package_name); inter_t P_index = Inter::Frame::get_parent_index(D); if (P_index == 0) return NULL; @@ -69,7 +82,8 @@ inter_package *Inter::Packages::parent(inter_package *pack) { void Inter::Packages::unmark_all(void) { inter_package *pack; LOOP_OVER(pack, inter_package) - CodeGen::unmark(pack->package_name); + if (pack->package_name) + CodeGen::unmark(pack->package_name); } void Inter::Packages::set_scope(inter_package *P, inter_symbols_table *T) { diff --git a/inter/inter-module/Chapter 2/The Warehouse.w b/inter/inter-module/Chapter 2/The Warehouse.w index 95e17848c..23d093cd7 100644 --- a/inter/inter-module/Chapter 2/The Warehouse.w +++ b/inter/inter-module/Chapter 2/The Warehouse.w @@ -89,7 +89,11 @@ inter_frame Inter::Warehouse::find_room(inter_tree *I, int n, inter_error_locati while (IS->next_room) IS = IS->next_room; inter_frame F = Inter::Warehouse::find_room_in_room(IS, n); F.repo_segment->bytecode[F.index + PREFRAME_ORIGIN] = Inter::Warehouse::store_origin(warehouse, eloc); - F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = I->global_symbols_table_ID; + inter_symbols_table *T = Inter::get_global_symbols(I); + if (T) + F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = (inter_t) T->n_index; + else + F.repo_segment->bytecode[F.index + PREFRAME_GLOBALS] = 1; Inter::Frame::attach_package(F, Inter::Packages::to_PID(owner)); return F; }