Changeset 11541


Ignore:
Timestamp:
Aug 30, 2018 4:04:43 PM (15 months ago)
Author:
Jonathan Kämpe
Message:

#5670 Fixed a bug where external constant evaluation with literal or size inputs could produce wrong values if several modelica wrappers used the same external function.

Location:
trunk
Files:
1 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Compiler/GenericCodeGen/src/jastadd/ExternalCEvalTag.jrag

    r11524 r11541  
    5151   
    5252    /* Used when unit testing. Temp names will accumulate over all tests */
    53     private static final CodeGenContext unitCgc = new CodeGenContext();
    5453    private static final Map<String,String> unitTempMap = new HashMap<String,String>();
    5554   
    5655    public  void generate(CodeStream str) {
    5756        if (ext == null) {
     57            CodeGenContext unitCgc = new CodeGenContext().createProxy();
    5858            for (FExternalStmt ext : fClass.myExternals()) {
    5959                if (!ext.isConstructorStmt() && !ext.isDestructorStmt()) {
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenAlgorithms.jrag

    r11514 r11541  
    122122    public void FExternalStmt.genVarDecls_C(CodePrinter p, CodeStream str, String indent) {
    123123        FExternalLanguage lang = getFExternalLanguage();
    124         lang.genVarDecls_C(p, str, indent, this);
     124        lang.genVarDecls_C(p, str, indent, this, codeGenContext != null);
    125125        lang.genFuncDecl(p, str, indent, this);
    126126    }
     
    394394    @Override
    395395    public void FExternalStmt.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     396        boolean ceval = codeGenContext != null;
    396397        // Generate temp arrays for all array inputs and outputs
    397398        // and transpose array for if array is input (Fortran 77 only)
    398         getFExternalLanguage().prepExternalArg(p, str, indent, this, false);
     399        getFExternalLanguage().prepExternalArg(p, str, indent, this, false, getCodeGenContext(), ceval);
    399400       
    400401        str.print(indent);
    401402        // return variable?
    402403        if(hasReturnVar()) {
    403             String name = getReturnVar().type().isRecord() ?
     404            String name = getCodeGenContext().alias(getReturnVar().myCommonVarDecl());
     405            if (name == null) {
     406                name = getReturnVar().type().isRecord() ?
    404407                    "*"+getReturnVar().tempName_C() :
    405408                    getReturnVar().getCommonAccess().name_C();
    406             str.print(getCodeGenContext().alias(name));
     409            }
     410            str.print(name);
    407411            str.print(" = ");
    408412        }
    409413       
    410         // print function call
    411         getFExternalLanguage().genFuncCall(p, str, indent, this);
     414        CodeGenContext cgc = getCodeGenContext().createProxy();
     415        getFExternalLanguage().extraContext(this, cgc, ceval);
     416        getFExternalLanguage().genFuncCall(p, str, indent, this, cgc);
    412417       
    413418        // If there are any output arrays, transpose these before returning (Fortran 77 only)
    414         getFExternalLanguage().prepExternalArg(p, str, indent, this, true);
     419        getFExternalLanguage().prepExternalArg(p, str, indent, this, true, getCodeGenContext(), ceval);
    415420    }
    416421
     
    437442    }
    438443
    439     public void FExternalLanguage.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt, boolean writeback){
     444    public void FExternalLanguage.extraContext(FExternalStmt stmt, CodeGenContext cgc, boolean ceval) {
    440445        for (FExp arg : stmt.getArgs()) {
    441             if (extShouldArgConvert(arg)) {
    442                 arg.prepExternalArg(p, str, indent, this, writeback);
     446            if (extShouldArgConvert(arg, ceval)) {
     447                cgc.setAlias(arg.externalArgument(), arg.tempName_C());
     448            }
     449        }
     450    }
     451
     452    public void FExternalLanguage.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt, boolean writeback, CodeGenContext cgc, boolean ceval){
     453        for (FExp arg : stmt.getArgs()) {
     454            if (extShouldArgConvert(arg, ceval)) {
     455                arg.prepExternalArg(p, str, indent, this, writeback, cgc);
    443456            }
    444457        }
    445458        if (writeback && stmt.hasReturnVar() && stmt.getReturnVar().type().isRecord()) {
    446             stmt.getReturnVar().prepExternalArg(p, str, indent, this, writeback);
    447         }
    448     }
    449 
    450     public void FExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback) {
     459            stmt.getReturnVar().prepExternalArg(p, str, indent, this, writeback, cgc);
     460        }
     461    }
     462
     463    public void FExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback, CodeGenContext cgc) {
    451464        String tempName = tempName_C();
    452         String src = alias_C(p);
    453         useTempVar = true;
     465        String src = alias_C(p, cgc);
    454466        if (isArray()) {
    455467            MatrixOp op = new MatrixOp(type(), lang, writeback);
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenExternal.jrag

    r11471 r11541  
    1919     * Generates temporaries for an argument to an external function when necessary.
    2020     */
    21     public void FExternalLanguage.genVarDecls_C(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt) {
     21    public void FExternalLanguage.genVarDecls_C(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt, boolean ceval) {
    2222        for (FExp arg: stmt.getArgs()) {
    23             if (extShouldArgConvert(arg)) {
     23            if (extShouldArgConvert(arg, ceval)) {
    2424                arg.type().printDeclBase_C(p, str, indent, arg.tempName_C(), arg, true);
    2525            }
     
    3636     *  Fortran matrix => transpose
    3737     */
    38     syn boolean FExternalLanguage.extShouldArgConvert(FExp arg) = false;
    39     eq FCExternalLanguage.extShouldArgConvert(FExp arg)         = arg.extShouldArgConvert(false);
    40     eq FFortran77ExternalLanguage.extShouldArgConvert(FExp arg) = arg.extShouldArgConvert(true);
     38    syn boolean FExternalLanguage.extShouldArgConvert(FExp arg, boolean ceval) = false;
     39    eq FCExternalLanguage.extShouldArgConvert(FExp arg, boolean ceval)         = arg.extShouldArgConvert(false, ceval);
     40    eq FFortran77ExternalLanguage.extShouldArgConvert(FExp arg, boolean ceval) = arg.extShouldArgConvert(true, ceval);
    4141   
    42     syn boolean FExp.extShouldArgConvert(boolean fortran) = false;
    43     eq FLitExp.extShouldArgConvert(boolean fortran)       = fortran;
    44     eq FIdUseExp.extShouldArgConvert(boolean fortran)     =
     42    syn boolean FExp.extShouldArgConvert(boolean fortran, boolean ceval) { throw new UnsupportedOperationException(); }
     43    eq FLitExp.extShouldArgConvert(boolean fortran, boolean ceval)   = ceval || fortran;
     44    eq FSizeExp.extShouldArgConvert(boolean fortran, boolean ceval)  = ceval;
     45    eq FIdUseExp.extShouldArgConvert(boolean fortran, boolean ceval) =
    4546            type().isInteger() || type().isBoolean() || type().isEnum() || type().isRecord() ||
    4647            (fortran && type().isReal() && ndims() > 1);
     
    4849   
    4950    @Override
    50     public void FIdUseExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback) {
     51    public void FIdUseExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback, CodeGenContext cgc) {
    5152        if (!writeback || myCommonVarDecl().isOutput()) {
    5253            if (isArray() && !writeback) {
    5354                type().print(p.createInitPrinter(str), indent, tempName_C(), this, true);
    5455            }
    55             super.prepExternalArg(p, str, indent, lang, writeback);
     56            super.prepExternalArg(p, str, indent, lang, writeback, cgc);
    5657        }
    5758    }
    5859   
    5960    @Override
    60     public void FLitExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback) {
     61    public void FLitExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback, CodeGenContext cgc) {
    6162        if (!writeback)
    62             super.prepExternalArg(p, str, indent, lang, writeback);
     63            super.prepExternalArg(p, str, indent, lang, writeback, cgc);
    6364    }
    6465   
    65     public void FExternalLanguage.genFuncCall(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt) {}
     66    @Override
     67    public void FSizeExp.prepExternalArg(CodePrinter p, CodeStream str, String indent, FExternalLanguage lang, boolean writeback, CodeGenContext cgc) {
     68        if (!writeback)
     69            super.prepExternalArg(p, str, indent, lang, writeback, cgc);
     70    }
     71   
     72    public void FExternalLanguage.genFuncCall(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt, CodeGenContext cgc) {}
    6673   
    6774    @Override
    68     public void FCExternalLanguage.genFuncCall(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt) {
     75    public void FCExternalLanguage.genFuncCall(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt, CodeGenContext cgc) {
    6976        str.print(stmt.getName()+"(");
    7077        String prefix = "";
    7178        for (FExp arg : stmt.getArgs()) {
    7279            str.print(prefix);
    73             arg.genExternalCFuncArgs(p, str, indent);
     80            arg.genExternalCFuncArgs(p, str, indent, cgc);
    7481            prefix = ", ";
    7582        }
     
    7885   
    7986    @Override
    80     public void FFortran77ExternalLanguage.genFuncCall(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt) {
     87    public void FFortran77ExternalLanguage.genFuncCall(CodePrinter p, CodeStream str, String indent, FExternalStmt stmt, CodeGenContext cgc) {
    8188        str.print(stmt.getName()+"_(");
    8289        String prefix = "";
    8390        for (FExp arg : stmt.getArgs()) {
    8491            str.print(prefix);
    85             arg.genExternalFortranFuncArgs(p, str, indent);
     92            arg.genExternalFortranFuncArgs(p, str, indent, cgc);
    8693            prefix = ", ";
    8794        }
     
    120127    eq FIdUseExp.isExternalArgumentRef(boolean fortran)     = super.isExternalArgumentRef(fortran) || myCommonVarDecl().isOutput();
    121128   
    122     public void FExp.genExternalFortranFuncArgs(CodePrinter p, CodeStream str, String indent) {
     129    public void FExp.genExternalFortranFuncArgs(CodePrinter p, CodeStream str, String indent, CodeGenContext cgc) {
    123130        if (!isArray() && !type().isString()) {
    124131            str.print("&");
    125132        }
    126         if (useTempVar) {
    127             str.print(tempName_C());
    128         } else {
    129             str.print(alias_C(p));
    130         }
     133        str.print(alias_C(p, cgc));
    131134        if (isArray()) {
    132135            str.print("->var");
     
    134137    }
    135138   
    136     public void FExp.genExternalCFuncArgs(CodePrinter p, CodeStream str, String indent) {
    137         p.print(this, str, indent);
    138     }
    139    
    140     @Override
    141     public void FIdUseExp.genExternalCFuncArgs(CodePrinter p, CodeStream str, String indent) {
    142         if (myCommonVarDecl().isOutput() && !isComposite())
    143             str.print("&");
    144         if (useTempVar) {
    145             str.print(tempName_C());
    146         } else {
    147             str.print(alias_C(p));
    148         }
     139    public void FExp.genExternalCFuncArgs(CodePrinter p, CodeStream str, String indent, CodeGenContext cgc) {
     140        str.print(alias_C(p, cgc));
    149141        if (isArray()) {
    150142            str.print("->var");
    151143        }
    152144    }
    153 
     145   
    154146    @Override
    155     public void FSizeExp.genExternalCFuncArgs(CodePrinter p, CodeStream str, String indent) {
    156         str.print(alias_C(p));
     147    public void FIdUseExp.genExternalCFuncArgs(CodePrinter p, CodeStream str, String indent, CodeGenContext cgc) {
     148        if (myCommonVarDecl().isOutput() && !isComposite())
     149            str.print("&");
     150        super.genExternalCFuncArgs(p, str, indent, cgc);
    157151    }
    158152   
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenExternalCeval.jrag

    r11524 r11541  
    2121
    2222aspect CCodeGenExternalCeval {
     23
     24    public void FExternalStmt.setExternalArgumentAliases(CodeGenContext cgc) {
     25        setExternalArgumentAliases(cgc, getName(), false);
     26    }
     27
     28    public void FExternalStmt.setExternalArgumentAliases(CodeGenContext cgc, String name, boolean all) {
     29        int i = 0;
     30        for (ExternalArgument arg : varsToSerialize()) {
     31            if (all || arg instanceof FExp) {
     32                cgc.setAlias(arg, name + "_arg" + i);
     33            }
     34            i++;
     35        }
     36    }
     37
     38    public void FExternalStmt.setExternalArgumentAliases(CodeGenContext cgc, String outName, String name) {
     39        setExternalArgumentAliases(cgc, name, true);
     40        cgc.setAlias(myConstructorOutput(), outName);
     41    }
     42
    2343    public class DeclPrinter_ECE extends DeclPrinter_C {
    2444        private CodeGenContext cgc;
     
    4464        protected void printComps(FExternalObjectType type) {
    4565            FExternalStmt stmt = type.myConstructorStmt();
    46             stmt.setCodeGenContext(cgc.createProxy());
     66            stmt.setExternalArgumentAliases(cgc, name(), acquireTemp(name()));
     67            stmt.setCodeGenContext(cgc);
    4768            stmt.genVarDecls_C(p, str, indent());
    4869            stmt.setCodeGenContext(null);
     
    94115        }
    95116        protected void printExt(FExternalObjectType type) {
    96             int i = 0;
    97117            FExternalStmt stmt = type.myConstructorStmt();
    98             stmt.setCodeGenContext(cgc.createProxy());
    99             ArrayList<FExp> args = stmt.myConstructorArgs();
    100             ExternalArgument out = stmt.myConstructorOutput();
    101             String name = acquireTemp(name());
    102             stmt.getCodeGenContext().setAlias(out.name_C(), name());
    103             for (FExp arg : args)
    104                 stmt.getCodeGenContext().setAlias(arg.prettyPrint_C(), name + "_arg" + i++);
     118            stmt.setExternalArgumentAliases(cgc, name(), acquireTemp(name()));
     119            stmt.setCodeGenContext(cgc);
    105120            stmt.prettyPrint_C(p, str, indent());
    106121            stmt.setCodeGenContext(null);
     
    144159        protected void printExt(FExternalObjectType type) {
    145160            FExternalStmt stmt = type.myDestructorStmt();
    146             ArrayList<FExp> args = stmt.myConstructorArgs();
    147             stmt.setCodeGenContext(cgc.createProxy());
    148             stmt.getCodeGenContext().setAlias(args.get(0).prettyPrint_C(), name());
     161            type.myConstructorStmt().setExternalArgumentAliases(cgc, name(), acquireTemp(name()));
     162            stmt.setCodeGenContext(cgc);
    149163            stmt.prettyPrint_C(p, str, indent());
    150164            stmt.setCodeGenContext(null);
     
    167181            CodeGenContext cgc, Map<String,String> tempMap, Iterable<ExternalArgument> cvds) {
    168182        for (ExternalArgument cvd : cvds) {
    169             tp.resetUnknown(cvd.name_C(), cvd.type(), indent);
     183            String name = cgc.alias(cvd);
     184            if (name == null) {
     185                name = cvd.name_C();
     186            }
     187            tp.resetUnknown(name, cvd.type(), indent);
    170188            cvd.type().print(tp);
    171189        }
     
    177195            tp.resetUnknown(cvd.name_C(), cvd.type(), indent);
    178196            tp.printComps((FExternalObjectType)cvd.type());
    179         }
    180     }
    181    
    182     public void FExternalStmt.genSerializeNoComps_C(TypePrinter_C tp, String indent,
    183             CodeGenContext cgc, Map<String,String> tempMap, Iterable<ExternalArgument> cvds) {
    184         for (ExternalArgument cvd : cvds) {
    185             tp.resetUnknown(cvd.name_C(), cvd.type(), indent);
    186             tp.printExt((FExternalObjectType)cvd.type());
    187197        }
    188198    }
     
    235245     * when evaluating an external function.
    236246     */
    237     syn ArrayList<ExternalArgument> FExternalStmt.varsToSerialize() {
     247    syn Collection<ExternalArgument> FExternalStmt.varsToSerialize() {
    238248        if (!hasArg() && !hasReturnVar())
    239249            return new ArrayList<ExternalArgument>(myCommonVarDecls());
    240250       
    241         ArrayList<ExternalArgument> res = new ArrayList<>();
    242         if (hasReturnVar())
    243             res.add(getReturnVar().myCommonVarDecl());
     251        Collection<ExternalArgument> res = new LinkedHashSet<>();
     252        if (hasReturnVar()) {
     253            res.add(getReturnVar().externalArgument());
     254        }
    244255        for (FExp e : getArgs()) {
    245             e.varsToSerialize(res);
     256            res.add(e.externalArgument());
    246257        }
    247258        return res;
    248259    }
    249260   
    250     public void FExp.varsToSerialize(ArrayList<ExternalArgument> decls) {
    251        
    252     }
    253    
    254     public void FIdUseExp.varsToSerialize(ArrayList<ExternalArgument> decls) {
    255         ExternalArgument cvd = myCommonVarDecl();
    256         if (!decls.contains(cvd))
    257             decls.add(cvd);
    258     }
    259    
    260     public void FSizeExp.varsToSerialize(ArrayList<ExternalArgument> decls) {
    261         getFExp().varsToSerialize(decls);
    262         //getDim().varsToSerialize(decls);
    263     }
    264    
     261    public ExternalArgument FExp.externalArgument() {
     262        return this;
     263    }
     264   
     265    public ExternalArgument FIdUseExp.externalArgument() {
     266        return myCommonVarDecl();
     267    }
     268
     269
    265270    syn ArrayList<ExternalArgument> FExternalStmt.externalObjectsToSerialize() {
    266271        ArrayList<ExternalArgument> externalObjects = new ArrayList<ExternalArgument>();
     
    277282    syn ArrayList<ExternalArgument> FExternalStmt.functionArgsToSerialize() {
    278283        ArrayList<ExternalArgument> functionArgs = new ArrayList<ExternalArgument>();
    279 
    280284        for (ExternalArgument var : varsToSerialize()) {
    281285            if (!var.type().isExternalObject()) {
     
    283287            }
    284288        }
    285 
    286289        return functionArgs;
    287290    }
     
    291294     * when evaluating an external function.
    292295     */
    293     syn ArrayList<CommonVariableDecl> FExternalStmt.varsToDeserialize() {
    294         ArrayList<CommonVariableDecl> res = new ArrayList<>();
     296    syn ArrayList<ExternalArgument> FExternalStmt.varsToDeserialize() {
     297        ArrayList<ExternalArgument> res = new ArrayList<>();
    295298        for (ExternalArgument cvd : varsToSerialize()) {
    296             cvd.addVarToDeserialize(res);
     299            if (cvd.isOutput()) {
     300                res.add(cvd);
     301            }
    297302        }
    298303        return res;
    299     }
    300    
    301     @Override
    302     public void InstComponentDecl.addVarToDeserialize(ArrayList<CommonVariableDecl> res) {
    303         if (isOutput()) {
    304             res.add(this);
    305         }
    306     }
    307    
    308     @Override
    309     public void FAbstractVariable.addVarToDeserialize(ArrayList<CommonVariableDecl> res) {
    310         if (isOutput()) {
    311             res.add(this);
    312         }
    313304    }
    314305   
     
    356347        res.put(name(), this);
    357348        FExternalStmt stmt = myConstructorStmt();
    358         for (FExp exp : stmt.myConstructorArgs()) {
    359             FType t = exp.type();
     349        for (ExternalArgument arg : stmt.varsToSerialize()) {
     350            FType t = arg.type();
    360351            boolean par = t.getParent() == null;
    361352            if (par) {
     
    434425        res.add(this);
    435426       
    436         for (FExp exp : myConstructorArgs()) {
    437             FType t = exp.type();
     427        for (ExternalArgument arg : varsToSerialize()) {
     428            FType t = arg.type();
    438429            boolean par = t.getParent() == null;
    439430            if (par) {
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenNames.jrag

    r11514 r11541  
    6565            return "tmp_" + nextTempNbr_C++;
    6666        }
    67         public void setAlias(String key, String val) {
     67        public void setAlias(ExternalArgument arg, String val) {
    6868            throw new UnsupportedOperationException();
    6969        }
    70         public String alias(String key) {
    71             return key;
     70        public String alias(ExternalArgument arg) {
     71            return null;
    7272        }
    7373        public CodeGenContext createProxy() {
     
    7979        private class CodeGenContextProxy extends CodeGenContext {
    8080            private CodeGenContext redirect;
    81             private Map<String,String> aliases = new HashMap<String,String>();
     81            private Map<ExternalArgument,String> aliases = new HashMap<>();
    8282            public CodeGenContextProxy(CodeGenContext redirect) {
    8383                this.redirect = redirect;
     
    8686                return redirect.nextTempName_C();
    8787            }
    88             public void setAlias(String key, String val) {
    89                 aliases.put(key,val);
     88            public void setAlias(ExternalArgument arg, String val) {
     89                aliases.put(arg,val);
    9090            }
    91             public String alias(String key) {
    92                 return aliases.get(key);
     91            public String alias(ExternalArgument arg) {
     92                String res = aliases.get(arg);
     93                if (res == null) {
     94                    res = redirect.alias(arg);
     95                }
     96                return res;
    9397            }
    9498            public Map<String,String> recordChildTempNames() {
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenTypes.jrag

    r11471 r11541  
    134134    syn boolean FAbstractVariable.useAlias_C() = true;
    135135
    136     syn String FExp             .alias_C(CodePrinter p) = myCodeGenContext().alias(prettyPrint_C());
     136    syn String FExp.alias_C(CodePrinter p) {
     137        return alias_C(p, myCodeGenContext());
     138    }
     139
     140    syn String FExp.alias_C(CodePrinter p, CodeGenContext cgc) {
     141        String res = cgc.alias(this);
     142        if (res == null) {
     143            res = prettyPrint_C();
     144        }
     145        return res;
     146    }
     147    eq FIdUseExp.alias_C(CodePrinter p, CodeGenContext cgc) {
     148        String res = cgc.alias(myCommonVarDecl());
     149        if (res == null) {
     150            res = super.alias_C(p, cgc);
     151        }
     152        return res;
     153    }
    137154    syn String FFunctionCallLeft.alias_C(CodePrinter p) = getFExp().alias_C(p);
    138155    syn String FAbstractVariable.alias_C(CodePrinter p) = p.getExecStep().name(this);
     
    310327            int i = 0;
    311328            String name = acquireTemp(name());
    312             for (FExp arg : type.myConstructorStmt().myConstructorArgs()) {
    313                 pushLevelExt(name + "_arg" + i, false, arg.size());
     329            for (ExternalArgument arg : type.myConstructorStmt().varsToSerialize()) {
     330                if (arg.isOutput()) {
     331                    i++;
     332                    continue;
     333                }
    314334                FType t = arg.type();
     335                pushLevelExt(name + "_arg" + i, false, t.size());
    315336                boolean b = t.parent == null;
    316337                if (b) {
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CGenerator.jrag

    r11524 r11541  
    14771477                CodeGenContext cgc, Map<String,String> tempMap) {
    14781478            indent = p.indent(indent);
     1479            ext.setExternalArgumentAliases(cgc);
    14791480            TypePrinter_C tp = new DeclPrinter_ECE(p, str, tempMap, cgc);
    14801481            ext.genSerialize_C(tp, indent, cgc, tempMap, ext.functionArgsToSerialize());
     
    14921493                CodeGenContext cgc, Map<String,String> tempMap) {
    14931494            indent = p.indent(indent);
     1495            ext.setExternalArgumentAliases(cgc);
    14941496            TypePrinter_C tp = new InitPrinter_ECE(p, str, tempMap, cgc);
    14951497            ext.genSerialize_C(tp, indent, cgc, tempMap, ext.functionArgsToSerialize());
     
    15051507        public void generate(CodePrinter p, CodeStream str, String indent, FExternalStmt ext,
    15061508                CodeGenContext cgc, Map<String,String> tempMap) {
    1507             indent = p.indent(indent);
    1508             indent = p.indent(indent);
     1509            indent = p.indent(p.indent(indent));
     1510            ext.setExternalArgumentAliases(cgc);
    15091511            ext.genSerializeCalc_C(p, str, indent, cgc, tempMap);
    15101512        }
     
    15211523            indent = p.indent(indent);
    15221524            TypePrinter_C tp = new FreePrinter_ECE(p, str, tempMap, cgc);
     1525            ext.setExternalArgumentAliases(cgc);
    15231526            ext.genSerialize_C(tp, indent, cgc, tempMap, ext.functionArgsToSerialize());
    15241527        }
  • trunk/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenExternalCevalTests.mo

    r11471 r11541  
    192192---
    193193        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, a1_a, -1, 1)
     194        JMI_DEF(INT, f_arg1)
    194195        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, a2_a, -1, 1)
     196        JMI_DEF(INT, f_arg3)
    195197        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, a3_a, -1, 1)
     198        JMI_DEF(INT, f_arg5)
    196199        JMI_ARR(DYNA, jmi_string_t, jmi_string_array_t, a4_a, -1, 1)
     200        JMI_DEF(INT, f_arg7)
    197201        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, a5_a, -1, 1)
     202        JMI_DEF(INT, f_arg9)
    198203        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, b1_a, -1, 1)
     204        JMI_DEF(INT, f_arg11)
    199205        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, b2_a, -1, 1)
     206        JMI_DEF(INT, f_arg13)
    200207        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, b3_a, -1, 1)
     208        JMI_DEF(INT, f_arg15)
    201209        JMI_ARR(DYNA, jmi_string_t, jmi_string_array_t, b4_a, -1, 1)
     210        JMI_DEF(INT, f_arg17)
    202211        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, b5_a, -1, 1)
     212        JMI_DEF(INT, f_arg19)
     213        JMI_DEF(INT_EXT, tmp_1)
     214        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_2, -1, 1)
     215        JMI_DEF(INT_EXT, tmp_3)
     216        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_4, -1, 1)
     217        JMI_DEF(INT_EXT, tmp_5)
     218        JMI_DEF(INT_EXT, tmp_6)
    203219        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_7, -1, 1)
    204         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_8, -1, 1)
    205         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_9, -1, 1)
     220        JMI_DEF(INT_EXT, tmp_8)
     221        JMI_DEF(INT_EXT, tmp_9)
    206222        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_10, -1, 1)
    207         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_11, -1, 1)
     223        JMI_DEF(INT_EXT, tmp_11)
    208224        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_12, -1, 1)
     225        JMI_DEF(INT_EXT, tmp_13)
     226        JMI_DEF(INT_EXT, tmp_14)
     227        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_15, -1, 1)
     228        JMI_DEF(INT_EXT, tmp_16)
    209229        extern void f(double*, size_t, int*, size_t, int*, size_t, const char**, size_t, int*, size_t, double*, size_t, int*, size_t, int*, size_t, const char**, size_t, int*, size_t);
    210230
     
    213233        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, a1_a, d[0], 1, d[0])
    214234        JMCEVAL_parseArray(Real, a1_a);
     235        JMCEVAL_parse(Integer, f_arg1);
    215236        JMCEVAL_parseArrayDims(1);
    216237        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, a2_a, d[0], 1, d[0])
    217238        JMCEVAL_parseArray(Integer, a2_a);
     239        JMCEVAL_parse(Integer, f_arg3);
    218240        JMCEVAL_parseArrayDims(1);
    219241        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, a3_a, d[0], 1, d[0])
    220242        JMCEVAL_parseArray(Boolean, a3_a);
     243        JMCEVAL_parse(Integer, f_arg5);
    221244        JMCEVAL_parseArrayDims(1);
    222245        JMI_ARRAY_INIT_1(DYNA, jmi_string_t, jmi_string_array_t, a4_a, d[0], 1, d[0])
    223246        JMCEVAL_parseArray(String, a4_a);
     247        JMCEVAL_parse(Integer, f_arg7);
    224248        JMCEVAL_parseArrayDims(1);
    225249        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, a5_a, d[0], 1, d[0])
    226250        JMCEVAL_parseArray(Enum, a5_a);
     251        JMCEVAL_parse(Integer, f_arg9);
    227252        JMCEVAL_parseArrayDims(1);
    228253        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, b1_a, d[0], 1, d[0])
    229254        JMCEVAL_parseArray(Real, b1_a);
     255        JMCEVAL_parse(Integer, f_arg11);
    230256        JMCEVAL_parseArrayDims(1);
    231257        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, b2_a, d[0], 1, d[0])
    232258        JMCEVAL_parseArray(Integer, b2_a);
     259        JMCEVAL_parse(Integer, f_arg13);
    233260        JMCEVAL_parseArrayDims(1);
    234261        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, b3_a, d[0], 1, d[0])
    235262        JMCEVAL_parseArray(Boolean, b3_a);
     263        JMCEVAL_parse(Integer, f_arg15);
    236264        JMCEVAL_parseArrayDims(1);
    237265        JMI_ARRAY_INIT_1(DYNA, jmi_string_t, jmi_string_array_t, b4_a, d[0], 1, d[0])
    238266        JMCEVAL_parseArray(String, b4_a);
     267        JMCEVAL_parse(Integer, f_arg17);
    239268        JMCEVAL_parseArrayDims(1);
    240269        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, b5_a, d[0], 1, d[0])
    241270        JMCEVAL_parseArray(Enum, b5_a);
    242 
    243 ---
    244             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_7, jmi_array_size(a2_a, 0), 1, jmi_array_size(a2_a, 0))
    245             jmi_copy_matrix_to_int(a2_a, a2_a->var, tmp_7->var);
    246             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_8, jmi_array_size(a3_a, 0), 1, jmi_array_size(a3_a, 0))
    247             jmi_copy_matrix_to_int(a3_a, a3_a->var, tmp_8->var);
    248             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_9, jmi_array_size(a5_a, 0), 1, jmi_array_size(a5_a, 0))
    249             jmi_copy_matrix_to_int(a5_a, a5_a->var, tmp_9->var);
     271        JMCEVAL_parse(Integer, f_arg19);
     272
     273---
     274            tmp_1 = (int)f_arg1;
     275            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_2, jmi_array_size(a2_a, 0), 1, jmi_array_size(a2_a, 0))
     276            jmi_copy_matrix_to_int(a2_a, a2_a->var, tmp_2->var);
     277            tmp_3 = (int)f_arg3;
     278            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_4, jmi_array_size(a3_a, 0), 1, jmi_array_size(a3_a, 0))
     279            jmi_copy_matrix_to_int(a3_a, a3_a->var, tmp_4->var);
     280            tmp_5 = (int)f_arg5;
     281            tmp_6 = (int)f_arg7;
     282            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_7, jmi_array_size(a5_a, 0), 1, jmi_array_size(a5_a, 0))
     283            jmi_copy_matrix_to_int(a5_a, a5_a->var, tmp_7->var);
     284            tmp_8 = (int)f_arg9;
     285            tmp_9 = (int)f_arg11;
    250286            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_10, jmi_array_size(b2_a, 0), 1, jmi_array_size(b2_a, 0))
    251287            jmi_copy_matrix_to_int(b2_a, b2_a->var, tmp_10->var);
    252             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_11, jmi_array_size(b3_a, 0), 1, jmi_array_size(b3_a, 0))
    253             jmi_copy_matrix_to_int(b3_a, b3_a->var, tmp_11->var);
    254             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_12, jmi_array_size(b5_a, 0), 1, jmi_array_size(b5_a, 0))
    255             jmi_copy_matrix_to_int(b5_a, b5_a->var, tmp_12->var);
    256             f(a1_a->var, jmi_array_size(a1_a, 0), tmp_7->var, jmi_array_size(a2_a, 0), tmp_8->var, jmi_array_size(a3_a, 0), a4_a->var, jmi_array_size(a4_a, 0), tmp_9->var, jmi_array_size(a5_a, 0), b1_a->var, jmi_array_size(b1_a, 0), tmp_10->var, jmi_array_size(b2_a, 0), tmp_11->var, jmi_array_size(b3_a, 0), b4_a->var, jmi_array_size(b4_a, 0), tmp_12->var, jmi_array_size(b5_a, 0));
     288            tmp_11 = (int)f_arg13;
     289            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_12, jmi_array_size(b3_a, 0), 1, jmi_array_size(b3_a, 0))
     290            jmi_copy_matrix_to_int(b3_a, b3_a->var, tmp_12->var);
     291            tmp_13 = (int)f_arg15;
     292            tmp_14 = (int)f_arg17;
     293            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_15, jmi_array_size(b5_a, 0), 1, jmi_array_size(b5_a, 0))
     294            jmi_copy_matrix_to_int(b5_a, b5_a->var, tmp_15->var);
     295            tmp_16 = (int)f_arg19;
     296            f(a1_a->var, tmp_1, tmp_2->var, tmp_3, tmp_4->var, tmp_5, a4_a->var, tmp_6, tmp_7->var, tmp_8, b1_a->var, tmp_9, tmp_10->var, tmp_11, tmp_12->var, tmp_13, b4_a->var, tmp_14, tmp_15->var, tmp_16);
    257297            jmi_copy_matrix_from_int(b2_a, tmp_10->var, b2_a->var);
    258             jmi_copy_matrix_from_int(b3_a, tmp_11->var, b3_a->var);
    259             jmi_copy_matrix_from_int(b5_a, tmp_12->var, b5_a->var);
     298            jmi_copy_matrix_from_int(b3_a, tmp_12->var, b3_a->var);
     299            jmi_copy_matrix_from_int(b5_a, tmp_15->var, b5_a->var);
    260300            JMCEVAL_check(\"DONE\");
    261301            JMCEVAL_printArray(Real, b1_a);
     
    301341            input String[:] s;
    302342            output Obj2 o2;
    303             external "C" my_constructor2(x,y,o2,b,s)
     343            external "C" my_constructor2(x,y,o2,b,s,size(x,1),3.14)
    304344                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
    305345        end constructor;
     
    374414
    375415---
    376         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_13, -1, 1)
    377         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_14, -1, 1)
    378         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_15_arg0, -1, 1)
    379         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_15_arg1, -1, 1)
    380         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_15_arg2, -1, 1)
    381         JMI_ARR(DYNA, jmi_string_t, jmi_string_array_t, tmp_15_arg3, -1, 1)
    382 
    383 ---
    384         JMCEVAL_parseArrayDims(1);
    385         JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_15_arg0, d[0], 1, d[0])
    386         JMCEVAL_parseArray(Real, tmp_15_arg0);
    387         JMCEVAL_parseArrayDims(1);
    388         JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_15_arg1, d[0], 1, d[0])
    389         JMCEVAL_parseArray(Integer, tmp_15_arg1);
    390         JMCEVAL_parseArrayDims(1);
    391         JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_15_arg2, d[0], 1, d[0])
    392         JMCEVAL_parseArray(Boolean, tmp_15_arg2);
    393         JMCEVAL_parseArrayDims(1);
    394         JMI_ARRAY_INIT_1(DYNA, jmi_string_t, jmi_string_array_t, tmp_15_arg3, d[0], 1, d[0])
    395         JMCEVAL_parseArray(String, tmp_15_arg3);
    396         JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_13, jmi_array_size(tmp_15_arg1, 0), 1, jmi_array_size(tmp_15_arg1, 0))
    397         jmi_copy_matrix_to_int(tmp_15_arg1, tmp_15_arg1->var, tmp_13->var);
    398         JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_14, jmi_array_size(tmp_15_arg2, 0), 1, jmi_array_size(tmp_15_arg2, 0))
    399         jmi_copy_matrix_to_int(tmp_15_arg2, tmp_15_arg2->var, tmp_14->var);
    400         my_constructor2(tmp_15_arg0->var, tmp_13->var, &o2_v, tmp_14->var, tmp_15_arg3->var);
     416        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_2, -1, 1)
     417        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_3, -1, 1)
     418        JMI_DEF(INT_EXT, tmp_4)
     419        JMI_DEF(REA_EXT, tmp_5)
     420        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_6_arg0, -1, 1)
     421        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_6_arg1, -1, 1)
     422        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_6_arg3, -1, 1)
     423        JMI_ARR(DYNA, jmi_string_t, jmi_string_array_t, tmp_6_arg4, -1, 1)
     424        JMI_DEF(INT, tmp_6_arg5)
     425        JMI_DEF(REA, tmp_6_arg6)
     426
     427---
     428        JMCEVAL_parseArrayDims(1);
     429        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_6_arg0, d[0], 1, d[0])
     430        JMCEVAL_parseArray(Real, tmp_6_arg0);
     431        JMCEVAL_parseArrayDims(1);
     432        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_6_arg1, d[0], 1, d[0])
     433        JMCEVAL_parseArray(Integer, tmp_6_arg1);
     434        JMCEVAL_parseArrayDims(1);
     435        JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_6_arg3, d[0], 1, d[0])
     436        JMCEVAL_parseArray(Boolean, tmp_6_arg3);
     437        JMCEVAL_parseArrayDims(1);
     438        JMI_ARRAY_INIT_1(DYNA, jmi_string_t, jmi_string_array_t, tmp_6_arg4, d[0], 1, d[0])
     439        JMCEVAL_parseArray(String, tmp_6_arg4);
     440        JMCEVAL_parse(Integer, tmp_6_arg5);
     441        JMCEVAL_parse(Real, tmp_6_arg6);
     442        JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_2, jmi_array_size(tmp_6_arg1, 0), 1, jmi_array_size(tmp_6_arg1, 0))
     443        jmi_copy_matrix_to_int(tmp_6_arg1, tmp_6_arg1->var, tmp_2->var);
     444        JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_3, jmi_array_size(tmp_6_arg3, 0), 1, jmi_array_size(tmp_6_arg3, 0))
     445        jmi_copy_matrix_to_int(tmp_6_arg3, tmp_6_arg3->var, tmp_3->var);
     446        tmp_4 = (int)tmp_6_arg5;
     447        tmp_5 = (double)tmp_6_arg6;
     448        my_constructor2(tmp_6_arg0->var, tmp_2->var, &o2_v, tmp_3->var, tmp_6_arg4->var, tmp_4, tmp_5);
    401449
    402450---
     
    459507
    460508---
    461         JMI_DEF(EXO, tmp_16_arg0)
    462         JMI_DEF(INT_EXT, tmp_17)
    463         JMI_DEF(BOO_EXT, tmp_18)
    464         JMI_DEF(REA, tmp_19_arg0)
    465         JMI_DEF(INT, tmp_19_arg1)
    466         JMI_DEF(BOO, tmp_19_arg2)
    467         JMI_DEF(STR, tmp_19_arg3)
    468         JMI_ARR(DYNA, jmi_extobj_t, jmi_extobj_array_t, tmp_16_arg1, -1, 1)
    469         JMI_DEF(REA, tmp_20)
    470         JMI_DEF(REA, tmp_20_max)
    471         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_21, -1, 1)
    472         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_22, -1, 1)
    473         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_23_arg0, -1, 1)
    474         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_23_arg1, -1, 1)
    475         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_23_arg2, -1, 1)
    476         JMI_ARR(DYNA, jmi_string_t, jmi_string_array_t, tmp_23_arg3, -1, 1)
    477 
    478 ---
    479         JMCEVAL_parse(Real, tmp_19_arg0);
    480         JMCEVAL_parse(Integer, tmp_19_arg1);
    481         JMCEVAL_parse(Boolean, tmp_19_arg2);
    482         JMCEVAL_parse(String, tmp_19_arg3);
    483         tmp_17 = (int)tmp_19_arg1;
    484         tmp_18 = (int)tmp_19_arg2;
    485         tmp_16_arg0 = my_constructor1(tmp_19_arg0, tmp_17, tmp_18, tmp_19_arg3);
    486         JMCEVAL_parseArrayDims(1);
    487         JMI_ARRAY_INIT_1(DYNA, jmi_extobj_t, jmi_extobj_array_t, tmp_16_arg1, d[0], 1, d[0])
    488         tmp_20_max = d[0] + 1;
    489         for (tmp_20 = 1; tmp_20 < tmp_20_max; tmp_20++) {
     509        JMI_DEF(EXO, tmp_2_arg0)
     510        JMI_DEF(INT_EXT, tmp_4)
     511        JMI_DEF(BOO_EXT, tmp_5)
     512        JMI_DEF(REA, tmp_6_arg1)
     513        JMI_DEF(INT, tmp_6_arg2)
     514        JMI_DEF(BOO, tmp_6_arg3)
     515        JMI_DEF(STR, tmp_6_arg4)
     516        JMI_ARR(DYNA, jmi_extobj_t, jmi_extobj_array_t, tmp_2_arg1, -1, 1)
     517        JMI_DEF(REA, tmp_7)
     518        JMI_DEF(REA, tmp_7_max)
     519        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_9, -1, 1)
     520        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_10, -1, 1)
     521        JMI_DEF(INT_EXT, tmp_11)
     522        JMI_DEF(REA_EXT, tmp_12)
     523        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_13_arg0, -1, 1)
     524        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_13_arg1, -1, 1)
     525        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_13_arg3, -1, 1)
     526        JMI_ARR(DYNA, jmi_string_t, jmi_string_array_t, tmp_13_arg4, -1, 1)
     527        JMI_DEF(INT, tmp_13_arg5)
     528        JMI_DEF(REA, tmp_13_arg6)
     529
     530---
     531        JMCEVAL_parse(Real, tmp_6_arg1);
     532        JMCEVAL_parse(Integer, tmp_6_arg2);
     533        JMCEVAL_parse(Boolean, tmp_6_arg3);
     534        JMCEVAL_parse(String, tmp_6_arg4);
     535        tmp_4 = (int)tmp_6_arg2;
     536        tmp_5 = (int)tmp_6_arg3;
     537        tmp_2_arg0 = my_constructor1(tmp_6_arg1, tmp_4, tmp_5, tmp_6_arg4);
     538        JMCEVAL_parseArrayDims(1);
     539        JMI_ARRAY_INIT_1(DYNA, jmi_extobj_t, jmi_extobj_array_t, tmp_2_arg1, d[0], 1, d[0])
     540        tmp_7_max = d[0] + 1;
     541        for (tmp_7 = 1; tmp_7 < tmp_7_max; tmp_7++) {
    490542            JMCEVAL_parseArrayDims(1);
    491             JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_23_arg0, d[0], 1, d[0])
    492             JMCEVAL_parseArray(Real, tmp_23_arg0);
     543            JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_13_arg0, d[0], 1, d[0])
     544            JMCEVAL_parseArray(Real, tmp_13_arg0);
    493545            JMCEVAL_parseArrayDims(1);
    494             JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_23_arg1, d[0], 1, d[0])
    495             JMCEVAL_parseArray(Integer, tmp_23_arg1);
     546            JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_13_arg1, d[0], 1, d[0])
     547            JMCEVAL_parseArray(Integer, tmp_13_arg1);
    496548            JMCEVAL_parseArrayDims(1);
    497             JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_23_arg2, d[0], 1, d[0])
    498             JMCEVAL_parseArray(Boolean, tmp_23_arg2);
     549            JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_13_arg3, d[0], 1, d[0])
     550            JMCEVAL_parseArray(Boolean, tmp_13_arg3);
    499551            JMCEVAL_parseArrayDims(1);
    500             JMI_ARRAY_INIT_1(DYNA, jmi_string_t, jmi_string_array_t, tmp_23_arg3, d[0], 1, d[0])
    501             JMCEVAL_parseArray(String, tmp_23_arg3);
    502             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_21, jmi_array_size(tmp_23_arg1, 0), 1, jmi_array_size(tmp_23_arg1, 0))
    503             jmi_copy_matrix_to_int(tmp_23_arg1, tmp_23_arg1->var, tmp_21->var);
    504             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_22, jmi_array_size(tmp_23_arg2, 0), 1, jmi_array_size(tmp_23_arg2, 0))
    505             jmi_copy_matrix_to_int(tmp_23_arg2, tmp_23_arg2->var, tmp_22->var);
    506             my_constructor2(tmp_23_arg0->var, tmp_21->var, &jmi_array_ref_1(tmp_16_arg1, tmp_20), tmp_22->var, tmp_23_arg3->var);
     552            JMI_ARRAY_INIT_1(DYNA, jmi_string_t, jmi_string_array_t, tmp_13_arg4, d[0], 1, d[0])
     553            JMCEVAL_parseArray(String, tmp_13_arg4);
     554            JMCEVAL_parse(Integer, tmp_13_arg5);
     555            JMCEVAL_parse(Real, tmp_13_arg6);
     556            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_9, jmi_array_size(tmp_13_arg1, 0), 1, jmi_array_size(tmp_13_arg1, 0))
     557            jmi_copy_matrix_to_int(tmp_13_arg1, tmp_13_arg1->var, tmp_9->var);
     558            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_10, jmi_array_size(tmp_13_arg3, 0), 1, jmi_array_size(tmp_13_arg3, 0))
     559            jmi_copy_matrix_to_int(tmp_13_arg3, tmp_13_arg3->var, tmp_10->var);
     560            tmp_11 = (int)tmp_13_arg5;
     561            tmp_12 = (double)tmp_13_arg6;
     562            my_constructor2(tmp_13_arg0->var, tmp_9->var, &jmi_array_ref_1(tmp_2_arg1, tmp_7), tmp_10->var, tmp_13_arg4->var, tmp_11, tmp_12);
    507563        }
    508         my_constructor3(tmp_16_arg0, tmp_16_arg1->var, &o3_v);
    509 
    510 ---
    511         destructor(tmp_16_arg0);
    512         for (tmp_20 = 1; tmp_20 < tmp_20_max; tmp_20++) {
    513             destructor(jmi_array_ref_1(tmp_16_arg1, tmp_20));
     564        my_constructor3(tmp_2_arg0, tmp_2_arg1->var, &o3_v);
     565
     566---
     567        destructor(o1_v);
     568        for (tmp_7 = 1; tmp_7 < tmp_7_max; tmp_7++) {
     569            destructor(o2_v);
    514570        }
    515571
     
    673729
    674730my_constructor2
     731#include \"extObjects2b.h\"
    675732#include \"extObjects2.h\"
     733Include2b
    676734Include
     735extObjects2b
    677736extObjects2
     737Library2b
    678738Library
    679739
    680740destructor
    681741#include \"extObjects.h\"
     742#include \"extObjects2b.h\"
    682743#include \"extObjects2.h\"
    683 #include \"extObjects2b.h\"
    684744#include \"extObjects3.h\"
    685745#include \"extObjects3b.h\"
     
    687747Include2b
    688748extObjects
     749extObjects2b
    689750extObjects2
    690 extObjects2b
    691751extObjects3
    692752extObjects3b
     
    696756my_constructor3
    697757#include \"extObjects.h\"
     758#include \"extObjects2b.h\"
    698759#include \"extObjects2.h\"
    699 #include \"extObjects2b.h\"
     760#include \"extObjects3b.h\"
    700761#include \"extObjects3.h\"
    701762Include
    702763Include2b
    703764extObjects
     765extObjects2b
    704766extObjects2
    705 extObjects2b
     767extObjects3b
    706768extObjects3
    707769Library
     
    710772use3
    711773#include \"extObjects.h\"
     774#include \"extObjects2b.h\"
    712775#include \"extObjects2.h\"
    713 #include \"extObjects2b.h\"
     776#include \"extObjects3b.h\"
    714777#include \"extObjects3.h\"
    715 #include \"extObjects3b.h\"
    716778#include \"extObjects4.h\"
    717779Include
    718780Include2b
    719781extObjects
     782extObjects2b
    720783extObjects2
    721 extObjects2b
     784extObjects3b
    722785extObjects3
    723 extObjects3b
    724786extObjects4
    725787Library
     
    752814      Integer jpvt[size(A, 2)]=zeros(ncol);
    753815    external"FORTRAN 77" dgelsx(
    754               nrow,
     816              size(A, 1),
    755817              ncol,
    756818              nrhs,
     
    801863",
    802864            generatedCode="
    803 
    804 
    805 
    806 ---
    807 
    808 ---
    809 
    810 ---
    811 
    812 ---
    813         JMI_DEF(INT, nrow_v)
     865---
     866
     867---
     868
     869---
     870
     871---
     872        JMI_DEF(INT, dgelsx_arg0)
    814873        JMI_DEF(INT, ncol_v)
    815874        JMI_DEF(INT, nrhs_v)
    816875        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, Awork_a, -1, 2)
     876        JMI_DEF(INT, nrow_v)
    817877        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, X_a, -1, 2)
    818878        JMI_DEF(INT, nx_v)
     
    823883        JMI_DEF(INT, lwork_v)
    824884        JMI_DEF(INT, info_v)
    825         JMI_DEF(INT_EXT, tmp_24)
    826         JMI_DEF(INT_EXT, tmp_25)
    827         JMI_DEF(INT_EXT, tmp_26)
    828         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_27, -1, 2)
    829         JMI_DEF(INT_EXT, tmp_28)
    830         JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_29, -1, 2)
    831         JMI_DEF(INT_EXT, tmp_30)
    832         JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_31, -1, 1)
    833         JMI_DEF(INT_EXT, tmp_32)
    834         JMI_DEF(INT_EXT, tmp_33)
    835         JMI_DEF(INT_EXT, tmp_34)
     885        JMI_DEF(INT_EXT, tmp_1)
     886        JMI_DEF(INT_EXT, tmp_2)
     887        JMI_DEF(INT_EXT, tmp_3)
     888        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_4, -1, 2)
     889        JMI_DEF(INT_EXT, tmp_5)
     890        JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_6, -1, 2)
     891        JMI_DEF(INT_EXT, tmp_7)
     892        JMI_ARR(DYNA, jmi_int_t, jmi_int_array_t, tmp_8, -1, 1)
     893        JMI_DEF(INT_EXT, tmp_9)
     894        JMI_DEF(INT_EXT, tmp_10)
     895        JMI_DEF(INT_EXT, tmp_11)
    836896        extern void dgelsx_(int*, int*, int*, double*, int*, double*, int*, int*, double*, int*, double*, int*, int*);
    837897
    838898---
    839         JMCEVAL_parse(Integer, nrow_v);
     899        JMCEVAL_parse(Integer, dgelsx_arg0);
    840900        JMCEVAL_parse(Integer, ncol_v);
    841901        JMCEVAL_parse(Integer, nrhs_v);
     
    843903        JMI_ARRAY_INIT_2(DYNA, jmi_real_t, jmi_array_t, Awork_a, d[0]*d[1], 2, d[0], d[1])
    844904        JMCEVAL_parseArray(Real, Awork_a);
     905        JMCEVAL_parse(Integer, nrow_v);
    845906        JMCEVAL_parseArrayDims(2);
    846907        JMI_ARRAY_INIT_2(DYNA, jmi_real_t, jmi_array_t, X_a, d[0]*d[1], 2, d[0], d[1])
     
    859920
    860921---
    861             tmp_24 = (int)nrow_v;
    862             tmp_25 = (int)ncol_v;
    863             tmp_26 = (int)nrhs_v;
    864             JMI_ARRAY_INIT_2(DYNA, jmi_real_t, jmi_array_t, tmp_27, jmi_array_size(Awork_a, 0) * jmi_array_size(Awork_a, 1), 2, jmi_array_size(Awork_a, 0), jmi_array_size(Awork_a, 1))
    865             jmi_matrix_to_fortran_real(Awork_a, Awork_a->var, tmp_27->var);
    866             tmp_28 = (int)nrow_v;
    867             JMI_ARRAY_INIT_2(DYNA, jmi_real_t, jmi_array_t, tmp_29, jmi_array_size(X_a, 0) * jmi_array_size(X_a, 1), 2, jmi_array_size(X_a, 0), jmi_array_size(X_a, 1))
    868             jmi_matrix_to_fortran_real(X_a, X_a->var, tmp_29->var);
    869             tmp_30 = (int)nx_v;
    870             JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_31, jmi_array_size(jpvt_a, 0), 1, jmi_array_size(jpvt_a, 0))
    871             jmi_matrix_to_fortran_int(jpvt_a, jpvt_a->var, tmp_31->var);
    872             tmp_32 = (int)rank_v;
    873             tmp_33 = (int)lwork_v;
    874             tmp_34 = (int)info_v;
    875             dgelsx_(&tmp_24, &tmp_25, &tmp_26, tmp_27->var, &tmp_28, tmp_29->var, &tmp_30, tmp_31->var, &rcond_v, &tmp_32, work_a->var, &tmp_33, &tmp_34);
    876             jmi_matrix_from_fortran_real(X_a, tmp_29->var, X_a->var);
    877             rank_v = tmp_32;
    878             info_v = tmp_34;
     922            tmp_1 = (int)dgelsx_arg0;
     923            tmp_2 = (int)ncol_v;
     924            tmp_3 = (int)nrhs_v;
     925            JMI_ARRAY_INIT_2(DYNA, jmi_real_t, jmi_array_t, tmp_4, jmi_array_size(Awork_a, 0) * jmi_array_size(Awork_a, 1), 2, jmi_array_size(Awork_a, 0), jmi_array_size(Awork_a, 1))
     926            jmi_matrix_to_fortran_real(Awork_a, Awork_a->var, tmp_4->var);
     927            tmp_5 = (int)nrow_v;
     928            JMI_ARRAY_INIT_2(DYNA, jmi_real_t, jmi_array_t, tmp_6, jmi_array_size(X_a, 0) * jmi_array_size(X_a, 1), 2, jmi_array_size(X_a, 0), jmi_array_size(X_a, 1))
     929            jmi_matrix_to_fortran_real(X_a, X_a->var, tmp_6->var);
     930            tmp_7 = (int)nx_v;
     931            JMI_ARRAY_INIT_1(DYNA, jmi_int_t, jmi_int_array_t, tmp_8, jmi_array_size(jpvt_a, 0), 1, jmi_array_size(jpvt_a, 0))
     932            jmi_matrix_to_fortran_int(jpvt_a, jpvt_a->var, tmp_8->var);
     933            tmp_9 = (int)rank_v;
     934            tmp_10 = (int)lwork_v;
     935            tmp_11 = (int)info_v;
     936            dgelsx_(&tmp_1, &tmp_2, &tmp_3, tmp_4->var, &tmp_5, tmp_6->var, &tmp_7, tmp_8->var, &rcond_v, &tmp_9, work_a->var, &tmp_10, &tmp_11);
     937            jmi_matrix_from_fortran_real(X_a, tmp_6->var, X_a->var);
     938            rank_v = tmp_9;
     939            info_v = tmp_11;
    879940            JMCEVAL_check(\"DONE\");
    880941            JMCEVAL_printArray(Real, X_a);
     
    9781039---
    9791040        JMI_RECORD_STATIC(R_1_r, a_v)
    980         JMI_RECORD_STATIC(R2_0_r, tmp_35)
     1041        JMI_RECORD_STATIC(R2_0_r, tmp_1)
    9811042        JMI_RECORD_STATIC(R_1_r, b_v)
    982         JMI_RECORD_STATIC(R2_0_r, tmp_36)
    983         JMI_RECORD_STATIC(R_1_r_ext, tmp_37)
    984         JMI_RECORD_STATIC(R_1_r_ext, tmp_38)
     1043        JMI_RECORD_STATIC(R2_0_r, tmp_2)
     1044        JMI_RECORD_STATIC(R_1_r_ext, tmp_3)
     1045        JMI_RECORD_STATIC(R_1_r_ext, tmp_4)
    9851046        extern void f(R_1_r*, R_1_r**);
    9861047
     
    9911052        JMCEVAL_parse(String, a_v->a4);
    9921053        JMCEVAL_parse(Enum, a_v->a5);
    993         JMCEVAL_parse(Real, tmp_35->x);
    994         a_v->r2 = tmp_35;
     1054        JMCEVAL_parse(Real, tmp_1->x);
     1055        a_v->r2 = tmp_1;
    9951056        JMCEVAL_parse(Real, b_v->a1);
    9961057        JMCEVAL_parse(Integer, b_v->a2);
     
    9981059        JMCEVAL_parse(String, b_v->a4);
    9991060        JMCEVAL_parse(Enum, b_v->a5);
    1000         JMCEVAL_parse(Real, tmp_36->x);
    1001         b_v->r2 = tmp_36;
    1002 
    1003 ---
    1004             tmp_37->a1 = (double)a_v->a1;
    1005             tmp_37->a2 = (int)a_v->a2;
    1006             tmp_37->a3 = (int)a_v->a3;
    1007             JMI_ASG(STR, tmp_37->a4, a_v->a4)
    1008             tmp_37->a5 = (int)a_v->a5;
    1009             tmp_37->r2.x = (double)a_v->r2->x;
    1010             tmp_38->a1 = (double)b_v->a1;
    1011             tmp_38->a2 = (int)b_v->a2;
    1012             tmp_38->a3 = (int)b_v->a3;
    1013             JMI_ASG(STR, tmp_38->a4, b_v->a4)
    1014             tmp_38->a5 = (int)b_v->a5;
    1015             tmp_38->r2.x = (double)b_v->r2->x;
    1016             f(tmp_37, tmp_38);
    1017             b_v->a1 = tmp_38->a1;
    1018             b_v->a2 = tmp_38->a2;
    1019             b_v->a3 = tmp_38->a3;
    1020             JMI_ASG(STR, tmp_38->a4, b_v->a4)
    1021             b_v->a5 = tmp_38->a5;
    1022             b_v->r2->x = tmp_38->r2.x;
     1061        JMCEVAL_parse(Real, tmp_2->x);
     1062        b_v->r2 = tmp_2;
     1063
     1064---
     1065            tmp_3->a1 = (double)a_v->a1;
     1066            tmp_3->a2 = (int)a_v->a2;
     1067            tmp_3->a3 = (int)a_v->a3;
     1068            JMI_ASG(STR, tmp_3->a4, a_v->a4)
     1069            tmp_3->a5 = (int)a_v->a5;
     1070            tmp_3->r2.x = (double)a_v->r2->x;
     1071            tmp_4->a1 = (double)b_v->a1;
     1072            tmp_4->a2 = (int)b_v->a2;
     1073            tmp_4->a3 = (int)b_v->a3;
     1074            JMI_ASG(STR, tmp_4->a4, b_v->a4)
     1075            tmp_4->a5 = (int)b_v->a5;
     1076            tmp_4->r2.x = (double)b_v->r2->x;
     1077            f(tmp_3, tmp_4);
     1078            b_v->a1 = tmp_4->a1;
     1079            b_v->a2 = tmp_4->a2;
     1080            b_v->a3 = tmp_4->a3;
     1081            JMI_ASG(STR, tmp_4->a4, b_v->a4)
     1082            b_v->a5 = tmp_4->a5;
     1083            b_v->r2->x = tmp_4->r2.x;
    10231084            JMCEVAL_check(\"DONE\");
    10241085            JMCEVAL_print(Real, b_v->a1);
     
    11191180
    11201181---
    1121         JMI_RECORD_STATIC(R1_1_r_ext, tmp_39)
     1182        JMI_RECORD_STATIC(R1_1_r_ext, tmp_2)
    11221183        extern void* constructor(R1_1_r*);
    1123         JMI_RECORD_STATIC(R1_1_r, tmp_40_arg0)
    1124         JMI_RECORD_STATIC(R2_0_r, tmp_41)
    1125 
    1126 ---
    1127         JMCEVAL_parse(Real, tmp_41->x);
    1128         tmp_40_arg0->r2 = tmp_41;
    1129         tmp_39->r2.x = (double)tmp_40_arg0->r2->x;
    1130         eo_v = constructor(tmp_39);
     1184        JMI_RECORD_STATIC(R1_1_r, tmp_3_arg1)
     1185        JMI_RECORD_STATIC(R2_0_r, tmp_4)
     1186
     1187---
     1188        JMCEVAL_parse(Real, tmp_4->x);
     1189        tmp_3_arg1->r2 = tmp_4;
     1190        tmp_2->r2.x = (double)tmp_3_arg1->r2->x;
     1191        eo_v = constructor(tmp_2);
    11311192
    11321193---
  • trunk/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenExternalTests.mo

    r11492 r11541  
    23702370    tmp_9 = (int)n_v;
    23712371    tmp_10 = (int)info_v;
    2372     dgeev_(tmp_1, tmp_2, &tmp_3, tmp_4->var, &tmp_5, eigenReal_a->var, eigenImag_a->var, tmp_6->var, &tmp_7, tmp_8->var, &tmp_9, work_a->var, &jmi_array_size(work_a, 0), &tmp_10);
     2372    dgeev_(tmp_1, tmp_2, &tmp_9, tmp_4->var, &tmp_9, eigenReal_a->var, eigenImag_a->var, tmp_6->var, &tmp_7, tmp_8->var, &tmp_9, work_a->var, &jmi_array_size(work_a, 0), &tmp_10);
    23732373    jmi_matrix_from_fortran_real(eigenVectors_a, tmp_8->var, eigenVectors_a->var);
    23742374    info_v = tmp_10;
  • trunk/Compiler/ModelicaCompiler/src/jastadd/ModelicaCompiler.jrag

    r11425 r11541  
    12931293
    12941294    protected ExternCEvalGenerator createCGenerator(FExternalStmt ext) {
    1295         CodeGenContext cgc = new CodeGenContext();
     1295        CodeGenContext cgc = new CodeGenContext().createProxy();
    12961296        Map<String,String> tempMap = new HashMap<String,String>();
    12971297        return new ExternCEvalGenerator(ASTNode.prettyPrinter, '$', null, ext, cgc, tempMap);
  • trunk/Compiler/ModelicaFlatTree/src/jastadd/ConstantEvaluation/ExternalConstantEvaluation.jrag

    r11524 r11541  
    3939       
    4040        String name_C();
    41         void addVarToDeserialize(ArrayList<CommonVariableDecl> res);
     41        boolean isOutput();
    4242    }
    4343   
    4444    public interface CommonVariableDecl extends ExternalArgument {}
     45    FExp implements ExternalArgument;
     46   
     47    syn boolean FExp.isOutput() = false;
    4548   
    4649    class ModelicaCompiler {}
     
    7376            throw new ConstantEvaluationException(null, "Could not evaluate external function, invalid return type");
    7477        }
    75         Collection<CommonVariableDecl> outputs = varsToDeserialize();
     78        Collection<ExternalArgument> outputs = varsToDeserialize();
    7679        for (ExternalArgument arg : values.keySet()) {
    7780            if (!outputs.contains(arg)) {
     
    205208        }
    206209       
    207         for (CommonVariableDecl output : varsToDeserialize()) {
    208             evaluator.getValues().put(output, values.get(output));
     210        for (ExternalArgument output : varsToDeserialize()) {
     211            evaluator.getValues().put((CommonVariableDecl)output, values.get(output));
    209212        }
    210213       
  • trunk/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/evaluation/ExternalProcessMultiCache.java

    r11524 r11541  
    3535        public Iterable<K> functionArgsToSerialize();
    3636
    37         public Iterable<? extends K> varsToDeserialize();
     37        public Iterable<K> varsToDeserialize();
    3838    }
    3939
  • trunk/Python/src/tests_jmodelica/files/Modelica/ExtFunctionTests.mo

    r11417 r11541  
    995995end ExternalObjectTests3;
    996996
     997model MultiUse1
     998    function f1
     999        input Real x;
     1000        output Real y;
     1001        external "C" y = add(x,1) annotation(Library="addNumbers",
     1002                                           Include="#include \"addNumbers.h\"");
     1003    end f1;
     1004    function f2
     1005        input Real x;
     1006        output Real y;
     1007        external "C" y = add(x,2) annotation(Library="addNumbers",
     1008                                           Include="#include \"addNumbers.h\"");
     1009    end f2;
     1010   
     1011    Real y = f1(1) + f2(1);
     1012end MultiUse1;
     1013
    9971014end ExtFunctionTests;
  • trunk/Python/src/tests_jmodelica/general/test_extfunctions.py

    r11417 r11541  
    737737        fmu_name = compile_fmu(cpath, self.fpath)
    738738       
     739class TestMultiUse:
     740    @classmethod
     741    def setUpClass(self):
     742        self.fpath = path(path_to_mofiles, "ExtFunctionTests.mo")
     743   
     744    @testattr(stddist_full = True)
     745    def testMultiUse1(self):
     746        cpath = "ExtFunctionTests.MultiUse1"
     747        fmu_name = compile_fmu(cpath, self.fpath)
     748        model = load_fmu(fmu_name)
     749        res = model.simulate()
     750        nose.tools.assert_equals(res.final('y'), 5.0)
Note: See TracChangeset for help on using the changeset viewer.