[pure-lang-svn] SF.net SVN: pure-lang: [345] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-06-30 20:00:46
|
Revision: 345 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=345&view=rev Author: agraef Date: 2008-06-30 13:00:55 -0700 (Mon, 30 Jun 2008) Log Message: ----------- Fix a segfault in external wrapper routines. Modified Paths: -------------- pure/trunk/ChangeLog pure/trunk/interpreter.cc Modified: pure/trunk/ChangeLog =================================================================== --- pure/trunk/ChangeLog 2008-06-30 19:08:19 UTC (rev 344) +++ pure/trunk/ChangeLog 2008-06-30 20:00:55 UTC (rev 345) @@ -1,3 +1,9 @@ +2008-06-30 Albert Graef <Dr....@t-...> + + * interpreter.cc (declare_extern): Fix a segfault in external + wrapper routines, due to the shadow stack not being popped when + an external fails and thus the default rule gets used. + 2008-06-29 Albert Graef <Dr....@t-...> * etc/pure.xml: Improved syntax highlighting for Kate. Fixed up Modified: pure/trunk/interpreter.cc =================================================================== --- pure/trunk/interpreter.cc 2008-06-30 19:08:19 UTC (rev 344) +++ pure/trunk/interpreter.cc 2008-06-30 20:00:55 UTC (rev 345) @@ -2903,10 +2903,19 @@ vector<Value*> myargs(2); for (size_t i = 0; i < n; ++i) { myargs[0] = b.CreateCall(module->getFunction("pure_new"), defaultv); - myargs[1] = args[i]; + myargs[1] = b.CreateCall(module->getFunction("pure_new"), args[i]); defaultv = b.CreateCall(module->getFunction("pure_apply"), myargs.begin(), myargs.end()); } + if (n > 0) { + vector<Value*> freeargs(3); + freeargs[0] = defaultv; + freeargs[1] = UInt(n); + freeargs[2] = Zero; + b.CreateCall(module->getFunction("pure_pop_args"), + freeargs.begin(), freeargs.end()); + b.CreateCall(module->getFunction("pure_unref"), defaultv); + } b.CreateRet(defaultv); verifyFunction(*f); if (FPM) FPM->run(*f); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |