Skip to content

Commit

Permalink
Fixed Jira bug I7-2407
Browse files Browse the repository at this point in the history
  • Loading branch information
ganelson committed Nov 14, 2024
1 parent 7eb33c6 commit 1a963d3
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 25 deletions.
27 changes: 21 additions & 6 deletions docs/runtime-module/5-kc.html
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ <h1><a href="../index.html">

<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">declaration_sequence_number</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">nonstandard_enumeration</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">permissions_emitted</span><span class="plain-syntax">;</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">kind_constructor_compilation_data</span><span class="plain-syntax">;</span>

<span class="reserved-syntax">kind_constructor_compilation_data</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::new_compilation_data</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
Expand Down Expand Up @@ -129,6 +130,7 @@ <h1><a href="../index.html">

<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">declaration_sequence_number</span><span class="plain-syntax"> = -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">nonstandard_enumeration</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">.</span><span class="element-syntax">permissions_emitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">kccd</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
Expand Down Expand Up @@ -2087,18 +2089,31 @@ <h1><a href="../index.html">
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP35" class="paragraph-anchor"></a><b>&#167;35. Property permissions for kinds. </b></p>
<p class="commentary firstcommentary"><a id="SP35" class="paragraph-anchor"></a><b>&#167;35. Property permissions for kinds. </b>Note that these need to be compiled in hierarchical order, or at any rate,
so that the permissions for a superkind are always compiled before those of
its subkinds. We need this in order to ensure that any default values set
for the subkind are not rejected by Inter bytecode verification as being
unpermitted for the kind in question. See Jira bug I7-2407.
</p>

<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::compile_permissions</span><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">, </span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_KIND_VARIABLE</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">kc</span><span class="plain-syntax"> == </span><span class="identifier-syntax">CON_INTERMEDIATE</span><span class="plain-syntax">)) </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::base_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-kd.html#SP1" class="function-link"><span class="function-syntax">RTKindDeclarations::base_represented_in_Inter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><a href="6-pp.html#SP2" class="function-link"><span class="function-syntax">RTPropertyPermissions::emit_kind_permissions</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-pv.html#SP1" class="function-link"><span class="function-syntax">RTPropertyValues::compile_values_for_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="5-kc.html#SP35" class="function-link"><span class="function-syntax">RTKindConstructors::compile_permissions_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>

<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">RTKindConstructors::compile_permissions_r</span><span class="plain-syntax">(</span><span class="identifier-syntax">kind_constructor</span><span class="plain-syntax"> *</span><span class="identifier-syntax">kc</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">permissions_emitted</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kc</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">compilation_data</span><span class="plain-syntax">.</span><span class="element-syntax">permissions_emitted</span><span class="plain-syntax"> = </span><span class="identifier-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">K</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Kinds::base_construction</span><span class="plain-syntax">(</span><span class="identifier-syntax">kc</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="2-kd.html#SP1" class="function-link"><span class="function-syntax">RTKindDeclarations::base_represented_in_Inter</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">kind</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax"> = </span><span class="identifier-syntax">Latticework::super</span><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">S</span><span class="plain-syntax">) </span><a href="5-kc.html#SP35" class="function-link"><span class="function-syntax">RTKindConstructors::compile_permissions_r</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">Kinds::get_construct</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><a href="6-pp.html#SP2" class="function-link"><span class="function-syntax">RTPropertyPermissions::emit_kind_permissions</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-pv.html#SP1" class="function-link"><span class="function-syntax">RTPropertyValues::compile_values_for_kind</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">K</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
Expand Down
4 changes: 2 additions & 2 deletions inform7/Figures/memory-diagnostics.txt
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ Total memory consumption was 153750K = 150 MB
---- imperative_defn 1494 objects, 107568 bytes
---- noun_usage 2621 objects, 104840 bytes
---- pathname 2487 objects, 99480 bytes
---- kind_constructor 94 objects, 97008 bytes
---- inter_tree 7 objects, 96656 bytes
---- kind_constructor 94 objects, 96256 bytes
---- anl_entry_array 2 x 1000 = 2000 objects, 96064 bytes
---- label_namespace 1470 objects, 94080 bytes
---- preposition 278 objects, 88960 bytes
Expand Down Expand Up @@ -289,5 +289,5 @@ Total memory consumption was 153750K = 150 MB
---- code generation workspace for objects 3616 bytes in 19 claims
0.1% emitter array storage 295200 bytes in 2112 claims

