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:
parent
10ff2a1ea1
commit
e0ac92fb1b
|
@ -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">) && (</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">) && (</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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
];
|
||||
|
|
Loading…
Reference in a new issue