Skip to content

Commit 860bb91

Browse files
perostOpenModelica-Hudson
authored andcommitted
Partial fix for bug3535.
- Replaced avl tree implementation in NFSCodeEnv with generic avl tree. - Fixed NFSCodeDependency to handle duplicate elements better. - Changed Main.loadLib so that it doesn't remove duplicate top-level elements when loading libraries.
1 parent 2749b17 commit 860bb91

File tree

11 files changed

+263
-746
lines changed

11 files changed

+263
-746
lines changed

Compiler/FFrontEnd/FNode.mo

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ protected
339339
Ref parent;
340340
algorithm
341341
FCore.N(n, i, p, c, d) := fromRef(inParentRef);
342-
c := RefTree.add(c, inName, inChildRef, RefTree.addConflictReplace);
342+
c := RefTree.add(c, inName, inChildRef, printElementConflictError);
343343
parent := updateRef(inParentRef, FCore.N(n, i, p, c, d));
344344
FGraphStream.edge(inName, fromRef(parent), fromRef(inChildRef));
345345
end addChildRef;
@@ -352,10 +352,11 @@ protected
352352
SourceInfo info1, info2;
353353
String name;
354354
algorithm
355-
(name, info1) := SCode.elementNameInfo(FNode.getElementFromRef(newRef));
356-
info2 := SCode.elementInfo(FNode.getElementFromRef(oldRef));
357-
Error.addMultiSourceMessage(Error.DOUBLE_DECLARATION_OF_ELEMENTS, {name}, {info2, info1});
358-
fail();
355+
dummy := newRef;
356+
//(name, info1) := SCode.elementNameInfo(FNode.getElementFromRef(newRef));
357+
//info2 := SCode.elementInfo(FNode.getElementFromRef(oldRef));
358+
//Error.addMultiSourceMessage(Error.DOUBLE_DECLARATION_OF_ELEMENTS, {name}, {info2, info1});
359+
//fail();
359360
end printElementConflictError;
360361

361362
public function addImportToRef

Compiler/FFrontEnd/FVisit.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@ algorithm
701701

702702
else
703703
equation
704-
Error.addMessage(Error.INTERNAL_ERROR, {"Env.avlTreeReplace failed"});
704+
Error.addMessage(Error.INTERNAL_ERROR, {getInstanceName() + " failed"});
705705
then fail();
706706

707707
end match;

Compiler/FrontEnd/NFEnvExtends.mo

Lines changed: 28 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,6 @@ protected import Util;
136136

137137
public type Env = NFSCodeEnv.Env;
138138

139-
protected type AvlTree = NFSCodeEnv.AvlTree;
140-
protected type AvlTreeValue = NFSCodeEnv.AvlTreeValue;
141139
protected type ClassType = NFSCodeEnv.ClassType;
142140
protected type Extends = NFSCodeEnv.Extends;
143141
protected type Frame = NFSCodeEnv.Frame;
@@ -147,6 +145,8 @@ protected type Item = NFSCodeEnv.Item;
147145

148146
protected type ExtendsTableArray = array<ExtendsWrapper>;
149147

148+
import NFSCodeEnv.EnvTree;
149+
150150
public constant String BASECLASS_NOT_FOUND_ERROR = "$1";
151151
public constant String BASECLASS_INHERITED_ERROR = "$2";
152152
public constant String BASECLASS_REPLACEABLE_ERROR = "$3";
@@ -244,57 +244,39 @@ protected
244244
list<SCode.Element> re;
245245
Option<SCode.Element> cei;
246246
Env env;
247-
AvlTree tree;
247+
EnvTree.Tree tree;
248248
algorithm
249249
// Qualify the extends in this scope.
250250
env := qualifyLocalScope(inEnv, inClassType, inExtendsTable);
251251

252252
// Recurse down the tree.
253253
NFSCodeEnv.FRAME(clsAndVars = tree) :: _ := env;
254-
SOME(tree) := qualify3(SOME(tree), env, inExtendsTable);
254+
tree := EnvTree.map(tree,
255+
function qualify3(inEnv = env, inExtendsTable = inExtendsTable));
255256
outEnv := NFSCodeEnv.setEnvClsAndVars(tree, env);
256257
end qualify2;
257258

258259
protected function qualify3
259-
input Option<AvlTree> inTree;
260+
input String name;
261+
input output Item item;
260262
input Env inEnv;
261263
input ExtendsTableArray inExtendsTable;
262-
output Option<AvlTree> outTree;
263264
algorithm
264-
outTree := match(inTree, inEnv, inExtendsTable)
265+
item := match item
265266
local
266-
String name;
267267
SCode.Element cls;
268268
Frame cls_env;
269269
ClassType cls_ty;
270-
Integer h;
271-
Option<AvlTree> left, right;
272270
Env env, rest_env;
273-
Item item;
274-
Option<AvlTreeValue> value;
275-
276-
// Empty leaf, do nothing.
277-
case (NONE(), _, _) then inTree;
278271

