From 4ed53b07891dd7e472843860861e2f1a0e2faabd Mon Sep 17 00:00:00 2001 From: Graham Nelson Date: Sun, 26 Sep 2021 15:35:01 +0100 Subject: [PATCH] Removed segment choices from vanilla --- docs/final-module/2-cg.html | 16 +-- docs/final-module/2-cg2.html | 126 ++++++++--------- docs/final-module/2-tvg.html | 13 +- docs/final-module/2-vc.html | 34 ++--- docs/final-module/2-vc2.html | 4 +- docs/final-module/2-vo.html | 133 ++++++++++-------- docs/final-module/4-fi6.html | 110 ++++++++------- docs/final-module/5-cfm.html | 4 +- docs/final-module/5-clt.html | 20 +-- docs/final-module/5-cmm.html | 23 ++- docs/final-module/5-com.html | 62 ++++---- docs/final-module/5-fnc.html | 24 +--- inform7/Figures/memory-diagnostics.txt | 4 +- inform7/Figures/timings-diagnostics.txt | 23 +-- inform7/Tests/Test Makes/Eg4-C/textual.txt | 2 +- .../final-module/Chapter 2/Code Generators.w | 50 +++---- .../Chapter 2/The Vanilla Generator.w | 9 +- .../Chapter 2/Vanilla Constants.w | 10 +- .../final-module/Chapter 2/Vanilla Objects.w | 49 ++++--- inter/final-module/Chapter 4/Final Inform 6.w | 56 ++++---- .../final-module/Chapter 5/C Function Model.w | 4 +- inter/final-module/Chapter 5/C Literals.w | 20 +-- inter/final-module/Chapter 5/C Memory Model.w | 21 ++- inter/final-module/Chapter 5/C Object Model.w | 20 ++- inter/final-module/Chapter 5/Final C.w | 22 --- 25 files changed, 431 insertions(+), 428 deletions(-) diff --git a/docs/final-module/2-cg.html b/docs/final-module/2-cg.html index 729541b7a..bc7a30dfb 100644 --- a/docs/final-module/2-cg.html +++ b/docs/final-module/2-cg.html @@ -299,7 +299,7 @@ to go back to where it was. These calls must be made in properly nested pairs.

-generated_segment *CodeGen::select(code_generation *gen, int i) {
+generated_segment *CodeGen::select(code_generation *gen, int i) {
     generated_segment *saved = gen->segmentation.current_segment;
     if ((i < 0) || (i >= NO_DEFINED_I7CGS_VALUES)) internal_error("out of range");
     if (gen->segmentation.temporarily_diverted) internal_error("poorly timed selection");
@@ -309,7 +309,7 @@ to go back to where it was. These calls must be made in properly nested pairs.
     return saved;
 }
 
-void CodeGen::deselect(code_generation *gen, generated_segment *saved) {
+void CodeGen::deselect(code_generation *gen, generated_segment *saved) {
     if (gen->segmentation.temporarily_diverted) internal_error("poorly timed deselection");
     gen->segmentation.current_segment = saved;
 }
@@ -424,26 +424,26 @@ extracted from some Inter instruction.
     inter_tree *I = gen->from;
     text_stream *OUT = CodeGen::current(gen);
     if (val1 == LITERAL_IVAL) {
-        Generators::compile_literal_number(gen, val2, FALSE);
+        Generators::compile_literal_number(gen, val2, FALSE);
     } else if (Inter::Symbols::is_stored_in_data(val1, val2)) {
         inter_symbol *s = InterSymbolsTables::symbol_from_data_pair_and_table(val1, val2, T);
         if (s == NULL) internal_error("bad symbol in Inter pair");
-        Generators::compile_literal_symbol(gen, s);
+        Generators::compile_literal_symbol(gen, s);
     } else if (val1 == DIVIDER_IVAL) {
         text_stream *divider_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);
         WRITE(" ! %S\n\t", divider_text);
     } else if (val1 == REAL_IVAL) {
         text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);
-        Generators::compile_literal_real(gen, glob_text);
+        Generators::compile_literal_real(gen, glob_text);
     } else if (val1 == DWORD_IVAL) {
         text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);
-        Generators::compile_dictionary_word(gen, glob_text, FALSE);
+        Generators::compile_dictionary_word(gen, glob_text, FALSE);
     } else if (val1 == PDWORD_IVAL) {
         text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);
-        Generators::compile_dictionary_word(gen, glob_text, TRUE);
+        Generators::compile_dictionary_word(gen, glob_text, TRUE);
     } else if (val1 == LITERAL_TEXT_IVAL) {
         text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);
