gcc/libjava/gnu/gcj/jvmti/natBreakpoint.cc
Keith Seitz 02b1e78caf Breakpoint.java: Make abstract.
* gnu/gcj/jvmti/Breakpoint.java: Make abstract.
        (method): Change from private to protected.
        (location): Likewise.
        (Breakpoint): Change argument list to take only integer type.
        Add default constructor.
        (initialize_native): Renamed to ...
        (_save_insn): ... this to make function more explicit.
        (execute): New method.
        * gnu/gcj/jvmti/Breakpoint.h: Regenerate.
        * gnu/gcj/jvmti/natBreakpoint.cc (initialize_native): Rename to...
        (_save_insn): ... this.
        (install): Save the original instruction.
        * gnu/gcj/jvmti/NormalBreakpoint.java: New file.
        * gnu/gcj/jvmti/NormalBreakpoint.h: New file.
        * gnu/gcj/jvmti/natNormalBreakpoint.cc: New file.
        * gnu/gcj/jvmti/BreakpointManager.java (newBreakpoint):
        Instantiate a NormalBreakpoint instead of Breakpoint.
        * interpret-run.cc (insn_breakpoint): Remove breakpoint actions
        and call Breakpoint.execute to do them.
        * classpath/lib/gnu/gcj/jvmti/Breakpoint.class: Regenerate.
        * classpath/lib/gnu/gcj/jvmti/BreakpointManager.class: Likewise.
        * classpath/lib/gnu/gcj/jvmti/NormalBreakpoint.class: New file.
        * sources.am: Regenerate.
        * Makefile.am (nat_source_files): Add natNormalBreakpoint.cc.
        * Makefile.in: Regenerated.

From-SVN: r125834
2007-06-19 00:10:10 +00:00

74 lines
1.8 KiB
C++

// 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 <config.h>
#include <gcj/cni.h>
#include <gcj/method.h>
#include <java-interp.h>
#include <java-insns.h>
#include <java-assert.h>
#include <jvmti.h>
#include <gnu/gcj/jvmti/Breakpoint.h>
#include <gnu/gcj/jvmti/BreakpointManager.h>
static _Jv_InterpMethod *
get_interp_method (jlong method)
{
jmethodID id = reinterpret_cast<jmethodID> (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<pc_t> (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<jlong> (mid), loc);
if (bp != NULL)
{
pc_t old_insn = (pc_t) bp->data;
old_insn->insn = new_insn;
}
}
#endif // DIRECT_THREADED