pike.git/src/error.c:1:
/*
|| This file is part of Pike. For copyright information see COPYRIGHT.
|| Pike is distributed under GPL, LGPL and MPL. See the file COPYING
|| for more information.
- || $Id: error.c,v 1.143 2004/12/22 18:46:15 grubba Exp $
+ || $Id: error.c,v 1.144 2006/02/27 12:07:10 mast Exp $
*/
#define NO_PIKE_SHORTHAND
#include "global.h"
#include "svalue.h"
#include "pike_macros.h"
#include "pike_error.h"
#include "interpret.h"
#include "stralloc.h"
#include "builtin_functions.h"
pike.git/src/error.c:56:
/*
* Recoveries handling.
*/
#ifdef PIKE_DEBUG
PMOD_EXPORT void check_recovery_context(void)
{
char foo;
#define TESTILITEST ((((char *)Pike_interpreter.recoveries)-((char *)&foo))*STACK_DIRECTION)
- if(Pike_interpreter.recoveries && TESTILITEST > 0) {
+ if(Pike_interpreter.recoveries &&
+ Pike_interpreter.recoveries->on_stack &&
+ TESTILITEST > 0) {
fprintf(stderr, "Recoveries is out biking (Pike_interpreter.recoveries=%p, Pike_sp=%p, %ld)!\n",
Pike_interpreter.recoveries, &foo,
DO_NOT_WARN((long)TESTILITEST));
fprintf(stderr, "Last recovery was added at %s\n",
Pike_interpreter.recoveries->file);
Pike_fatal("Recoveries is out biking (Pike_interpreter.recoveries=%p, Pike_sp=%p, %ld)!\n",
Pike_interpreter.recoveries, &foo,
DO_NOT_WARN((long)TESTILITEST));
}
/* Add more stuff here when required */
}
#endif
PMOD_EXPORT void pike_gdb_breakpoint(INT32 args)
{
pop_n_elems(args);
}
- PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_LINE_ARGS)
+ PMOD_EXPORT JMP_BUF *init_recovery(JMP_BUF *r, size_t stack_pop_levels DEBUG_INIT_REC_ARGS)
{
check_recovery_context();
#ifdef PIKE_DEBUG
r->file=location;
OED_FPRINTF((stderr, "init_recovery(%p) %s\n", r, location));
-
+ r->on_stack = on_stack;
#endif
r->frame_pointer=Pike_fp;
r->stack_pointer=Pike_sp - stack_pop_levels - Pike_interpreter.evaluator_stack;
r->mark_sp=Pike_mark_sp - Pike_interpreter.mark_stack;
r->previous=Pike_interpreter.recoveries;
r->onerror=0;
r->severity=THROW_ERROR;
Pike_interpreter.recoveries=r;
check_recovery_context();
return r;
pike.git/src/error.c:108:
#endif
while(Pike_interpreter.recoveries && throw_severity > Pike_interpreter.recoveries->severity)
{
while(Pike_interpreter.recoveries->onerror)
{
(*Pike_interpreter.recoveries->onerror->func)(Pike_interpreter.recoveries->onerror->arg);
Pike_interpreter.recoveries->onerror=Pike_interpreter.recoveries->onerror->previous;
}
+ if (Pike_interpreter.catch_ctx &&
+ &Pike_interpreter.catch_ctx->recovery == Pike_interpreter.recoveries) {
+ struct catch_context *cc = Pike_interpreter.catch_ctx;
+ Pike_interpreter.catch_ctx = cc->prev;
+ really_free_catch_context (cc);
+ }
+
Pike_interpreter.recoveries=Pike_interpreter.recoveries->previous;
}
if(!Pike_interpreter.recoveries)
Pike_fatal("No error recovery context.\n");
#ifdef PIKE_DEBUG
if(Pike_sp - Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
Pike_fatal("Stack error in error.\n");
#endif
pike.git/src/error.c:151: Inside #if defined(DEBUG_MALLOC) && defined(PIKE_DEBUG)
debug_malloc_update_location(throw_value.u.refs,
Pike_interpreter.recoveries->file);
debug_malloc_touch(throw_value.u.refs);
}
#endif
#ifdef TRACE_UNFINISHED_TYPE_FIELDS
accept_unfinished_type_fields--;
#endif
+ if (Pike_interpreter.catch_ctx &&
+ &Pike_interpreter.catch_ctx->recovery == Pike_interpreter.recoveries) {
+ /* This is a phony recovery made in F_CATCH that hasn't been passed
+ * to LOW_SETJMP. The real jmpbuf is in catching_eval_instruction. */
+ #ifdef PIKE_DEBUG
+ if (!Pike_interpreter.catching_eval_jmpbuf)
+ Pike_fatal ("Got phony F_CATCH recovery but no catching_eval_jmpbuf.\n");
+ #endif
+ LOW_LONGJMP (*Pike_interpreter.catching_eval_jmpbuf, 1);
+ }
+ else
LOW_LONGJMP(Pike_interpreter.recoveries->recovery,1);
}
PMOD_EXPORT void push_error(const char *description)
{
push_text(description);
f_backtrace(0);
f_aggregate(2);
}