Skip to content

Commit 677fc4b

Browse files
committed
Tail recursion
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@17685 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent af948b4 commit 677fc4b

File tree

2 files changed

+41
-20
lines changed

2 files changed

+41
-20
lines changed

Compiler/BackEnd/BackendEquation.mo

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -157,19 +157,10 @@ protected function equationList2 "author: PA
157157
input list<BackendDAE.Equation> iAcc;
158158
output list<BackendDAE.Equation> outEquationLst;
159159
algorithm
160-
outEquationLst := matchcontinue(arr, pos, iAcc)
161-
local
162-
BackendDAE.Equation e;
163-
160+
outEquationLst := match (arr, pos, iAcc)
164161
case (_,0,_) then iAcc;
165-
166-
case (_,_,_) equation
167-
SOME(e) = arr[pos];
168-
then equationList2(arr,pos-1,e::iAcc);
169-
170-
case (_,_,_)
171-
then equationList2(arr,pos-1,iAcc);
172-
end matchcontinue;
162+
else equationList2(arr,pos-1,List.consOption(arr[pos],iAcc));
163+
end match;
173164
end equationList2;
174165

175166
public function getWhenEquationExpr

Compiler/BackEnd/EvaluateParameter.mo

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,7 @@ protected function evaluateSelectedParameters
323323
output BackendVarTransform.VariableReplacements oReplEvaluate;
324324
output Integer oMark;
325325
algorithm
326-
(oKnVars,oCache,oRepl,oReplEvaluate,oMark) :=
327-
matchcontinue(iSelected,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate)
326+
(oKnVars,oCache,oRepl,oReplEvaluate,oMark) := match (iSelected,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate)
328327
local
329328
Integer i,mark;
330329
list<Integer> rest;
@@ -334,6 +333,40 @@ algorithm
334333
Env.Cache cache;
335334
case ({},_,_,_,_,_,_,_,_,_) then (iKnVars,iCache,iRepl,iReplEvaluate,iMark);
336335
case (i::rest,_,_,_,_,_,_,_,_,_)
336+
equation
337+
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters0(i,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate);
338+
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters(rest,knVars,m,inIEqns,cache,env,mark,markarr,repl,repleval);
339+
then (knVars,cache,repl,repleval,mark);
340+
end match;
341+
end evaluateSelectedParameters;
342+
343+
protected function evaluateSelectedParameters0
344+
"author Frenkel TUD"
345+
input Integer i;
346+
input BackendDAE.Variables iKnVars;
347+
input BackendDAE.IncidenceMatrix m;
348+
input BackendDAE.EquationArray inIEqns;
349+
input Env.Cache iCache;
350+
input Env.Env env;
351+
input Integer iMark;
352+
input array<Integer> markarr;
353+
input BackendVarTransform.VariableReplacements iRepl;
354+
input BackendVarTransform.VariableReplacements iReplEvaluate;
355+
output BackendDAE.Variables oKnVars;
356+
output Env.Cache oCache;
357+
output BackendVarTransform.VariableReplacements oRepl;
358+
output BackendVarTransform.VariableReplacements oReplEvaluate;
359+
output Integer oMark;
360+
algorithm
361+
(oKnVars,oCache,oRepl,oReplEvaluate,oMark) := matchcontinue(i,iKnVars,m,inIEqns,iCache,env,iMark,markarr,iRepl,iReplEvaluate)
362+
local
363+
Integer mark;
364+
list<Integer> rest;
365+
BackendDAE.Variables knVars;
366+
BackendVarTransform.VariableReplacements repl,repleval;
367+
BackendDAE.Var v;
368+
Env.Cache cache;
369+
case (_,_,_,_,_,_,_,_,_,_)
337370
equation
338371
false = intGt(markarr[i],0) "not allready evaluated";
339372
_ = arrayUpdate(markarr,i,iMark);
@@ -343,19 +376,16 @@ algorithm
343376
v = BackendVariable.getVarAt(knVars,i);
344377
(v,knVars,cache,repl,mark) = evaluateFixedAttribute(v,true,knVars,m,inIEqns,cache,env,mark,markarr,repl);
345378
(knVars,cache,repl,repleval) = evaluateSelectedParameter(v,i,knVars,inIEqns,repl,iReplEvaluate,cache,env);
346-
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters(rest,knVars,m,inIEqns,cache,env,mark,markarr,repl,repleval);
347379
then
348380
(knVars,cache,repl,repleval,mark);
349-
case (i::rest,_,_,_,_,_,_,_,_,_)
381+
case (_,_,_,_,_,_,_,_,_,_)
350382
equation
351383
// evaluate parameter
352384
v = BackendVariable.getVarAt(iKnVars,i);
353385
(knVars,cache,repl,repleval) = evaluateSelectedParameter(v,i,iKnVars,inIEqns,iRepl,iReplEvaluate,iCache,env);
354-
(knVars,cache,repl,repleval,mark) = evaluateSelectedParameters(rest,knVars,m,inIEqns,cache,env,iMark,markarr,repl,repleval);
355-
then
356-
(knVars,cache,repl,repleval,mark);
386+
then (knVars,cache,repl,repleval,iMark);
357387
end matchcontinue;
358-
end evaluateSelectedParameters;
388+
end evaluateSelectedParameters0;
359389

360390
protected function evaluateSelectedParameters1
361391
"author Frenkel TUD"

0 commit comments

Comments
 (0)