From 1006fe52a9bfcab1387e9aeaa7d9ceeb26604bb4 Mon Sep 17 00:00:00 2001 From: kseitz <kseitz@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Mon, 23 Jan 2006 18:44:43 +0000 Subject: [PATCH] * java/lang/Class.h (_Jv_FindInterpreterMethod): Add new declaration. * java/lang/natClass.cc (_Jv_FindInterpreterMethod): New function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@110142 138bc75d-0d04-0410-961f-82ee72b054a4 --- libjava/ChangeLog | 5 +++++ libjava/java/lang/Class.h | 19 +++++++++++++++---- libjava/java/lang/natClass.cc | 28 +++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/libjava/ChangeLog b/libjava/ChangeLog index abe7989f40dc..d13425b1316c 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,8 @@ +2006-01-23 Keith Seitz <keiths@redhat.com> + + * java/lang/Class.h (_Jv_FindInterpreterMethod): Add new declaration. + * java/lang/natClass.cc (_Jv_FindInterpreterMethod): New function. + 2006-01-23 David Daney <ddaney@avtrex.com> * configure.host (disable_dladdr): Remove variable and its diff --git a/libjava/java/lang/Class.h b/libjava/java/lang/Class.h index 1c14df3a9c39..fe31fa2a39ce 100644 --- a/libjava/java/lang/Class.h +++ b/libjava/java/lang/Class.h @@ -81,6 +81,12 @@ class _Jv_ExecutionEngine; class _Jv_CompiledEngine; class _Jv_InterpreterEngine; +#ifdef INTERPRETER +class _Jv_ClassReader; +class _Jv_InterpClass; +class _Jv_InterpMethod; +#endif + struct _Jv_Constants { jint size; @@ -217,6 +223,11 @@ jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *); jint JvNumMethods (jclass); jmethodID JvGetFirstMethod (jclass); +#ifdef INTERPRETER +// Finds a desired interpreter method in the given class or NULL if not found +_Jv_InterpMethod* _Jv_FindInterpreterMethod (jclass, jmethodID); +#endif + // Friend classes and functions to implement the ClassLoader class java::lang::ClassLoader; class java::lang::VMClassLoader; @@ -256,10 +267,6 @@ void _Jv_CopyClassesToSystemLoader (gnu::gcj::runtime::SystemClassLoader *); #ifdef INTERPRETER void _Jv_InitField (jobject, jclass, int); - -class _Jv_ClassReader; -class _Jv_InterpClass; -class _Jv_InterpMethod; #endif class _Jv_StackTrace; @@ -442,6 +449,10 @@ private: friend jmethodID (::_Jv_FromReflectedConstructor) (java::lang::reflect::Constructor *); friend jint (::JvNumMethods) (jclass); friend jmethodID (::JvGetFirstMethod) (jclass); +#ifdef INTERPRETER + friend _Jv_InterpMethod* (::_Jv_FindInterpreterMethod) (jclass klass, + jmethodID desired_method); +#endif // Friends classes and functions to implement the ClassLoader friend class java::lang::ClassLoader; diff --git a/libjava/java/lang/natClass.cc b/libjava/java/lang/natClass.cc index bd68eb224358..951bab974cc9 100644 --- a/libjava/java/lang/natClass.cc +++ b/libjava/java/lang/natClass.cc @@ -1,6 +1,6 @@ // natClass.cc - Implementation of java.lang.Class native methods. -/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation This file is part of libgcj. @@ -1220,3 +1220,29 @@ _Jv_getInterfaceMethod (jclass search_class, jclass &found_class, int &index, return false; } + +#ifdef INTERPRETER +_Jv_InterpMethod* +_Jv_FindInterpreterMethod (jclass klass, jmethodID desired_method) +{ + using namespace java::lang::reflect; + + _Jv_InterpClass* iclass + = reinterpret_cast<_Jv_InterpClass*> (klass->aux_info); + _Jv_MethodBase** imethods = _Jv_GetFirstMethod (iclass); + + for (int i = 0; i < JvNumMethods (klass); ++i) + { + _Jv_MethodBase* imeth = imethods[i]; + _Jv_ushort accflags = klass->methods[i].accflags; + if ((accflags & (Modifier::NATIVE | Modifier::ABSTRACT)) == 0) + { + _Jv_InterpMethod* im = reinterpret_cast<_Jv_InterpMethod*> (imeth); + if (im->get_method () == desired_method) + return im; + } + } + + return NULL; +} +#endif -- GitLab