﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
3363	Evaluation of parameter args of external objects	Rüdiger Franke	Rüdiger Franke	"External objects often require parameters, like a file name or a size.

OpenModelica evaluates such parameters at translation time. This appears not necessary. Can't for instance the count parameter of the following Test model be kept during translation?

{{{#!mo
package ExtObj
  model MyExternalObject
    extends ExternalObject;
    function constructor
      input Integer count;
      output MyExternalObject ptr;
      external ""C"" ptr = my_malloc(count);
      annotation(Include = ""static void *my_malloc(int count) {
        return malloc(count);}"");
    end constructor;

    function destructor
      input MyExternalObject ptr;
      external ""C"" free(ptr);
    end destructor;
  end MyExternalObject;

  model Test
    parameter Integer count = 10;
    MyExternalObject ptr = MyExternalObject(count);
  end Test;
end ExtObj;
}}}

The desired behavior can be achieved, but at the price of ugly code that hardly improves anything: 

{{{#!mo
package ExtObj2
  model MyExternalWorkaround
    extends ExternalObject;
    function constructor
      output MyExternalWorkaround pptr;
      external ""C"" pptr = my_malloc();
      annotation(Include = ""static void *my_malloc() {
        return calloc(1, sizeof(void*));}"");
    end constructor;

    function destructor
      input MyExternalObject pptr;
      external ""C"" my_free(pptr);
      annotation(Include = ""static void my_free(void *pptr) {
        if (*(void **)pptr != NULL) free(*(void **)pptr);
        free(pptr);}"");
    end destructor;
  end MyExternalWorkaround;

  function create
    input MyExternalWorkaround pptr;
    input Integer count;
    output Integer dummy;
    external ""C"" dummy = my_create(pptr, count);
    annotation(Include = ""static int my_create(void *pptr, int count) {
      if (*(void **)pptr == NULL) *(void **)pptr = malloc(count);
      return count;}"");
  end create;

  model TestWorkaround
    parameter Integer count = 10;
    MyExternalWorkaround pptr = MyExternalWorkaround();
    Integer dummyForEquationSorting = create(pptr, count);
  end TestWorkaround;
end ExtObj2;
}}}
"	defect	closed	high		Frontend	trunk	fixed		Adrian Pop