279-
case (SOME(NFSCodeEnv.AVLTREENODE(SOME(NFSCodeEnv.AVLTREEVALUE(
280-
name, NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty))), h, left, right)), _, _)
281-
equation
282-
env = NFSCodeEnv.enterFrame(cls_env, inEnv);
283-
cls_env :: rest_env = qualify2(env, cls_ty, inExtendsTable);
284-
left = qualify3(left, rest_env, inExtendsTable);
285-
right = qualify3(right, rest_env, inExtendsTable);
286-
item = NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
287-
value = SOME(NFSCodeEnv.AVLTREEVALUE(name, item));
272+
case NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty)
273+
algorithm
274+
env := NFSCodeEnv.enterFrame(cls_env, inEnv);
275+
cls_env :: rest_env := qualify2(env, cls_ty, inExtendsTable);
288276
then
289-
SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
290-
291-
case (SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right)), _, _)
292-
equation
293-
left = qualify3(left, inEnv, inExtendsTable);
294-
right = qualify3(right, inEnv, inExtendsTable);
295-
then
296-
SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
277+
NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
297278

279+
else item;
298280
end match;
299281
end qualify3;
300282

@@ -1117,64 +1099,45 @@ protected
11171099
Env env, rest_env;
11181100
Option<String> name;
11191101
FrameType ty;
1120-
AvlTree tree;
1102+
EnvTree.Tree tree;
11211103
list<Extends> bcl;
11221104
list<SCode.Element> re;
11231105
NFSCodeEnv.ImportTable imps;
11241106
Option<Util.StatefulBoolean> iu;
11251107
algorithm
11261108
NFSCodeEnv.FRAME(name, ty, tree,
11271109
NFSCodeEnv.EXTENDS_TABLE(bcl, re, _), imps, iu) :: rest_env := inEnv;
1128-
SOME(tree) := update3(SOME(tree), inEnv);
1110+
tree := EnvTree.map(tree, function update3(inEnv = inEnv));
11291111
env := NFSCodeEnv.FRAME(name, ty, tree,
11301112
NFSCodeEnv.EXTENDS_TABLE(bcl, {}, NONE()), imps, iu) :: rest_env;
11311113
outEnv := NFSCodeFlattenRedeclare.addElementRedeclarationsToEnv(re, env);
11321114
end update2;
11331115

11341116
protected function update3
1135-
input Option<AvlTree> inTree;
1117+
input String name;
1118+
input output Item item;
11361119
input Env inEnv;
1137-
output Option<AvlTree> outTree;
11381120
algorithm
1139-
outTree := match(inTree, inEnv)
1121+
() := match item
11401122
local
1141-
String name;
1142-
Integer h;
1143-
Option<AvlTree> left, right;
11441123
Env rest_env, env;
11451124
SCode.Element cls;
1146-
Frame cls_env;
1147-
Option<NFSCodeEnv.AvlTreeValue> value;
1148-
Item item;
11491125
ClassType cls_ty;
1126+
Frame cls_env;
11501127

1151-
case (NONE(), _) then inTree;
1152-
1153-
case (SOME(NFSCodeEnv.AVLTREENODE(SOME(NFSCodeEnv.AVLTREEVALUE(
1154-
name, NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty))), h, left, right)), _)
1155-
equation
1128+
case NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty)
1129+
algorithm
11561130
// Enter the class' frame and update the class extends in it.
1157-
env = NFSCodeEnv.enterFrame(cls_env, inEnv);
1158-
(cls, env) = updateClassExtends(cls, env, cls_ty);
1131+
env := NFSCodeEnv.enterFrame(cls_env, inEnv);
1132+
(cls, env) := updateClassExtends(cls, env, cls_ty);
11591133
// Call update2 on the class' environment to update the extends.
1160-
cls_env :: rest_env = update2(env);
1161-
// Recurse into left and right branch of the tree.
1162-
left = update3(left, rest_env);
1163-
right = update3(right, rest_env);
1134+
cls_env :: rest_env := update2(env);
11641135
// Rebuild the class item with the updated information.
1165-
item = NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
1166-
value = SOME(NFSCodeEnv.AVLTREEVALUE(name, item));
1136+
item := NFSCodeEnv.CLASS(cls, {cls_env}, cls_ty);
11671137
then
1168-
SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
1169-
1170-
case (SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right)), _)
1171-
equation
1172-
// Recurse into left and right branch of the tree.
1173-
left = update3(left, inEnv);
1174-
right = update3(right, inEnv);
1175-
then
1176-
SOME(NFSCodeEnv.AVLTREENODE(value, h, left, right));
1138+
();
11771139

1140+
else ();
11781141
end match;
11791142
end update3;
11801143

Compiler/FrontEnd/NFSCodeCheck.mo

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ protected import Flags;
4949
protected import NFInstDump;
5050
protected import SCodeDump;
5151

52+
import NFSCodeEnv.EnvTree;
53+
5254
public function checkRecursiveShortDefinition
5355
input Absyn.TypeSpec inTypeSpec;
5456
input String inTypeName;
@@ -474,7 +476,7 @@ algorithm
474476
inComponentEnv)
475477
local
476478
String cls_name, ty_name;
477-
NFSCodeEnv.AvlTree tree;
479+
EnvTree.Tree tree;
478480
SCode.Element el;
479481

480482
// No environment means one of the basic types.
@@ -492,7 +494,7 @@ algorithm
492494
case (_, _, _, _, NFSCodeEnv.FRAME(name = SOME(cls_name)) ::
493495
NFSCodeEnv.FRAME(clsAndVars = tree) :: _)
494496
equation
495-
NFSCodeEnv.CLASS(cls = el) = NFSCodeEnv.avlTreeGet(tree, cls_name);
497+
NFSCodeEnv.CLASS(cls = el) = EnvTree.get(tree, cls_name);
496498
true = SCode.isFunction(el);
497499
then
498500
();

0 commit comments

Comments
 (0)