pike.git / src / error.c

version» Context lines:

pike.git/src/error.c:8:   #include "error.h"   #include "interpret.h"   #include "stralloc.h"   #include "builtin_functions.h"   #include "array.h"   #include "object.h"   #include "main.h"   #include "builtin_functions.h"   #include "backend.h"    - RCSID("$Id: error.c,v 1.15 1998/04/06 04:15:52 hubbe Exp $"); + RCSID("$Id: error.c,v 1.16 1998/04/10 15:20:48 grubba Exp $");      #undef ATTRIBUTE   #define ATTRIBUTE(X)      JMP_BUF *recoveries=0;      JMP_BUF *init_recovery(JMP_BUF *r)   {    r->fp=fp;    r->sp=sp-evaluator_stack;
pike.git/src/error.c:72:       while(recoveries->onerror)    {    (*recoveries->onerror->func)(recoveries->onerror->arg);    recoveries->onerror=recoveries->onerror->previous;    }       longjmp(recoveries->recovery,1);   }    + void push_error(char *description) + { +  push_text(description); +  f_backtrace(0); +  f_aggregate(2); + } +    struct svalue throw_value = { T_INT };   int throw_severity;    -  + static char *in_error; + /* FIXME: NOTE: This function uses a static buffer. +  * Check sizes of arguments passed! +  */   void va_error(char *fmt, va_list args) ATTRIBUTE((noreturn))   {    char buf[2000]; -  static char *in_error; +     if(in_error)    {    char *tmp=in_error;    in_error=0;    fatal("Recursive error() calls, original error: %s",tmp);    }       in_error=buf;       VSPRINTF(buf, fmt, args);
pike.git/src/error.c:103:    dump_backlog();   #endif       fprintf(stderr,"No error recovery context!\n%s",buf);    exit(99);    }       if((long)strlen(buf) >= (long)sizeof(buf))    fatal("Buffer overflow in error()\n");    -  push_string(make_shared_string(buf)); +  push_error(buf); +  free_svalue(& throw_value); +  throw_value = *--sp; +  throw_severity=THROW_ERROR; +  +  in_error=0; +  pike_throw(); /* Hope someone is catching, or we will be out of balls. */ + } +  + void new_error(char *name, char *text, struct svalue *oldsp, INT32 args, +  char *file, int line) ATTRIBUTE((noreturn)) + { +  int i; +  +  if(in_error) +  { +  char *tmp=in_error; +  in_error=0; +  fatal("Recursive error() calls, original error: %s",tmp); +  } +  +  in_error=text; +  +  if(!recoveries) +  { + #ifdef DEBUG +  dump_backlog(); + #endif +  +  fprintf(stderr,"No error recovery context!\n%s():%s",name,text); +  exit(99); +  } +  +  push_text(text); +     f_backtrace(0); -  +  +  if (file) { +  push_text(file); +  push_int(line); +  } else { +  push_int(0); +  push_int(0); +  } +  push_text(name); +  +  for (i=-args; i; i++) { +  push_svalue(oldsp + i); +  } +  +  f_aggregate(args + 3); +  f_aggregate(1); +  +  f_add(2); +     f_aggregate(2); -  +     free_svalue(& throw_value);    throw_value = *--sp;    throw_severity=THROW_ERROR;       in_error=0;    pike_throw(); /* Hope someone is catching, or we will be out of balls. */   }      void exit_on_error(void *msg)   {
pike.git/src/error.c:161:    abort();    }    in_fatal = 1;   #ifdef DEBUG    dump_backlog();   #endif       (void)VFPRINTF(stderr, fmt, args);       d_flag=t_flag=0; -  push_text("Attempting to dump backlog (may fail).\n"); -  f_backtrace(0); -  f_aggregate(2); +  push_error("Attempting to dump backlog (may fail).\n");    APPLY_MASTER("describe_backtrace",1);    if(sp[-1].type==T_STRING)    write_to_stderr(sp[-1].u.string->str, sp[-1].u.string->len);       fflush(stderr);    abort();   }