Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 6d5709b

Browse files
hkielOpenModelica-Hudson
authored andcommitted
turn non tail-recursive functions into for-loops
1 parent ba45c06 commit 6d5709b

File tree

1 file changed

+33
-57
lines changed

1 file changed

+33
-57
lines changed

Compiler/BackEnd/FindZeroCrossings.mo

Lines changed: 33 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -342,37 +342,24 @@ protected function encapsulateWhenConditions_EquationsWithArrayConditions "autho
342342
input DAE.ElementSource inSource;
343343
input Integer inIndex;
344344
input HashTableExpToIndex.HashTable inHT;
345-
output list<DAE.Exp> outConditionList;
346-
output list<BackendDAE.Var> outVars;
347-
output list<BackendDAE.Equation> outEqns;
348-
output Integer outIndex;
349-
output HashTableExpToIndex.HashTable outHT;
345+
output list<DAE.Exp> outConditionList = {};
346+
output list<BackendDAE.Var> outVars = {};
347+
output list<BackendDAE.Equation> outEqns = {};
348+
output Integer outIndex = inIndex;
349+
output HashTableExpToIndex.HashTable outHT = inHT;
350+
protected
351+
list<BackendDAE.Var> vars1;
352+
list<BackendDAE.Equation> eqns1;
350353
algorithm
351-
(outConditionList, outVars, outEqns, outIndex, outHT) := match inConditionList
352-
local
353-
Integer index;
354-
list<BackendDAE.Var> vars1, vars2;
355-
list<BackendDAE.Equation> eqns1, eqns2;
356-
357-
DAE.Exp condition;
358-
list<DAE.Exp> conditionList;
359-
360-
HashTableExpToIndex.HashTable ht;
361-
362-
case {} equation
363-
then ({}, {}, {}, inIndex, inHT);
364-
365-
case condition::conditionList equation
366-
(condition, vars1, eqns1, index, ht) = encapsulateWhenConditions_Equations1(condition, inSource, inIndex, inHT);
367-
(conditionList, vars2, eqns2, index, ht) = encapsulateWhenConditions_EquationsWithArrayConditions(conditionList, inSource, index, ht);
368-
vars1 = listAppend(vars1, vars2);
369-
eqns1 = listAppend(eqns1, eqns2);
370-
then (condition::conditionList, vars1, eqns1, index, ht);
371-
372-
else equation
373-
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/FindZeroCrossings.mo: function encapsulateWhenConditions_EquationsWithArrayConditions failed"});
374-
then fail();
375-
end match;
354+
for condition in inConditionList loop
355+
(condition, vars1, eqns1, outIndex, outHT) := encapsulateWhenConditions_Equations1(condition, inSource, outIndex, outHT);
356+
outVars := List.append_reverse(vars1,outVars);
357+
outEqns := List.append_reverse(eqns1,outEqns);
358+
outConditionList := condition::outConditionList;
359+
end for;
360+
outVars := listReverse(outVars);
361+
outEqns := listReverse(outEqns);
362+
outConditionList := listReverse(outConditionList);
376363
end encapsulateWhenConditions_EquationsWithArrayConditions;
377364

378365
protected function encapsulateWhenConditions_Algorithms "author: lochel"
@@ -529,34 +516,23 @@ protected function encapsulateWhenConditions_AlgorithmsWithArrayConditions "auth
529516
input list<DAE.Exp> inConditionList;
530517
input DAE.ElementSource inSource;
531518
input Integer inIndex;
532-
output list<DAE.Exp> outConditionList;
533-
output list<BackendDAE.Var> outVars;
534-
output list<DAE.Statement> outStmts;
535-
output Integer outIndex;
519+
output list<DAE.Exp> outConditionList = {};
520+
output list<BackendDAE.Var> outVars = {};
521+
output list<DAE.Statement> outStmts = {};
522+
output Integer outIndex = inIndex;
523+
protected
524+
list<BackendDAE.Var> vars1;
525+
list<DAE.Statement> stmt1;
536526
algorithm
537-
(outConditionList, outVars, outStmts, outIndex) := match inConditionList
538-
local
539-
Integer index;
540-
list<BackendDAE.Var> vars1, vars2;
541-
list<DAE.Statement> stmt1, stmt2;
542-
543-
DAE.Exp condition;
544-
list<DAE.Exp> conditionList;
545-
546-
case {} equation
547-
then ({}, {}, {}, inIndex);
548-
549-
case condition::conditionList equation
550-
(condition, vars1, stmt1, index) = encapsulateWhenConditions_Algorithms1(condition, inSource, inIndex);
551-
(conditionList, vars2, stmt2, index) = encapsulateWhenConditions_AlgorithmsWithArrayConditions(conditionList, inSource, index);
552-
vars1 = listAppend(vars1, vars2);
553-
stmt1 = listAppend(stmt1, stmt2);
554-
then (condition::conditionList, vars1, stmt1, index);
555-
556-
else equation
557-
Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/FindZeroCrossings.mo: function encapsulateWhenConditions_AlgorithmsWithArrayConditions failed"});
558-
then fail();
559-
end match;
527+
for condition in inConditionList loop
528+
(condition, vars1, stmt1, outIndex) := encapsulateWhenConditions_Algorithms1(condition, inSource, outIndex);
529+
outVars := List.append_reverse(vars1,outVars);
530+
outStmts := List.append_reverse(stmt1,outStmts);
531+
outConditionList := condition::outConditionList;
532+
end for;
533+
outVars := listReverse(outVars);
534+
outStmts := listReverse(outStmts);
535+
outConditionList := listReverse(outConditionList);
560536
end encapsulateWhenConditions_AlgorithmsWithArrayConditions;
561537

562538

0 commit comments

Comments
 (0)