[pure-lang-svn] SF.net SVN: pure-lang:[722] pure/trunk/printer.cc
Status: Beta
Brought to you by:
agraef
|
From: <ag...@us...> - 2008-09-05 22:58:05
|
Revision: 722
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=722&view=rev
Author: agraef
Date: 2008-09-05 22:58:16 +0000 (Fri, 05 Sep 2008)
Log Message:
-----------
Bugfixes.
Modified Paths:
--------------
pure/trunk/printer.cc
Modified: pure/trunk/printer.cc
===================================================================
--- pure/trunk/printer.cc 2008-09-05 22:57:51 UTC (rev 721)
+++ pure/trunk/printer.cc 2008-09-05 22:58:16 UTC (rev 722)
@@ -624,22 +624,42 @@
static inline bool pstr(ostream& os, pure_expr *x)
{
+ static bool recursive = false;
+ if (recursive) return false;
interpreter& interp = *interpreter::g_interp;
int32_t f = interp.symtab.__show__sym;
if (f > 0 && interp.globenv.find(f) != interp.globenv.end()) {
assert(x->refc > 0);
- pure_expr *y = pure_app(pure_symbol(f), x);
- assert(y);
- if (y->tag == EXPR::STR) {
- char *s = fromutf8(y->data.s);
- pure_freenew(y);
- if (s) {
- os << s; free(s);
- return true;
+ pure_exception ex; ex.e = 0; ex.sz = interp.sstk_sz;
+ interp.estk.push_front(ex);
+ if (setjmp(interp.estk.front().jmp)) {
+ // caught an exception
+ size_t sz = interp.estk.front().sz;
+ pure_expr* e = interp.estk.front().e;
+ interp.estk.pop_front();
+ if (e) pure_freenew(e);
+ for (size_t i = interp.sstk_sz; i-- > sz; )
+ if (interp.sstk[i] && interp.sstk[i]->refc > 0)
+ pure_free(interp.sstk[i]);
+ interp.sstk_sz = sz;
+ return false;
+ } else {
+ recursive = true;
+ pure_expr *y = pure_app(pure_symbol(f), x);
+ interp.estk.pop_front();
+ recursive = false;
+ assert(y);
+ if (y->tag == EXPR::STR) {
+ char *s = fromutf8(y->data.s);
+ pure_freenew(y);
+ if (s) {
+ os << s; free(s);
+ return true;
+ } else
+ return false;
} else
return false;
- } else
- return false;
+ }
} else
return false;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|