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

Commit d39b07b

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Optimize cref evaluation.
- Keep track of which bindings have been evaluated so we don't need to evaluate a component's binding multiple times. Belonging to [master]: - #2754
1 parent 9a92511 commit d39b07b

File tree

4 files changed

+15
-9
lines changed

4 files changed

+15
-9
lines changed

Compiler/NFFrontEnd/NFBinding.mo

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ uniontype Binding
7979
Variability variability;
8080
list<InstNode> parents;
8181
Boolean isEach;
82+
Boolean evaluated;
8283
SourceInfo info;
8384
end TYPED_BINDING;
8485

@@ -277,7 +278,7 @@ public
277278
ty := Expression.typeOf(exp);
278279
var := Expression.variability(exp);
279280
then
280-
TYPED_BINDING(exp, ty, var, fieldBinding.parents, fieldBinding.isEach, fieldBinding.info);
281+
TYPED_BINDING(exp, ty, var, fieldBinding.parents, fieldBinding.isEach, fieldBinding.evaluated, fieldBinding.info);
281282

282283
case FLAT_BINDING()
283284
algorithm

Compiler/NFFrontEnd/NFCeval.mo

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,12 +329,17 @@ algorithm
329329
(exp, evaluated) := match binding
330330
case Binding.TYPED_BINDING()
331331
algorithm
332-
exp := evalExp(binding.bindingExp, target);
332+
if binding.evaluated then
333+
exp := binding.bindingExp;
334+
else
335+
exp := evalExp(binding.bindingExp, target);
333336

334-
if not referenceEq(exp, binding.bindingExp) then
335-
binding.bindingExp := exp;
336-
comp := Component.setBinding(binding, comp);
337-
InstNode.updateComponent(comp, node);
337+
if not referenceEq(exp, binding.bindingExp) then
338+
binding.bindingExp := exp;
339+
binding.evaluated := true;
340+
comp := Component.setBinding(binding, comp);
341+
InstNode.updateComponent(comp, node);
342+
end if;
338343
end if;
339344
then
340345
(exp, true);

Compiler/NFFrontEnd/NFTypeCheck.mo

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2279,7 +2279,7 @@ algorithm
22792279
Type.toString(binding.bindingType)}, {Binding.getInfo(binding), InstNode.info(component)});
22802280
fail();
22812281
elseif isCastMatch(ty_match) then
2282-
binding := Binding.TYPED_BINDING(exp, ty, binding.variability, binding.parents, binding.isEach, binding.info);
2282+
binding := Binding.TYPED_BINDING(exp, ty, binding.variability, binding.parents, binding.isEach, binding.evaluated, binding.info);
22832283
end if;
22842284
then
22852285
();

Compiler/NFFrontEnd/NFTyping.mo

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ algorithm
840840
info := Binding.getInfo(binding);
841841
(exp, ty, var) := typeExp(exp, origin, info);
842842
then
843-
Binding.TYPED_BINDING(exp, ty, var, binding.parents, binding.isEach, binding.info);
843+
Binding.TYPED_BINDING(exp, ty, var, binding.parents, binding.isEach, false, binding.info);
844844

845845
case Binding.TYPED_BINDING() then binding;
846846
case Binding.UNBOUND() then binding;
@@ -903,7 +903,7 @@ algorithm
903903
fail();
904904
end if;
905905
then
906-
Binding.TYPED_BINDING(exp, ty, var, condition.parents, false, info);
906+
Binding.TYPED_BINDING(exp, ty, var, condition.parents, false, false, info);
907907

908908
end match;
909909
end typeComponentCondition;

0 commit comments

Comments
 (0)