-        Generators::compile_literal_text(gen, glob_text, TRUE);
+        Generators::compile_literal_text(gen, glob_text, TRUE);
     } else if (val1 == GLOB_IVAL) {
         text_stream *glob_text = Inter::Warehouse::get_text(InterTree::warehouse(I), val2);
         WRITE("%S", glob_text);
diff --git a/docs/final-module/2-cg2.html b/docs/final-module/2-cg2.html
index aad0b4c99..3c2d3b715 100644
--- a/docs/final-module/2-cg2.html
+++ b/docs/final-module/2-cg2.html
@@ -229,39 +229,25 @@ I6 code. Still, all pragmas are offered to all generators.
 

§8.

-
enum GENERAL_SEGMENT_MTID
-enum DEFAULT_SEGMENT_MTID
-
-
-INT_METHOD_TYPE(GENERAL_SEGMENT_MTID, code_generator *generator, code_generation *gen, inter_tree_node *P)
-
-int Generators::general_segment(code_generation *gen, inter_tree_node *P) {
-    int rv = 0;
-    INT_METHOD_CALL(rv, gen->generator, GENERAL_SEGMENT_MTID, gen, P);
-    return rv;
-}
-
-

§9.

-
enum MANGLE_IDENTIFIER_MTID
 
 VOID_METHOD_TYPE(MANGLE_IDENTIFIER_MTID, code_generator *generator, text_stream *OUT, text_stream *identifier)
-void Generators::mangle(code_generation *gen, text_stream *OUT, text_stream *identifier) {
+void Generators::mangle(code_generation *gen, text_stream *OUT, text_stream *identifier) {
     VOID_METHOD_CALL(gen->generator, MANGLE_IDENTIFIER_MTID, OUT, identifier);
 }
 
-

§10.

+

§9.

enum COMPILE_DICTIONARY_WORD_MTID
 
 VOID_METHOD_TYPE(COMPILE_DICTIONARY_WORD_MTID, code_generator *generator, code_generation *gen, text_stream *S, int pluralise)
-void Generators::compile_dictionary_word(code_generation *gen, text_stream *S, int pluralise) {
+void Generators::compile_dictionary_word(code_generation *gen, text_stream *S, int pluralise) {
     VOID_METHOD_CALL(gen->generator, COMPILE_DICTIONARY_WORD_MTID, gen, S, pluralise);
 }
 
-

§11.

+

§10.

enum COMPILE_LITERAL_NUMBER_MTID
 enum COMPILE_LITERAL_REAL_MTID
@@ -269,24 +255,24 @@ I6 code. Still, all pragmas are offered to all generators.
 
 VOID_METHOD_TYPE(COMPILE_LITERAL_NUMBER_MTID, code_generator *generator, code_generation *gen, inter_ti val, int hex_mode)
 VOID_METHOD_TYPE(COMPILE_LITERAL_REAL_MTID, code_generator *generator, code_generation *gen, text_stream *textual)
-void Generators::compile_literal_number(code_generation *gen, inter_ti val, int hex_mode) {
+void Generators::compile_literal_number(code_generation *gen, inter_ti val, int hex_mode) {
     VOID_METHOD_CALL(gen->generator, COMPILE_LITERAL_NUMBER_MTID, gen, val, hex_mode);
 }
-void Generators::compile_literal_real(code_generation *gen, text_stream *textual) {
+void Generators::compile_literal_real(code_generation *gen, text_stream *textual) {
     VOID_METHOD_CALL(gen->generator, COMPILE_LITERAL_REAL_MTID, gen, textual);
 }
 
-

§12.

+

§11.

enum COMPILE_LITERAL_TEXT_MTID
 
 VOID_METHOD_TYPE(COMPILE_LITERAL_TEXT_MTID, code_generator *generator, code_generation *gen, text_stream *S, int escape_mode)
-void Generators::compile_literal_text(code_generation *gen, text_stream *S, int escape_mode) {
+void Generators::compile_literal_text(code_generation *gen, text_stream *S, int escape_mode) {
     VOID_METHOD_CALL(gen->generator, COMPILE_LITERAL_TEXT_MTID, gen, S, escape_mode);
 }
 
-

§13.

+

§12.

enum DECLARE_PROPERTY_MTID
 enum DECLARE_ATTRIBUTE_MTID
@@ -294,14 +280,14 @@ I6 code. Still, all pragmas are offered to all generators.
 
 VOID_METHOD_TYPE(DECLARE_PROPERTY_MTID, code_generator *generator, code_generation *gen, inter_symbol *prop_name, int used)
 VOID_METHOD_TYPE(DECLARE_ATTRIBUTE_MTID, code_generator *generator, code_generation *gen, text_stream *prop_name)
-void Generators::declare_property(code_generation *gen, inter_symbol *prop_name, int used) {
+void Generators::declare_property(code_generation *gen, inter_symbol *prop_name, int used) {
     VOID_METHOD_CALL(gen->generator, DECLARE_PROPERTY_MTID, gen, prop_name, used);
 }
-void Generators::declare_attribute(code_generation *gen, text_stream *prop_name) {
+void Generators::declare_attribute(code_generation *gen, text_stream *prop_name) {
     VOID_METHOD_CALL(gen->generator, DECLARE_ATTRIBUTE_MTID, gen, prop_name);
 }
 
-

§14.

+

§13.

enum PREPARE_VARIABLE_MTID
 enum DECLARE_VARIABLE_MTID
@@ -324,24 +310,24 @@ I6 code. Still, all pragmas are offered to all generators.
     INT_METHOD_CALL(rv, gen->generator, DECLARE_VARIABLE_MTID, gen, P, var_name, k, of);
     return rv;
 }
-void Generators::declare_variables(code_generation *gen, linked_list *L) {
+void Generators::declare_variables(code_generation *gen, linked_list *L) {
     VOID_METHOD_CALL(gen->generator, DECLARE_VARIABLES_MTID, gen, L);
 }
-void Generators::evaluate_variable(code_generation *gen, inter_symbol *var_name, int as_reference) {
+void Generators::evaluate_variable(code_generation *gen, inter_symbol *var_name, int as_reference) {
     VOID_METHOD_CALL(gen->generator, EVALUATE_VARIABLE_MTID, gen, var_name, as_reference);
 }
 
-

§15.

+

§14.

enum PSEUDO_OBJECT_MTID
 
 VOID_METHOD_TYPE(PSEUDO_OBJECT_MTID, code_generator *generator, code_generation *gen, text_stream *obj_name)
-void Generators::pseudo_object(code_generation *gen, text_stream *obj_name) {
+void Generators::pseudo_object(code_generation *gen, text_stream *obj_name) {
     VOID_METHOD_CALL(gen->generator, PSEUDO_OBJECT_MTID, gen, obj_name);
 }
 
-

§16.

+

§15.

enum DECLARE_CLASS_MTID
 enum END_CLASS_MTID
@@ -353,49 +339,49 @@ I6 code. Still, all pragmas are offered to all generators.
 enum PROPERTY_OFFSET_MTID
 
-VOID_METHOD_TYPE(DECLARE_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class)
-VOID_METHOD_TYPE(END_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name)
-void Generators::declare_class(code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class) {
-    VOID_METHOD_CALL(gen->generator, DECLARE_CLASS_MTID, gen, class_name, printed_name, super_class);
+VOID_METHOD_TYPE(DECLARE_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class, generated_segment **saved)
+VOID_METHOD_TYPE(END_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, generated_segment *saved)
+void Generators::declare_class(code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class, generated_segment **saved) {
+    VOID_METHOD_CALL(gen->generator, DECLARE_CLASS_MTID, gen, class_name, printed_name, super_class, saved);
 }
-void Generators::end_class(code_generation *gen, text_stream *class_name) {
-    VOID_METHOD_CALL(gen->generator, END_CLASS_MTID, gen, class_name);
+void Generators::end_class(code_generation *gen, text_stream *class_name, generated_segment *saved) {
+    VOID_METHOD_CALL(gen->generator, END_CLASS_MTID, gen, class_name, saved);
 }
-VOID_METHOD_TYPE(DECLARE_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir)
-VOID_METHOD_TYPE(END_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name)
-void Generators::declare_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) {
-    VOID_METHOD_CALL(gen->generator, DECLARE_INSTANCE_MTID, gen, class_name, instance_name, printed_name, acount, is_dir);
+VOID_METHOD_TYPE(DECLARE_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, generated_segment **saved)
+VOID_METHOD_TYPE(END_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved)
+void Generators::declare_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, generated_segment **saved) {
+    VOID_METHOD_CALL(gen->generator, DECLARE_INSTANCE_MTID, gen, class_name, instance_name, printed_name, acount, is_dir, saved);
 }
-void Generators::end_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name) {
-    VOID_METHOD_CALL(gen->generator, END_INSTANCE_MTID, gen, class_name, instance_name);
+void Generators::end_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) {
+    VOID_METHOD_CALL(gen->generator, END_INSTANCE_MTID, gen, class_name, instance_name, saved);
 }
 VOID_METHOD_TYPE(DECLARE_VALUE_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val)
-void Generators::declare_value_instance(code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val) {
+void Generators::declare_value_instance(code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val) {
     VOID_METHOD_CALL(gen->generator, DECLARE_VALUE_INSTANCE_MTID, gen, instance_name, printed_name, val);
 }
 INT_METHOD_TYPE(OPTIMISE_PROPERTY_MTID, code_generator *generator, code_generation *gen, inter_symbol *prop_name, inter_tree_node *X)
-int Generators::optimise_property_value(code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) {
+int Generators::optimise_property_value(code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) {
     int rv = FALSE;
     INT_METHOD_CALL(rv, gen->generator, OPTIMISE_PROPERTY_MTID, gen, prop_name, X);
     return rv;
 }
 VOID_METHOD_TYPE(ASSIGN_PROPERTY_MTID, code_generator *generator, code_generation *gen, text_stream *property_name, text_stream *val, int as_att)
-void Generators::assign_property(code_generation *gen, text_stream *property_name, text_stream *val, int as_att) {
+void Generators::assign_property(code_generation *gen, text_stream *property_name, text_stream *val, int as_att) {
     VOID_METHOD_CALL(gen->generator, ASSIGN_PROPERTY_MTID, gen, property_name, val, as_att);
 }
-void Generators::assign_mangled_property(code_generation *gen, text_stream *property_name, text_stream *val, int as_att) {
+void Generators::assign_mangled_property(code_generation *gen, text_stream *property_name, text_stream *val, int as_att) {
     TEMPORARY_TEXT(mangled)
-    Generators::mangle(gen, mangled, val);
-    Generators::assign_property(gen, property_name, mangled, as_att);
+    Generators::mangle(gen, mangled, val);
+    Generators::assign_property(gen, property_name, mangled, as_att);
     DISCARD_TEXT(mangled)
 }
 
 VOID_METHOD_TYPE(PROPERTY_OFFSET_MTID, code_generator *generator, code_generation *gen, text_stream *property_name, int pos, int as_att)
-void Generators::property_offset(code_generation *gen, text_stream *property_name, int pos, int as_att) {
+void Generators::property_offset(code_generation *gen, text_stream *property_name, int pos, int as_att) {
     VOID_METHOD_CALL(gen->generator, PROPERTY_OFFSET_MTID, gen, property_name, pos, as_att);
 }
 
-

§17.

+

§16.

enum DECLARE_CONSTANT_MTID
 define DATA_GDCFORM 1
@@ -405,11 +391,11 @@ I6 code. Still, all pragmas are offered to all generators.
 
 VOID_METHOD_TYPE(DECLARE_CONSTANT_MTID, code_generator *generator, code_generation *gen, text_stream *const_name, inter_symbol *const_s, int form, inter_tree_node *P, text_stream *val, int ifndef_me)
-void Generators::declare_constant(code_generation *gen, text_stream *const_name, inter_symbol *const_s, int form, inter_tree_node *P, text_stream *val, int ifndef_me) {
+void Generators::declare_constant(code_generation *gen, text_stream *const_name, inter_symbol *const_s, int form, inter_tree_node *P, text_stream *val, int ifndef_me) {
     VOID_METHOD_CALL(gen->generator, DECLARE_CONSTANT_MTID, gen, const_name, const_s, form, P, val, ifndef_me);
 }
 
-

§18.

+

§17.

enum PREDECLARE_FUNCTION_MTID
 enum DECLARE_FUNCTION_MTID
@@ -420,17 +406,17 @@ I6 code. Still, all pragmas are offered to all generators.
 VOID_METHOD_TYPE(PREDECLARE_FUNCTION_MTID, code_generator *generator, code_generation *gen, inter_symbol *fn, inter_tree_node *code)
 VOID_METHOD_TYPE(DECLARE_FUNCTION_MTID, code_generator *generator, code_generation *gen, inter_symbol *fn, inter_tree_node *code)
 VOID_METHOD_TYPE(END_FUNCTION_MTID, code_generator *generator, int pass, code_generation *gen, inter_symbol *fn)
-void Generators::predeclare_function(code_generation *gen, inter_symbol *fn, inter_tree_node *code) {
+void Generators::predeclare_function(code_generation *gen, inter_symbol *fn, inter_tree_node *code) {
     VOID_METHOD_CALL(gen->generator, PREDECLARE_FUNCTION_MTID, gen, fn, code);
 }
-void Generators::declare_function(code_generation *gen, inter_symbol *fn, inter_tree_node *code) {
+void Generators::declare_function(code_generation *gen, inter_symbol *fn, inter_tree_node *code) {
     VOID_METHOD_CALL(gen->generator, DECLARE_FUNCTION_MTID, gen, fn, code);
 }
 void Generators::end_function(int pass, code_generation *gen, inter_symbol *fn) {
     VOID_METHOD_CALL(gen->generator, END_FUNCTION_MTID, pass, gen, fn);
 }
 
-

§19.

+

§18.

enum BEGIN_ARRAY_MTID
 enum ARRAY_ENTRY_MTID
@@ -443,37 +429,37 @@ I6 code. Still, all pragmas are offered to all generators.
 define BUFFER_ARRAY_FORMAT 4
 
-INT_METHOD_TYPE(BEGIN_ARRAY_MTID, code_generator *generator, code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format)
+INT_METHOD_TYPE(BEGIN_ARRAY_MTID, code_generator *generator, code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved)
 VOID_METHOD_TYPE(ARRAY_ENTRY_MTID, code_generator *generator, code_generation *gen, text_stream *entry, int format)
 VOID_METHOD_TYPE(ARRAY_ENTRIES_MTID, code_generator *generator, code_generation *gen, int how_many, int plus_ips, int format)
 VOID_METHOD_TYPE(COMPILE_LITERAL_SYMBOL_MTID, code_generator *generator, code_generation *gen, inter_symbol *aliased)
-VOID_METHOD_TYPE(END_ARRAY_MTID, code_generator *generator, code_generation *gen, int format)
-int Generators::begin_array(code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format) {
+VOID_METHOD_TYPE(END_ARRAY_MTID, code_generator *generator, code_generation *gen, int format, generated_segment *saved)
+int Generators::begin_array(code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) {
     int rv = FALSE;
-    INT_METHOD_CALL(rv, gen->generator, BEGIN_ARRAY_MTID, gen, const_name, array_s, P, format);
+    INT_METHOD_CALL(rv, gen->generator, BEGIN_ARRAY_MTID, gen, const_name, array_s, P, format, saved);
     return rv;
 }
-void Generators::array_entry(code_generation *gen, text_stream *entry, int format) {
+void Generators::array_entry(code_generation *gen, text_stream *entry, int format) {
     VOID_METHOD_CALL(gen->generator, ARRAY_ENTRY_MTID, gen, entry, format);
 }
-void Generators::array_entries(code_generation *gen, int how_many, int plus_ips, int format) {
+void Generators::array_entries(code_generation *gen, int how_many, int plus_ips, int format) {
     VOID_METHOD_CALL(gen->generator, ARRAY_ENTRIES_MTID, gen, how_many, plus_ips, format);
 }
-void Generators::mangled_array_entry(code_generation *gen, text_stream *entry, int format) {
+void Generators::mangled_array_entry(code_generation *gen, text_stream *entry, int format) {
     TEMPORARY_TEXT(mangled)
-    Generators::mangle(gen, mangled, entry);
+    Generators::mangle(gen, mangled, entry);
     VOID_METHOD_CALL(gen->generator, ARRAY_ENTRY_MTID, gen, mangled, format);
     DISCARD_TEXT(mangled)
 }
-void Generators::compile_literal_symbol(code_generation *gen, inter_symbol *aliased) {
+void Generators::compile_literal_symbol(code_generation *gen, inter_symbol *aliased) {
     VOID_METHOD_CALL(gen->generator, COMPILE_LITERAL_SYMBOL_MTID, gen, aliased);
 }
 
-void Generators::end_array(code_generation *gen, int format) {
-    VOID_METHOD_CALL(gen->generator, END_ARRAY_MTID, gen, format);
+void Generators::end_array(code_generation *gen, int format, generated_segment *saved) {
+    VOID_METHOD_CALL(gen->generator, END_ARRAY_MTID, gen, format, saved);
 }
 
-

§20.

+

§19.

enum WORLD_MODEL_ESSENTIALS_MTID
 
@@ -483,13 +469,13 @@ I6 code. Still, all pragmas are offered to all generators. VOID_METHOD_CALL(gen->generator, WORLD_MODEL_ESSENTIALS_MTID, gen); }
-

§21.

+

§20.

enum NEW_ACTION_MTID
 
 VOID_METHOD_TYPE(NEW_ACTION_MTID, code_generator *generator, code_generation *gen, text_stream *name, int true_action)
-void Generators::new_action(code_generation *gen, text_stream *name, int true_action) {
+void Generators::new_action(code_generation *gen, text_stream *name, int true_action) {
     VOID_METHOD_CALL(gen->generator, NEW_ACTION_MTID, gen, name, true_action);
 }
 
diff --git a/docs/final-module/2-tvg.html b/docs/final-module/2-tvg.html index 09685b727..5a6453e25 100644 --- a/docs/final-module/2-tvg.html +++ b/docs/final-module/2-tvg.html @@ -126,7 +126,7 @@ be sent END_GENERATION_MTID gen->global_variables = NEW_LINKED_LIST(inter_symbol); InterTree::traverse(gen->from, Vanilla::gather_variables, gen, NULL, VARIABLE_IST); - Generators::declare_variables(gen, gen->global_variables); + Generators::declare_variables(gen, gen->global_variables);

§1.5.

@@ -155,8 +155,6 @@ and then this will do nothing. code_generation *gen = (code_generation *) state; inter_package *outer = Inter::Packages::container(P); if ((outer == NULL) || (Inter::Packages::is_codelike(outer) == FALSE)) { - generated_segment *saved = - CodeGen::select(gen, Generators::general_segment(gen, P)); switch (P->W.data[ID_IFLD]) { case CONSTANT_IST: { inter_symbol *con_name = @@ -164,13 +162,12 @@ and then this will do nothing. if (Inter::Constant::is_routine(con_name)) { inter_package *code_block = Inter::Constant::code_block(con_name); inter_tree_node *D = Inter::Packages::definition(code_block); - Generators::predeclare_function(gen, con_name, D); + Generators::predeclare_function(gen, con_name, D); return; } break; } } - CodeGen::deselect(gen, saved); } } @@ -190,17 +187,15 @@ functions, and calls Vanilla::node code_generation *gen = (code_generation *) state; inter_package *outer = Inter::Packages::container(P); if ((outer == NULL) || (Inter::Packages::is_codelike(outer) == FALSE)) { - generated_segment *saved = CodeGen::select(gen, Generators::general_segment(gen, P)); switch (P->W.data[ID_IFLD]) { case CONSTANT_IST: - case INSTANCE_IST: - case PROPERTYVALUE_IST: case VARIABLE_IST: case SPLAT_IST: + case INSTANCE_IST: + case PROPERTYVALUE_IST: Vanilla::node(gen, P); break; } - CodeGen::deselect(gen, saved); } } diff --git a/docs/final-module/2-vc.html b/docs/final-module/2-vc.html index 1a1afd8b9..f1bb5ca80 100644 --- a/docs/final-module/2-vc.html +++ b/docs/final-module/2-vc.html @@ -115,7 +115,7 @@ function togglePopup(material_id) { text_stream *fa = Str::duplicate(con_name->symbol_name); Str::delete_first_character(fa); Str::delete_first_character(fa); - Generators::new_action(gen, fa, TRUE); + Generators::new_action(gen, fa, TRUE);

§1.2. Declare this constant as a fake action name1.2 = @@ -125,7 +125,7 @@ function togglePopup(material_id) { text_stream *fa = Str::duplicate(con_name->symbol_name); Str::delete_first_character(fa); Str::delete_first_character(fa); - Generators::new_action(gen, fa, FALSE); + Generators::new_action(gen, fa, FALSE);

§1.3. Declare this constant as a function1.3 = @@ -134,7 +134,7 @@ function togglePopup(material_id) {

     inter_package *code_block = Inter::Constant::code_block(con_name);
     inter_tree_node *D = Inter::Packages::definition(code_block);
-    Generators::declare_function(gen, con_name, D);
+    Generators::declare_function(gen, con_name, D);
 

§1.4. Declare this constant as the special UUID string array1.4 = @@ -143,7 +143,8 @@ function togglePopup(material_id) {

     inter_ti ID = P->W.data[DATA_CONST_IFLD];
     text_stream *S = Inode::ID_to_text(P, ID);
-    Generators::begin_array(gen, I"UUID_ARRAY", NULL, NULL, BYTE_ARRAY_FORMAT);
+    generated_segment *saved;
+    Generators::begin_array(gen, I"UUID_ARRAY", NULL, NULL, BYTE_ARRAY_FORMAT, &saved);
     TEMPORARY_TEXT(content)
     WRITE_TO(content, "UUID:");
     for (int i=0, L=Str::len(S); i<L; i++)
@@ -160,7 +161,7 @@ function togglePopup(material_id) {
         DISCARD_TEXT(ch)
     }
     DISCARD_TEXT(content)
-    Generators::end_array(gen, BYTE_ARRAY_FORMAT);
+    Generators::end_array(gen, BYTE_ARRAY_FORMAT, saved);
 

§1.5. Declare this as a textual constant1.5 = @@ -187,8 +188,9 @@ function togglePopup(material_id) { } if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1) format = BUFFER_ARRAY_FORMAT; - if (Generators::begin_array(gen, Inter::Symbols::name(con_name), con_name, P, format)) { - if (hang_one) Generators::array_entry(gen, I"1", format); + generated_segment *saved; + if (Generators::begin_array(gen, Inter::Symbols::name(con_name), con_name, P, format, &saved)) { + if (hang_one) Generators::array_entry(gen, I"1", format); int entry_count = 0; for (int i=DATA_CONST_IFLD; i<P->W.extent; i=i+2) if (P->W.data[i] != DIVIDER_IVAL) @@ -201,7 +203,7 @@ function togglePopup(material_id) { } if (e > 1) { LOG("Entry count 1 on %S masks %d blanks\n", Inter::Symbols::name(con_name), e); - Generators::array_entries(gen, (int) e, ips, format); + Generators::array_entries(gen, (int) e, ips, format); } else { for (int i=DATA_CONST_IFLD; i<P->W.extent; i=i+2) { if (P->W.data[i] != DIVIDER_IVAL) { @@ -209,12 +211,12 @@ function togglePopup(material_id) { CodeGen::select_temporary(gen, entry); CodeGen::pair(gen, P, P->W.data[i], P->W.data[i+1]); CodeGen::deselect_temporary(gen); - Generators::array_entry(gen, entry, format); + Generators::array_entry(gen, entry, format); DISCARD_TEXT(entry) } } } - Generators::end_array(gen, format); + Generators::end_array(gen, format, saved); }

@@ -222,7 +224,7 @@ function togglePopup(material_id) {

-    Generators::declare_constant(gen, Inter::Symbols::name(con_name), con_name, COMPUTED_GDCFORM, P, NULL, FALSE);
+    Generators::declare_constant(gen, Inter::Symbols::name(con_name), con_name, COMPUTED_GDCFORM, P, NULL, FALSE);
 

§1.8. Declare this as an explicit constant1.8 = @@ -238,7 +240,7 @@ function togglePopup(material_id) { (Str::eq(con_name->symbol_name, I"DEBUG")) || (Str::eq(con_name->symbol_name, I"cap_short_name"))) ifndef_me = TRUE; - Generators::declare_constant(gen, Inter::Symbols::name(con_name), con_name, DATA_GDCFORM, P, NULL, ifndef_me); + Generators::declare_constant(gen, Inter::Symbols::name(con_name), con_name, DATA_GDCFORM, P, NULL, ifndef_me);

§2.

@@ -252,14 +254,14 @@ function togglePopup(material_id) { if (Str::len(val) > 0) { WRITE("%S", val); } else { - Generators::compile_literal_number(gen, 1, FALSE); + Generators::compile_literal_number(gen, 1, FALSE); } break; case DATA_GDCFORM: { inter_ti val1 = P->W.data[DATA_CONST_IFLD]; inter_ti val2 = P->W.data[DATA_CONST_IFLD + 1]; if ((val1 == LITERAL_IVAL) && (Inter::Symbols::read_annotation(con_name, HEX_IANN))) - Generators::compile_literal_number(gen, val2, TRUE); + Generators::compile_literal_number(gen, val2, TRUE); else CodeGen::pair(gen, P, val1, val2); break; @@ -284,7 +286,7 @@ function togglePopup(material_id) { break; } case LITERAL_TEXT_GDCFORM: - Generators::compile_literal_text(gen, val, FALSE); + Generators::compile_literal_text(gen, val, FALSE); break; } } @@ -328,7 +330,7 @@ function togglePopup(material_id) { qsort(sorted, (size_t) no_tlh, sizeof(text_literal_holder *), VanillaConstants::compare_tlh); for (int i=0; i<no_tlh; i++) { text_literal_holder *tlh = sorted[i]; - Generators::declare_constant(gen, Inter::Symbols::name(tlh->con_name), tlh->con_name, LITERAL_TEXT_GDCFORM, tlh->con_name->definition, tlh->literal_content, FALSE); + Generators::declare_constant(gen, Inter::Symbols::name(tlh->con_name), tlh->con_name, LITERAL_TEXT_GDCFORM, tlh->con_name->definition, tlh->literal_content, FALSE); } } } diff --git a/docs/final-module/2-vc2.html b/docs/final-module/2-vc2.html index 5344089d4..0345512e4 100644 --- a/docs/final-module/2-vc2.html +++ b/docs/final-module/2-vc2.html @@ -225,9 +225,9 @@ a variable here. if ((Str::eq(Inter::Symbols::name(named_s), I"self")) || ((named_s->definition) && (named_s->definition->W.data[ID_IFLD] == VARIABLE_IST))) { - Generators::evaluate_variable(gen, named_s, ref); + Generators::evaluate_variable(gen, named_s, ref); } else { - Generators::compile_literal_symbol(gen, named_s); + Generators::compile_literal_symbol(gen, named_s); } } else switch (val1) { case UNDEF_IVAL: internal_error("undef val/ref in Inter tree"); diff --git a/docs/final-module/2-vo.html b/docs/final-module/2-vo.html index 60d4ea517..bf312e1ee 100644 --- a/docs/final-module/2-vo.html +++ b/docs/final-module/2-vo.html @@ -156,7 +156,7 @@ MathJax = { code_generation *gen = (code_generation *) state; inter_symbol *con_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_CONST_IFLD); if (Inter::Symbols::read_annotation(con_name, OBJECT_IANN) > 0) - Generators::pseudo_object(gen, Inter::Symbols::name(con_name)); + Generators::pseudo_object(gen, Inter::Symbols::name(con_name)); } @@ -370,10 +370,10 @@ in the I6 template, or some extension), and we therefore do nothing. if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) >= 0) { text_stream *A = Inter::Symbols::get_translate(prop_name); if (A == NULL) A = Inter::Symbols::name(prop_name); - Generators::declare_attribute(gen, A); + Generators::declare_attribute(gen, A); } else { if (translated == FALSE) - Generators::declare_attribute(gen, Inter::Symbols::name(prop_name)); + Generators::declare_attribute(gen, Inter::Symbols::name(prop_name)); } @@ -404,8 +404,8 @@ compiles an I6 constant for this value. if (FBNA_found == FALSE) { FBNA_found = TRUE; TEMPORARY_TEXT(val) - Generators::mangle(gen, val, Inter::Symbols::name(prop_name)); - Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, val, FALSE); + Generators::mangle(gen, val, Inter::Symbols::name(prop_name)); + Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, val, FALSE); DISCARD_TEXT(val) } @@ -416,10 +416,10 @@ above has been tried on all properties:
 void VanillaObjects::knowledge(code_generation *gen) {
-    text_stream *OUT = CodeGen::current(gen);
+	text_stream *OUT = CodeGen::current(gen);
     inter_tree *I = gen->from;
     if ((FBNA_found == FALSE) && (properties_found)) {
-        Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, I"MAX_POSITIVE_NUMBER", FALSE);
+        Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, I"MAX_POSITIVE_NUMBER", FALSE);
     }
     inter_symbol **all_props_in_source_order = NULL;
     inter_symbol **props_in_source_order = NULL;
@@ -495,7 +495,7 @@ above has been tried on all properties:
             inter_symbol *prop_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_PROP_IFLD);
             if ((Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) == 1) &&
                 (Inter::Symbols::read_annotation(prop_name, ATTRIBUTE_IANN) != 1)) {
-                Generators::declare_property(gen, prop_name, TRUE);
+                Generators::declare_property(gen, prop_name, TRUE);
             }
         }
     }
@@ -570,17 +570,18 @@ bother to force them.)
 
 
     if (properties_found) {
-        Generators::declare_instance(gen, I"Object", I"property_numberspace_forcer", NULL, -1, FALSE);
+        generated_segment *saved;
+        Generators::declare_instance(gen, I"Object", I"property_numberspace_forcer", NULL, -1, FALSE, &saved);
         for (int p=0; p<no_properties; p++) {
             inter_symbol *prop_name = props_in_source_order[p];
             if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT) == FALSE) {
                 inter_symbol *kind_name = Inter::Property::kind_of(prop_name);
                 if (kind_name == truth_state_kind_symbol) {
-                    Generators::assign_property(gen, Inter::Symbols::name(prop_name), I"0", FALSE);
+                    Generators::assign_property(gen, Inter::Symbols::name(prop_name), I"0", FALSE);
                 }
             }
         }
-        Generators::end_instance(gen, I"Object", I"property_numberspace_forcer");
+        Generators::end_instance(gen, I"Object", I"property_numberspace_forcer", saved);
     }
 
@@ -617,30 +618,31 @@ property usage is legal. if (VanillaObjects::is_kind_of_object(kind_name)) no_kos++; } - Generators::begin_array(gen, I"KindHierarchy", NULL, NULL, WORD_ARRAY_FORMAT); + generated_segment *saved; + Generators::begin_array(gen, I"KindHierarchy", NULL, NULL, WORD_ARRAY_FORMAT, &saved); if (no_kos > 0) { - Generators::mangled_array_entry(gen, I"K0_kind", WORD_ARRAY_FORMAT); - Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); + Generators::mangled_array_entry(gen, I"K0_kind", WORD_ARRAY_FORMAT); + Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); for (int i=0; i<no_kind_frames; i++) { inter_symbol *kind_name = kinds_in_source_order[i]; if (VanillaObjects::is_kind_of_object(kind_name)) { inter_symbol *super_name = Inter::Kind::super(kind_name); - Generators::mangled_array_entry(gen, Inter::Symbols::name(kind_name), WORD_ARRAY_FORMAT); + Generators::mangled_array_entry(gen, Inter::Symbols::name(kind_name), WORD_ARRAY_FORMAT); if ((super_name) && (super_name != object_kind_symbol)) { TEMPORARY_TEXT(N); WRITE_TO(N, "%d", VanillaObjects::kind_of_object_count(super_name)); - Generators::array_entry(gen, N, WORD_ARRAY_FORMAT); + Generators::array_entry(gen, N, WORD_ARRAY_FORMAT); DISCARD_TEXT(N); } else { - Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); + Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); } } } } else { - Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); - Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); + Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); + Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); } - Generators::end_array(gen, WORD_ARRAY_FORMAT); + Generators::end_array(gen, WORD_ARRAY_FORMAT, saved);

§5.8. Lookup mechanism for properties of value instances. As noted above, if K is a kind which can have properties but is not a subkind @@ -682,10 +684,11 @@ take lightly in the Z-machine. But speed and flexibility are worth more. if (Inter::Symbols::get_flag(kind_name, VPH_MARK_BIT)) { TEMPORARY_TEXT(instance_name) WRITE_TO(instance_name, "VPH_%d", w); - Generators::declare_instance(gen, I"VPH_Class", instance_name, NULL, -1, FALSE); + generated_segment *saved; + Generators::declare_instance(gen, I"VPH_Class", instance_name, NULL, -1, FALSE, &saved); TEMPORARY_TEXT(N) WRITE_TO(N, "%d", Inter::Kind::instance_count(kind_name)); - Generators::assign_property(gen, I"value_range", N, FALSE); + Generators::assign_property(gen, I"value_range", N, FALSE); DISCARD_TEXT(N) for (int p=0; p<no_properties; p++) { inter_symbol *prop_name = props_in_source_order[p]; @@ -702,7 +705,7 @@ take lightly in the Z-machine. But speed and flexibility are worth more. Work through this frame list of permissions5.8.4; } } - Generators::end_instance(gen, I"VPH_Class", instance_name); + Generators::end_instance(gen, I"VPH_Class", instance_name, saved); DISCARD_TEXT(instance_name) } } @@ -727,8 +730,9 @@ words, the number of instances of this kind.

-    Generators::declare_class(gen, I"VPH_Class", NULL, I"Class");
-    Generators::end_class(gen, I"VPH_Class");
+    generated_segment *saved;
+    Generators::declare_class(gen, I"VPH_Class", NULL, I"Class", &saved);
+    Generators::end_class(gen, I"VPH_Class", saved);
 

§5.8.2. Decide who gets a VPH5.8.2 = @@ -768,8 +772,9 @@ doesn't have a VPH, or the object number of its VPH if it has.

-    Generators::begin_array(gen, I"value_property_holders", NULL, NULL, WORD_ARRAY_FORMAT);
-    Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT);
+    generated_segment *saved;
+    Generators::begin_array(gen, I"value_property_holders", NULL, NULL, WORD_ARRAY_FORMAT, &saved);
+    Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT);
     int vph = 0;
     for (int w=1; w<M; w++) {
         int written = FALSE;
@@ -780,14 +785,14 @@ doesn't have a VPH, or the object number of its VPH if it has.
                     written = TRUE;
                     TEMPORARY_TEXT(vph)
                     WRITE_TO(vph, "VPH_%d", w);
-                    Generators::mangled_array_entry(gen, vph, WORD_ARRAY_FORMAT);
+                    Generators::mangled_array_entry(gen, vph, WORD_ARRAY_FORMAT);
                     DISCARD_TEXT(vph)
                 }
             }
         }
