| %verify "executed" |
| %verify "exception for null object (impossible in javac)" |
| %verify "dvmUnlockObject fails" |
| /* |
| * Unlock an object. |
| * |
| * Exceptions that occur when unlocking a monitor need to appear as |
| * if they happened at the following instruction. See the Dalvik |
| * instruction spec. |
| */ |
| /* monitor-exit vAA */ |
| movzbl rINST_HI,rINST_FULL # rINST_FULL<- AA |
| GET_VREG(%eax,rINST_FULL) |
| GET_GLUE(%ecx) |
| EXPORT_PC() |
| testl %eax,%eax # null object? |
| je .L${opcode}_errNullObject # go if so |
| movl offGlue_self(%ecx),%ecx # ecx<- glue->self |
| movl %eax,OUT_ARG1(%esp) |
| SPILL(rPC) |
| movl %ecx,OUT_ARG0(%esp) |
| jmp .L${opcode}_continue |
| %break |
| |
| .L${opcode}_continue: |
| call dvmUnlockObject # unlock(self,obj) |
| UNSPILL(rPC) |
| FETCH_INST_WORD(1) |
| testl %eax,%eax # success? |
| ADVANCE_PC(1) |
| je common_exceptionThrown # no, exception pending |
| GOTO_NEXT |
| .L${opcode}_errNullObject: |
| ADVANCE_PC(1) # advance before throw |
| jmp common_errNullObject |