1 
2 #include "xmlvm.h"
3 #include "java_lang_Throwable.h"
4 
5 
6 //XMLVM_BEGIN_NATIVE_IMPLEMENTATION
7 
8 #ifdef XMLVM_ENABLE_STACK_TRACES
9 
10 #include "java_lang_StackTraceElement.h"
11 
createStackTraceElement(XMLVM_STACK_TRACE_ELEMENT * elem)12 java_lang_StackTraceElement* createStackTraceElement(XMLVM_STACK_TRACE_ELEMENT* elem)
13 {
14     java_lang_StackTraceElement* ste = (java_lang_StackTraceElement*)__NEW_java_lang_StackTraceElement();
15     java_lang_StackTraceElement___INIT____java_lang_String_java_lang_String_java_lang_String_int(ste,
16             xmlvm_create_java_string(elem->className),
17             xmlvm_create_java_string(elem->methodName),
18             xmlvm_create_java_string(elem->fileName),
19             elem->lineNumber);
20     return ste;
21 }
22 #endif
23 
24 //XMLVM_END_NATIVE_IMPLEMENTATION
25 
java_lang_Throwable_fillInStackTrace__(JAVA_OBJECT me)26 JAVA_OBJECT java_lang_Throwable_fillInStackTrace__(JAVA_OBJECT me)
27 {
28     //XMLVM_BEGIN_NATIVE[java_lang_Throwable_fillInStackTrace__]
29 #ifdef XMLVM_ENABLE_STACK_TRACES
30 
31     XMLVM_STACK_TRACE_CURRENT* threadStack = getCurrentStackTrace();
32     int size = threadStack->stackSize;
33 
34     if (!__TIB_java_lang_StackTraceElement.classInitialized) __INIT_java_lang_StackTraceElement();
35     JAVA_OBJECT array = XMLVMArray_createSingleDimension(__CLASS_java_lang_StackTraceElement, size);
36 
37     // Put the currentLocation at the beginning of the array
38     ((JAVA_ARRAY_OBJECT*) (((org_xmlvm_runtime_XMLVMArray*) array)->fields.org_xmlvm_runtime_XMLVMArray.array_))[0] = createStackTraceElement(threadStack->topOfStack->currentLocation);
39 
40     XMLVM_STACK_TRACE_LINK* curLink = threadStack->topOfStack;
41     for (int index = 1; index < size; index++) {
42         java_lang_StackTraceElement* ste = createStackTraceElement(curLink->element);
43         ((JAVA_ARRAY_OBJECT*) (((org_xmlvm_runtime_XMLVMArray*) array)->fields.org_xmlvm_runtime_XMLVMArray.array_))[index] = ste;
44         curLink = curLink->nextLink;
45     }
46 
47     ((java_lang_Throwable*) me)->fields.java_lang_Throwable.stackTrace_ = array;
48 
49     return me;
50 #else
51     return JAVA_NULL;
52 #endif
53     //XMLVM_END_NATIVE
54 }
55 
java_lang_Throwable_getStackTraceImpl__(JAVA_OBJECT me)56 JAVA_OBJECT java_lang_Throwable_getStackTraceImpl__(JAVA_OBJECT me)
57 {
58     //XMLVM_BEGIN_NATIVE[java_lang_Throwable_getStackTraceImpl__]
59 #ifdef XMLVM_ENABLE_STACK_TRACES
60 
61     return ((java_lang_Throwable*) me)->fields.java_lang_Throwable.stackTrace_;
62 
63 #else
64 
65 // TODO throw RuntimeException with the following message instead of printf
66     printf("Stack traces are not enabled natively! To enable stack traces, define XMLVM_ENABLE_STACK_TRACES. Keep in mind this will decrease performance!\n");
67     XMLVM_UNIMPLEMENTED_NATIVE_METHOD();
68 
69 #endif
70     //XMLVM_END_NATIVE
71 }
72 
73 
xmlvm_init_native_java_lang_Throwable()74 void xmlvm_init_native_java_lang_Throwable()
75 {
76     //XMLVM_BEGIN_NATIVE_IMPLEMENTATION_INIT
77     //XMLVM_END_NATIVE_IMPLEMENTATION_INIT
78 #ifdef XMLVM_VTABLE_IDX_java_lang_Throwable_fillInStackTrace__
79     __TIB_java_lang_Throwable.vtable[XMLVM_VTABLE_IDX_java_lang_Throwable_fillInStackTrace__] =
80         (VTABLE_PTR) java_lang_Throwable_fillInStackTrace__;
81 #endif
82 }
83