@@ -4242,37 +4242,19 @@ template tempDeclZero(String ty, Text &varDecls)
42424242
42434243end tempDeclZero;
42444244
4245- template tempDeclMatchInput(String ty , String prefix , String startIndex, String index, Text &varDecls)
4245+ template tempDeclMatchInput(MatchType matchTy , String ty , String startIndex, String index, Text &varDecls)
42464246 "Declares a temporary variable in varDecls for variables in match input list and returns the name."
42474247::=
4248- let newVar
4249- =
4250- match ty /* TODO! FIXME! UGLY! UGLY! hack! */
4251- case "modelica_metatype"
4252- case "metamodelica_string"
4253- case "metamodelica_string_const"
4254- then 'tmpMeta[<%startIndex%>+<%index%>]'
4255- else
4256- let newVarIx = '<%prefix%>_in<%index%>'
4257- let &varDecls += '<%ty%> <%newVarIx%>;<%\n%>'
4258- newVarIx
4259- newVar
4248+ // Note: We use volatile variables in matchcontinue to avoid problems with optimizing compilers
4249+ let ix = 'tmp<%startIndex%>_<%index%>'
4250+ let &varDecls += '<% match matchTy case MATCHCONTINUE(__) then 'volatile '%><%ty%> <%ix%>;'
4251+ ix
42604252end tempDeclMatchInput;
42614253
4262- template getTempDeclMatchInputName(list< Exp > inputs, String prefix, String startIndex, Integer index)
4254+ template getTempDeclMatchInputName(String startIndex, Integer index)
42634255 "Returns the name of the temporary variable from the match input list."
42644256::=
4265- let typ = '<%expTypeFromExpModelica(listGet(inputs, index))%>'
4266- let newVar =
4267- match typ /* TODO! FIXME! UGLY! UGLY! hack! */
4268- case "modelica_metatype"
4269- case "metamodelica_string"
4270- case "metamodelica_string_const"
4271- then 'tmpMeta[<%startIndex%>+<%intSub(index, 1)%>]'
4272- else
4273- let newVarIx = '<%prefix%>_in<%intSub(index, 1)%>'
4274- newVarIx
4275- newVar
4257+ 'tmp<%startIndex%>_<%index%>'
42764258end getTempDeclMatchInputName;
42774259
42784260template tempDeclMatchOutput(String ty, String prefix, String startIndex, String index, Text &varDecls)
@@ -6684,22 +6666,22 @@ case exp as MATCHEXPRESSION(__) then
66846666 let &preExpInput = buffer ""
66856667 let &expInput = buffer ""
66866668 // get the current index of tmpMeta and reserve N=listLength(inputs) values in it!
6687- let startIndexInputs = ' <% System.tmpTickIndexReserve(1, listLength(inputs) )%> '
6688- let ignore3 = (List.threadTuple(inputs,aliases) |> (exp ,alias) hasindex i0 =>
6689- let typ = ' <% expTypeFromExpModelica(exp )%> '
6690- let decl = tempDeclMatchInput(typ, prefix , startIndexInputs, i0 , &varDeclsInput)
6691- let &expInput += ' <% decl%> = <% daeExp(exp , context, &preExpInput, &varDeclsInput, &auxFunction)%> ;<% \n%> '
6669+ let startIndexInputs = ' <% System.tmpTickIndexReserve(0, 0 )%> '
6670+ let ignore3 = (List.threadTuple(inputs,aliases) |> (e1 ,alias) hasindex i1 fromindex 1 =>
6671+ let typ = ' <% expTypeFromExpModelica(e1 )%> '
6672+ let decl = tempDeclMatchInput(exp.matchType, typ , startIndexInputs, i1 , &varDeclsInput)
6673+ let &expInput += ' <% decl%> = <% daeExp(e1 , context, &preExpInput, &varDeclsInput, &auxFunction)%> ;<% \n%> '
66926674 let &expInput += alias |> a => let &varDeclsInput += ' <% typ%> _<% a%> ;' ' _<% a%> = <% decl%> ;' ; separator="\n "
66936675 ""; empty)
66946676 let ix = match exp.matchType
66956677 case MATCH(switch=SOME((switchIndex,ty as T_STRING(__),div))) then
6696- let matchInputVar = getTempDeclMatchInputName(exp.inputs, prefix, startIndexInputs, switchIndex)
6678+ let matchInputVar = getTempDeclMatchInputName(startIndexInputs, switchIndex)
66976679 ' stringHashDjb2Mod(<% matchInputVar%> ,<% div%> )'
66986680 case MATCH(switch=SOME((switchIndex,ty as T_METATYPE(__),_))) then
6699- let matchInputVar = getTempDeclMatchInputName(exp.inputs, prefix, startIndexInputs, switchIndex)
6681+ let matchInputVar = getTempDeclMatchInputName(startIndexInputs, switchIndex)
67006682 ' valueConstructor(<% matchInputVar%> )'
67016683 case MATCH(switch=SOME((switchIndex,ty as T_INTEGER(__),_))) then
6702- let matchInputVar = getTempDeclMatchInputName(exp.inputs, prefix, startIndexInputs, switchIndex)
6684+ let matchInputVar = getTempDeclMatchInputName(startIndexInputs, switchIndex)
67036685 ' <% matchInputVar%> '
67046686 case MATCH(switch=SOME(_)) then
67056687 error(sourceInfo(), ' Unknown switch : <% ExpressionDumpTpl.dumpExp(exp," \" " )%> ' )
@@ -6823,7 +6805,8 @@ template daeExpMatchCases(list<MatchCase> cases, list<Exp> tupleAssignExps, DAE.
68236805 let &assignments = buffer " "
68246806 let &preRes = buffer " "
68256807 let &varFrees = buffer " "
6826- let patternMatching = (sortPatternsByComplexity(c.patterns) |> (lhs,i0) => patternMatch(lhs,' <%getTempDeclMatchInputName(inputs, prefix, startIndexInputs, i0)%>' , onPatternFail, &varDeclsCaseInner, &assignments); empty)
6808+ let patternMatching = (sortPatternsByComplexity(c.patterns) |> (lhs,i0)
6809+ => patternMatch(lhs,' <%getTempDeclMatchInputName(startIndexInputs, i0)%>' , onPatternFail, &varDeclsCaseInner, &assignments); empty)
68276810 let() = System.tmpTickSetIndex(startTmpTickIndex,1)
68286811 let stmts = (c.body |> stmt => algStatement(stmt, context, &varDeclsCaseInner, &auxFunction); separator= " \n " )
68296812 let &preGuardCheck = buffer " "
0 commit comments