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

Commit 7961fdb

Browse files
perostOpenModelica-Hudson
authored andcommitted
[NF] Improve array assignment in EvalFunction.
- Handle slices and : in EvalFunction.assignArrayElement. Belonging to [master]: - #2710
1 parent 00d7528 commit 7961fdb

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

Compiler/NFFrontEnd/NFEvalFunction.mo

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -524,23 +524,53 @@ function assignArrayElement
524524
input Expression value;
525525
output Expression result;
526526
protected
527-
Expression sub;
527+
Expression sub, val;
528528
list<Subscript> rest_subs;
529529
Integer idx;
530+
list<Expression> subs, vals;
530531
algorithm
531532
result := match (arrayExp, subscripts)
532-
case (Expression.ARRAY(), {Subscript.INDEX(sub)}) guard Expression.isScalarLiteral(sub)
533+
case (Expression.ARRAY(), Subscript.INDEX(sub) :: rest_subs) guard Expression.isScalarLiteral(sub)
533534
algorithm
534535
idx := Expression.toInteger(sub);
535-
arrayExp.elements := List.set(arrayExp.elements, idx, value);
536+
537+
if listEmpty(rest_subs) then
538+
arrayExp.elements := List.set(arrayExp.elements, idx, value);
539+
else
540+
arrayExp.elements := List.set(arrayExp.elements, idx,
541+
assignArrayElement(listGet(arrayExp.elements, idx), rest_subs, value));
542+
end if;
536543
then
537544
arrayExp;
538545

539-
case (Expression.ARRAY(), Subscript.INDEX(sub) :: rest_subs) guard Expression.isScalarLiteral(sub)
546+
case (Expression.ARRAY(), Subscript.SLICE(sub) :: rest_subs)
540547
algorithm
541-
idx := Expression.toInteger(sub);
542-
arrayExp.elements := List.set(arrayExp.elements, idx,
543-
assignArrayElement(listGet(arrayExp.elements, idx), rest_subs, value));
548+
subs := Expression.arrayElements(sub);
549+
vals := Expression.arrayElements(value);
550+
551+
if listEmpty(rest_subs) then
552+
for s in subs loop
553+
val :: vals := vals;
554+
idx := Expression.toInteger(s);
555+
arrayExp.elements := List.set(arrayExp.elements, idx, val);
556+
end for;
557+
else
558+
for s in subs loop
559+
val :: vals := vals;
560+
idx := Expression.toInteger(s);
561+
arrayExp.elements := List.set(arrayExp.elements, idx,
562+
assignArrayElement(listGet(arrayExp.elements, idx), rest_subs, val));
563+
end for;
564+
end if;
565+
then
566+
arrayExp;
567+
568+
case (Expression.ARRAY(), Subscript.WHOLE() :: rest_subs)
569+
algorithm
570+
if not listEmpty(rest_subs) then
571+
arrayExp.elements := list(assignArrayElement(e, rest_subs, v) threaded for
572+
e in arrayExp.elements, v in Expression.arrayElements(value));
573+
end if;
544574
then
545575
arrayExp;
546576

0 commit comments

Comments
 (0)