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