static PyObject * wadobject_getslice(wadobject *self, int start, int end) { int i; WadFrame *f; f = self->frame; for (i = 0; i < start; i++) { f = f->next; } return new_wadobject(f,(end-start)); }
static PyObject * wadobject_getitem(wadobject *self, int n) { int i; WadFrame *f; if (n < 0) { n = self->count + n; } if ((n < 0) || (n >= self->count)) { PyErr_SetString(PyExc_IndexError,"Stack frame out of range"); return NULL; } f = self->frame; for (i = 0; i <n; i++) { f = f->next; } return new_wadobject(f,1); }
/* Handler function */ static void handler(int signo, WadFrame *frame, char *ret) { static char message[65536]; static char temp[1024]; int len = 0; PyObject *type; char *name; WadFrame *f; WadFrame *fline = 0; char *srcstr = 0; /* printf("python handler.\n"); */ if (!ret) { wad_default_callback(signo, frame, ret); return; } strcpy(message,"[ C stack trace ]\n\n"); switch(signo) { case SIGSEGV: type = segfault_exc; break; case SIGBUS: type = buserror_exc; break; case SIGABRT: type = abort_exc; break; case SIGFPE: type = PyExc_FloatingPointError; break; case SIGILL: type = illegal_exc; break; default: type = PyExc_RuntimeError; break; } #ifdef OLD f = frame; /* Find the last exception frame */ while (!f->last) { f= f->next; } /* Now work backwards */ f = f->prev; while (f) { strcat(message, f->debug_str); if (f->debug_srcstr) srcstr = f->debug_srcstr; f = f->prev; } if (srcstr) { strcat(message,"\n"); strcat(message, srcstr); strcat(message,"\n"); } #endif if (wad_heap_overflow) { write(2, "WAD: Heap overflow detected.\n", 30); wad_default_callback(signo, frame, ret); } /* Note: if the heap is blown, there is a very good chance that this function will not succeed and we'll dump core. However, the check above should dump a stack trace to stderr just in case we don't make it back. */ #ifdef OLD PyErr_SetString(type, message); #endif PyErr_SetObject(type, new_wadobject(frame,0)); }