emscripten/tests/nbody-java/native_java_lang_Throwable.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
}