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

Commit e4071b5

Browse files
sjoelundOpenModelica-Hudson
authored andcommitted
Make getClassnamesInElts not stack overflow
matchcontinue+append list after the recursion cause OM crashes...
1 parent 4af9b08 commit e4071b5

File tree

1 file changed

+76
-78
lines changed

1 file changed

+76
-78
lines changed

Compiler/Script/Interactive.mo

Lines changed: 76 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -47,57 +47,60 @@ encapsulated package Interactive
4747
- Modelica models in SCode form (to speed up instantiation. not impl. yet)"
4848

4949
//public imports
50-
public import Absyn;
51-
public import ConnectionGraph;
52-
public import DAE;
53-
public import FCore;
54-
public import Global;
55-
public import GlobalScript;
56-
public import SCode;
57-
public import SCodeUtil;
58-
public import Settings;
59-
public import Values;
50+
import Absyn;
51+
import ConnectionGraph;
52+
import DAE;
53+
import FCore;
54+
import Global;
55+
import GlobalScript;
56+
import SCode;
57+
import SCodeUtil;
58+
import Settings;
59+
import Values;
6060

6161
// protected imports
62-
protected import Ceval;
63-
protected import CevalScript;
64-
protected import ClassInf;
65-
protected import ClockIndexes;
66-
protected import Config;
67-
protected import Connect;
68-
protected import Constants;
69-
protected import DAEUtil;
70-
protected import Debug;
71-
protected import Dump;
72-
protected import Error;
73-
protected import ErrorExt;
74-
protected import ExpressionDump;
75-
protected import ExpressionSimplify;
76-
protected import FBuiltin;
77-
protected import Flags;
78-
protected import FGraph;
79-
protected import GlobalScriptDump;
80-
protected import GlobalScriptUtil;
81-
protected import InnerOuter;
82-
protected import Inst;
83-
protected import InstUtil;
84-
protected import InstTypes;
85-
protected import List;
86-
protected import Lookup;
87-
protected import MetaUtil;
88-
protected import Mod;
89-
protected import Parser;
90-
protected import Prefix;
91-
protected import Print;
92-
protected import Refactor;
93-
protected import Static;
94-
protected import StaticScript;
95-
protected import StringUtil;
96-
protected import System;
97-
protected import Types;
98-
protected import UnitAbsyn;
99-
protected import Util;
100-
protected import ValuesUtil;
62+
protected
63+
64+
import Ceval;
65+
import CevalScript;
66+
import ClassInf;
67+
import ClockIndexes;
68+
import Config;
69+
import Connect;
70+
import Constants;
71+
import DAEUtil;
72+
import Debug;
73+
import DoubleEndedList;
74+
import Dump;
75+
import Error;
76+
import ErrorExt;
77+
import ExpressionDump;
78+
import ExpressionSimplify;
79+
import FBuiltin;
80+
import Flags;
81+
import FGraph;
82+
import GlobalScriptDump;
83+
import GlobalScriptUtil;
84+
import InnerOuter;
85+
import Inst;
86+
import InstUtil;
87+
import InstTypes;
88+
import List;
89+
import Lookup;
90+
import MetaUtil;
91+
import Mod;
92+
import Parser;
93+
import Prefix;
94+
import Print;
95+
import Refactor;
96+
import Static;
97+
import StaticScript;
98+
import StringUtil;
99+
import System;
100+
import Types;
101+
import UnitAbsyn;
102+
import Util;
103+
import ValuesUtil;
101104
import MetaModelica.Dangerous;
102105

103106
protected uniontype AnnotationType
@@ -12022,9 +12025,12 @@ public function getClassnamesInElts
1202212025
input list<Absyn.ElementItem> inAbsynElementItemLst;
1202312026
input Boolean includeConstants;
1202412027
output list<String> outStringLst;
12028+
protected
12029+
DoubleEndedList<String> delst;
1202512030
algorithm
12026-
outStringLst:=
12027-
matchcontinue (inAbsynElementItemLst,includeConstants)
12031+
delst := DoubleEndedList.fromList({});
12032+
for elt in inAbsynElementItemLst loop
12033+
_ := match elt
1202812034
local
1202912035
list<String> res;
1203012036
String id;
@@ -12033,36 +12039,28 @@ algorithm
1203312039
list<Absyn.ComponentItem> lst;
1203412040
list<String> names;
1203512041

12036-
case ({},_) then {};
12037-
12038-
case ((Absyn.ELEMENTITEM(element = Absyn.ELEMENT(specification = Absyn.CLASSDEF(class_ =
12039-
Absyn.CLASS(body = Absyn.CLASS_EXTENDS(baseClassName = id))))) :: rest),c)
12040-
equation
12041-
res = getClassnamesInElts(rest,c);
12042-
then
12043-
(id :: res);
12042+
case Absyn.ELEMENTITEM(element = Absyn.ELEMENT(specification = Absyn.CLASSDEF(class_ =
12043+
Absyn.CLASS(body = Absyn.CLASS_EXTENDS(baseClassName = id)))))
12044+
algorithm
12045+
DoubleEndedList.push_back(delst, id);
12046+
then ();
1204412047

12045-
case ((Absyn.ELEMENTITEM(element = Absyn.ELEMENT(specification = Absyn.CLASSDEF(class_ =
12046-
Absyn.CLASS(name = id)))) :: rest),c)
12047-
equation
12048-
res = getClassnamesInElts(rest,c);
12049-
then
12050-
(id :: res);
12048+
case Absyn.ELEMENTITEM(element = Absyn.ELEMENT(specification = Absyn.CLASSDEF(class_ =
12049+
Absyn.CLASS(name = id))))
12050+
algorithm
12051+
DoubleEndedList.push_back(delst, id);
12052+
then ();
1205112053

12052-
case ((Absyn.ELEMENTITEM(element = Absyn.ELEMENT(specification = Absyn.COMPONENTS(attributes = Absyn.ATTR(variability = Absyn.CONST()),
12053-
components = lst))) :: rest),true)
12054-
equation
12055-
names = getComponentItemsName(lst,false);
12056-
res = getClassnamesInElts(rest,true);
12057-
then
12058-
listAppend(names, res);
12054+
case Absyn.ELEMENTITEM(element = Absyn.ELEMENT(specification = Absyn.COMPONENTS(attributes = Absyn.ATTR(variability = Absyn.CONST()),
12055+
components = lst))) guard includeConstants
12056+
algorithm
12057+
DoubleEndedList.push_list_back(delst, getComponentItemsName(lst,false));
12058+
then ();
1205912059

12060-
case ((_ :: rest),c)
12061-
equation
12062-
res = getClassnamesInElts(rest,c);
12063-
then
12064-
res;
12065-
end matchcontinue;
12060+
else ();
12061+
end match;
12062+
end for;
12063+
outStringLst := DoubleEndedList.toListAndClear(delst);
1206612064
end getClassnamesInElts;
1206712065

1206812066
protected function getBaseClasses

0 commit comments

Comments
 (0)