1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Fix for Jira bug I7-1877

This commit is contained in:
Graham Nelson 2022-05-29 12:41:14 +01:00
parent 10ff2a1ea1
commit e0ac92fb1b
3 changed files with 56 additions and 40 deletions

View file

@ -485,23 +485,31 @@ is slower.
<span class="plain-syntax">[ </span><span class="identifier-syntax">ObjectTreeCoalesce</span><span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> </span><span class="identifier-syntax">memb</span><span class="plain-syntax"> </span><span class="identifier-syntax">lt</span><span class="plain-syntax"> </span><span class="identifier-syntax">later</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DBLW</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^^Sorting out: "</span><span class="plain-syntax">; </span><span class="identifier-syntax">DiagnoseSortList</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">); #</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> .</span><span class="identifier-syntax">StartAgain</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax">=</span><span class="identifier-syntax">obj</span><span class="plain-syntax">: </span><span class="identifier-syntax">memb</span><span class="plain-syntax">~=</span><span class="reserved-syntax">nothing</span><span class="plain-syntax">: </span><span class="identifier-syntax">memb</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">memb</span><span class="plain-syntax"> = </span><span class="identifier-syntax">obj</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax"> ~= </span><span class="reserved-syntax">nothing</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Find the next object in a list_together run.</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">lt</span><span class="plain-syntax"> = </span><span class="identifier-syntax">memb</span><span class="plain-syntax">.</span><span class="identifier-syntax">list_together</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">LT_Compare</span><span class="plain-syntax">(</span><span class="identifier-syntax">lt</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_TEXT_VALUE</span><span class="plain-syntax">) ~= </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Find first object in list after contiguous run with this list_together value:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">):</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">LT_Compare</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">.</span><span class="identifier-syntax">list_together</span><span class="plain-syntax">, </span><span class="identifier-syntax">lt</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">): </span><span class="identifier-syntax">memb</span><span class="plain-syntax"> = </span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">)) ;</span>
<span class="plain-syntax"> </span><span class="comment-syntax">If the contiguous run extends to end of list, the list is now perfect:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="comment-syntax">And otherwise we look to see if any future entries belong in the earlier run:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">later</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">): </span><span class="identifier-syntax">later</span><span class="plain-syntax">: </span><span class="identifier-syntax">later</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">later</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">LT_Compare</span><span class="plain-syntax">(</span><span class="identifier-syntax">later</span><span class="plain-syntax">.</span><span class="identifier-syntax">list_together</span><span class="plain-syntax">, </span><span class="identifier-syntax">lt</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Yes, they do: so we perform a regrouping of the list and start again:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GroupChildren</span><span class="plain-syntax">(</span><span class="reserved-syntax">parent</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">), </span><span class="identifier-syntax">lt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DBLW</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^^Sorted to: "</span><span class="plain-syntax">; </span><span class="identifier-syntax">DiagnoseSortList</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">); #</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">StartAgain</span><span class="plain-syntax">;</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">LT_Compare</span><span class="plain-syntax">(</span><span class="identifier-syntax">lt</span><span class="plain-syntax">, </span><span class="identifier-syntax">EMPTY_TEXT_VALUE</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">memb</span><span class="plain-syntax"> = </span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">continue</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Find first object after the contiguous run with this list_together value:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">):</span>
<span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">LT_Compare</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">.</span><span class="identifier-syntax">list_together</span><span class="plain-syntax">, </span><span class="identifier-syntax">lt</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">): </span><span class="identifier-syntax">memb</span><span class="plain-syntax"> = </span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">)) ;</span>
<span class="plain-syntax"> </span><span class="comment-syntax">If the contiguous run extends to end of list, the list is now perfect:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">memb</span><span class="plain-syntax"> == </span><span class="constant-syntax">0</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">obj</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">And otherwise we look to see if any future entries belong in the run:</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">later</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">memb</span><span class="plain-syntax">): </span><span class="identifier-syntax">later</span><span class="plain-syntax">: </span><span class="identifier-syntax">later</span><span class="plain-syntax">=</span><span class="reserved-syntax">sibling</span><span class="plain-syntax">(</span><span class="identifier-syntax">later</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">LT_Compare</span><span class="plain-syntax">(</span><span class="identifier-syntax">later</span><span class="plain-syntax">.</span><span class="identifier-syntax">list_together</span><span class="plain-syntax">, </span><span class="identifier-syntax">lt</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="comment-syntax">Yes, they do: so we perform a regrouping of the list and start again:</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">obj</span><span class="plain-syntax"> = </span><span class="identifier-syntax">GroupChildren</span><span class="plain-syntax">(</span><span class="reserved-syntax">parent</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">), </span><span class="identifier-syntax">lt</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> #</span><span class="identifier-syntax">Ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">DBLW</span><span class="plain-syntax">; </span><span class="reserved-syntax">print</span><span class="plain-syntax"> </span><span class="string-syntax">"^^Sorted to: "</span><span class="plain-syntax">; </span><span class="identifier-syntax">DiagnoseSortList</span><span class="plain-syntax">(</span><span class="identifier-syntax">obj</span><span class="plain-syntax">); #</span><span class="identifier-syntax">Endif</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">jump</span><span class="plain-syntax"> </span><span class="identifier-syntax">StartAgain</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="comment-syntax">No, that run is complete. Continue with the element that followed the run.</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">obj</span><span class="plain-syntax">;</span>
<span class="plain-syntax">];</span>

