Changes: Christian Thalinger
- $Id: stacktrace.c 3244 2005-09-21 14:58:47Z twisti $
+ $Id: stacktrace.c 3540 2005-11-03 20:33:20Z twisti $
*/
/* global variables ***********************************************************/
-#if defined(USE_THREADS)
-#define STACKFRAMEINFO (stackframeinfo **) (&THREADINFO->_stackframeinfo)
-#else
-THREADSPECIFIC stackframeinfo *_no_threads_stackframeinfo = NULL;
-
-#define STACKFRAMEINFO (&_no_threads_stackframeinfo)
+#if !defined(USE_THREADS)
+stackframeinfo *_no_threads_stackframeinfo = NULL;
#endif
}
-/* stacktrace_inline_negativearraysizeexception ********************************
-
- Creates an NegativeArraySizeException for inline stub.
-
-*******************************************************************************/
-
-java_objectheader *stacktrace_inline_negativearraysizeexception(u1 *pv, u1 *sp,
- functionptr ra,
- functionptr xpc)
-{
- stackframeinfo sfi;
- java_objectheader *o;
-
- /* create stackframeinfo */
-
- stacktrace_create_inline_stackframeinfo(&sfi, pv, sp, ra, xpc);
-
- /* create exception */
-
- o = new_negativearraysizeexception();
-
- /* remove stackframeinfo */
-
- stacktrace_remove_stackframeinfo(&sfi);
-
- return o;
-}
-
-
/* stacktrace_inline_nullpointerexception **************************************
Creates an NullPointerException for inline stub.
#if PRINTMETHODS
printf("\n\nfillInStackTrace start:\n");
+ fflush(stdout);
#endif
/* loop while we have a method pointer (asm_calljavafunction has NULL) or */
utf_display(m->name);
utf_display(m->descriptor);
printf(": native stub\n");
+ fflush(stdout);
#endif
/* this is an native stub stackframe info, so we can get the */
/* parent pv from the return address (ICMD_INVOKE*) */
#if PRINTMETHODS
printf("NULL: inline stub\n");
+ fflush(stdout);
#endif
/* get methodinfo from current Java method */
utf_display(m->name);
utf_display(m->descriptor);
printf(": inline stub parent\n");
+ fflush(stdout);
#endif
#if defined(ENABLE_INTRP)
}
#endif
}
+#if PRINTMETHODS
+ else {
+ printf("asm_calljavafunction\n");
+ fflush(stdout);
+ }
+#endif
}
/* get previous stackframeinfo in the chain */
}
-static bool callingMethodCollector(void **target, stackTraceBuffer *buffer)
-{
- if (buffer->full > 2)
- *target = buffer->start[2].method;
- else
- *target = NULL;
-
- return true;
-}
-
-
-methodinfo *cacao_callingMethod(void)
-{
- methodinfo *method;
-
- if (!cacao_stacktrace_fillInStackTrace((void **) &method,
- &callingMethodCollector))
- return NULL;
-
- return method;
-}
-
-
static bool getStackCollector(void **target, stackTraceBuffer *buffer)
{
java_objectarray *oa;
void stacktrace_dump_trace(void)
{
stackTraceBuffer *buffer;
- stacktraceelement *element;
- methodinfo *m;
- s4 i;
#if 0
/* get thread stackframeinfo */
/* print stacktrace */
if (buffer) {
- element = buffer->start;
+ stacktrace_print_trace(buffer);
- for (i = 0; i < buffer->size; i++, element++) {
- m = element->method;
+ } else {
+ puts("\t<<No stacktrace available>>");
+ fflush(stdout);
+ }
+}
- printf("\tat ");
- utf_display_classname(m->class->name);
- printf(".");
- utf_display(m->name);
- utf_display(m->descriptor);
- if (m->flags & ACC_NATIVE) {
- printf("(Native Method)\n");
+/* stacktrace_print_trace ******************************************************
- } else {
- printf("(");
- utf_display(m->class->sourcefile);
- printf(":%d)\n", (u4) element->linenumber);
- }
+ Print the stacktrace of a given stackTraceBuffer with CACAO intern
+ methods (no Java help). This method is used by
+ stacktrace_dump_trace and builtin_trace_exception.
+
+*******************************************************************************/
+
+void stacktrace_print_trace(stackTraceBuffer *stb)
+{
+ stacktraceelement *ste;
+ methodinfo *m;
+ s4 i;
+
+ ste = stb->start;
+
+ for (i = 0; i < stb->size; i++, ste++) {
+ m = ste->method;
+
+ printf("\tat ");
+ utf_display_classname(m->class->name);
+ printf(".");
+ utf_display(m->name);
+ utf_display(m->descriptor);
+
+ if (m->flags & ACC_NATIVE) {
+ puts("(Native Method)");
+
+ } else {
+ printf("(");
+ utf_display(m->class->sourcefile);
+ printf(":%d)\n", (u4) ste->linenumber);
}
}
- /* flush stdout */
+ /* just to be sure */
fflush(stdout);
}