1 %verify "executed" 2 %verify "exception for null object (impossible in javac)" 3 %verify "dvmUnlockObject fails" 4 /* 5 * Unlock an object. 6 * 7 * Exceptions that occur when unlocking a monitor need to appear as 8 * if they happened at the following instruction. See the Dalvik 9 * instruction spec. 10 */ 11 /* monitor-exit vAA */ 12 movzbl rINST_HI,rINST_FULL # rINST_FULL<- AA 13 GET_VREG(%eax,rINST_FULL) 14 GET_GLUE(%ecx) 15 EXPORT_PC() 16 testl %eax,%eax # null object? 17 je .L${opcode}_errNullObject # go if so 18 movl offGlue_self(%ecx),%ecx # ecx<- glue->self 19 movl %eax,OUT_ARG1(%esp) 20 SPILL(rPC) 21 movl %ecx,OUT_ARG0(%esp) 22 jmp .L${opcode}_continue 23 %break 24 25 .L${opcode}_continue: 26 call dvmUnlockObject # unlock(self,obj) 27 UNSPILL(rPC) 28 FETCH_INST_WORD(1) 29 testl %eax,%eax # success? 30 ADVANCE_PC(1) 31 je common_exceptionThrown # no, exception pending 32 GOTO_NEXT 33 .L${opcode}_errNullObject: 34 ADVANCE_PC(1) # advance before throw 35 jmp common_errNullObject 36