From 0bd08a362a52cbaef96273dac77ddb8a4a42b5c0 Mon Sep 17 00:00:00 2001
From: Graham Nelson
-segmentation_pos CodeGen::select(code_generation *gen, int i) { +segmentation_pos CodeGen::select(code_generation *gen, int i) { return CodeGen::select_layered(gen, i, 1); } @@ -450,7 +450,7 @@ but for now about 10 layers is plenty. return previous_pos; } -void CodeGen::deselect(code_generation *gen, segmentation_pos saved) { +void CodeGen::deselect(code_generation *gen, segmentation_pos saved) { if (gen->segmentation.temporarily_diverted) internal_error("poorly timed deselection"); gen->segmentation.pos = saved; } @@ -476,7 +476,7 @@ if it has been "temporarily diverted" then the regiular selection is ignored.-text_stream *CodeGen::current(code_generation *gen) { +text_stream *CodeGen::current(code_generation *gen) { if (gen->segmentation.temporarily_diverted) return gen->segmentation.temporarily_diverted_to; if (gen->segmentation.pos.current_segment == NULL) return NULL; diff --git a/docs/final-module/5-ccn.html b/docs/final-module/5-ccn.html index 5eb51a7cb..12452b882 100644 --- a/docs/final-module/5-ccn.html +++ b/docs/final-module/5-ccn.html @@ -108,9 +108,7 @@ and handling that requires the mechanism below. C_GEN_DATA(objdata.value_ranges_needed) = TRUE; C_GEN_DATA(objdata.value_property_holders_needed) = TRUE; WRITE("(i7_provides_gprop(proc, "); VNODE_1C; WRITE(", "); - VNODE_2C; WRITE(", "); VNODE_3C; WRITE(", "); - WRITE("i7_mgl_OBJECT_TY, i7_mgl_value_ranges, i7_mgl_value_property_holders, "); - WRITE("i7_mgl_A_door_to, i7_mgl_COL_HSIZE))"); + VNODE_2C; WRITE(", "); VNODE_3C; WRITE("))"); break; case EQ_BIP: case NE_BIP: case GT_BIP: case GE_BIP: case LT_BIP: case LE_BIP: case OFCLASS_BIP: case IN_BIP: case NOTIN_BIP: @@ -193,13 +191,11 @@ the latter would be universally true, which is useless. } if (bip == PROPERTYVALUE_BIP) { - WRITE("(i7_read_gprop(proc, ", test_fn); + WRITE("(i7_read_gprop_value(proc, ", test_fn); Vanilla::node(gen, K); WRITE(", "); Compile first comparand2.1; WRITE(", "); Compile second comparand2.2; - WRITE(", i7_mgl_OBJECT_TY, i7_mgl_value_ranges, i7_mgl_value_property_holders, "); - WRITE("i7_mgl_A_door_to, i7_mgl_COL_HSIZE"); WRITE("))"); } else if (Str::len(test_fn) > 0) { WRITE("(%S(proc, ", test_fn); diff --git a/docs/final-module/5-com.html b/docs/final-module/5-com.html index aeb55f002..f21340006 100644 --- a/docs/final-module/5-com.html +++ b/docs/final-module/5-com.html @@ -74,7 +74,7 @@ function togglePopup(material_id) {
How objects, classes and properties are compiled to C.
-§27. Let's start with property array (for inline properties) and property length. +
§27. Let's start with property address and property length; while actual property +values live inside process memory, the addresses showing where they are in that +memory, and how many bytes they take up, are held in (static) arrays. Note that +although multiple processes running the same I7 story would have multiple values +for these properties, which likely differ at any given time, they would be at +the same address and of the same length in each.
+#define I7_MAX_PROPERTY_IDS 1000 +typedef struct i7_property_set { + i7word_t address[I7_MAX_PROPERTY_IDS]; + i7word_t len[I7_MAX_PROPERTY_IDS]; +} i7_property_set; +i7_property_set i7_properties[]; + i7word_t i7_prop_addr(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr); i7word_t i7_prop_len(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr);
Note that lengths are returned in bytes, not words, hence the multiplication by 4. +
Lengths are returned in bytes, not words, hence the multiplication by 4.
+i7_property_set i7_properties[i7_max_objects]; + i7word_t i7_prop_len(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr_array) { i7word_t pr = i7_read_word(proc, pr_array, 1); if ((obj <= 0) || (obj >= i7_max_objects) || @@ -967,7 +982,28 @@ which we will then need to write in }
§28. Now i7_move, which moves obj in the object tree so that it becomes the +
§28. The address array can be used to determine whether a runtime object or class +provides a given property: if the address is nonzero then it does. +
+ ++int i7_provides(i7process_t *proc, i7word_t owner_id, i7word_t prop_id); ++
+int i7_provides(i7process_t *proc, i7word_t owner_id, i7word_t pr_array) { + i7word_t prop_id = i7_read_word(proc, pr_array, 1); + if ((owner_id <= 0) || (owner_id >= i7_max_objects) || + (prop_id < 0) || (prop_id >= i7_no_property_ids)) return 0; + while (owner_id != 1) { + if (i7_properties[(int) owner_id].address[(int) prop_id] != 0) return 1; + owner_id = i7_class_of[owner_id]; + } + return 0; +} ++
§29. Now i7_move, which moves obj in the object tree so that it becomes the eldest child of to, unless to is zero, in which case it is removed from the tree.
@@ -1003,7 +1039,7 @@ the tree. }§29. Now the four ways to interrogate the object containment tree: +
§30. Now the four ways to interrogate the object containment tree:
@@ -1036,26 +1072,43 @@ the tree.
}
§30. Reading and writing properties. So here is the run-time storage for property values, and simple code to read -and write them. +
§31. And the implementation of "is obj1 directly a child of obj2?"
-i7word_t fn_i7_mgl_CreatePropertyOffsets(i7process_t *proc); -void i7_write_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t prop_id, i7word_t val); -i7word_t i7_read_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t pr_array); -i7word_t i7_change_prop_value(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, i7word_t to, int way); -void i7_give(i7process_t *proc, i7word_t owner, i7word_t prop, i7word_t val); -#define I7_MAX_PROPERTY_IDS 1000 -typedef struct i7_property_set { - i7word_t address[I7_MAX_PROPERTY_IDS]; - i7word_t len[I7_MAX_PROPERTY_IDS]; -} i7_property_set; -i7_property_set i7_properties[]; +int i7_in(i7process_t *proc, i7word_t obj1, i7word_t obj2);
-i7_property_set i7_properties[i7_max_objects]; +int i7_in(i7process_t *proc, i7word_t obj1, i7word_t obj2) { + if (i7_metaclass(proc, obj1) != i7_mgl_Object) return 0; + if (obj2 == 0) return 0; + if (proc->state.object_tree_parent[obj1] == obj2) return 1; + return 0; +} ++
§32. Reading, writing and changing object properties.
+ ++i7word_t i7_read_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t pr_array); +void i7_write_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t prop_id, i7word_t val); +i7word_t i7_change_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t prop_id, + i7word_t val, int way); ++
+i7word_t i7_read_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t pr_array) { + i7word_t prop_id = i7_read_word(proc, pr_array, 1); + if ((owner_id <= 0) || (owner_id >= i7_max_objects) || + (prop_id < 0) || (prop_id >= i7_no_property_ids)) return 0; + while (i7_properties[(int) owner_id].address[(int) prop_id] == 0) { + owner_id = i7_class_of[owner_id]; + if (owner_id == i7_mgl_Class) return 0; + } + i7word_t address = i7_properties[(int) owner_id].address[(int) prop_id]; + return i7_read_word(proc, address, 0); +} void i7_write_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t pr_array, i7word_t val) { i7word_t prop_id = i7_read_word(proc, pr_array, 1); @@ -1071,162 +1124,154 @@ and write them. i7_fatal_exit(proc); } } --
§31. And here sre the functions called by the above primitives: -
--i7word_t i7_read_prop_value(i7process_t *proc, i7word_t owner_id, i7word_t pr_array) { - i7word_t prop_id = i7_read_word(proc, pr_array, 1); - if ((owner_id <= 0) || (owner_id >= i7_max_objects) || - (prop_id < 0) || (prop_id >= i7_no_property_ids)) return 0; - while (i7_properties[(int) owner_id].address[(int) prop_id] == 0) { - owner_id = i7_class_of[owner_id]; - if (owner_id == i7_mgl_Class) return 0; - } - i7word_t address = i7_properties[(int) owner_id].address[(int) prop_id]; - return i7_read_word(proc, address, 0); -} - -i7word_t i7_change_prop_value(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, i7word_t to, int way) { +i7word_t i7_change_prop_value(i7process_t *proc, i7word_t obj, i7word_t pr, + i7word_t to, int way) { i7word_t val = i7_read_prop_value(proc, obj, pr), new_val = val; switch (way) { - case i7_lvalue_SET: i7_write_prop_value(proc, obj, pr, to); new_val = to; break; - case i7_lvalue_PREDEC: new_val = val-1; i7_write_prop_value(proc, obj, pr, val-1); break; - case i7_lvalue_POSTDEC: new_val = val; i7_write_prop_value(proc, obj, pr, val-1); break; - case i7_lvalue_PREINC: new_val = val+1; i7_write_prop_value(proc, obj, pr, val+1); break; - case i7_lvalue_POSTINC: new_val = val; i7_write_prop_value(proc, obj, pr, val+1); break; - case i7_lvalue_SETBIT: new_val = val | new_val; i7_write_prop_value(proc, obj, pr, new_val); break; - case i7_lvalue_CLEARBIT: new_val = val &(~new_val); i7_write_prop_value(proc, obj, pr, new_val); break; + case i7_lvalue_SET: + i7_write_prop_value(proc, obj, pr, to); new_val = to; break; + case i7_lvalue_PREDEC: + new_val = val-1; i7_write_prop_value(proc, obj, pr, val-1); break; + case i7_lvalue_POSTDEC: + new_val = val; i7_write_prop_value(proc, obj, pr, val-1); break; + case i7_lvalue_PREINC: + new_val = val+1; i7_write_prop_value(proc, obj, pr, val+1); break; + case i7_lvalue_POSTINC: + new_val = val; i7_write_prop_value(proc, obj, pr, val+1); break; + case i7_lvalue_SETBIT: + new_val = val | new_val; i7_write_prop_value(proc, obj, pr, new_val); break; + case i7_lvalue_CLEARBIT: + new_val = val &(~new_val); i7_write_prop_value(proc, obj, pr, new_val); break; } return new_val; } - -void i7_give(i7process_t *proc, i7word_t owner, i7word_t prop, i7word_t val) { - i7_write_prop_value(proc, owner, prop, val); -}
§33. Reading, writing and changing general properties. And these are the exactly analogous functions which more generally read, write +or change properties which can be held by either objects or enumerated instances — +in other words, all properties. The additional kind argument K is then needed +to distinguish these cases (since the obj values for different kinds may well +coincide). +
+ +The functions themselves are simple enough, but there is a complication, which +is that they need to use addresses which vary from one compilation to another; +so they cannot be written straightforwardly into our C library, which has to +be the same for all compilations. We get around this by compiling wrapper +functions in our story-file C which supply the necessary information and then +call clumsy but static functions in the C library; but this is all transparent +to the user, who should call only these: +
-int i7_has(i7process_t *proc, i7word_t obj, i7word_t either_or); -int i7_provides(i7process_t *proc, i7word_t owner_id, i7word_t prop_id); -int i7_in(i7process_t *proc, i7word_t obj1, i7word_t obj2); +int i7_provides_gprop(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p); +i7word_t i7_read_gprop_value(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr); +void i7_write_gprop_value(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, + i7word_t val); +void i7_change_gprop_value(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, + i7word_t val, i7word_t form); ++
§34. So here are the dynamic wrappers. +
+ ++void CObjectModel::compile_gprop_functions(code_generation *gen) { + segmentation_pos saved = CodeGen::select(gen, c_function_declarations_I7CGS); + text_stream *OUT = CodeGen::current(gen); + WRITE("int i7_provides_gprop(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p) {\n"); + WRITE(" return i7_provides_gprop_inner(proc, K, obj, p, i7_mgl_OBJECT_TY,\n"); + WRITE(" i7_mgl_value_ranges, i7_mgl_value_property_holders, i7_mgl_COL_HSIZE);\n"); + WRITE("}\n"); + WRITE("i7word_t i7_read_gprop_value(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p) {\n"); + WRITE(" return i7_read_gprop_value_inner(proc, K, obj, p, i7_mgl_OBJECT_TY,\n"); + WRITE(" i7_mgl_value_ranges, i7_mgl_value_property_holders, i7_mgl_COL_HSIZE);\n"); + WRITE("}\n"); + WRITE("void i7_write_gprop_value(i7process_t *proc, i7word_t K, i7word_t obj,\n"); + WRITE(" i7word_t p, i7word_t val) {\n"); + WRITE(" i7_write_gprop_value_inner(proc, K, obj, p, val, i7_mgl_OBJECT_TY,\n"); + WRITE(" i7_mgl_value_ranges, i7_mgl_value_property_holders, i7_mgl_COL_HSIZE);\n"); + WRITE("}\n"); + WRITE("void i7_change_gprop_value(i7process_t *proc, i7word_t K, i7word_t obj,\n"); + WRITE(" i7word_t p, i7word_t val, i7word_t form) {\n"); + WRITE(" i7_change_gprop_value_inner(proc, K, obj, p, val, form, i7_mgl_OBJECT_TY,\n"); + WRITE(" i7_mgl_value_ranges, i7_mgl_value_property_holders, i7_mgl_COL_HSIZE);\n"); + WRITE("}\n"); + CodeGen::deselect(gen, saved); +} ++
§35. And these are the static functions in the C library which they call: +
+ ++int i7_provides_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, + i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE); +i7word_t i7_read_gprop_value_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, + i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE); +void i7_write_gprop_value_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, + i7word_t val, i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE); +void i7_change_gprop_value_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, + i7word_t val, i7word_t form, i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE);
-int i7_has(i7process_t *proc, i7word_t obj, i7word_t either_or) { - if (i7_read_prop_value(proc, obj, either_or)) return 1; - return 0; -} - -int i7_provides(i7process_t *proc, i7word_t owner_id, i7word_t pr_array) { - i7word_t prop_id = i7_read_word(proc, pr_array, 1); - if ((owner_id <= 0) || (owner_id >= i7_max_objects) || - (prop_id < 0) || (prop_id >= i7_no_property_ids)) return 0; - while (owner_id != 1) { - if (i7_properties[(int) owner_id].address[(int) prop_id] != 0) - return 1; - owner_id = i7_class_of[owner_id]; - } - return 0; -} - -int i7_in(i7process_t *proc, i7word_t obj1, i7word_t obj2) { - if (i7_metaclass(proc, obj1) != i7_mgl_Object) return 0; - if (obj2 == 0) return 0; - if (proc->state.object_tree_parent[obj1] == obj2) return 1; - return 0; -} --
-void i7_provides_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, i7word_t *val, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE); -int i7_provides_gprop(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE); -void i7_read_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, i7word_t *val, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE); -void i7_write_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t p, i7word_t val, i7word_t form, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE); --
-void i7_provides_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, i7word_t *val, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE) { +int i7_provides_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, + i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE) { if (K == i7_mgl_OBJECT_TY) { - if (((obj) && ((i7_metaclass(proc, obj) == i7_mgl_Object)))) { - if (((i7_read_word(proc, pr, 0) == 2) || (i7_provides(proc, obj, pr)))) { - if (val) *val = 1; - } else { - if (val) *val = 0; - } - } else { - if (val) *val = 0; - } + if ((((obj) && ((i7_metaclass(proc, obj) == i7_mgl_Object)))) && + (((i7_read_word(proc, pr, 0) == 2) || (i7_provides(proc, obj, pr))))) + return 1; } else { if ((((obj >= 1)) && ((obj <= i7_read_word(proc, i7_mgl_value_ranges, K))))) { i7word_t holder = i7_read_word(proc, i7_mgl_value_property_holders, K); - if (((holder) && ((i7_provides(proc, holder, pr))))) { - if (val) *val = 1; - } else { - if (val) *val = 0; - } - } else { - if (val) *val = 0; + if (((holder) && ((i7_provides(proc, holder, pr))))) return 1; } } + return 0; } -int i7_provides_gprop(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE) { +i7word_t i7_read_gprop_value_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, + i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE) { i7word_t val = 0; - i7_provides_gprop_inner(proc, K, obj, pr, &val, i7_mgl_OBJECT_TY, i7_mgl_value_ranges, i7_mgl_value_property_holders, i7_mgl_A_door_to, i7_mgl_COL_HSIZE); + if ((K == i7_mgl_OBJECT_TY)) { + return (i7word_t) i7_read_prop_value(proc, obj, pr); + } else { + i7word_t holder = i7_read_word(proc, i7_mgl_value_property_holders, K); + return (i7word_t) i7_read_word(proc, + i7_read_prop_value(proc, holder, pr), (obj + i7_mgl_COL_HSIZE)); + } return val; } -void i7_read_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, i7word_t *val, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE) { +void i7_write_gprop_value_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, + i7word_t val, i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE) { if ((K == i7_mgl_OBJECT_TY)) { - if ((i7_read_word(proc, pr, 0) == 2)) { - if ((i7_has(proc, obj, pr))) { - if (val) *val = 1; - } else { - if (val) *val = 0; - } - } else { - if (val) *val = (i7word_t) i7_read_prop_value(proc, obj, pr); - } + i7_write_prop_value(proc, obj, pr, val); } else { i7word_t holder = i7_read_word(proc, i7_mgl_value_property_holders, K); - if (val) *val = (i7word_t) i7_read_word(proc, i7_read_prop_value(proc, holder, pr), (obj + i7_mgl_COL_HSIZE)); + i7_write_word(proc, + i7_read_prop_value(proc, holder, pr), (obj + i7_mgl_COL_HSIZE), val); } } -i7word_t i7_read_gprop(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE) { - i7word_t val = 0; - i7_read_gprop_inner(proc, K, obj, pr, &val, i7_mgl_OBJECT_TY, i7_mgl_value_ranges, i7_mgl_value_property_holders, i7_mgl_A_door_to, i7_mgl_COL_HSIZE); - return val; -} - -void i7_write_gprop_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, i7word_t val, i7word_t form, - i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_A_door_to, i7word_t i7_mgl_COL_HSIZE) { +void i7_change_gprop_value_inner(i7process_t *proc, i7word_t K, i7word_t obj, i7word_t pr, + i7word_t val, i7word_t form, + i7word_t i7_mgl_OBJECT_TY, i7word_t i7_mgl_value_ranges, + i7word_t i7_mgl_value_property_holders, i7word_t i7_mgl_COL_HSIZE) { if ((K == i7_mgl_OBJECT_TY)) { - if ((i7_read_word(proc, pr, 0) == 2)) { - if (val) { - i7_change_prop_value(proc, K, obj, pr, 1, form); - } else { - i7_change_prop_value(proc, K, obj, pr, 0, form); - } - } else { - (i7_change_prop_value(proc, K, obj, pr, val, form)); - } + i7_change_prop_value(proc, obj, pr, val, form); } else { i7word_t holder = i7_read_word(proc, i7_mgl_value_property_holders, K); - (i7_change_word(proc, i7_read_prop_value(proc, holder, pr), (obj + i7_mgl_COL_HSIZE), val, form)); + i7_change_word(proc, + i7_read_prop_value(proc, holder, pr), (obj + i7_mgl_COL_HSIZE), val, form); } }diff --git a/docs/final-module/5-crf.html b/docs/final-module/5-crf.html index a5af65f25..43ff7e9bd 100644 --- a/docs/final-module/5-crf.html +++ b/docs/final-module/5-crf.html @@ -197,14 +197,12 @@ calling functions.
WRITE("("); - WRITE("i7_write_gprop_inner(proc, "); + WRITE("i7_change_gprop_value(proc, "); Vanilla::node(gen, InterTree::first_child(storage_ref)); WRITE(", "); Vanilla::node(gen, InterTree::second_child(storage_ref)); WRITE(", "); Vanilla::node(gen, InterTree::third_child(storage_ref)); WRITE(", "); if (val_supplied) { VNODE_2C; } else { WRITE("0"); } WRITE(", %S", store_form); - WRITE(", i7_mgl_OBJECT_TY, i7_mgl_value_ranges, i7_mgl_value_property_holders, "); - WRITE("i7_mgl_A_door_to, i7_mgl_COL_HSIZE"); WRITE("))");