83 строки
2.8 KiB
C
83 строки
2.8 KiB
C
|
|
#include "xmlvm.h"
|
|
#include "java_lang_Throwable.h"
|
|
|
|
|
|
//XMLVM_BEGIN_NATIVE_IMPLEMENTATION
|
|
|
|
#ifdef XMLVM_ENABLE_STACK_TRACES
|
|
|
|
#include "java_lang_StackTraceElement.h"
|
|
|
|
java_lang_StackTraceElement* createStackTraceElement(XMLVM_STACK_TRACE_ELEMENT* elem)
|
|
{
|
|
java_lang_StackTraceElement* ste = (java_lang_StackTraceElement*)__NEW_java_lang_StackTraceElement();
|
|
java_lang_StackTraceElement___INIT____java_lang_String_java_lang_String_java_lang_String_int(ste,
|
|
xmlvm_create_java_string(elem->className),
|
|
xmlvm_create_java_string(elem->methodName),
|
|
xmlvm_create_java_string(elem->fileName),
|
|
elem->lineNumber);
|
|
return ste;
|
|
}
|
|
#endif
|
|
|
|
//XMLVM_END_NATIVE_IMPLEMENTATION
|
|
|
|
JAVA_OBJECT java_lang_Throwable_fillInStackTrace__(JAVA_OBJECT me)
|
|
{
|
|
//XMLVM_BEGIN_NATIVE[java_lang_Throwable_fillInStackTrace__]
|
|
#ifdef XMLVM_ENABLE_STACK_TRACES
|
|
|
|
XMLVM_STACK_TRACE_CURRENT* threadStack = getCurrentStackTrace();
|
|
int size = threadStack->stackSize;
|
|
|
|
if (!__TIB_java_lang_StackTraceElement.classInitialized) __INIT_java_lang_StackTraceElement();
|
|
JAVA_OBJECT array = XMLVMArray_createSingleDimension(__CLASS_java_lang_StackTraceElement, size);
|
|
|
|
// Put the currentLocation at the beginning of the array
|
|
((JAVA_ARRAY_OBJECT*) (((org_xmlvm_runtime_XMLVMArray*) array)->fields.org_xmlvm_runtime_XMLVMArray.array_))[0] = createStackTraceElement(threadStack->topOfStack->currentLocation);
|
|
|
|
XMLVM_STACK_TRACE_LINK* curLink = threadStack->topOfStack;
|
|
for (int index = 1; index < size; index++) {
|
|
java_lang_StackTraceElement* ste = createStackTraceElement(curLink->element);
|
|
((JAVA_ARRAY_OBJECT*) (((org_xmlvm_runtime_XMLVMArray*) array)->fields.org_xmlvm_runtime_XMLVMArray.array_))[index] = ste;
|
|
curLink = curLink->nextLink;
|
|
}
|
|
|
|
((java_lang_Throwable*) me)->fields.java_lang_Throwable.stackTrace_ = array;
|
|
|
|
return me;
|
|
#else
|
|
return JAVA_NULL;
|
|
#endif
|
|
//XMLVM_END_NATIVE
|
|
}
|
|
|
|
JAVA_OBJECT java_lang_Throwable_getStackTraceImpl__(JAVA_OBJECT me)
|
|
{
|
|
//XMLVM_BEGIN_NATIVE[java_lang_Throwable_getStackTraceImpl__]
|
|
#ifdef XMLVM_ENABLE_STACK_TRACES
|
|
|
|
return ((java_lang_Throwable*) me)->fields.java_lang_Throwable.stackTrace_;
|
|
|
|
#else
|
|
|
|
// TODO throw RuntimeException with the following message instead of printf
|
|
printf("Stack traces are not enabled natively! To enable stack traces, define XMLVM_ENABLE_STACK_TRACES. Keep in mind this will decrease performance!\n");
|
|
XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
|
|
|
|
#endif
|
|
//XMLVM_END_NATIVE
|
|
}
|
|
|
|
|
|
void xmlvm_init_native_java_lang_Throwable()
|
|
{
|
|
//XMLVM_BEGIN_NATIVE_IMPLEMENTATION_INIT
|
|
//XMLVM_END_NATIVE_IMPLEMENTATION_INIT
|
|
#ifdef XMLVM_VTABLE_IDX_java_lang_Throwable_fillInStackTrace__
|
|
__TIB_java_lang_Throwable.vtable[XMLVM_VTABLE_IDX_java_lang_Throwable_fillInStackTrace__] =
|
|
(VTABLE_PTR) java_lang_Throwable_fillInStackTrace__;
|
|
#endif
|
|
}
|