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)12java_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)26JAVA_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)56JAVA_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()74void 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