Ignore:
Timestamp:
2020-02-04T17:09:45+01:00 (4 years ago)
Author:
GitHub <noreply@…>
Branches:
Added-citation-metadata, maintenance/v1.16, maintenance/v1.17, maintenance/v1.18, maintenance/v1.19, maintenance/v1.20, maintenance/v1.21, maintenance/v1.22, maintenance/v1.23, master, omlib-staging
Children:
8862d56, 92420d0
Parents:
6c78ddb
git-author:
Mahder Gebremedhin <mahge@…> (02/04/20 17:09:45)
git-committer:
GitHub <noreply@…> (02/04/20 17:09:45)
Message:

Improve record constructor creation. (#717)

  • Make sure we do not remove bindings from derived record

declarations. This happens only for the old FrontEnd right now.

  • Improve processing a bit. Instead of checking twice in the list of already visited records, create the unique name for the constructor and then check only once.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • OMCompiler/Compiler/SimCode/SimCodeFunctionUtil.mo

    r80ac1a4 rd84fc85e  
    16091609      Integer varnum;
    16101610      SimCodeFunction.RecordDeclaration recDecl;
     1611      Boolean is_default;
    16111612
    16121613    case (DAE.T_COMPLEX(complexClassType = ClassInf.RECORD(path), varLst = varlst), accRecDecls, rt)
     
    16151616        rt_1 := rt;
    16161617
    1617         if not listMember(name, rt_1) then
    1618           rt_1 := name :: rt_1;
    1619           (accRecDecls, rt_1) := elaborateNestedRecordDeclarations(varlst, accRecDecls, rt_1);
    1620 
    1621           varlst := List.map(varlst, simCodeVarRemoveBindFromOutside);
    1622           vars := List.map(varlst, typesVar);
    1623           // vars := List.map(vars, simCodeVarRemoveBindFromOutside);
    1624           recDecl := SimCodeFunction.RECORD_DECL_FULL(name, NONE(), path, vars);
     1618        (sname, is_default) := checkBindingsandGetConstructorName(name, varlst);
     1619        // is_default := stringEqual(sname,name);
     1620
     1621        if not listMember(sname, rt_1) then
     1622          rt_1 := sname :: rt_1;
     1623
     1624          if is_default then
     1625            (accRecDecls, rt_1) := elaborateNestedRecordDeclarations(varlst, accRecDecls, rt_1);
     1626
     1627            vars := List.map(varlst, typesVar);
     1628            recDecl := SimCodeFunction.RECORD_DECL_FULL(sname, NONE(), path, vars);
     1629          else
     1630            vars := List.map(varlst, typesVar);
     1631            recDecl := SimCodeFunction.RECORD_DECL_ADD_CONSTRCTOR(sname, name, vars);
     1632          end if;
     1633
    16251634          accRecDecls := List.appendElt(recDecl, accRecDecls);
    16261635        end if;
    16271636
    1628         sname := name;
    1629         varnum := 1;
    1630         for var in varlst loop
    1631           if var.bind_from_outside then
    1632             sname := sname + "_" + intString(varnum);
    1633           end if;
    1634           varnum := intAdd(varnum,1);
    1635         end for;
    1636 
    1637         if not listMember(sname, rt_1) then
    1638           rt_1 := sname :: rt_1;
    1639           vars := List.map(varlst, typesVar);
    1640           recDecl := SimCodeFunction.RECORD_DECL_ADD_CONSTRCTOR(sname, name, vars);
    1641           accRecDecls := List.appendElt(recDecl, accRecDecls);
    1642         end if;
    16431637      then (accRecDecls, rt_1);
    16441638
     
    17161710end typesVar;
    17171711
    1718 protected function simCodeVarRemoveBindFromOutside
    1719   input output DAE.Var var;
    1720 algorithm
    1721   _ := match (var)
    1722     case DAE.TYPES_VAR(binding = DAE.EQBOUND(source=DAE.BINDING_FROM_DERIVED_RECORD_DECL()))
    1723       then ();
    1724     case DAE.TYPES_VAR()
    1725       algorithm
    1726         var.bind_from_outside := false;
    1727       then ();
    1728   end match;
    1729 end simCodeVarRemoveBindFromOutside;
     1712protected function checkBindingsandGetConstructorName
     1713  input String rec_name;
     1714  input list<DAE.Var> vars;
     1715  output String ctor_name;
     1716  output Boolean is_default;
     1717protected
     1718  Integer varnum;
     1719algorithm
     1720  is_default := true;
     1721
     1722  ctor_name := rec_name;
     1723  varnum := 1;
     1724
     1725  for var in vars loop
     1726    if var.bind_from_outside and not isBindingFromDerivedRecordDeclaration(var.binding) then
     1727      is_default := false;
     1728      ctor_name := ctor_name + "_" + intString(varnum);
     1729    end if;
     1730
     1731    varnum := intAdd(varnum,1);
     1732  end for;
     1733end checkBindingsandGetConstructorName;
     1734
     1735protected function isBindingFromDerivedRecordDeclaration
     1736  input DAE.Binding bind;
     1737  output Boolean b;
     1738algorithm
     1739  b := match bind
     1740    case DAE.EQBOUND(source=DAE.BINDING_FROM_DERIVED_RECORD_DECL())  then true;
     1741    else false;
     1742  end match;
     1743end isBindingFromDerivedRecordDeclaration;
    17301744
    17311745protected function checkSourceAndGetBindingExp
Note: See TracChangeset for help on using the changeset viewer.