From 640ba8c827df8ac791ffa003fd3f4479e8db68f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Sj=C3=B6lund?= Date: Fri, 6 May 2011 10:39:17 +0000 Subject: [PATCH] - Create external objects one by one and free the stack after each object has been initialized git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@8847 f25d12d1-65f4-0310-ae8a-bbce733d8d8e --- Compiler/susan_codegen/SimCode/SimCodeC.tpl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Compiler/susan_codegen/SimCode/SimCodeC.tpl b/Compiler/susan_codegen/SimCode/SimCodeC.tpl index 570fb64beba..70c525cc7d5 100644 --- a/Compiler/susan_codegen/SimCode/SimCodeC.tpl +++ b/Compiler/susan_codegen/SimCode/SimCodeC.tpl @@ -855,15 +855,20 @@ match extObjInfo case EXTOBJINFO(__) then let &funDecls = buffer "" /*BUFD*/ let &varDecls = buffer "" /*BUFD*/ - let &preExp = buffer "" /*BUFD*/ let ctorCalls = (constructors |> (var, fnName, args) => + let &preExp = buffer "" /*BUFD*/ let argsStr = (args |> arg => daeExternalCExp(arg, contextOther, &preExp /*BUFC*/, &varDecls /*BUFD*/) ;separator=", ") let typesStr = (args |> arg => extType(typeof(arg),true,false) ; separator=", ") let &funDecls += 'extern void* <%fnName%>(<%typesStr%>);<%\n%>' + /* Restore the memory state after each object has been initialized. Then we can + * initalize a really large number of external objects that play with strings :) + */ << + <%preExp%> <%cref(var)%> = <%fnName%>(<%argsStr%>); + restore_memory_state(mem_state); >> ;separator="\n") << @@ -873,7 +878,8 @@ case EXTOBJINFO(__) then } void callExternalObjectConstructors(DATA* localData) { <%varDecls%> - <%preExp%> + state mem_state; + mem_state = get_memory_state(); <%ctorCalls%> <%aliases |> (var1, var2) => '<%cref(var1)%> = <%cref(var2)%>;' ;separator="\n"%> }