-139.-9% was overhead - -220298280 bytes = -215135K = -210 MB
-139.-9% was overhead - -220299032 bytes = -215135K = -210 MB

25 changes: 13 additions & 12 deletions inform7/Figures/timings-diagnostics.txt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
100.0% in inform7 run
66.5% in compilation to Inter
43.7% in //Sequence::undertake_queued_tasks//
65.8% in compilation to Inter
43.3% in //Sequence::undertake_queued_tasks//
4.4% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
3.7% in //MajorNodes::pass_1//
2.0% in //RTKindConstructors::compile//
1.7% in //ImperativeDefinitions::assess_all//
1.3% in //RTPhrasebook::compile_entries//
1.7% in //RTPhrasebook::compile_entries//
1.0% in //Sequence::lint_inter//
0.6% in //ImperativeDefinitions::compile_first_block//
0.6% in //MajorNodes::pass_2//
Expand All @@ -15,16 +15,17 @@
0.3% in //Sequence::undertake_queued_tasks//
0.3% in //Sequence::undertake_queued_tasks//
0.3% in //Task::make_built_in_kind_constructors//
4.8% not specifically accounted for
26.5% in running Inter pipeline
8.6% in step 14/15: generate inform6 -> auto.inf
6.8% in step 5/15: load-binary-kits
5.5% in step 6/15: make-synoptic-module
4.1% not specifically accounted for
26.9% in running Inter pipeline
8.8% in step 14/15: generate inform6 -> auto.inf
7.1% in step 5/15: load-binary-kits
5.4% in step 6/15: make-synoptic-module
2.0% in step 9/15: make-identifiers-unique
0.3% in step 11/15: eliminate-redundant-labels
0.3% in step 12/15: eliminate-redundant-operations
0.3% in step 4/15: compile-splats
0.3% in step 7/15: shorten-wiring
0.3% in step 8/15: detect-indirect-calls
2.1% not specifically accounted for
6.5% in supervisor
0.4% not specifically accounted for
1.7% not specifically accounted for
6.4% in supervisor
0.7% not specifically accounted for
25 changes: 20 additions & 5 deletions inform7/runtime-module/Chapter 5/Kind Constructors.w
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ typedef struct kind_constructor_compilation_data {

int declaration_sequence_number;
int nonstandard_enumeration;
int permissions_emitted;
} kind_constructor_compilation_data;

kind_constructor_compilation_data RTKindConstructors::new_compilation_data(kind_constructor *kc) {
Expand Down Expand Up @@ -70,6 +71,7 @@ kind_constructor_compilation_data RTKindConstructors::new_compilation_data(kind_

kccd.declaration_sequence_number = -1;
kccd.nonstandard_enumeration = FALSE;
kccd.permissions_emitted = FALSE;
return kccd;
}

Expand Down Expand Up @@ -1720,16 +1722,29 @@ void RTKindConstructors::apply_multiplication_rule_metadata(void) {
}

@h Property permissions for kinds.
Note that these need to be compiled in hierarchical order, or at any rate,
so that the permissions for a superkind are always compiled before those of
its subkinds. We need this in order to ensure that any default values set
for the subkind are not rejected by Inter bytecode verification as being
unpermitted for the kind in question. See Jira bug I7-2407.

=
void RTKindConstructors::compile_permissions(void) {
kind_constructor *kc;
LOOP_OVER(kc, kind_constructor) {
if ((kc == CON_KIND_VARIABLE) || (kc == CON_INTERMEDIATE)) continue;
kind *K = Kinds::base_construction(kc);
if (RTKindDeclarations::base_represented_in_Inter(K)) {
RTPropertyPermissions::emit_kind_permissions(K);
RTPropertyValues::compile_values_for_kind(K);
}
RTKindConstructors::compile_permissions_r(kc);
}
}

void RTKindConstructors::compile_permissions_r(kind_constructor *kc) {
if (kc->compilation_data.permissions_emitted) return;
kc->compilation_data.permissions_emitted = TRUE;
kind *K = Kinds::base_construction(kc);
if (RTKindDeclarations::base_represented_in_Inter(K)) {
kind *S = Latticework::super(K);
if (S) RTKindConstructors::compile_permissions_r(Kinds::get_construct(S));
RTPropertyPermissions::emit_kind_permissions(K);
RTPropertyValues::compile_values_for_kind(K);
}
}

0 comments on commit 1a963d3

Please sign in to comment.