// natBreakpoint.cc - C++ side of Breakpoint /* Copyright (C) 2006, 2007 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ #include #include #include #include #include #include #include #include #include static _Jv_InterpMethod * get_interp_method (jlong method) { jmethodID id = reinterpret_cast (method); jclass klass = _Jv_GetMethodDeclaringClass (id); JvAssert (_Jv_IsInterpretedClass (klass)); _Jv_MethodBase *base = _Jv_FindInterpreterMethod (klass, id); JvAssert (base != NULL); return reinterpret_cast<_Jv_InterpMethod *> (base); } void gnu::gcj::jvmti::Breakpoint::_save_insn () { _Jv_InterpMethod *imeth = get_interp_method (method); // copy contents of insn at location into data pc_t code = imeth->get_insn (location); data = (RawDataManaged *) JvAllocBytes (sizeof (*code)); memcpy (data, code, sizeof (*code)); } void gnu::gcj::jvmti::Breakpoint::install () { _save_insn (); _Jv_InterpMethod *imeth = get_interp_method (method); imeth->install_break (location); } void gnu::gcj::jvmti::Breakpoint::remove () { _Jv_InterpMethod *imeth = get_interp_method (method); imeth->set_insn (location, reinterpret_cast (data)); } #ifdef DIRECT_THREADED void _Jv_RewriteBreakpointInsn (jmethodID mid, jlocation loc, pc_t new_insn) { using namespace ::gnu::gcj::jvmti; Breakpoint *bp = BreakpointManager::getBreakpoint (reinterpret_cast (mid), loc); if (bp != NULL) { pc_t old_insn = (pc_t) bp->data; old_insn->insn = new_insn; } } #endif // DIRECT_THREADED