(stacktrace_print_trace): Does not use stacktracecontainer anymore.
* src/vm/jit/stacktrace.h (stacktracecontainer): Removed.
(stacktrace_fillInStackTrace): Adapted prototype to above change.
* src/native/vm/cldc1.1/java_lang_Throwable.c: Adapted to above changes.
* src/native/vm/gnu/java_lang_VMThrowable.c: Likewise.
* src/native/vm/sun/jvm.c: Likewise.
*/
JNIEXPORT void JNICALL Java_java_lang_Throwable_fillInStackTrace(JNIEnv *env, java_lang_Throwable *this)
{
- stacktracecontainer *stc;
+ java_handle_bytearray_t *ba;
- stc = stacktrace_fillInStackTrace();
+ ba = stacktrace_fillInStackTrace();
- if (stc == NULL)
+ if (ba == NULL)
return;
- this->backtrace = (java_lang_Object *) stc;
+ this->backtrace = (java_lang_Object *) ba;
}
*/
JNIEXPORT java_lang_VMThrowable* JNICALL Java_java_lang_VMThrowable_fillInStackTrace(JNIEnv *env, jclass clazz, java_lang_Throwable *t)
{
- java_lang_VMThrowable *o;
- stacktracecontainer *stc;
+ java_lang_VMThrowable *o;
+ java_handle_bytearray_t *ba;
o = (java_lang_VMThrowable *)
native_new_and_init(class_java_lang_VMThrowable);
if (o == NULL)
return NULL;
- stc = stacktrace_fillInStackTrace();
+ ba = stacktrace_fillInStackTrace();
- if (stc == NULL)
+ if (ba == NULL)
return NULL;
- LLNI_field_set_ref(o, vmData, (gnu_classpath_Pointer *) stc);
+ LLNI_field_set_ref(o, vmData, (gnu_classpath_Pointer *) ba);
return o;
}
*/
JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_VMThrowable_getStackTrace(JNIEnv *env, java_lang_VMThrowable *this, java_lang_Throwable *t)
{
- stacktracecontainer *stc;
+ java_handle_bytearray_t *ba;
stacktracebuffer *stb;
stacktrace_entry *ste;
stacktrace_entry *tmpste;
/* get the stacktrace buffer from the VMThrowable object */
- /*XXX stc = (stacktracecontainer *) this->vmData;*/
- LLNI_field_get_ref(this, vmData, stc);
- stb = &(stc->stb);
+ LLNI_field_get_ref(this, vmData, ba);
+ stb = (stacktracebuffer *) LLNI_array_data(ba);
/* get the class of the Throwable object */
void JVM_FillInStackTrace(JNIEnv *env, jobject receiver)
{
- java_lang_Throwable *o;
- stacktracecontainer *stc;
+ java_lang_Throwable *o;
+ java_handle_bytearray_t *ba;
#if PRINTJVM
log_println("JVM_FillInStackTrace: receiver=%p", receiver);
o = (java_lang_Throwable *) receiver;
- stc = stacktrace_fillInStackTrace();
+ ba = stacktrace_fillInStackTrace();
- if (stc == NULL)
+ if (ba == NULL)
return;
- o->backtrace = (java_lang_Object *) stc;
+ o->backtrace = (java_lang_Object *) ba;
}
jint JVM_GetStackTraceDepth(JNIEnv *env, jobject throwable)
{
- java_lang_Throwable *o;
- stacktracecontainer *stc;
- stacktracebuffer *stb;
+ java_lang_Throwable *o;
+ java_handle_bytearray_t *ba;
+ stacktracebuffer *stb;
#if PRINTJVM
log_println("JVM_GetStackTraceDepth: throwable=%p", throwable);
#endif
o = (java_lang_Throwable *) throwable;
- stc = (stacktracecontainer *) o->backtrace;
- stb = &(stc->stb);
+ ba = (java_handle_bytearray_t *) o->backtrace;
+ stb = (stacktracebuffer *) LLNI_array_data(ba);
return stb->used;
}
jobject JVM_GetStackTraceElement(JNIEnv *env, jobject throwable, jint index)
{
java_lang_Throwable *t;
- stacktracecontainer *stc;
- stacktracebuffer *stb;
- stacktrace_entry *ste;
+ java_handle_bytearray_t *ba;
+ stacktracebuffer *stb;
+ stacktrace_entry *ste;
java_lang_StackTraceElement *o;
java_lang_String *declaringclass;
java_lang_String *filename;
#endif
t = (java_lang_Throwable *) throwable;
- stc = (stacktracecontainer *) t->backtrace;
- stb = &(stc->stb);
+ ba = (java_handle_bytearray_t *) t->backtrace;
+ stb = (stacktracebuffer *) LLNI_array_data(ba);
if ((index < 0) || (index >= stb->used)) {
/* XXX This should be an IndexOutOfBoundsException (check this
if (opt_DebugStackTrace) {
printf("ra=%p sp=%p, ", ra, sp);
method_print(m);
- printf(": native stub\n");
+ if (m)
+ printf(": native stub\n");
+ else
+ printf(": builtin stub\n");
fflush(stdout);
}
#endif
*******************************************************************************/
-stacktracecontainer *stacktrace_fillInStackTrace(void)
+java_handle_bytearray_t *stacktrace_fillInStackTrace(void)
{
- stacktracebuffer *stb;
- stacktracecontainer *gcstc;
- s4 gcstc_size;
- s4 dumpsize;
+ stacktracebuffer *stb;
+ java_handle_bytearray_t *ba;
+ s4 ba_size;
+ s4 dumpsize;
CYCLES_STATS_DECLARE_AND_START_WITH_OVERHEAD
/* mark start of dump memory area */
goto return_NULL;
/* allocate memory from the GC heap and copy the stacktrace buffer */
- /* ATTENTION: use stacktracecontainer for this and make it look like
- an array */
+ /* ATTENTION: use a bytearray for this to not confuse the GC */
- gcstc_size = sizeof(stacktracebuffer) +
- sizeof(stacktrace_entry) * stb->used -
- sizeof(stacktrace_entry) * STACKTRACE_CAPACITY_DEFAULT;
- gcstc = (stacktracecontainer *) builtin_newarray_byte(gcstc_size);
+ ba_size = sizeof(stacktracebuffer) +
+ sizeof(stacktrace_entry) * stb->used -
+ sizeof(stacktrace_entry) * STACKTRACE_CAPACITY_DEFAULT;
+ ba = builtin_newarray_byte(ba_size);
- if (gcstc == NULL)
+ if (ba == NULL)
goto return_NULL;
- MCOPY(&(gcstc->stb), stb, u1, gcstc_size);
+ MCOPY(LLNI_array_data(ba), stb, u1, ba_size);
/* release dump memory */
CYCLES_STATS_END_WITH_OVERHEAD(stacktrace_fillInStackTrace,
stacktrace_overhead)
- return gcstc;
+ return ba;
return_NULL:
dump_release(dumpsize);
void stacktrace_print_trace(java_handle_t *xptr)
{
- java_lang_Throwable *t;
+ java_lang_Throwable *t;
#if defined(WITH_CLASSPATH_GNU)
- java_lang_VMThrowable *vmt;
+ java_lang_VMThrowable *vmt;
#endif
- stacktracecontainer *stc;
- stacktracebuffer *stb;
+ java_handle_bytearray_t *ba;
+ stacktracebuffer *stb;
t = (java_lang_Throwable *) xptr;
#if defined(WITH_CLASSPATH_GNU)
LLNI_field_get_ref(t, vmState, vmt);
- stc = (stacktracecontainer *) LLNI_field_direct(vmt, vmData);
+ LLNI_field_get_ref(vmt, vmData, ba);
#elif defined(WITH_CLASSPATH_SUN) || defined(WITH_CLASSPATH_CLDC1_1)
- stc = (stacktracecontainer *) t->backtrace;
+ LLNI_field_get_ref(t, backtrace, ba);
#else
# error unknown classpath configuration
#endif
- stb = &(stc->stb);
+ assert(ba);
+ stb = (stacktracebuffer *) LLNI_array_data(ba);
stacktrace_print_trace_from_buffer(stb);
}
};
-/* stacktracecontainer ********************************************************
-
- ATTENTION: Use the stacktracecontainer to place a stacktrace onto the heap
- with stacktrace_fillInStackTrace() so that the GC does not get confused.
-
-*******************************************************************************/
-
-typedef struct stacktracecontainer {
- java_array_t header; /* default array header for the GC */
- struct stacktracebuffer stb; /* wrapped stacktracebuffer */
-} stacktracecontainer;
-
-
/* function prototypes ********************************************************/
#if defined(ENABLE_INTRP)
stacktracebuffer *stacktrace_create(stackframeinfo *sfi);
-stacktracecontainer *stacktrace_fillInStackTrace(void);
+java_handle_bytearray_t *stacktrace_fillInStackTrace(void);
#if defined(ENABLE_JAVASE)
java_handle_objectarray_t *stacktrace_getClassContext(void);