-        if (written) vph++; else Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT);
+        if (written) vph++; else Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT);
     }
-    Generators::end_array(gen, WORD_ARRAY_FORMAT);
+    Generators::end_array(gen, WORD_ARRAY_FORMAT, saved);
     Stub a faux VPH if none have otherwise been created5.8.3.1;
 
@@ -802,7 +807,7 @@ just to force the property into being.

-    if (vph == 0) WRITE("VPH_Class UnusedVPH with value_range 0;\n");
+     if (vph == 0) WRITE("VPH_Class UnusedVPH with value_range 0;\n");
 

§5.8.4. Work through this frame list of permissions5.8.4 = @@ -819,7 +824,7 @@ just to force the property into being. if (X->W.data[STORAGE_PERM_IFLD]) { inter_symbol *store = InterSymbolsTables::symbol_from_frame_data(X, STORAGE_PERM_IFLD); if (store == NULL) internal_error("bad PP in inter"); - Generators::assign_mangled_property(gen, call_it, Inter::Symbols::name(store), FALSE); + Generators::assign_mangled_property(gen, call_it, Inter::Symbols::name(store), FALSE); } else { TEMPORARY_TEXT(ident) kov_value_stick *kvs = CREATE(kov_value_stick); @@ -829,7 +834,7 @@ just to force the property into being. kvs->kind_name = kind_name; kvs->node = X; ADD_TO_LINKED_LIST(kvs, kov_value_stick, stick_list); - Generators::assign_mangled_property(gen, call_it, kvs->identifier, FALSE); + Generators::assign_mangled_property(gen, call_it, kvs->identifier, FALSE); DISCARD_TEXT(ident) } } @@ -870,9 +875,10 @@ because I6 doesn't allow function calls in a constant context.

-    Generators::begin_array(gen, ident, NULL, NULL, TABLE_ARRAY_FORMAT);
-    Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT);
-    Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT);
+    generated_segment *saved;
+    Generators::begin_array(gen, ident, NULL, NULL, TABLE_ARRAY_FORMAT, &saved);
+    Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT);
+    Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT);
     for (int j=0; j<no_instance_frames; j++) {
         inter_symbol *inst_name = instances_in_declaration_order[j];
         if (Inter::Kind::is_a(Inter::Instance::kind_of(inst_name), kind_name)) {
@@ -884,10 +890,10 @@ because I6 doesn't allow function calls in a constant context.
             PVL = Inode::ID_to_frame_list(X,
                     Inter::Kind::properties_list(kind_name));
             Work through this frame list of values5.8.5.1.1;
-            if (found == 0) Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT);
+            if (found == 0) Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT);
         }
     }
-    Generators::end_array(gen, TABLE_ARRAY_FORMAT);
+    Generators::end_array(gen, TABLE_ARRAY_FORMAT, saved);
 

§5.8.5.1.1. Work through this frame list of values5.8.5.1.1 = @@ -905,7 +911,7 @@ because I6 doesn't allow function calls in a constant context. CodeGen::select_temporary(gen, val); CodeGen::pair(gen, Y, v1, v2); CodeGen::deselect_temporary(gen); - Generators::array_entry(gen, val, TABLE_ARRAY_FORMAT); + Generators::array_entry(gen, val, TABLE_ARRAY_FORMAT); DISCARD_TEXT(val) } } @@ -922,12 +928,13 @@ because I6 doesn't allow function calls in a constant context. text_stream *super_class = NULL; inter_symbol *super_name = Inter::Kind::super(kind_name); if (super_name) super_class = Inter::Symbols::name(super_name); - Generators::declare_class(gen, Inter::Symbols::name(kind_name), Metadata::read_optional_textual(Inter::Packages::container(kind_name->definition), I"^printed_name"), super_class); + generated_segment *saved; + Generators::declare_class(gen, Inter::Symbols::name(kind_name), Metadata::read_optional_textual(Inter::Packages::container(kind_name->definition), I"^printed_name"), super_class, &saved); VanillaObjects::append(gen, kind_name); inter_node_list *FL = Inter::Warehouse::get_frame_list(InterTree::warehouse(I), Inter::Kind::properties_list(kind_name)); VanillaObjects::plist(gen, FL); - Generators::end_class(gen, Inter::Symbols::name(kind_name)); + Generators::end_class(gen, Inter::Symbols::name(kind_name), saved); } } @@ -973,20 +980,21 @@ though this won't happen for any property created by I7 source text.

     if (properties_found) {
-        Generators::begin_array(gen, I"property_metadata", NULL, NULL, WORD_ARRAY_FORMAT);
+        generated_segment *saved;
+        Generators::begin_array(gen, I"property_metadata", NULL, NULL, WORD_ARRAY_FORMAT, &saved);
         int pos = 0;
         for (int p=0; p<no_properties; p++) {
             inter_symbol *prop_name = props_in_source_order[p];
             if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT))
-                Generators::property_offset(gen, Inter::Symbols::name(prop_name), pos, TRUE);
+                Generators::property_offset(gen, Inter::Symbols::name(prop_name), pos, TRUE);
             else
-                Generators::property_offset(gen, Inter::Symbols::name(prop_name), pos, FALSE);
+                Generators::property_offset(gen, Inter::Symbols::name(prop_name), pos, FALSE);
             Write the property name in double quotes5.11.1;
             Write a list of kinds or objects which are permitted to have this property5.11.2;
-            Generators::mangled_array_entry(gen, I"NULL", WORD_ARRAY_FORMAT);
+            Generators::mangled_array_entry(gen, I"NULL", WORD_ARRAY_FORMAT);
             pos++;
         }
-        Generators::end_array(gen, WORD_ARRAY_FORMAT);
+        Generators::end_array(gen, WORD_ARRAY_FORMAT, saved);
     }
 
