From 4ed53b07891dd7e472843860861e2f1a0e2faabd Mon Sep 17 00:00:00 2001
From: Graham Nelson
-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.-
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; -} -- -
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); }- +
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); }- +
enum COMPILE_LITERAL_NUMBER_MTID enum COMPILE_LITERAL_REAL_MTID @@ -269,24 +255,24 @@ I6 code. Still, all pragmas are offered to all generators.@@ -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);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); }- +enum COMPILE_LITERAL_TEXT_MTIDVOID_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); }- +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); }- +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); }- +enum PSEUDO_OBJECT_MTIDVOID_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); }- +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); }- +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); }- +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); }- +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); }- +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); }enum NEW_ACTION_MTIDVOID_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_MTIDgen->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);@@ -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); } }
- This code is used in §1.
§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); }
- 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);
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); }
§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;
- 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); }
-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.-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.-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".)-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); }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.
- The structure C_dword is accessed in 2/vo, 5/com and here.
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:-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; i W.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; 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); @@ -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;