Changes: Christian Thalinger
- $Id: stacktrace.c 3500 2005-10-26 20:22:30Z twisti $
+ $Id: stacktrace.c 3570 2005-11-04 16:58:36Z motse $
*/
methodinfo *method;
} lineNumberTableEntryInlineBegin;
-
+#ifndef ENABLE_JVMTI
typedef bool(*CacaoStackTraceCollector)(void **, stackTraceBuffer*);
+#endif
#define BLOCK_INITIALSIZE 40
#define BLOCK_SIZEINCREMENT 40
/* 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
XXX
*******************************************************************************/
-
+#ifdef ENABLE_JVMTI
+bool cacao_stacktrace_fillInStackTrace(void **target,
+ CacaoStackTraceCollector coll,
+ threadobject* thread)
+#else
static bool cacao_stacktrace_fillInStackTrace(void **target,
- CacaoStackTraceCollector coll)
+ CacaoStackTraceCollector coll)
+#endif
+
{
stacktraceelement primaryBlock[BLOCK_INITIALSIZE*sizeof(stacktraceelement)];
stackTraceBuffer buffer;
/* the first element in the stackframe chain must always be a native */
/* stackframeinfo (VMThrowable.fillInStackTrace is a native function) */
+#ifdef ENABLE_JVMTI
+ if (thread == NULL)
+ sfi = *STACKFRAMEINFO; /* invocation from Throwable */
+ else
+ sfi = thread->info._stackframeinfo; /* invocation from JVMTI */
+#else
sfi = *STACKFRAMEINFO;
+#endif
if (!sfi) {
*target = NULL;
#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 */
XXX
*******************************************************************************/
-
+#ifdef ENABLE_JVMTI
+bool stackTraceCollector(void **target, stackTraceBuffer *buffer)
+#else
static bool stackTraceCollector(void **target, stackTraceBuffer *buffer)
+#endif
{
stackTraceBuffer *dest;
bool cacao_stacktrace_NormalTrace(void **target)
{
+#ifdef ENABLE_JVMTI
+ return cacao_stacktrace_fillInStackTrace(target, &stackTraceCollector, NULL);
+#else
return cacao_stacktrace_fillInStackTrace(target, &stackTraceCollector);
+#endif
+
}
{
java_objectarray *array = NULL;
+#ifdef ENABLE_JVMTI
+ if (!cacao_stacktrace_fillInStackTrace((void **) &array,
+ &classContextCollector, NULL))
+#else
if (!cacao_stacktrace_fillInStackTrace((void **) &array,
&classContextCollector))
+#endif
return NULL;
return array;
{
java_objectheader *header = NULL;
+
+#ifdef ENABLE_JVMTI
+ if (!cacao_stacktrace_fillInStackTrace((void**)&header,
+ &stacktrace_classLoaderCollector,
+ NULL))
+#else
if (!cacao_stacktrace_fillInStackTrace((void**)&header,
&stacktrace_classLoaderCollector))
+#endif
return NULL;
return header;
{
java_objectarray *result = NULL;
+#ifdef ENABLE_JVMTI
+ if (!cacao_stacktrace_fillInStackTrace((void **) &result,
+ &getStackCollector,NULL))
+#else
if (!cacao_stacktrace_fillInStackTrace((void **) &result,
&getStackCollector))
+#endif
return NULL;
return result;
/* print stacktrace */
- if (buffer)
+ if (buffer) {
stacktrace_print_trace(buffer);
+
+ } else {
+ puts("\t<<No stacktrace available>>");
+ fflush(stdout);
+ }
}
utf_display(m->descriptor);
if (m->flags & ACC_NATIVE) {
- printf("(Native Method)\n");
+ puts("(Native Method)");
} else {
printf("(");