@@ -999,9 +1007,9 @@ though this won't happen for any property created by I7 source text. if (N > 0) pname = Inter::Warehouse::get_text(InterTree::warehouse(I), (inter_ti) N); TEMPORARY_TEXT(entry) CodeGen::select_temporary(gen, entry); - Generators::compile_literal_text(gen, pname, TRUE); + Generators::compile_literal_text(gen, pname, TRUE); CodeGen::deselect_temporary(gen); - Generators::array_entry(gen, entry, WORD_ARRAY_FORMAT); + Generators::array_entry(gen, entry, WORD_ARRAY_FORMAT); DISCARD_TEXT(entry) pos++; @@ -1052,7 +1060,7 @@ linearly with the size of the source text, even though \(N\) does. inter_symbol *owner_name = InterSymbolsTables::symbol_from_frame_data(X, OWNER_PERM_IFLD); if (owner_name == kind_name) { - Generators::mangled_array_entry(gen, Inter::Symbols::name(kind_name), WORD_ARRAY_FORMAT); + Generators::mangled_array_entry(gen, Inter::Symbols::name(kind_name), WORD_ARRAY_FORMAT); pos++; } } @@ -1066,7 +1074,7 @@ linearly with the size of the source text, even though \(N\) does. inter_symbol *owner_name = InterSymbolsTables::symbol_from_frame_data(X, OWNER_PERM_IFLD); if (owner_name == inst_name) { - Generators::mangled_array_entry(gen, Inter::Symbols::name(inst_name), WORD_ARRAY_FORMAT); + Generators::mangled_array_entry(gen, Inter::Symbols::name(inst_name), WORD_ARRAY_FORMAT); pos++; } } @@ -1084,12 +1092,12 @@ linearly with the size of the source text, even though \(N\) does. inter_symbol *owner_name = InterSymbolsTables::symbol_from_frame_data(X, OWNER_PERM_IFLD); if (owner_name == object_kind_symbol) { - Generators::mangled_array_entry(gen, I"K0_kind", WORD_ARRAY_FORMAT); + Generators::mangled_array_entry(gen, I"K0_kind", WORD_ARRAY_FORMAT); pos++; for (int k=0; k<no_kind_frames; k++) { inter_symbol *kind_name = kinds_in_source_order[k]; if (Inter::Kind::super(kind_name) == object_kind_symbol) { - Generators::mangled_array_entry(gen, Inter::Symbols::name(kind_name), WORD_ARRAY_FORMAT); + Generators::mangled_array_entry(gen, Inter::Symbols::name(kind_name), WORD_ARRAY_FORMAT); pos++; } } @@ -1105,7 +1113,7 @@ linearly with the size of the source text, even though \(N\) does. for (int p=0; p<no_properties; p++) { inter_symbol *prop_name = props_in_source_order[p]; if (Inter::Symbols::read_annotation(prop_name, ASSIMILATED_IANN) != 1) { - Generators::declare_property(gen, prop_name, FALSE); + Generators::declare_property(gen, prop_name, FALSE); } } @@ -1124,8 +1132,8 @@ linearly with the size of the source text, even though \(N\) does. if (val1 == UNDEF_IVAL) defined = FALSE; TEMPORARY_TEXT(val) if (defined) WRITE_TO(val, "%d", val2); - Generators::declare_constant(gen, Inter::Symbols::name(inst_name), NULL, RAW_GDCFORM, NULL, val, FALSE); - Generators::declare_value_instance(gen, Inter::Symbols::name(inst_name), + Generators::declare_constant(gen, Inter::Symbols::name(inst_name), NULL, RAW_GDCFORM, NULL, val, FALSE); + Generators::declare_value_instance(gen, Inter::Symbols::name(inst_name), Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), val); DISCARD_TEXT(val) @@ -1211,14 +1219,15 @@ really make much conceptual sense, and I7 dropped the idea — it has no int c = Inter::Symbols::read_annotation(inst_name, ARROW_COUNT_IANN); if (c < 0) c = 0; int is_dir = Inter::Kind::is_a(inst_kind, direction_kind_symbol); - Generators::declare_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), - Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), c, is_dir); + generated_segment *saved; + Generators::declare_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), + Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), c, is_dir, &saved); VanillaObjects::append(gen, inst_name); inter_node_list *FL = Inode::ID_to_frame_list(P, Inter::Instance::properties_list(inst_name)); VanillaObjects::plist(gen, FL); - Generators::end_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name)); + Generators::end_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), saved); } } @@ -1232,19 +1241,19 @@ really make much conceptual sense, and I7 dropped the idea — it has no if (Inter::Symbols::get_flag(prop_name, ATTRIBUTE_MARK_BIT)) { if ((X->W.data[DVAL1_PVAL_IFLD] == LITERAL_IVAL) && (X->W.data[DVAL2_PVAL_IFLD] == 0)) { - Generators::assign_property(gen, call_it, I"0", TRUE); + Generators::assign_property(gen, call_it, I"0", TRUE); } else { - Generators::assign_property(gen, call_it, I"1", TRUE); + Generators::assign_property(gen, call_it, I"1", TRUE); } } else { TEMPORARY_TEXT(OUT) CodeGen::select_temporary(gen, OUT); - if (Generators::optimise_property_value(gen, prop_name, X) == FALSE) { + if (Generators::optimise_property_value(gen, prop_name, X) == FALSE) { CodeGen::pair(gen, X, X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD]); } CodeGen::deselect_temporary(gen); - Generators::assign_property(gen, call_it, OUT, FALSE); + Generators::assign_property(gen, call_it, OUT, FALSE); DISCARD_TEXT(OUT) } } diff --git a/docs/final-module/4-fi6.html b/docs/final-module/4-fi6.html index 81645d8a3..ad7718f5d 100644 --- a/docs/final-module/4-fi6.html +++ b/docs/final-module/4-fi6.html @@ -142,7 +142,6 @@ function togglePopup(material_id) { void I6Target::create_generator(void) { code_generator *cgt = Generators::new(I"inform6"); METHOD_ADD(cgt, BEGIN_GENERATION_MTID, I6Target::begin_generation); - METHOD_ADD(cgt, GENERAL_SEGMENT_MTID, I6Target::general_segment); METHOD_ADD(cgt, INVOKE_PRIMITIVE_MTID, I6Target::invoke_primitive); METHOD_ADD(cgt, MANGLE_IDENTIFIER_MTID, I6Target::mangle); METHOD_ADD(cgt, COMPILE_DICTIONARY_WORD_MTID, I6Target::compile_dictionary_word); @@ -305,32 +304,12 @@ It's used in the I6 veneer, and need not exist on any other final compilation ta return FALSE; } -int I6Target::general_segment(code_generator *cgt, code_generation *gen, inter_tree_node *P) { - switch (P->W.data[ID_IFLD]) { - case CONSTANT_IST: { - inter_symbol *con_name = - InterSymbolsTables::symbol_from_frame_data(P, DEFN_CONST_IFLD); - int choice = early_matter_I7CGS; - if (Str::eq(con_name->symbol_name, I"DynamicMemoryAllocation")) choice = very_early_matter_I7CGS; - if (Inter::Symbols::read_annotation(con_name, LATE_IANN) == 1) choice = code_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BYTEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, TABLEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; - if (P->W.data[FORMAT_CONST_IFLD] == CONSTANT_INDIRECT_LIST) choice = arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, VERBARRAY_IANN) == 1) choice = verbs_at_eof_I7CGS; - if (Inter::Constant::is_routine(con_name)) choice = routines_at_eof_I7CGS; - return choice; - } - } - return main_matter_I7CGS; -} - -int I6Target::basic_constant_segment(code_generator *cgt, code_generation *gen, inter_symbol *con_name, int depth) { +int I6Target::basic_constant_segment(code_generator *cgt, code_generation *gen, inter_symbol *con_name, int depth) { if (depth >= 10) depth = 10; return constants_1_I7CGS + depth - 1; } -void I6Target::offer_pragma(code_generator *cgt, code_generation *gen, +void I6Target::offer_pragma(code_generator *cgt, code_generation *gen, inter_tree_node *P, text_stream *tag, text_stream *content) { if (Str::eq(tag, I"Inform6")) { generated_segment *saved = CodeGen::select(gen, pragmatic_matter_I7CGS); @@ -340,11 +319,11 @@ It's used in the I6 veneer, and need not exist on any other final compilation ta } } -void I6Target::mangle(code_generator *cgt, OUTPUT_STREAM, text_stream *identifier) { +void I6Target::mangle(code_generator *cgt, OUTPUT_STREAM, text_stream *identifier) { WRITE("%S", identifier); } -void I6Target::invoke_primitive(code_generator *cgt, code_generation *gen, +void I6Target::invoke_primitive(code_generator *cgt, code_generation *gen, inter_symbol *prim_name, inter_tree_node *P, int void_context) { text_stream *OUT = CodeGen::current(gen); int suppress_terminal_semicolon = FALSE; @@ -701,7 +680,7 @@ then the result.

§4.

-void I6Target::compile_dictionary_word(code_generator *cgt, code_generation *gen,
+void I6Target::compile_dictionary_word(code_generator *cgt, code_generation *gen,
     text_stream *S, int pluralise) {
     text_stream *OUT = CodeGen::current(gen);
     int n = 0;
@@ -726,14 +705,14 @@ then the result.
 

§5.

-void I6Target::compile_literal_number(code_generator *cgt,
+void I6Target::compile_literal_number(code_generator *cgt,
     code_generation *gen, inter_ti val, int hex_mode) {
     text_stream *OUT = CodeGen::current(gen);
     if (hex_mode) WRITE("$%x", val);
     else WRITE("%d", val);
 }
 
-void I6Target::compile_literal_real(code_generator *cgt,
+void I6Target::compile_literal_real(code_generator *cgt,
     code_generation *gen, text_stream *textual) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE("$%S", textual);
@@ -742,7 +721,7 @@ then the result.
 

§6.

-void I6Target::compile_literal_text(code_generator *cgt, code_generation *gen,
+void I6Target::compile_literal_text(code_generator *cgt, code_generation *gen,
     text_stream *S, int escape_mode) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE("\"");
@@ -808,7 +787,7 @@ trick called "stubbing", these being "stub definitions".)
 

-void I6Target::declare_property(code_generator *cgt, code_generation *gen,
+void I6Target::declare_property(code_generator *cgt, code_generation *gen,
     inter_symbol *prop_name, int used) {
     text_stream *name = Inter::Symbols::name(prop_name);
     if (used) {
@@ -822,13 +801,13 @@ trick called "stubbing", these being "stub definitions".)
     }
 }
 
-void I6Target::declare_attribute(code_generator *cgt, code_generation *gen, text_stream *prop_name) {
+void I6Target::declare_attribute(code_generator *cgt, code_generation *gen, text_stream *prop_name) {
     generated_segment *saved = CodeGen::select(gen, I6Target::basic_constant_segment(cgt, gen, NULL, 1));
     WRITE_TO(CodeGen::current(gen), "Attribute %S;\n", prop_name);
     CodeGen::deselect(gen, saved);
 }
 
-void I6Target::property_offset(code_generator *cgt, code_generation *gen, text_stream *prop, int pos, int as_attr) {
+void I6Target::property_offset(code_generator *cgt, code_generation *gen, text_stream *prop, int pos, int as_attr) {
     generated_segment *saved = CodeGen::select(gen, property_offset_creator_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
     if (I6_GEN_DATA(I6_property_offsets_made)++ == 0) {
@@ -847,7 +826,7 @@ trick called "stubbing", these being "stub definitions".)
 

§8.

-void I6Target::declare_variables(code_generator *cgt, code_generation *gen,
+void I6Target::declare_variables(code_generator *cgt, code_generation *gen,
     linked_list *L) {
     int k = 0;
     inter_symbol *var_name;
@@ -884,23 +863,28 @@ trick called "stubbing", these being "stub definitions".)
     }
 }
 
-void I6Target::evaluate_variable(code_generator *cgt, code_generation *gen, inter_symbol *var_name, int as_reference) {
+void I6Target::evaluate_variable(code_generator *cgt, code_generation *gen, inter_symbol *var_name, int as_reference) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE("%S", Inter::Symbols::name(var_name));
 }
 
-void I6Target::declare_class(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class) {
+void I6Target::declare_class(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class,
+    generated_segment **saved) {
+    *saved = CodeGen::select(gen, main_matter_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
     WRITE("Class %S\n", class_name);
     if (Str::len(super_class) > 0) WRITE("  class %S\n", super_class);
 }
 
-void I6Target::end_class(code_generator *cgt, code_generation *gen, text_stream *class_name) {
+void I6Target::end_class(code_generator *cgt, code_generation *gen, text_stream *class_name, generated_segment *saved) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE(";\n");
+    CodeGen::deselect(gen, saved);
 }
 
-void I6Target::declare_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) {
+void I6Target::declare_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir,
+    generated_segment **saved) {
+    *saved = CodeGen::select(gen, main_matter_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
     WRITE("%S", class_name);
     for (int i=0; i<acount; i++) WRITE(" ->");
@@ -908,12 +892,13 @@ trick called "stubbing", these being "stub definitions".)
     if (is_dir) WRITE(" Compass");
 }
 
-void I6Target::end_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name) {
+void I6Target::end_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE(";\n");
+    CodeGen::deselect(gen, saved);
 }
 
-int I6Target::optimise_property_value(code_generator *cgt, code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) {
+int I6Target::optimise_property_value(code_generator *cgt, code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) {
     if (Inter::Symbols::is_stored_in_data(X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD])) {
         inter_symbol *S = InterSymbolsTables::symbol_from_data_pair_and_frame(X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD], X);
         if ((S) && (Inter::Symbols::read_annotation(S, INLINE_ARRAY_IANN) == 1)) {
@@ -929,7 +914,7 @@ trick called "stubbing", these being "stub definitions".)
     return FALSE;
 }
 
-void I6Target::assign_property(code_generator *cgt, code_generation *gen, text_stream *property_name, text_stream *val, int as_att) {
+void I6Target::assign_property(code_generator *cgt, code_generation *gen, text_stream *property_name, text_stream *val, int as_att) {
     text_stream *OUT = CodeGen::current(gen);
     if (as_att) {
         if (Str::eq(val, I"0")) WRITE("    has ~%S\n", property_name);
@@ -950,7 +935,7 @@ trick called "stubbing", these being "stub definitions".)
     LOOP_THROUGH_INTER_CHILDREN(F, P) I6Target::seek_locals(gen, F);
 }
 
-void I6Target::declare_constant(code_generator *cgt, code_generation *gen, text_stream *const_name, inter_symbol *const_s, int form, inter_tree_node *P, text_stream *val, int ifndef_me) {
+void I6Target::declare_constant(code_generator *cgt, code_generation *gen, text_stream *const_name, inter_symbol *const_s, int form, inter_tree_node *P, text_stream *val, int ifndef_me) {
     if ((const_s) && (Inter::Symbols::read_annotation(const_s, INLINE_ARRAY_IANN) == 1)) return;
 
     if (Str::eq(const_name, I"FLOAT_INFINITY")) return;
@@ -1001,7 +986,8 @@ trick called "stubbing", these being "stub definitions".)
 }
 
 int this_is_I6_Main = 0;
-void I6Target::declare_function(code_generator *cgt, code_generation *gen, inter_symbol *fn, inter_tree_node *D) {
+void I6Target::declare_function(code_generator *cgt, code_generation *gen, inter_symbol *fn, inter_tree_node *D) {
+    generated_segment *saved = CodeGen::select(gen, routines_at_eof_I7CGS);
     text_stream *fn_name = Inter::Symbols::name(fn);
     this_is_I6_Main = 0;
     text_stream *OUT = CodeGen::current(gen);
@@ -1091,12 +1077,13 @@ trick called "stubbing", these being "stub definitions".)
         WRITE("rfalse;\n");
     }
     WRITE("];\n");
+    CodeGen::deselect(gen, saved);
 }
-void I6Target::place_label(code_generator *cgt, code_generation *gen, text_stream *label_name) {
+void I6Target::place_label(code_generator *cgt, code_generation *gen, text_stream *label_name) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE("%S;\n", label_name);
 }
-void I6Target::evaluate_label(code_generator *cgt, code_generation *gen, text_stream *label_name) {
+void I6Target::evaluate_label(code_generator *cgt, code_generation *gen, text_stream *label_name) {
     text_stream *OUT = CodeGen::current(gen);
     LOOP_THROUGH_TEXT(pos, label_name)
         if (Str::get(pos) != '.')
@@ -1113,7 +1100,7 @@ or implement assembly-language operations like 
 
 
-void I6Target::invoke_function(code_generator *cgt, code_generation *gen, inter_symbol *fn, inter_tree_node *P, int void_context) {
+void I6Target::invoke_function(code_generator *cgt, code_generation *gen, inter_symbol *fn, inter_tree_node *P, int void_context) {
     text_stream *fn_name = Inter::Symbols::name(fn);
     text_stream *OUT = CodeGen::current(gen);
     WRITE("%S(", fn_name);
@@ -1126,7 +1113,7 @@ or implement assembly-language operations like     if (void_context) WRITE(";\n");
 }
 
-void I6Target::invoke_opcode(code_generator *cgt, code_generation *gen,
+void I6Target::invoke_opcode(code_generator *cgt, code_generation *gen,
     text_stream *opcode, int operand_count, inter_tree_node **operands,
     inter_tree_node *label, int label_sense, int void_context) {
     text_stream *OUT = CodeGen::current(gen);
@@ -1143,7 +1130,19 @@ or implement assembly-language operations like     if (void_context) WRITE(";\n");
 }
 
-int I6Target::begin_array(code_generator *cgt, code_generation *gen, text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format) {
+int I6Target::begin_array(code_generator *cgt, code_generation *gen, text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) {
+    if (saved) {
+        int choice = early_matter_I7CGS;
+        if (array_s) {
+            if (Str::eq(array_s->symbol_name, I"DynamicMemoryAllocation")) choice = very_early_matter_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, LATE_IANN) == 1) choice = code_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, BUFFERARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, BYTEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, TABLEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, VERBARRAY_IANN) == 1) choice = verbs_at_eof_I7CGS;
+        }
+        *saved = CodeGen::select(gen, choice);
+    }
     text_stream *OUT = CodeGen::current(gen);
 
     if ((array_s) && (Inter::Symbols::read_annotation(array_s, VERBARRAY_IANN) == 1)) {
@@ -1198,15 +1197,15 @@ or implement assembly-language operations like     return TRUE;
 }
 
-void I6Target::array_entry(code_generator *cgt, code_generation *gen, text_stream *entry, int format) {
+void I6Target::array_entry(code_generator *cgt, code_generation *gen, text_stream *entry, int format) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE(" (%S)", entry);
 }
 
-void I6Target::compile_literal_symbol(code_generator *cgt, code_generation *gen, inter_symbol *aliased) {
+void I6Target::compile_literal_symbol(code_generator *cgt, code_generation *gen, inter_symbol *aliased) {
     text_stream *OUT = CodeGen::current(gen);
     text_stream *S = Inter::Symbols::name(aliased);
-    Generators::mangle(gen, OUT, S);
+    Generators::mangle(gen, OUT, S);
 }
 

§10. Alternatively, we can just specify how many entries there will be: they will @@ -1214,26 +1213,29 @@ then be initialised to 0.

-void I6Target::array_entries(code_generator *cgt, code_generation *gen,
+void I6Target::array_entries(code_generator *cgt, code_generation *gen,
     int how_many, int plus_ips, int format) {
     text_stream *OUT = CodeGen::current(gen);
     if (plus_ips) WRITE(" (%d + INDIV_PROP_START)", how_many, plus_ips);
     else WRITE(" (%d)", how_many);
 }
 
-void I6Target::end_array(code_generator *cgt, code_generation *gen, int format) {
+void I6Target::end_array(code_generator *cgt, code_generation *gen, int format, generated_segment *saved) {
     text_stream *OUT = CodeGen::current(gen);
     WRITE(";\n");
+    if (saved) CodeGen::deselect(gen, saved);
 }
 
-void I6Target::new_action(code_generator *cgt, code_generation *gen, text_stream *name, int true_action) {
+void I6Target::new_action(code_generator *cgt, code_generation *gen, text_stream *name, int true_action) {
     if (true_action == FALSE) {
+        generated_segment *saved = CodeGen::select(gen, early_matter_I7CGS);
         text_stream *OUT = CodeGen::current(gen);
         WRITE("Fake_Action %S;\n", name);
+        CodeGen::deselect(gen, saved);
     }
 }
 
-void I6Target::pseudo_object(code_generator *cgt, code_generation *gen, text_stream *obj_name) {
+void I6Target::pseudo_object(code_generator *cgt, code_generation *gen, text_stream *obj_name) {
     generated_segment *saved = CodeGen::select(gen, main_matter_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
     WRITE("Object %S \"(%S object)\" has concealed;\n", obj_name, obj_name);
diff --git a/docs/final-module/5-cfm.html b/docs/final-module/5-cfm.html
index 1fa202a16..68841f4ae 100644
--- a/docs/final-module/5-cfm.html
+++ b/docs/final-module/5-cfm.html
@@ -312,7 +312,8 @@ function togglePopup(material_id) {
     text_stream *fn_name = Inter::Symbols::name(fn);
     final_c_function *fcf = RETRIEVE_POINTER_final_c_function(fn->translation_data);
     C_GEN_DATA(fndata.current_fcf) = fcf;
-        text_stream *OUT = CodeGen::current(gen);
+    generated_segment *saved = CodeGen::select(gen, c_functions_at_eof_I7CGS);
+    text_stream *OUT = CodeGen::current(gen);
     WRITE("%S", fcf->prototype);
     WRITE(" {\n");
     WRITE("i7_debug_stack(\"%S\");\n", fn_name);
@@ -330,6 +331,7 @@ function togglePopup(material_id) {
     C_GEN_DATA(fndata.compiling_function) = FALSE;
     WRITE("return 1;\n");
     WRITE("\n}\n\n");
+    CodeGen::deselect(gen, saved);
 }
 
 void CFunctionModel::place_label(code_generator *cgt, code_generation *gen, text_stream *label_name) {
diff --git a/docs/final-module/5-clt.html b/docs/final-module/5-clt.html
index e19d6050d..697039c31 100644
--- a/docs/final-module/5-clt.html
+++ b/docs/final-module/5-clt.html
@@ -182,14 +182,14 @@ function togglePopup(material_id) {
     int dictlen = C_GEN_DATA(litdata.C_dword_count);
 
     generated_segment *saved = CodeGen::select(gen, c_predeclarations_I7CGS);
-    CMemoryModel::begin_array(NULL, gen, I"#dictionary_table", NULL, NULL, BYTE_ARRAY_FORMAT);
+    CMemoryModel::begin_array(NULL, gen, I"#dictionary_table", NULL, NULL, BYTE_ARRAY_FORMAT, NULL);
     for (int b=0; b<4; b++) {
         TEMPORARY_TEXT(N)
         WRITE_TO(N, "I7BYTE_%d(%d)", b, dictlen);
         CMemoryModel::array_entry(NULL, gen, N, BYTE_ARRAY_FORMAT);
         DISCARD_TEXT(N)
     }
-    CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT);
+    CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT, NULL);
 
     if (dictlen == 0) return;
     C_dword **sorted = (C_dword **)
@@ -199,7 +199,7 @@ function togglePopup(material_id) {
     qsort(sorted, (size_t) LinkedLists::len(C_GEN_DATA(litdata.words)), sizeof(C_dword *), CLiteralsModel::compare_dwords);
     for (int i=0; i<dictlen; i++) {
         dw = sorted[i];
-        CMemoryModel::begin_array(NULL, gen, sorted[i]->identifier, NULL, NULL, BYTE_ARRAY_FORMAT);
+        CMemoryModel::begin_array(NULL, gen, sorted[i]->identifier, NULL, NULL, BYTE_ARRAY_FORMAT, NULL);
         TEMPORARY_TEXT(N)
         WRITE_TO(N, "0x60");
         CMemoryModel::array_entry(NULL, gen, N, BYTE_ARRAY_FORMAT);
@@ -238,7 +238,7 @@ function togglePopup(material_id) {
         DISCARD_TEXT(DP1L)
         DISCARD_TEXT(DP2H)
         DISCARD_TEXT(DP2L)
-        CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT);
+        CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT, NULL);
     }
     Memory::I7_free(sorted, CODE_GENERATION_MREASON, dictlen);
     CodeGen::deselect(gen, saved);
@@ -492,7 +492,7 @@ function togglePopup(material_id) {
 }
 
 void CLiteralsModel::compile_verb_table(code_generation *gen) {
-    CMemoryModel::begin_array(NULL, gen, I"#grammar_table", NULL, NULL, WORD_ARRAY_FORMAT);
+    CMemoryModel::begin_array(NULL, gen, I"#grammar_table", NULL, NULL, WORD_ARRAY_FORMAT, NULL);
     TEMPORARY_TEXT(N)
     WRITE_TO(N, "%d", C_GEN_DATA(litdata.verb_count) - 1);
     CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT);
@@ -504,13 +504,13 @@ function togglePopup(material_id) {
         CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT);
         DISCARD_TEXT(N)
     }
-    CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT);
-    CMemoryModel::begin_array(NULL, gen, I"#grammar_table_cont", NULL, NULL, BYTE_ARRAY_FORMAT);
+    CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT, NULL);
+    CMemoryModel::begin_array(NULL, gen, I"#grammar_table_cont", NULL, NULL, BYTE_ARRAY_FORMAT, NULL);
     text_stream *entry;
     LOOP_OVER_LINKED_LIST(entry, text_stream, C_GEN_DATA(litdata.verb_grammar)) {
         CMemoryModel::array_entry(NULL, gen, entry, BYTE_ARRAY_FORMAT);
     }
-    CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT);
+    CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT, NULL);
 }
 
 void CLiteralsModel::new_action(code_generator *cgt, code_generation *gen, text_stream *name, int true_action) {
@@ -527,7 +527,7 @@ function togglePopup(material_id) {
 }
 
 void CLiteralsModel::compile_actions_table(code_generation *gen) {
-    CMemoryModel::begin_array(NULL, gen, I"#actions_table", NULL, NULL, WORD_ARRAY_FORMAT);
+    CMemoryModel::begin_array(NULL, gen, I"#actions_table", NULL, NULL, WORD_ARRAY_FORMAT, NULL);
     TEMPORARY_TEXT(N)
     WRITE_TO(N, "%d", C_GEN_DATA(litdata.C_action_count));
     CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT);
@@ -539,7 +539,7 @@ function togglePopup(material_id) {
         CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT);
         DISCARD_TEXT(N)
     }
-    CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT);
+    CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT, NULL);
 }
 
  • The structure C_dword is accessed in 2/vo, 5/com and here.
diff --git a/docs/final-module/5-cmm.html b/docs/final-module/5-cmm.html index 5df930822..0d110ecdc 100644 --- a/docs/final-module/5-cmm.html +++ b/docs/final-module/5-cmm.html @@ -363,7 +363,19 @@ express a packed word in constant context, which we will need later.
 int CMemoryModel::begin_array(code_generator *cgt, code_generation *gen,
-    text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format) {
+    text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) {
+    if (saved) {
+        int choice = c_early_matter_I7CGS;
+        if (array_s) {
+            if (Str::eq(array_s->symbol_name, I"DynamicMemoryAllocation")) choice = c_very_early_matter_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, LATE_IANN) == 1) choice = c_code_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, BUFFERARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, BYTEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, TABLEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS;
+            if (Inter::Symbols::read_annotation(array_s, VERBARRAY_IANN) == 1) choice = c_verbs_at_eof_I7CGS;
+        }
+        *saved = CodeGen::select(gen, choice);
+    }
     Str::clear(C_GEN_DATA(memdata.array_name));
     WRITE_TO(C_GEN_DATA(memdata.array_name), "%S", array_name);
     C_GEN_DATA(memdata.entry_count) = 0;
@@ -477,7 +489,7 @@ and therefore if Xvoid CMemoryModel::compile_literal_symbol(code_generator *cgt, code_generation *gen, inter_symbol *aliased) {
     text_stream *OUT = CodeGen::current(gen);
     text_stream *S = Inter::Symbols::name(aliased);
-    Generators::mangle(gen, OUT, S);
+    Generators::mangle(gen, OUT, S);
 }
 

§13. Alternatively, we can just specify how many entries there will be: they will @@ -496,13 +508,14 @@ except to predeclare the extent constant, if one was used.

-void CMemoryModel::end_array(code_generator *cgt, code_generation *gen, int format) {
-    generated_segment *saved = CodeGen::select(gen, c_predeclarations_I7CGS);
+void CMemoryModel::end_array(code_generator *cgt, code_generation *gen, int format, generated_segment *saved) {
+    generated_segment *x_saved = CodeGen::select(gen, c_predeclarations_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
     WRITE("#define xt_");
     CNamespace::mangle(cgt, OUT, C_GEN_DATA(memdata.array_name));
     WRITE(" %d\n", C_GEN_DATA(memdata.entry_count)-1);
-    CodeGen::deselect(gen, saved);
+    CodeGen::deselect(gen, x_saved);
+    if (saved) CodeGen::deselect(gen, saved);
 }
 

§15. Primitives for byte and word lookup. The signatures here are: diff --git a/docs/final-module/5-com.html b/docs/final-module/5-com.html index f058faf46..581ba6c83 100644 --- a/docs/final-module/5-com.html +++ b/docs/final-module/5-com.html @@ -82,8 +82,10 @@ function togglePopup(material_id) { void CObjectModel::initialise(code_generator *cgt) { METHOD_ADD(cgt, PSEUDO_OBJECT_MTID, CObjectModel::pseudo_object); METHOD_ADD(cgt, DECLARE_INSTANCE_MTID, CObjectModel::declare_instance); + METHOD_ADD(cgt, END_INSTANCE_MTID, CObjectModel::end_instance); METHOD_ADD(cgt, DECLARE_VALUE_INSTANCE_MTID, CObjectModel::declare_value_instance); METHOD_ADD(cgt, DECLARE_CLASS_MTID, CObjectModel::declare_class); + METHOD_ADD(cgt, END_CLASS_MTID, CObjectModel::end_class); METHOD_ADD(cgt, DECLARE_PROPERTY_MTID, CObjectModel::declare_property); METHOD_ADD(cgt, DECLARE_ATTRIBUTE_MTID, CObjectModel::declare_attribute); @@ -248,13 +250,18 @@ overlap.

 void CObjectModel::declare_class(code_generator *cgt, code_generation *gen,
-    text_stream *class_name, text_stream *printed_name, text_stream *super_class) {
+    text_stream *class_name, text_stream *printed_name, text_stream *super_class, generated_segment **saved) {
+    *saved = CodeGen::select(gen, c_main_matter_I7CGS);
     if (Str::len(super_class) == 0) super_class = I"Class";
     CObjectModel::declare_class_inner(gen, class_name, printed_name,
         CObjectModel::next_owner_id(gen), super_class);
 }
 
-void CObjectModel::declare_class_inner(code_generation *gen,
+void CObjectModel::end_class(code_generator *cgt, code_generation *gen, text_stream *class_name, generated_segment *saved) {
+    CodeGen::deselect(gen, saved);
+}
+
+void CObjectModel::declare_class_inner(code_generation *gen,
     text_stream *class_name, text_stream *printed_name, int id, text_stream *super_class) {
     CObjectModel::define_constant_for_owner_id(gen, class_name, id);
     if (printed_name) CObjectModel::define_header_constant_for_kind(gen, class_name, printed_name, id);
@@ -265,13 +272,16 @@ overlap.
 

-void CObjectModel::pseudo_object(code_generator *cgt, code_generation *gen, text_stream *obj_name) {
-    C_property_owner *obj = CObjectModel::declare_instance(cgt, gen, I"Object", obj_name, obj_name, -1, FALSE);
+void CObjectModel::pseudo_object(code_generator *cgt, code_generation *gen, text_stream *obj_name) {
+    generated_segment *saved;
+    C_property_owner *obj = CObjectModel::declare_instance(cgt, gen, I"Object", obj_name, obj_name, -1, FALSE, &saved);
+    CodeGen::deselect(gen, saved);
     if (Str::eq(obj_name, I"Compass")) C_GEN_DATA(objdata.compass_instance) = obj;
 }
 
-C_property_owner *CObjectModel::declare_instance(code_generator *cgt, code_generation *gen,
-    text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) {
+C_property_owner *CObjectModel::declare_instance(code_generator *cgt, code_generation *gen,
+    text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, generated_segment **saved) {
+    *saved = CodeGen::select(gen, c_main_matter_I7CGS);
     if (Str::len(instance_name) == 0) internal_error("nameless instance");
     int id = CObjectModel::next_owner_id(gen);
     CObjectModel::define_constant_for_owner_id(gen, instance_name, id);
@@ -314,7 +324,11 @@ overlap.
     return this;
 }
 
-void CObjectModel::declare_value_instance(code_generator *cgt,
+void CObjectModel::end_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) {
+    CodeGen::deselect(gen, saved);
+}
+
+void CObjectModel::declare_value_instance(code_generator *cgt,
     code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val) {
     CObjectModel::define_header_constant_for_instance(gen, instance_name, printed_name, val, TRUE);
 }
@@ -324,7 +338,7 @@ defining this as a constant equal to its ID.
 

-void CObjectModel::define_constant_for_owner_id(code_generation *gen, text_stream *owner_name,
+void CObjectModel::define_constant_for_owner_id(code_generation *gen, text_stream *owner_name,
     int id) {
     generated_segment *saved = CodeGen::select(gen, c_ids_and_maxima_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -358,7 +372,7 @@ defining this as a constant equal to its ID.
     return key;
 }
 
-void CObjectModel::define_header_constant_for_instance(code_generation *gen, text_stream *owner_name,
+void CObjectModel::define_header_constant_for_instance(code_generation *gen, text_stream *owner_name,
     text_stream *printed_name, text_stream *val, int enumerated) {
     int seg = (enumerated)?c_enum_symbols_I7CGS:c_instances_symbols_I7CGS;
     generated_segment *saved = CodeGen::select(gen, seg);
@@ -367,7 +381,7 @@ defining this as a constant equal to its ID.
     CodeGen::deselect(gen, saved);
 }
 
-void CObjectModel::define_header_constant_for_kind(code_generation *gen, text_stream *owner_name,
+void CObjectModel::define_header_constant_for_kind(code_generation *gen, text_stream *owner_name,
     text_stream *printed_name, int id) {
     generated_segment *saved = CodeGen::select(gen, c_kinds_symbols_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -375,7 +389,7 @@ defining this as a constant equal to its ID.
     CodeGen::deselect(gen, saved);
 }
 
-void CObjectModel::define_header_constant_for_action(code_generation *gen, text_stream *action_name,
+void CObjectModel::define_header_constant_for_action(code_generation *gen, text_stream *action_name,
     text_stream *printed_name, int id) {
     generated_segment *saved = CodeGen::select(gen, c_actions_symbols_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -383,7 +397,7 @@ defining this as a constant equal to its ID.
     CodeGen::deselect(gen, saved);
 }
 
-void CObjectModel::define_header_constant_for_property(code_generation *gen, text_stream *prop_name,
+void CObjectModel::define_header_constant_for_property(code_generation *gen, text_stream *prop_name,
     int id) {
     generated_segment *saved = CodeGen::select(gen, c_property_symbols_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -391,7 +405,7 @@ defining this as a constant equal to its ID.
     CodeGen::deselect(gen, saved);
 }
 
-void CObjectModel::define_header_constant_for_variable(code_generation *gen, text_stream *var_name,
+void CObjectModel::define_header_constant_for_variable(code_generation *gen, text_stream *var_name,
     int id) {
     generated_segment *saved = CodeGen::select(gen, c_variable_symbols_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -399,7 +413,7 @@ defining this as a constant equal to its ID.
     CodeGen::deselect(gen, saved);
 }
 
-void CObjectModel::define_header_constant_for_function(code_generation *gen, text_stream *fn_name,
+void CObjectModel::define_header_constant_for_function(code_generation *gen, text_stream *fn_name,
     text_stream *val) {
     generated_segment *saved = CodeGen::select(gen, c_function_symbols_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -475,7 +489,7 @@ that references to it will not fail to compile.
 

-void CObjectModel::declare_property(code_generator *cgt, code_generation *gen,
+void CObjectModel::declare_property(code_generator *cgt, code_generation *gen,
     inter_symbol *prop_name, int used) {
     text_stream *name = Inter::Symbols::name(prop_name);
     C_property *cp = CObjectModel::property_by_name(gen, name, used, FALSE);
@@ -483,7 +497,7 @@ that references to it will not fail to compile.
     if (pname)
         CObjectModel::define_header_constant_for_property(gen, pname, cp->id);
 }
-void CObjectModel::declare_attribute(code_generator *cgt, code_generation *gen,
+void CObjectModel::declare_attribute(code_generator *cgt, code_generation *gen,
     text_stream *prop_name) {
     CObjectModel::property_by_name(gen, prop_name, TRUE, TRUE);
 }
@@ -500,7 +514,7 @@ only need to be unique, so the order is not significant.
     CLASS_DEFINITION
 } C_property;
 
-C_property *CObjectModel::property_by_name(code_generation *gen, text_stream *name, int used, int attr) {
+C_property *CObjectModel::property_by_name(code_generation *gen, text_stream *name, int used, int attr) {
     dictionary *D = C_GEN_DATA(objdata.declared_properties);
     C_property *cp;
     if (Dictionaries::find(D, name) == NULL) {
@@ -529,7 +543,7 @@ properties at runtime.
 

-void CObjectModel::property_offset(code_generator *cgt, code_generation *gen,
+void CObjectModel::property_offset(code_generator *cgt, code_generation *gen,
     text_stream *prop, int pos, int as_attr) {
     generated_segment *saved = CodeGen::select(gen, c_property_offset_creator_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
@@ -628,7 +642,7 @@ initialiser function which runs early and sets the property values up by hand:
 

§9.

-int CObjectModel::optimise_property_value(code_generator *cgt, code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) {
+int CObjectModel::optimise_property_value(code_generator *cgt, code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) {
     C_GEN_DATA(objdata.inline_this) = FALSE;
     if (Inter::Symbols::is_stored_in_data(X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD])) {
         inter_symbol *S = InterSymbolsTables::symbol_from_data_pair_and_frame(X->W.data[DVAL1_PVAL_IFLD], X->W.data[DVAL2_PVAL_IFLD], X);
@@ -652,7 +666,7 @@ the next owner is declared.
     CLASS_DEFINITION
 } C_pv_pair;
 
-void CObjectModel::assign_property(code_generator *cgt, code_generation *gen,
+void CObjectModel::assign_property(code_generator *cgt, code_generation *gen,
     text_stream *property_name, text_stream *val, int as_att) {
     C_property_owner *owner = C_GEN_DATA(objdata.current_owner);
     C_property *prop = CObjectModel::property_by_name(gen, property_name, FALSE, FALSE);
@@ -695,7 +709,7 @@ the next owner is declared.
     }
 }
 
-void CObjectModel::write_property_values_table(code_generation *gen) {
+void CObjectModel::write_property_values_table(code_generation *gen) {
     generated_segment *saved = CodeGen::select(gen, c_initialiser_I7CGS);
     text_stream *OUT = CodeGen::current(gen);
     C_property_owner *owner;
@@ -740,12 +754,12 @@ which we will then need to write in 
-int CObjectModel::handle_store_by_ref(code_generation *gen, inter_tree_node *ref) {
+int CObjectModel::handle_store_by_ref(code_generation *gen, inter_tree_node *ref) {
     if (Inter::Reference::node_is_ref_to(gen->from, ref, PROPERTYVALUE_BIP)) return TRUE;
     return FALSE;
 }
 
-int CObjectModel::invoke_primitive(code_generation *gen, inter_ti bip, inter_tree_node *P) {
+int CObjectModel::invoke_primitive(code_generation *gen, inter_ti bip, inter_tree_node *P) {
     text_stream *OUT = CodeGen::current(gen);
     switch (bip) {
         case PROPERTYADDRESS_BIP: WRITE("i7_prop_addr("); VNODE_1C; WRITE(", "); VNODE_2C; WRITE(")"); break;
@@ -859,7 +873,7 @@ and write them.
 

§14. Special object-related conditions.

-text_stream *CObjectModel::test_with_function(inter_ti bip, int *positive) {
+text_stream *CObjectModel::test_with_function(inter_ti bip, int *positive) {
     switch (bip) {
         case OFCLASS_BIP:   *positive = TRUE;  return I"i7_ofclass"; break;
         case HAS_BIP:       *positive = TRUE;  return I"i7_has"; break;
diff --git a/docs/final-module/5-fnc.html b/docs/final-module/5-fnc.html
index 2be4d3503..6881663c2 100644
--- a/docs/final-module/5-fnc.html
+++ b/docs/final-module/5-fnc.html
@@ -95,8 +95,6 @@ function togglePopup(material_id) {
     CGlobals::initialise(c_target);
     CAssembly::initialise(c_target);
     CInputOutputModel::initialise(c_target);
-
-    METHOD_ADD(c_target, GENERAL_SEGMENT_MTID, CTarget::general_segment);
 }
 

§2. Static supporting code. The C code generated here would not compile as a stand-alone file. It needs @@ -615,27 +613,7 @@ first of those: return FALSE; } -int CTarget::general_segment(code_generator *cgt, code_generation *gen, inter_tree_node *P) { - switch (P->W.data[ID_IFLD]) { - case CONSTANT_IST: { - inter_symbol *con_name = - InterSymbolsTables::symbol_from_frame_data(P, DEFN_CONST_IFLD); - int choice = c_early_matter_I7CGS; - if (Str::eq(con_name->symbol_name, I"DynamicMemoryAllocation")) choice = c_very_early_matter_I7CGS; - if (Inter::Symbols::read_annotation(con_name, LATE_IANN) == 1) choice = c_code_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BYTEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, TABLEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; - if (P->W.data[FORMAT_CONST_IFLD] == CONSTANT_INDIRECT_LIST) choice = c_arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, VERBARRAY_IANN) == 1) choice = c_verbs_at_eof_I7CGS; - if (Inter::Constant::is_routine(con_name)) choice = c_functions_at_eof_I7CGS; - return choice; - } - } - return c_main_matter_I7CGS; -} - -int CTarget::basic_constant_segment(code_generator *cgt, code_generation *gen, inter_symbol *con_name, int depth) { +int CTarget::basic_constant_segment(code_generator *cgt, code_generation *gen, inter_symbol *con_name, int depth) { if (con_name) { if (Str::eq(Inter::Symbols::name(con_name), I"Release")) return c_ids_and_maxima_I7CGS; if (Str::eq(Inter::Symbols::name(con_name), I"Serial")) return c_ids_and_maxima_I7CGS; diff --git a/inform7/Figures/memory-diagnostics.txt b/inform7/Figures/memory-diagnostics.txt index 5c409dcec..6001739f6 100644 --- a/inform7/Figures/memory-diagnostics.txt +++ b/inform7/Figures/memory-diagnostics.txt @@ -1,4 +1,4 @@ -Total memory consumption was 394542K = 385 MB +Total memory consumption was 394616K = 385 MB 60.8% was used for 1997167 objects, in 371207 frames in 300 x 800K = 240000K = 234 MB: @@ -238,7 +238,7 @@ Total memory consumption was 394542K = 385 MB 39.1% was used for memory not allocated for objects: - 20.3% text stream storage 82378076 bytes in 532430 claims + 20.4% text stream storage 82454548 bytes in 532435 claims 4.4% dictionary storage 18174976 bytes in 33265 claims ---- sorting 744 bytes in 3 claims 1.7% source text 7200000 bytes in 3 claims diff --git a/inform7/Figures/timings-diagnostics.txt b/inform7/Figures/timings-diagnostics.txt index d239aeb3c..8bbf5f93e 100644 --- a/inform7/Figures/timings-diagnostics.txt +++ b/inform7/Figures/timings-diagnostics.txt @@ -1,10 +1,10 @@ 100.0% in inform7 run - 55.1% in compilation to Inter - 39.8% in //Sequence::undertake_queued_tasks// - 3.3% in //MajorNodes::pre_pass// + 55.2% in compilation to Inter + 39.7% in //Sequence::undertake_queued_tasks// + 3.5% in //MajorNodes::pre_pass// 2.5% in //MajorNodes::pass_1// - 2.0% in //RTPhrasebook::compile_entries// - 1.3% in //ImperativeDefinitions::assess_all// + 2.1% in //RTPhrasebook::compile_entries// + 1.4% in //ImperativeDefinitions::assess_all// 1.2% in //RTKindConstructors::compile// 0.4% in //ImperativeDefinitions::compile_first_block// 0.4% in //MajorNodes::pass_2// @@ -16,12 +16,12 @@ 0.1% in //RTKindConstructors::compile_permissions// 0.1% in //Task::make_built_in_kind_constructors// 0.1% in //World::stages_II_and_III// - 2.0% not specifically accounted for - 42.9% in running Inter pipeline - 12.2% in step preparation - 9.5% in inter step 7/16: consolidate-text + 1.7% not specifically accounted for + 42.8% in running Inter pipeline + 12.6% in step preparation + 9.7% in inter step 7/16: consolidate-text 7.8% in inter step 2/16: link - 7.0% in inter step 16/16: generate inform6 -> auto.inf + 6.7% in inter step 16/16: generate inform6 -> auto.inf 1.4% in inter step 11/16: make-identifiers-unique 0.4% in inter step 12/16: reconcile-verbs 0.2% in inter step 10/16: detect-indirect-calls @@ -30,8 +30,9 @@ 0.2% in inter step 8/16: resolve-external-symbols 0.2% in inter step 9/16: inspect-plugs 0.1% in inter step 13/16: eliminate-redundant-labels + 0.1% in inter step 3/16: merge-template <- none 0.1% in inter step 4/16: parse-linked-matter 0.1% in inter step 5/16: resolve-conditional-compilation - 2.6% not specifically accounted for + 2.1% not specifically accounted for 1.6% in supervisor 0.3% not specifically accounted for diff --git a/inform7/Tests/Test Makes/Eg4-C/textual.txt b/inform7/Tests/Test Makes/Eg4-C/textual.txt index 9a098f964..137254418 100644 --- a/inform7/Tests/Test Makes/Eg4-C/textual.txt +++ b/inform7/Tests/Test Makes/Eg4-C/textual.txt @@ -34795,7 +34795,7 @@ package main _plain constant KIT_CONFIGURATION_BITMAP K_typeless_int = 0 constant KIT_CONFIGURATION_LOOKMODE K_typeless_int = 2 constant I7_VERSION_NUMBER K_typeless_string = "10.1.0" - constant I7_FULL_VERSION_NUMBER K_typeless_string = "10.1.0-alpha.1+6T35" + constant I7_FULL_VERSION_NUMBER K_typeless_string = "10.1.0-alpha.1+6T36" constant ^virtual_machine K_typeless_string = "C/32d/v1/no-main" constant ^virtual_machine_icon K_typeless_string = "vm_glulx.png" constant ^language_elements_used K_typeless_string = "core, naming, instance counting, glulx external files" diff --git a/inter/final-module/Chapter 2/Code Generators.w b/inter/final-module/Chapter 2/Code Generators.w index 5c0df45b0..83dbac340 100644 --- a/inter/final-module/Chapter 2/Code Generators.w +++ b/inter/final-module/Chapter 2/Code Generators.w @@ -150,20 +150,6 @@ void Generators::invoke_opcode(code_generation *gen, text_stream *opcode, int op @ -@e GENERAL_SEGMENT_MTID -@e DEFAULT_SEGMENT_MTID - -= -INT_METHOD_TYPE(GENERAL_SEGMENT_MTID, code_generator *generator, code_generation *gen, inter_tree_node *P) - -int Generators::general_segment(code_generation *gen, inter_tree_node *P) { - int rv = 0; - INT_METHOD_CALL(rv, gen->generator, GENERAL_SEGMENT_MTID, gen, P); - return rv; -} - -@ - @e MANGLE_IDENTIFIER_MTID = @@ -274,21 +260,21 @@ void Generators::pseudo_object(code_generation *gen, text_stream *obj_name) { @e PROPERTY_OFFSET_MTID = -VOID_METHOD_TYPE(DECLARE_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class) -VOID_METHOD_TYPE(END_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name) -void Generators::declare_class(code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class) { - VOID_METHOD_CALL(gen->generator, DECLARE_CLASS_MTID, gen, class_name, printed_name, super_class); +VOID_METHOD_TYPE(DECLARE_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class, generated_segment **saved) +VOID_METHOD_TYPE(END_CLASS_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, generated_segment *saved) +void Generators::declare_class(code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class, generated_segment **saved) { + VOID_METHOD_CALL(gen->generator, DECLARE_CLASS_MTID, gen, class_name, printed_name, super_class, saved); } -void Generators::end_class(code_generation *gen, text_stream *class_name) { - VOID_METHOD_CALL(gen->generator, END_CLASS_MTID, gen, class_name); +void Generators::end_class(code_generation *gen, text_stream *class_name, generated_segment *saved) { + VOID_METHOD_CALL(gen->generator, END_CLASS_MTID, gen, class_name, saved); } -VOID_METHOD_TYPE(DECLARE_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) -VOID_METHOD_TYPE(END_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name) -void Generators::declare_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) { - VOID_METHOD_CALL(gen->generator, DECLARE_INSTANCE_MTID, gen, class_name, instance_name, printed_name, acount, is_dir); +VOID_METHOD_TYPE(DECLARE_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, generated_segment **saved) +VOID_METHOD_TYPE(END_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) +void Generators::declare_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, generated_segment **saved) { + VOID_METHOD_CALL(gen->generator, DECLARE_INSTANCE_MTID, gen, class_name, instance_name, printed_name, acount, is_dir, saved); } -void Generators::end_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name) { - VOID_METHOD_CALL(gen->generator, END_INSTANCE_MTID, gen, class_name, instance_name); +void Generators::end_instance(code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) { + VOID_METHOD_CALL(gen->generator, END_INSTANCE_MTID, gen, class_name, instance_name, saved); } VOID_METHOD_TYPE(DECLARE_VALUE_INSTANCE_MTID, code_generator *generator, code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val) void Generators::declare_value_instance(code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val) { @@ -366,14 +352,14 @@ void Generators::end_function(int pass, code_generation *gen, inter_symbol *fn) @d BUFFER_ARRAY_FORMAT 4 = -INT_METHOD_TYPE(BEGIN_ARRAY_MTID, code_generator *generator, code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format) +INT_METHOD_TYPE(BEGIN_ARRAY_MTID, code_generator *generator, code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) VOID_METHOD_TYPE(ARRAY_ENTRY_MTID, code_generator *generator, code_generation *gen, text_stream *entry, int format) VOID_METHOD_TYPE(ARRAY_ENTRIES_MTID, code_generator *generator, code_generation *gen, int how_many, int plus_ips, int format) VOID_METHOD_TYPE(COMPILE_LITERAL_SYMBOL_MTID, code_generator *generator, code_generation *gen, inter_symbol *aliased) -VOID_METHOD_TYPE(END_ARRAY_MTID, code_generator *generator, code_generation *gen, int format) -int Generators::begin_array(code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format) { +VOID_METHOD_TYPE(END_ARRAY_MTID, code_generator *generator, code_generation *gen, int format, generated_segment *saved) +int Generators::begin_array(code_generation *gen, text_stream *const_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) { int rv = FALSE; - INT_METHOD_CALL(rv, gen->generator, BEGIN_ARRAY_MTID, gen, const_name, array_s, P, format); + INT_METHOD_CALL(rv, gen->generator, BEGIN_ARRAY_MTID, gen, const_name, array_s, P, format, saved); return rv; } void Generators::array_entry(code_generation *gen, text_stream *entry, int format) { @@ -392,8 +378,8 @@ void Generators::compile_literal_symbol(code_generation *gen, inter_symbol *alia VOID_METHOD_CALL(gen->generator, COMPILE_LITERAL_SYMBOL_MTID, gen, aliased); } -void Generators::end_array(code_generation *gen, int format) { - VOID_METHOD_CALL(gen->generator, END_ARRAY_MTID, gen, format); +void Generators::end_array(code_generation *gen, int format, generated_segment *saved) { + VOID_METHOD_CALL(gen->generator, END_ARRAY_MTID, gen, format, saved); } @ diff --git a/inter/final-module/Chapter 2/The Vanilla Generator.w b/inter/final-module/Chapter 2/The Vanilla Generator.w index 27f281cf2..7ab0a7d0a 100644 --- a/inter/final-module/Chapter 2/The Vanilla Generator.w +++ b/inter/final-module/Chapter 2/The Vanilla Generator.w @@ -62,8 +62,6 @@ void Vanilla::predeclare_functions(inter_tree *I, inter_tree_node *P, void *stat code_generation *gen = (code_generation *) state; inter_package *outer = Inter::Packages::container(P); if ((outer == NULL) || (Inter::Packages::is_codelike(outer) == FALSE)) { - generated_segment *saved = - CodeGen::select(gen, Generators::general_segment(gen, P)); switch (P->W.data[ID_IFLD]) { case CONSTANT_IST: { inter_symbol *con_name = @@ -77,7 +75,6 @@ void Vanilla::predeclare_functions(inter_tree *I, inter_tree_node *P, void *stat break; } } - CodeGen::deselect(gen, saved); } } @@ -92,17 +89,15 @@ void Vanilla::iterate(inter_tree *I, inter_tree_node *P, void *state) { code_generation *gen = (code_generation *) state; inter_package *outer = Inter::Packages::container(P); if ((outer == NULL) || (Inter::Packages::is_codelike(outer) == FALSE)) { - generated_segment *saved = CodeGen::select(gen, Generators::general_segment(gen, P)); switch (P->W.data[ID_IFLD]) { case CONSTANT_IST: - case INSTANCE_IST: - case PROPERTYVALUE_IST: case VARIABLE_IST: case SPLAT_IST: + case INSTANCE_IST: + case PROPERTYVALUE_IST: Vanilla::node(gen, P); break; } - CodeGen::deselect(gen, saved); } } diff --git a/inter/final-module/Chapter 2/Vanilla Constants.w b/inter/final-module/Chapter 2/Vanilla Constants.w index a74ef1073..6ce52c28a 100644 --- a/inter/final-module/Chapter 2/Vanilla Constants.w +++ b/inter/final-module/Chapter 2/Vanilla Constants.w @@ -56,7 +56,8 @@ void VanillaConstants::constant(code_generation *gen, inter_tree_node *P) { @ = inter_ti ID = P->W.data[DATA_CONST_IFLD]; text_stream *S = Inode::ID_to_text(P, ID); - Generators::begin_array(gen, I"UUID_ARRAY", NULL, NULL, BYTE_ARRAY_FORMAT); + generated_segment *saved; + Generators::begin_array(gen, I"UUID_ARRAY", NULL, NULL, BYTE_ARRAY_FORMAT, &saved); TEMPORARY_TEXT(content) WRITE_TO(content, "UUID://"); for (int i=0, L=Str::len(S); i = inter_ti ID = P->W.data[DATA_CONST_IFLD]; @@ -92,7 +93,8 @@ void VanillaConstants::constant(code_generation *gen, inter_tree_node *P) { } if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1) format = BUFFER_ARRAY_FORMAT; - if (Generators::begin_array(gen, Inter::Symbols::name(con_name), con_name, P, format)) { + generated_segment *saved; + if (Generators::begin_array(gen, Inter::Symbols::name(con_name), con_name, P, format, &saved)) { if (hang_one) Generators::array_entry(gen, I"1", format); int entry_count = 0; for (int i=DATA_CONST_IFLD; iW.extent; i=i+2) @@ -119,7 +121,7 @@ void VanillaConstants::constant(code_generation *gen, inter_tree_node *P) { } } } - Generators::end_array(gen, format); + Generators::end_array(gen, format, saved); } @ = diff --git a/inter/final-module/Chapter 2/Vanilla Objects.w b/inter/final-module/Chapter 2/Vanilla Objects.w index 59d9e8f49..ea67854dc 100644 --- a/inter/final-module/Chapter 2/Vanilla Objects.w +++ b/inter/final-module/Chapter 2/Vanilla Objects.w @@ -286,7 +286,7 @@ above has been tried on all properties: = void VanillaObjects::knowledge(code_generation *gen) { - text_stream *OUT = CodeGen::current(gen); +// text_stream *OUT = CodeGen::current(gen); inter_tree *I = gen->from; if ((FBNA_found == FALSE) && (properties_found)) { Generators::declare_constant(gen, I"FBNA_PROP_NUMBER", NULL, RAW_GDCFORM, NULL, I"MAX_POSITIVE_NUMBER", FALSE); @@ -419,7 +419,8 @@ bother to force them.) @ = if (properties_found) { - Generators::declare_instance(gen, I"Object", I"property_numberspace_forcer", NULL, -1, FALSE); + generated_segment *saved; + Generators::declare_instance(gen, I"Object", I"property_numberspace_forcer", NULL, -1, FALSE, &saved); for (int p=0; p = @@ -458,7 +459,8 @@ property usage is legal. if (VanillaObjects::is_kind_of_object(kind_name)) no_kos++; } - Generators::begin_array(gen, I"KindHierarchy", NULL, NULL, WORD_ARRAY_FORMAT); + generated_segment *saved; + Generators::begin_array(gen, I"KindHierarchy", NULL, NULL, WORD_ARRAY_FORMAT, &saved); if (no_kos > 0) { Generators::mangled_array_entry(gen, I"K0_kind", WORD_ARRAY_FORMAT); Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); @@ -481,7 +483,7 @@ property usage is legal. Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); } - Generators::end_array(gen, WORD_ARRAY_FORMAT); + Generators::end_array(gen, WORD_ARRAY_FORMAT, saved); @h Lookup mechanism for properties of value instances. As noted above, if |K| is a kind which can have properties but is not a subkind @@ -516,7 +518,8 @@ take lightly in the Z-machine. But speed and flexibility are worth more. if (Inter::Symbols::get_flag(kind_name, VPH_MARK_BIT)) { TEMPORARY_TEXT(instance_name) WRITE_TO(instance_name, "VPH_%d", w); - Generators::declare_instance(gen, I"VPH_Class", instance_name, NULL, -1, FALSE); + generated_segment *saved; + Generators::declare_instance(gen, I"VPH_Class", instance_name, NULL, -1, FALSE, &saved); TEMPORARY_TEXT(N) WRITE_TO(N, "%d", Inter::Kind::instance_count(kind_name)); Generators::assign_property(gen, I"value_range", N, FALSE); @@ -536,7 +539,7 @@ take lightly in the Z-machine. But speed and flexibility are worth more. @; } } - Generators::end_instance(gen, I"VPH_Class", instance_name); + Generators::end_instance(gen, I"VPH_Class", instance_name, saved); DISCARD_TEXT(instance_name) } } @@ -555,8 +558,9 @@ legal values at run-time for this kind are |1, 2, 3, ..., N|: or in other words, the number of instances of this kind. @ = - Generators::declare_class(gen, I"VPH_Class", NULL, I"Class"); - Generators::end_class(gen, I"VPH_Class"); + generated_segment *saved; + Generators::declare_class(gen, I"VPH_Class", NULL, I"Class", &saved); + Generators::end_class(gen, I"VPH_Class", saved); @ = for (int i=0; i = - Generators::begin_array(gen, I"value_property_holders", NULL, NULL, WORD_ARRAY_FORMAT); + generated_segment *saved; + Generators::begin_array(gen, I"value_property_holders", NULL, NULL, WORD_ARRAY_FORMAT, &saved); Generators::array_entry(gen, I"0", WORD_ARRAY_FORMAT); int vph = 0; for (int w=1; w; @ In the event that no value instances have properties, there'll be no @@ -614,7 +619,7 @@ I6 error. We don't want that, so if necessary we compile a useless VPH object just to force the property into being. @ = - if (vph == 0) WRITE("VPH_Class UnusedVPH with value_range 0;\n"); + /* if (vph == 0) WRITE("VPH_Class UnusedVPH with value_range 0;\n"); */ @ = inter_tree_node *X; @@ -668,7 +673,8 @@ brackets: thus |(4) (-5)|. This cannot be confused with function calling because I6 doesn't allow function calls in a constant context. @ = - Generators::begin_array(gen, ident, NULL, NULL, TABLE_ARRAY_FORMAT); + generated_segment *saved; + Generators::begin_array(gen, ident, NULL, NULL, TABLE_ARRAY_FORMAT, &saved); Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT); Generators::array_entry(gen, I"0", TABLE_ARRAY_FORMAT); for (int j=0; j = inter_tree_node *Y; @@ -712,12 +718,13 @@ because I6 doesn't allow function calls in a constant context. text_stream *super_class = NULL; inter_symbol *super_name = Inter::Kind::super(kind_name); if (super_name) super_class = Inter::Symbols::name(super_name); - Generators::declare_class(gen, Inter::Symbols::name(kind_name), Metadata::read_optional_textual(Inter::Packages::container(kind_name->definition), I"^printed_name"), super_class); + generated_segment *saved; + Generators::declare_class(gen, Inter::Symbols::name(kind_name), Metadata::read_optional_textual(Inter::Packages::container(kind_name->definition), I"^printed_name"), super_class, &saved); VanillaObjects::append(gen, kind_name); inter_node_list *FL = Inter::Warehouse::get_frame_list(InterTree::warehouse(I), Inter::Kind::properties_list(kind_name)); VanillaObjects::plist(gen, FL); - Generators::end_class(gen, Inter::Symbols::name(kind_name)); + Generators::end_class(gen, Inter::Symbols::name(kind_name), saved); } } @@ -752,7 +759,8 @@ though this won't happen for any property created by I7 source text. @ = if (properties_found) { - Generators::begin_array(gen, I"property_metadata", NULL, NULL, WORD_ARRAY_FORMAT); + generated_segment *saved; + Generators::begin_array(gen, I"property_metadata", NULL, NULL, WORD_ARRAY_FORMAT, &saved); int pos = 0; for (int p=0; p = @@ -966,14 +974,15 @@ void VanillaObjects::object_instance(code_generation *gen, inter_tree_node *P) { int c = Inter::Symbols::read_annotation(inst_name, ARROW_COUNT_IANN); if (c < 0) c = 0; int is_dir = Inter::Kind::is_a(inst_kind, direction_kind_symbol); + generated_segment *saved; Generators::declare_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), - Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), c, is_dir); + Metadata::read_optional_textual(Inter::Packages::container(P), I"^printed_name"), c, is_dir, &saved); VanillaObjects::append(gen, inst_name); inter_node_list *FL = Inode::ID_to_frame_list(P, Inter::Instance::properties_list(inst_name)); VanillaObjects::plist(gen, FL); - Generators::end_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name)); + Generators::end_instance(gen, Inter::Symbols::name(inst_kind), Inter::Symbols::name(inst_name), saved); } } diff --git a/inter/final-module/Chapter 4/Final Inform 6.w b/inter/final-module/Chapter 4/Final Inform 6.w index 9cc222e96..1a39390e7 100644 --- a/inter/final-module/Chapter 4/Final Inform 6.w +++ b/inter/final-module/Chapter 4/Final Inform 6.w @@ -69,7 +69,6 @@ code_generator *inform6_target = NULL; void I6Target::create_generator(void) { code_generator *cgt = Generators::new(I"inform6"); METHOD_ADD(cgt, BEGIN_GENERATION_MTID, I6Target::begin_generation); - METHOD_ADD(cgt, GENERAL_SEGMENT_MTID, I6Target::general_segment); METHOD_ADD(cgt, INVOKE_PRIMITIVE_MTID, I6Target::invoke_primitive); METHOD_ADD(cgt, MANGLE_IDENTIFIER_MTID, I6Target::mangle); METHOD_ADD(cgt, COMPILE_DICTIONARY_WORD_MTID, I6Target::compile_dictionary_word); @@ -231,26 +230,6 @@ int I6Target::end_generation(code_generator *cgt, code_generation *gen) { return FALSE; } -int I6Target::general_segment(code_generator *cgt, code_generation *gen, inter_tree_node *P) { - switch (P->W.data[ID_IFLD]) { - case CONSTANT_IST: { - inter_symbol *con_name = - InterSymbolsTables::symbol_from_frame_data(P, DEFN_CONST_IFLD); - int choice = early_matter_I7CGS; - if (Str::eq(con_name->symbol_name, I"DynamicMemoryAllocation")) choice = very_early_matter_I7CGS; - if (Inter::Symbols::read_annotation(con_name, LATE_IANN) == 1) choice = code_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BYTEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, TABLEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; - if (P->W.data[FORMAT_CONST_IFLD] == CONSTANT_INDIRECT_LIST) choice = arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, VERBARRAY_IANN) == 1) choice = verbs_at_eof_I7CGS; - if (Inter::Constant::is_routine(con_name)) choice = routines_at_eof_I7CGS; - return choice; - } - } - return main_matter_I7CGS; -} - int I6Target::basic_constant_segment(code_generator *cgt, code_generation *gen, inter_symbol *con_name, int depth) { if (depth >= 10) depth = 10; return constants_1_I7CGS + depth - 1; @@ -748,18 +727,23 @@ void I6Target::evaluate_variable(code_generator *cgt, code_generation *gen, inte WRITE("%S", Inter::Symbols::name(var_name)); } -void I6Target::declare_class(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class) { +void I6Target::declare_class(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *printed_name, text_stream *super_class, + generated_segment **saved) { + *saved = CodeGen::select(gen, main_matter_I7CGS); text_stream *OUT = CodeGen::current(gen); WRITE("Class %S\n", class_name); if (Str::len(super_class) > 0) WRITE(" class %S\n", super_class); } -void I6Target::end_class(code_generator *cgt, code_generation *gen, text_stream *class_name) { +void I6Target::end_class(code_generator *cgt, code_generation *gen, text_stream *class_name, generated_segment *saved) { text_stream *OUT = CodeGen::current(gen); WRITE(";\n"); + CodeGen::deselect(gen, saved); } -void I6Target::declare_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) { +void I6Target::declare_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, + generated_segment **saved) { + *saved = CodeGen::select(gen, main_matter_I7CGS); text_stream *OUT = CodeGen::current(gen); WRITE("%S", class_name); for (int i=0; i"); @@ -767,9 +751,10 @@ void I6Target::declare_instance(code_generator *cgt, code_generation *gen, text_ if (is_dir) WRITE(" Compass"); } -void I6Target::end_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name) { +void I6Target::end_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) { text_stream *OUT = CodeGen::current(gen); WRITE(";\n"); + CodeGen::deselect(gen, saved); } int I6Target::optimise_property_value(code_generator *cgt, code_generation *gen, inter_symbol *prop_name, inter_tree_node *X) { @@ -861,6 +846,7 @@ void I6Target::declare_constant(code_generator *cgt, code_generation *gen, text_ int this_is_I6_Main = 0; void I6Target::declare_function(code_generator *cgt, code_generation *gen, inter_symbol *fn, inter_tree_node *D) { + generated_segment *saved = CodeGen::select(gen, routines_at_eof_I7CGS); text_stream *fn_name = Inter::Symbols::name(fn); this_is_I6_Main = 0; text_stream *OUT = CodeGen::current(gen); @@ -950,6 +936,7 @@ void I6Target::declare_function(code_generator *cgt, code_generation *gen, inter WRITE("rfalse;\n"); } WRITE("];\n"); + CodeGen::deselect(gen, saved); } void I6Target::place_label(code_generator *cgt, code_generation *gen, text_stream *label_name) { text_stream *OUT = CodeGen::current(gen); @@ -1001,7 +988,19 @@ void I6Target::invoke_opcode(code_generator *cgt, code_generation *gen, if (void_context) WRITE(";\n"); } -int I6Target::begin_array(code_generator *cgt, code_generation *gen, text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format) { +int I6Target::begin_array(code_generator *cgt, code_generation *gen, text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) { + if (saved) { + int choice = early_matter_I7CGS; + if (array_s) { + if (Str::eq(array_s->symbol_name, I"DynamicMemoryAllocation")) choice = very_early_matter_I7CGS; + if (Inter::Symbols::read_annotation(array_s, LATE_IANN) == 1) choice = code_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, BUFFERARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, BYTEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, TABLEARRAY_IANN) == 1) choice = arrays_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, VERBARRAY_IANN) == 1) choice = verbs_at_eof_I7CGS; + } + *saved = CodeGen::select(gen, choice); + } text_stream *OUT = CodeGen::current(gen); if ((array_s) && (Inter::Symbols::read_annotation(array_s, VERBARRAY_IANN) == 1)) { @@ -1078,15 +1077,18 @@ void I6Target::array_entries(code_generator *cgt, code_generation *gen, else WRITE(" (%d)", how_many); } -void I6Target::end_array(code_generator *cgt, code_generation *gen, int format) { +void I6Target::end_array(code_generator *cgt, code_generation *gen, int format, generated_segment *saved) { text_stream *OUT = CodeGen::current(gen); WRITE(";\n"); + if (saved) CodeGen::deselect(gen, saved); } void I6Target::new_action(code_generator *cgt, code_generation *gen, text_stream *name, int true_action) { if (true_action == FALSE) { + generated_segment *saved = CodeGen::select(gen, early_matter_I7CGS); text_stream *OUT = CodeGen::current(gen); WRITE("Fake_Action %S;\n", name); + CodeGen::deselect(gen, saved); } } diff --git a/inter/final-module/Chapter 5/C Function Model.w b/inter/final-module/Chapter 5/C Function Model.w index 38b7babad..76e7e9dc5 100644 --- a/inter/final-module/Chapter 5/C Function Model.w +++ b/inter/final-module/Chapter 5/C Function Model.w @@ -240,7 +240,8 @@ void CFunctionModel::declare_function(code_generator *cgt, code_generation *gen, text_stream *fn_name = Inter::Symbols::name(fn); final_c_function *fcf = RETRIEVE_POINTER_final_c_function(fn->translation_data); C_GEN_DATA(fndata.current_fcf) = fcf; - text_stream *OUT = CodeGen::current(gen); + generated_segment *saved = CodeGen::select(gen, c_functions_at_eof_I7CGS); + text_stream *OUT = CodeGen::current(gen); WRITE("%S", fcf->prototype); WRITE(" {\n"); WRITE("i7_debug_stack(\"%S\");\n", fn_name); @@ -258,6 +259,7 @@ void CFunctionModel::declare_function(code_generator *cgt, code_generation *gen, C_GEN_DATA(fndata.compiling_function) = FALSE; WRITE("return 1;\n"); WRITE("\n}\n\n"); + CodeGen::deselect(gen, saved); } void CFunctionModel::place_label(code_generator *cgt, code_generation *gen, text_stream *label_name) { diff --git a/inter/final-module/Chapter 5/C Literals.w b/inter/final-module/Chapter 5/C Literals.w index b272d32d2..df5f2ed31 100644 --- a/inter/final-module/Chapter 5/C Literals.w +++ b/inter/final-module/Chapter 5/C Literals.w @@ -107,14 +107,14 @@ void CLiteralsModel::compile_dwords(code_generation *gen) { int dictlen = C_GEN_DATA(litdata.C_dword_count); generated_segment *saved = CodeGen::select(gen, c_predeclarations_I7CGS); - CMemoryModel::begin_array(NULL, gen, I"#dictionary_table", NULL, NULL, BYTE_ARRAY_FORMAT); + CMemoryModel::begin_array(NULL, gen, I"#dictionary_table", NULL, NULL, BYTE_ARRAY_FORMAT, NULL); for (int b=0; b<4; b++) { TEMPORARY_TEXT(N) WRITE_TO(N, "I7BYTE_%d(%d)", b, dictlen); CMemoryModel::array_entry(NULL, gen, N, BYTE_ARRAY_FORMAT); DISCARD_TEXT(N) } - CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT); + CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT, NULL); if (dictlen == 0) return; C_dword **sorted = (C_dword **) @@ -124,7 +124,7 @@ void CLiteralsModel::compile_dwords(code_generation *gen) { qsort(sorted, (size_t) LinkedLists::len(C_GEN_DATA(litdata.words)), sizeof(C_dword *), CLiteralsModel::compare_dwords); for (int i=0; iidentifier, NULL, NULL, BYTE_ARRAY_FORMAT); + CMemoryModel::begin_array(NULL, gen, sorted[i]->identifier, NULL, NULL, BYTE_ARRAY_FORMAT, NULL); TEMPORARY_TEXT(N) WRITE_TO(N, "0x60"); CMemoryModel::array_entry(NULL, gen, N, BYTE_ARRAY_FORMAT); @@ -163,7 +163,7 @@ void CLiteralsModel::compile_dwords(code_generation *gen) { DISCARD_TEXT(DP1L) DISCARD_TEXT(DP2H) DISCARD_TEXT(DP2L) - CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT); + CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT, NULL); } Memory::I7_free(sorted, CODE_GENERATION_MREASON, dictlen); CodeGen::deselect(gen, saved); @@ -417,7 +417,7 @@ void CLiteralsModel::grammar_byte_textual(code_generation *gen, text_stream *NT) } void CLiteralsModel::compile_verb_table(code_generation *gen) { - CMemoryModel::begin_array(NULL, gen, I"#grammar_table", NULL, NULL, WORD_ARRAY_FORMAT); + CMemoryModel::begin_array(NULL, gen, I"#grammar_table", NULL, NULL, WORD_ARRAY_FORMAT, NULL); TEMPORARY_TEXT(N) WRITE_TO(N, "%d", C_GEN_DATA(litdata.verb_count) - 1); CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT); @@ -429,13 +429,13 @@ void CLiteralsModel::compile_verb_table(code_generation *gen) { CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT); DISCARD_TEXT(N) } - CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT); - CMemoryModel::begin_array(NULL, gen, I"#grammar_table_cont", NULL, NULL, BYTE_ARRAY_FORMAT); + CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT, NULL); + CMemoryModel::begin_array(NULL, gen, I"#grammar_table_cont", NULL, NULL, BYTE_ARRAY_FORMAT, NULL); text_stream *entry; LOOP_OVER_LINKED_LIST(entry, text_stream, C_GEN_DATA(litdata.verb_grammar)) { CMemoryModel::array_entry(NULL, gen, entry, BYTE_ARRAY_FORMAT); } - CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT); + CMemoryModel::end_array(NULL, gen, BYTE_ARRAY_FORMAT, NULL); } void CLiteralsModel::new_action(code_generator *cgt, code_generation *gen, text_stream *name, int true_action) { @@ -452,7 +452,7 @@ void CLiteralsModel::new_action(code_generator *cgt, code_generation *gen, text_ } void CLiteralsModel::compile_actions_table(code_generation *gen) { - CMemoryModel::begin_array(NULL, gen, I"#actions_table", NULL, NULL, WORD_ARRAY_FORMAT); + CMemoryModel::begin_array(NULL, gen, I"#actions_table", NULL, NULL, WORD_ARRAY_FORMAT, NULL); TEMPORARY_TEXT(N) WRITE_TO(N, "%d", C_GEN_DATA(litdata.C_action_count)); CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT); @@ -464,7 +464,7 @@ void CLiteralsModel::compile_actions_table(code_generation *gen) { CMemoryModel::array_entry(NULL, gen, N, WORD_ARRAY_FORMAT); DISCARD_TEXT(N) } - CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT); + CMemoryModel::end_array(NULL, gen, WORD_ARRAY_FORMAT, NULL); } @ diff --git a/inter/final-module/Chapter 5/C Memory Model.w b/inter/final-module/Chapter 5/C Memory Model.w index d02c9e73a..d7bb76b6a 100644 --- a/inter/final-module/Chapter 5/C Memory Model.w +++ b/inter/final-module/Chapter 5/C Memory Model.w @@ -281,7 +281,19 @@ word entries | WORD_ARRAY_FORMAT | TABLE_ARRAY_FORMAT = int CMemoryModel::begin_array(code_generator *cgt, code_generation *gen, - text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format) { + text_stream *array_name, inter_symbol *array_s, inter_tree_node *P, int format, generated_segment **saved) { + if (saved) { + int choice = c_early_matter_I7CGS; + if (array_s) { + if (Str::eq(array_s->symbol_name, I"DynamicMemoryAllocation")) choice = c_very_early_matter_I7CGS; + if (Inter::Symbols::read_annotation(array_s, LATE_IANN) == 1) choice = c_code_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, BUFFERARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, BYTEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, TABLEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; + if (Inter::Symbols::read_annotation(array_s, VERBARRAY_IANN) == 1) choice = c_verbs_at_eof_I7CGS; + } + *saved = CodeGen::select(gen, choice); + } Str::clear(C_GEN_DATA(memdata.array_name)); WRITE_TO(C_GEN_DATA(memdata.array_name), "%S", array_name); C_GEN_DATA(memdata.entry_count) = 0; @@ -387,13 +399,14 @@ void CMemoryModel::array_entries(code_generator *cgt, code_generation *gen, except to predeclare the extent constant, if one was used. = -void CMemoryModel::end_array(code_generator *cgt, code_generation *gen, int format) { - generated_segment *saved = CodeGen::select(gen, c_predeclarations_I7CGS); +void CMemoryModel::end_array(code_generator *cgt, code_generation *gen, int format, generated_segment *saved) { + generated_segment *x_saved = CodeGen::select(gen, c_predeclarations_I7CGS); text_stream *OUT = CodeGen::current(gen); WRITE("#define xt_"); CNamespace::mangle(cgt, OUT, C_GEN_DATA(memdata.array_name)); WRITE(" %d\n", C_GEN_DATA(memdata.entry_count)-1); - CodeGen::deselect(gen, saved); + CodeGen::deselect(gen, x_saved); + if (saved) CodeGen::deselect(gen, saved); } @h Primitives for byte and word lookup. diff --git a/inter/final-module/Chapter 5/C Object Model.w b/inter/final-module/Chapter 5/C Object Model.w index a43a1fafd..3e5c7414a 100644 --- a/inter/final-module/Chapter 5/C Object Model.w +++ b/inter/final-module/Chapter 5/C Object Model.w @@ -8,8 +8,10 @@ How objects, classes and properties are compiled to C. void CObjectModel::initialise(code_generator *cgt) { METHOD_ADD(cgt, PSEUDO_OBJECT_MTID, CObjectModel::pseudo_object); METHOD_ADD(cgt, DECLARE_INSTANCE_MTID, CObjectModel::declare_instance); + METHOD_ADD(cgt, END_INSTANCE_MTID, CObjectModel::end_instance); METHOD_ADD(cgt, DECLARE_VALUE_INSTANCE_MTID, CObjectModel::declare_value_instance); METHOD_ADD(cgt, DECLARE_CLASS_MTID, CObjectModel::declare_class); + METHOD_ADD(cgt, END_CLASS_MTID, CObjectModel::end_class); METHOD_ADD(cgt, DECLARE_PROPERTY_MTID, CObjectModel::declare_property); METHOD_ADD(cgt, DECLARE_ATTRIBUTE_MTID, CObjectModel::declare_attribute); @@ -165,12 +167,17 @@ Each proper base kind in the Inter tree produces an owner as follows: = void CObjectModel::declare_class(code_generator *cgt, code_generation *gen, - text_stream *class_name, text_stream *printed_name, text_stream *super_class) { + text_stream *class_name, text_stream *printed_name, text_stream *super_class, generated_segment **saved) { + *saved = CodeGen::select(gen, c_main_matter_I7CGS); if (Str::len(super_class) == 0) super_class = I"Class"; CObjectModel::declare_class_inner(gen, class_name, printed_name, CObjectModel::next_owner_id(gen), super_class); } +void CObjectModel::end_class(code_generator *cgt, code_generation *gen, text_stream *class_name, generated_segment *saved) { + CodeGen::deselect(gen, saved); +} + void CObjectModel::declare_class_inner(code_generation *gen, text_stream *class_name, text_stream *printed_name, int id, text_stream *super_class) { CObjectModel::define_constant_for_owner_id(gen, class_name, id); @@ -182,12 +189,15 @@ void CObjectModel::declare_class_inner(code_generation *gen, = void CObjectModel::pseudo_object(code_generator *cgt, code_generation *gen, text_stream *obj_name) { - C_property_owner *obj = CObjectModel::declare_instance(cgt, gen, I"Object", obj_name, obj_name, -1, FALSE); + generated_segment *saved; + C_property_owner *obj = CObjectModel::declare_instance(cgt, gen, I"Object", obj_name, obj_name, -1, FALSE, &saved); + CodeGen::deselect(gen, saved); if (Str::eq(obj_name, I"Compass")) C_GEN_DATA(objdata.compass_instance) = obj; } C_property_owner *CObjectModel::declare_instance(code_generator *cgt, code_generation *gen, - text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir) { + text_stream *class_name, text_stream *instance_name, text_stream *printed_name, int acount, int is_dir, generated_segment **saved) { + *saved = CodeGen::select(gen, c_main_matter_I7CGS); if (Str::len(instance_name) == 0) internal_error("nameless instance"); int id = CObjectModel::next_owner_id(gen); CObjectModel::define_constant_for_owner_id(gen, instance_name, id); @@ -230,6 +240,10 @@ C_property_owner *CObjectModel::declare_instance(code_generator *cgt, code_gener return this; } +void CObjectModel::end_instance(code_generator *cgt, code_generation *gen, text_stream *class_name, text_stream *instance_name, generated_segment *saved) { + CodeGen::deselect(gen, saved); +} + void CObjectModel::declare_value_instance(code_generator *cgt, code_generation *gen, text_stream *instance_name, text_stream *printed_name, text_stream *val) { CObjectModel::define_header_constant_for_instance(gen, instance_name, printed_name, val, TRUE); diff --git a/inter/final-module/Chapter 5/Final C.w b/inter/final-module/Chapter 5/Final C.w index 9d43daca6..b07a996e5 100644 --- a/inter/final-module/Chapter 5/Final C.w +++ b/inter/final-module/Chapter 5/Final C.w @@ -21,8 +21,6 @@ void CTarget::create_generator(void) { CGlobals::initialise(c_target); CAssembly::initialise(c_target); CInputOutputModel::initialise(c_target); - - METHOD_ADD(c_target, GENERAL_SEGMENT_MTID, CTarget::general_segment); } @h Static supporting code. @@ -538,26 +536,6 @@ int CTarget::end_generation(code_generator *cgt, code_generation *gen) { return FALSE; } -int CTarget::general_segment(code_generator *cgt, code_generation *gen, inter_tree_node *P) { - switch (P->W.data[ID_IFLD]) { - case CONSTANT_IST: { - inter_symbol *con_name = - InterSymbolsTables::symbol_from_frame_data(P, DEFN_CONST_IFLD); - int choice = c_early_matter_I7CGS; - if (Str::eq(con_name->symbol_name, I"DynamicMemoryAllocation")) choice = c_very_early_matter_I7CGS; - if (Inter::Symbols::read_annotation(con_name, LATE_IANN) == 1) choice = c_code_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BUFFERARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, BYTEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, TABLEARRAY_IANN) == 1) choice = c_arrays_at_eof_I7CGS; - if (P->W.data[FORMAT_CONST_IFLD] == CONSTANT_INDIRECT_LIST) choice = c_arrays_at_eof_I7CGS; - if (Inter::Symbols::read_annotation(con_name, VERBARRAY_IANN) == 1) choice = c_verbs_at_eof_I7CGS; - if (Inter::Constant::is_routine(con_name)) choice = c_functions_at_eof_I7CGS; - return choice; - } - } - return c_main_matter_I7CGS; -} - int CTarget::basic_constant_segment(code_generator *cgt, code_generation *gen, inter_symbol *con_name, int depth) { if (con_name) { if (Str::eq(Inter::Symbols::name(con_name), I"Release")) return c_ids_and_maxima_I7CGS;