Index: vm/vmcore/include/jvmti_break_intf.h =================================================================== --- vm/vmcore/include/jvmti_break_intf.h (revision 581009) +++ vm/vmcore/include/jvmti_break_intf.h (working copy) @@ -64,7 +64,7 @@ struct VMBreakPointRef { VMBreakPoint* bp; - void* data; + POINTER_SIZE_INT data; VMBreakPointRef* next; }; @@ -78,7 +78,7 @@ }; // Pointer to interface callback function -typedef bool (*BPInterfaceCallBack)(TIEnv *env, VMBreakPoint* bp, void *data); +typedef bool (*BPInterfaceCallBack)(TIEnv *env, VMBreakPoint* bp, POINTER_SIZE_INT data); typedef bool (*BPInterfaceProcedure) (VMBreakPoint *bp); class VMBreakPoints @@ -176,11 +176,11 @@ // 'data' must be allocated with JVMTI Allocate (or internal _allocate) // Users must not deallocate 'data', it will be deallocated by 'remove' - VMBreakPointRef* add_reference(jmethodID method, jlocation location, void* data); + VMBreakPointRef* add_reference(jmethodID method, jlocation location, POINTER_SIZE_INT data); // To specify address explicitly VMBreakPointRef* add_reference(jmethodID method, jlocation location, - NativeCodePtr addr, void* data); - VMBreakPointRef* add_reference(NativeCodePtr addr, void* data); + NativeCodePtr addr, POINTER_SIZE_INT data); + VMBreakPointRef* add_reference(NativeCodePtr addr, POINTER_SIZE_INT data); bool remove_reference(VMBreakPointRef* ref); void remove_all_reference() @@ -203,7 +203,7 @@ TIEnv* get_env() { return m_env; } private: - inline VMBreakPointRef* add_reference_internal(VMBreakPoint *bp, void *data); + inline VMBreakPointRef* add_reference_internal(VMBreakPoint *bp, POINTER_SIZE_INT data); protected: VMBreakInterface* m_next; Index: vm/vmcore/include/jvmti_internal.h =================================================================== --- vm/vmcore/include/jvmti_internal.h (revision 581009) +++ vm/vmcore/include/jvmti_internal.h (working copy) @@ -423,6 +423,6 @@ unsigned location, jvmti_StepLocation **next_step, unsigned *count); // Callback function for JVMTI breakpoint processing -bool jvmti_process_breakpoint_event(TIEnv *env, VMBreakPoint* bp, void* data); +bool jvmti_process_breakpoint_event(TIEnv *env, VMBreakPoint* bp, POINTER_SIZE_INT data); #endif /* _JVMTI_INTERNAL_H_ */ Index: vm/vmcore/src/jvmti/jvmti_break_intf.cpp =================================================================== --- vm/vmcore/src/jvmti/jvmti_break_intf.cpp (revision 581009) +++ vm/vmcore/src/jvmti/jvmti_break_intf.cpp (working copy) @@ -615,7 +615,9 @@ { local.intf = intf->m_next; VMBreakPoint local_bp = *bp; - void *data = ref->data; + // Set local copy's pointer to local copy of disassembler + local_bp.disasm = &idisasm; + POINTER_SIZE_INT data = ref->data; Method *method = (Method*)bp->method; jlocation location = bp->location; @@ -844,7 +846,7 @@ { local.intf = intf->m_next; VMBreakPoint local_bp = *bp; - void *data = ref->data; + POINTER_SIZE_INT data = ref->data; TRACE2("jvmti.break.intf", "Calling interpreter breakpoint callback function: " @@ -933,7 +935,7 @@ } inline VMBreakPointRef* -VMBreakInterface::add_reference_internal(VMBreakPoint *bp, void *data) +VMBreakInterface::add_reference_internal(VMBreakPoint *bp, POINTER_SIZE_INT data) { VMBreakPointRef* bp_ref = (VMBreakPointRef*)STD_MALLOC(sizeof(VMBreakPointRef)); @@ -956,7 +958,7 @@ } VMBreakPointRef* -VMBreakInterface::add_reference(jmethodID method, jlocation location, void* data) +VMBreakInterface::add_reference(jmethodID method, jlocation location, POINTER_SIZE_INT data) { assert(method); @@ -993,7 +995,7 @@ VMBreakPointRef* VMBreakInterface::add_reference(jmethodID method, jlocation location, - NativeCodePtr addr, void* data) + NativeCodePtr addr, POINTER_SIZE_INT data) { assert(method); @@ -1033,7 +1035,7 @@ } VMBreakPointRef* -VMBreakInterface::add_reference(NativeCodePtr addr, void* data) +VMBreakInterface::add_reference(NativeCodePtr addr, POINTER_SIZE_INT data) { assert(addr); assert(!interpreter_enabled()); @@ -1104,9 +1106,6 @@ VMBreakPoint* brpt = found->bp; assert(brpt); - if (found->data) - _deallocate((unsigned char*)found->data); - STD_FREE(found); if (vm_brpt->find_other_reference(this, brpt)) Index: vm/vmcore/src/jvmti/jvmti_step.cpp =================================================================== --- vm/vmcore/src/jvmti/jvmti_step.cpp (revision 581009) +++ vm/vmcore/src/jvmti/jvmti_step.cpp (working copy) @@ -495,7 +495,7 @@ } static void jvmti_start_single_step_in_virtual_method(DebugUtilsTI *ti, VMBreakPoint* bp, - void *data) + POINTER_SIZE_INT data) { #if (defined _IA32_) || (defined _EM64T_) VM_thread *vm_thread = p_TLS_vmthread; @@ -506,10 +506,15 @@ // This is a virtual breakpoint set exactly on the call // instruction for the virtual method. In this place it is // possible to determine the target method in runtime - bool* UNREF virtual_flag = (bool *)data; - assert(*virtual_flag == true); + bool UNREF virtual_flag = (bool)data; + assert(virtual_flag == true); InstructionDisassembler *disasm = bp->disasm; + + InstructionDisassembler::Type UNREF type = disasm->get_type(); + assert(type == InstructionDisassembler::RELATIVE_CALL || + type == InstructionDisassembler::INDIRECT_CALL); + const InstructionDisassembler::Opnd& op = disasm->get_opnd(0); Method *method; if (op.kind == InstructionDisassembler::Kind_Mem) @@ -572,7 +577,7 @@ // Callback function for JVMTI single step processing static bool jvmti_process_jit_single_step_event(TIEnv* UNREF unused_env, - VMBreakPoint* bp, void *data) + VMBreakPoint* bp, POINTER_SIZE_INT data) { assert(bp); @@ -603,7 +608,7 @@ NativeCodePtr addr = bp->addr; assert(addr); - if (NULL != data) + if ((bool)data) { jvmti_start_single_step_in_virtual_method(ti, bp, data); return true; @@ -727,24 +732,12 @@ << " :" << locations[iii].location << " :" << locations[iii].native_location); - void *data = NULL; - if (locations[iii].no_event) - { - bool *virtual_flag; - jvmtiError error = _allocate(sizeof(bool), - (unsigned char**)&virtual_flag); - - assert(error == JVMTI_ERROR_NONE); - *virtual_flag = true; - data = virtual_flag; - } - VMBreakPointRef* ref = ss_state->predicted_breakpoints->add_reference( (jmethodID)locations[iii].method, locations[iii].location, locations[iii].native_location, - data); + (POINTER_SIZE_INT)locations[iii].no_event); assert(ref); } } Index: vm/vmcore/src/jvmti/jvmti_break.cpp =================================================================== --- vm/vmcore/src/jvmti/jvmti_break.cpp (revision 581009) +++ vm/vmcore/src/jvmti/jvmti_break.cpp (working copy) @@ -39,7 +39,7 @@ // Callback function for JVMTI breakpoint processing -bool jvmti_process_breakpoint_event(TIEnv *env, VMBreakPoint* bp, void* UNREF data) +bool jvmti_process_breakpoint_event(TIEnv *env, VMBreakPoint* bp, POINTER_SIZE_INT UNREF data) { assert(bp); @@ -197,7 +197,7 @@ if (NULL != bp) return JVMTI_ERROR_DUPLICATE; - if (!brpt_intf->add_reference(method, location, NULL)) + if (!brpt_intf->add_reference(method, location, (POINTER_SIZE_INT)false)) return JVMTI_ERROR_INTERNAL; TRACE2("jvmti.break", "SetBreakpoint is successful");