1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectHANDLE_OPCODE(OP_MONITOR_EXIT /*vAA*/)
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    {
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Object* obj;
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        EXPORT_PC();
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        vsrc1 = INST_AA(inst);
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ILOGV("|monitor-exit v%d %s(0x%08x)",
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            vsrc1, kSpacing+5, GET_REGISTER(vsrc1));
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        obj = (Object*)GET_REGISTER(vsrc1);
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!checkForNull(obj)) {
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            /*
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * The exception needs to be processed at the *following*
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * instruction, not the current instruction (see the Dalvik
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * spec).  Because we're jumping to an exception handler,
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * we're not actually at risk of skipping an instruction
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             * by doing so.
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project             */
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ADJUST_PC(1);           /* monitor-exit width is 1 */
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            GOTO_exceptionThrown();
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
2260fc806b679a3655c228b4093058c59941a49cfeDan Bornstein        ILOGV("+ unlocking %p %s", obj, obj->clazz->descriptor);
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!dvmUnlockObject(self, obj)) {
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assert(dvmCheckException(self));
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ADJUST_PC(1);
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            GOTO_exceptionThrown();
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    FINISH(1);
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectOP_END
31