Skip to content

Commit

Permalink
- Changed recursive instantiation of enumeration arrays to a loop, to…
Browse files Browse the repository at this point in the history
… avoid

  issues with type checking.
  • Loading branch information
perost authored and sjoelund committed May 26, 2015
1 parent 8739469 commit 89e8201
Showing 1 changed file with 61 additions and 30 deletions.
91 changes: 61 additions & 30 deletions Compiler/FrontEnd/InstVar.mo
Expand Up @@ -1472,10 +1472,7 @@ algorithm
SCode.Attributes absynAttr;
SCode.Mod scodeMod;
DAE.Mod mod2, mod3;
String lit;
list<String> l;
Integer enum_size;
Absyn.Path enum_type, enum_lit;
Absyn.Path enum_lit;
SCode.Prefixes pf;
UnitAbsyn.InstStore store;

Expand Down Expand Up @@ -1537,32 +1534,11 @@ algorithm
(cache,env,ih,store,dae,csets,ty,graph);

// Instantiate an array whose dimension is determined by an enumeration.
case (cache, env, ih, store, ci_state, mod, pre, n, (cl, attr), pf,
i, DAE.DIM_ENUM(enumTypeName = enum_type, literals = lit :: l), dims,
idxs, inst_dims, impl, comment, _, graph, csets)
equation
enum_lit = Absyn.joinPaths(enum_type, Absyn.IDENT(lit));
e = DAE.ENUM_LITERAL(enum_lit, i);
s = DAE.INDEX(e);
mod_1 = Mod.lookupIdxModification(mod, e);
enum_size = listLength(l);
(cache, env_1, ih, store, dae1, csets, ty, graph) =
instVar2(cache, env, ih, store, ci_state, mod_1, pre, n, cl,
attr, pf, dims, (s :: idxs), inst_dims, impl, comment, info, graph, csets);
i_1 = i + 1;
(cache, _, ih, store, dae2, csets, _, graph) =
instArray(cache, env, ih, store, ci_state, mod, pre, n, (cl,
attr), pf, i_1, DAE.DIM_ENUM(enum_type, l, enum_size), dims, idxs,
inst_dims, impl, comment, info, graph, csets);
daeLst = DAEUtil.joinDaes(dae1, dae2);
then
(cache, env_1, ih, store, daeLst, csets, ty, graph);

case (cache,env,ih,store,_,_,_,_,(_,_),_,_,
DAE.DIM_ENUM(literals = {}),_,_,_,_,_,
_,graph, csets)
then
(cache,env,ih,store,DAE.emptyDae,csets,DAE.T_UNKNOWN_DEFAULT,graph);
case (cache, env, ih, store, ci_state, mod, pre, n, (cl, attr), pf, _,
DAE.DIM_ENUM(), dims, idxs, inst_dims, impl, comment, _, graph, csets)
then instArrayDimEnum(cache, env, ih, store, ci_state, mod, pre, n, cl,
attr, pf, inDimension, dims, idxs, inst_dims, impl, comment, info,
graph, csets);

case (cache, env, ih, store, ci_state, mod, pre, n, (cl, attr), pf, i, DAE.DIM_BOOLEAN(), dims, idxs, inst_dims, impl, comment, _, graph, csets)
equation
Expand Down Expand Up @@ -1716,5 +1692,60 @@ algorithm
end match;
end instArrayDimInteger;

protected function instArrayDimEnum
input FCore.Cache inCache;
input FCore.Graph inEnv;
input InnerOuter.InstHierarchy inIH;
input UnitAbsyn.InstStore inStore;
input ClassInf.State inState;
input DAE.Mod inMod;
input Prefix.Prefix inPrefix;
input String inName;
input SCode.Element inClass;
input SCode.Attributes inAttributes;
input SCode.Prefixes inPrefixes;
input DAE.Dimension inDimension;
input DAE.Dimensions inRestDimensions;
input list<DAE.Subscript> inSubscripts;
input list<list<DAE.Dimension>> inInstDims;
input Boolean inImpl;
input SCode.Comment inComment;
input SourceInfo inInfo;
input ConnectionGraph.ConnectionGraph inGraph;
input Connect.Sets inSets;
output FCore.Cache outCache = inCache;
output FCore.Graph outEnv = inEnv;
output InnerOuter.InstHierarchy outIH = inIH;
output UnitAbsyn.InstStore outStore = inStore;
output DAE.DAElist outDae = DAE.emptyDae;
output Connect.Sets outSets = inSets;
output DAE.Type outType = DAE.T_UNKNOWN_DEFAULT;
output ConnectionGraph.ConnectionGraph outGraph = inGraph;
protected
Absyn.Path enum_path, enum_lit_path;
list<String> literals;
Integer i = 1;
DAE.Exp e;
DAE.Mod mod;
DAE.DAElist dae;
algorithm
DAE.DIM_ENUM(enumTypeName = enum_path, literals = literals) := inDimension;

for lit in literals loop
enum_lit_path := Absyn.joinPaths(enum_path, Absyn.IDENT(lit));
e := DAE.ENUM_LITERAL(enum_lit_path, i);
mod := Mod.lookupIdxModification(inMod, e);
i := i + 1;

(outCache, outEnv, outIH, outStore, dae, outSets, outType, outGraph) :=
instVar2(outCache, outEnv, outIH, outStore, inState, mod, inPrefix,
inName, inClass, inAttributes, inPrefixes, inRestDimensions,
DAE.INDEX(e) :: inSubscripts, inInstDims, inImpl, inComment, inInfo,
outGraph, outSets);

outDae := DAEUtil.joinDaes(outDae, dae);
end for;
end instArrayDimEnum;

annotation(__OpenModelica_Interface="frontend");
end InstVar;

0 comments on commit 89e8201

Please sign in to comment.