Implement NPE, div by 0 and AIOBE.
Implement runtime support for throwing NPE, divide by 0 and
ArrayIndexOutOfBounds excptions. Add simple unit tests.
Change-Id: I69453c10b6692aa79512bcab1f68c5ab16c8c256
diff --git a/src/runtime_support.S b/src/runtime_support.S
index 5372742..24883fc 100644
--- a/src/runtime_support.S
+++ b/src/runtime_support.S
@@ -1,3 +1,5 @@
+#include "asm_support.h"
+
#if defined(__arm__)
.balign 4
@@ -12,9 +14,45 @@
art_deliver_exception:
stmdb sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, lr}
sub sp, #16 @ 4 words of space, bottom word will hold Method*
- mov r1, r9
- mov r2, sp
- b artDeliverExceptionHelper @ artThrowExceptionHelper(Throwable*, SP)
+ mov r1, r9 @ pass Thread::Current
+ mov r2, sp @ pass SP
+ b artDeliverExceptionHelper @ artDeliverExceptionHelper(Throwable*, Thread*, SP)
+
+ .global art_throw_null_pointer_exception_from_code
+ .extern artThrowNullPointerExceptionFromCodeHelper
+ /*
+ * Create NPE and deliver
+ */
+art_throw_null_pointer_exception_from_code:
+ stmdb sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ sub sp, #16 @ 4 words of space, bottom word will hold Method*
+ mov r0, r9 @ pass Thread::Current
+ mov r1, sp @ pass SP
+ b artThrowNullPointerExceptionFromCodeHelper @ artThrowNullPointerExceptionFromCodeHelper(Thread*, SP)
+
+ .global art_throw_div_zero_from_code
+ .extern artThrowDivZeroFromCodeHelper
+ /*
+ * Create ArithmeticException and deliver
+ */
+art_throw_div_zero_from_code:
+ stmdb sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ sub sp, #16 @ 4 words of space, bottom word will hold Method*
+ mov r0, r9 @ pass Thread::Current
+ mov r1, sp @ pass SP
+ b artThrowDivZeroFromCodeHelper @ artThrowDivZeroFromCodeHelper(Thread*, SP)
+
+ .global art_throw_array_bounds_from_code
+ .extern artThrowArrayBoundsFromCodeHelper
+ /*
+ * Create ArrayIndexOutOfBoundsException and deliver
+ */
+art_throw_array_bounds_from_code:
+ stmdb sp!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, lr}
+ sub sp, #16 @ 4 words of space, bottom word will hold Method*
+ mov r2, r9 @ pass Thread::Current
+ mov r3, sp @ pass SP
+ b artThrowArrayBoundsFromCodeHelper @ artThrowArrayBoundsFromCodeHelper(index, limit, Thread*, SP)
.global art_invoke_interface_trampoline
.extern artFindInterfaceMethodInCache
@@ -144,10 +182,10 @@
mov %esp, %ecx
// Outgoing argument set up
pushl $0 // Alignment padding
- pushl %ecx
- pushl $0 // TODO: pass fs:offsetof(Thread,self_) - for now this is computed in the helper
- pushl %eax
- call artDeliverExceptionHelper // artThrowExceptionHelper(Throwable*, Thread*, SP)
+ pushl %ecx // pass SP
+ pushl %fs:THREAD_SELF_OFFSET // pass fs:offsetof(Thread,self_)
+ pushl %eax // pass Throwable*
+ call artDeliverExceptionHelper // artDeliverExceptionHelper(Throwable*, Thread*, SP)
int3
#endif