From 6d5709bda5c763b23002c00d042acf50a2e93c17 Mon Sep 17 00:00:00 2001 From: hkiel Date: Thu, 11 May 2017 13:04:37 +0200 Subject: [PATCH] turn non tail-recursive functions into for-loops --- Compiler/BackEnd/FindZeroCrossings.mo | 90 ++++++++++----------------- 1 file changed, 33 insertions(+), 57 deletions(-) diff --git a/Compiler/BackEnd/FindZeroCrossings.mo b/Compiler/BackEnd/FindZeroCrossings.mo index 7a856d1174b..178ebad7c93 100644 --- a/Compiler/BackEnd/FindZeroCrossings.mo +++ b/Compiler/BackEnd/FindZeroCrossings.mo @@ -342,37 +342,24 @@ protected function encapsulateWhenConditions_EquationsWithArrayConditions "autho input DAE.ElementSource inSource; input Integer inIndex; input HashTableExpToIndex.HashTable inHT; - output list outConditionList; - output list outVars; - output list outEqns; - output Integer outIndex; - output HashTableExpToIndex.HashTable outHT; + output list outConditionList = {}; + output list outVars = {}; + output list outEqns = {}; + output Integer outIndex = inIndex; + output HashTableExpToIndex.HashTable outHT = inHT; +protected + list vars1; + list eqns1; algorithm - (outConditionList, outVars, outEqns, outIndex, outHT) := match inConditionList - local - Integer index; - list vars1, vars2; - list eqns1, eqns2; - - DAE.Exp condition; - list conditionList; - - HashTableExpToIndex.HashTable ht; - - case {} equation - then ({}, {}, {}, inIndex, inHT); - - case condition::conditionList equation - (condition, vars1, eqns1, index, ht) = encapsulateWhenConditions_Equations1(condition, inSource, inIndex, inHT); - (conditionList, vars2, eqns2, index, ht) = encapsulateWhenConditions_EquationsWithArrayConditions(conditionList, inSource, index, ht); - vars1 = listAppend(vars1, vars2); - eqns1 = listAppend(eqns1, eqns2); - then (condition::conditionList, vars1, eqns1, index, ht); - - else equation - Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/FindZeroCrossings.mo: function encapsulateWhenConditions_EquationsWithArrayConditions failed"}); - then fail(); - end match; + for condition in inConditionList loop + (condition, vars1, eqns1, outIndex, outHT) := encapsulateWhenConditions_Equations1(condition, inSource, outIndex, outHT); + outVars := List.append_reverse(vars1,outVars); + outEqns := List.append_reverse(eqns1,outEqns); + outConditionList := condition::outConditionList; + end for; + outVars := listReverse(outVars); + outEqns := listReverse(outEqns); + outConditionList := listReverse(outConditionList); end encapsulateWhenConditions_EquationsWithArrayConditions; protected function encapsulateWhenConditions_Algorithms "author: lochel" @@ -529,34 +516,23 @@ protected function encapsulateWhenConditions_AlgorithmsWithArrayConditions "auth input list inConditionList; input DAE.ElementSource inSource; input Integer inIndex; - output list outConditionList; - output list outVars; - output list outStmts; - output Integer outIndex; + output list outConditionList = {}; + output list outVars = {}; + output list outStmts = {}; + output Integer outIndex = inIndex; +protected + list vars1; + list stmt1; algorithm - (outConditionList, outVars, outStmts, outIndex) := match inConditionList - local - Integer index; - list vars1, vars2; - list stmt1, stmt2; - - DAE.Exp condition; - list conditionList; - - case {} equation - then ({}, {}, {}, inIndex); - - case condition::conditionList equation - (condition, vars1, stmt1, index) = encapsulateWhenConditions_Algorithms1(condition, inSource, inIndex); - (conditionList, vars2, stmt2, index) = encapsulateWhenConditions_AlgorithmsWithArrayConditions(conditionList, inSource, index); - vars1 = listAppend(vars1, vars2); - stmt1 = listAppend(stmt1, stmt2); - then (condition::conditionList, vars1, stmt1, index); - - else equation - Error.addMessage(Error.INTERNAL_ERROR, {"./Compiler/BackEnd/FindZeroCrossings.mo: function encapsulateWhenConditions_AlgorithmsWithArrayConditions failed"}); - then fail(); - end match; + for condition in inConditionList loop + (condition, vars1, stmt1, outIndex) := encapsulateWhenConditions_Algorithms1(condition, inSource, outIndex); + outVars := List.append_reverse(vars1,outVars); + outStmts := List.append_reverse(stmt1,outStmts); + outConditionList := condition::outConditionList; + end for; + outVars := listReverse(outVars); + outStmts := listReverse(outStmts); + outConditionList := listReverse(outConditionList); end encapsulateWhenConditions_AlgorithmsWithArrayConditions;