View file

@ -1,12 +1,12 @@
100.0% in inform7 run
71.1% in compilation to Inter
71.0% in compilation to Inter
50.6% in //Sequence::undertake_queued_tasks//
4.6% in //MajorNodes::pre_pass//
3.4% in //MajorNodes::pass_1//
1.8% in //ImperativeDefinitions::assess_all//
1.8% in //RTPhrasebook::compile_entries//
1.4% in //RTKindConstructors::compile//
1.2% in //Sequence::lint_inter//
1.0% in //Sequence::lint_inter//
0.6% in //MajorNodes::pass_2//
0.6% in //Sequence::undertake_queued_tasks//
0.6% in //World::stage_V//
@ -17,16 +17,16 @@
0.2% in //RTKindConstructors::compile_permissions//
0.2% in //Task::make_built_in_kind_constructors//
2.8% not specifically accounted for
26.0% in running Inter pipeline
9.8% in step 14/15: generate inform6 -> auto.inf
5.8% in step 5/15: load-binary-kits
5.6% in step 6/15: make-synoptic-module
1.6% in step 9/15: make-identifiers-unique
26.3% in running Inter pipeline
10.5% in step 14/15: generate inform6 -> auto.inf
5.6% in step 5/15: load-binary-kits
5.4% in step 6/15: make-synoptic-module
1.4% in step 9/15: make-identifiers-unique
0.4% in step 12/15: eliminate-redundant-operations
0.4% in step 4/15: compile-splats
0.4% in step 7/15: shorten-wiring
0.4% in step 8/15: detect-indirect-calls
0.2% in step 11/15: eliminate-redundant-labels
1.3% not specifically accounted for
0.2% in step 8/15: detect-indirect-calls
1.7% not specifically accounted for
2.2% in supervisor
0.7% not specifically accounted for
0.5% not specifically accounted for

View file

@ -405,23 +405,31 @@ Again, the return value is the new first entry in the raw list.
[ ObjectTreeCoalesce obj memb lt later;
#Ifdef DBLW; print "^^Sorting out: "; DiagnoseSortList(obj); #Endif;
.StartAgain;
for (memb=obj: memb~=nothing: memb=sibling(memb)) {
memb = obj;
while (memb ~= nothing) {
! Find the next object in a list_together run.
lt = memb.list_together;
if (LT_Compare(lt, EMPTY_TEXT_VALUE) ~= 0) {
! Find first object in list after contiguous run with this list_together value:
for (memb=sibling(memb):
(memb) && (LT_Compare(memb.list_together, lt) == 0): memb = sibling(memb)) ;
! If the contiguous run extends to end of list, the list is now perfect:
if (memb == 0) return obj;
! And otherwise we look to see if any future entries belong in the earlier run:
for (later=sibling(memb): later: later=sibling(later))
if (LT_Compare(later.list_together, lt) == 0) {
! Yes, they do: so we perform a regrouping of the list and start again:
obj = GroupChildren(parent(obj), lt);
#Ifdef DBLW; print "^^Sorted to: "; DiagnoseSortList(obj); #Endif;
jump StartAgain;
}
if (LT_Compare(lt, EMPTY_TEXT_VALUE) == 0) {
memb = sibling(memb);
continue;
}
! Find first object after the contiguous run with this list_together value:
for (memb=sibling(memb):
(memb) && (LT_Compare(memb.list_together, lt) == 0): memb = sibling(memb)) ;
! If the contiguous run extends to end of list, the list is now perfect:
if (memb == 0) {
return obj;
}
! And otherwise we look to see if any future entries belong in the run:
for (later=sibling(memb): later: later=sibling(later)) {
if (LT_Compare(later.list_together, lt) == 0) {
! Yes, they do: so we perform a regrouping of the list and start again:
obj = GroupChildren(parent(obj), lt);
#Ifdef DBLW; print "^^Sorted to: "; DiagnoseSortList(obj); #Endif;
jump StartAgain;
}
}
! No, that run is complete. Continue with the element that followed the run.
}
return obj;
];