Commit 0f918fea by Tom Tromey

[multiple changes]

2000-01-04  Tom Tromey  <tromey@cygnus.com>

	* java/lang/reflect/natConstructor.cc (newInstance): Pass
	declaring class as return_type argument to
	_Jv_CallNonvirtualMethodA.
	* java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA): In
	constructor case, create object and use it as `this' argument.
	* java/lang/Class.h (_getConstructors): Declare.
	(_getFields): Declare.
	* java/lang/Class.java (getConstructors): Wrote.
	(_getConstructors): New native method.
	(getDeclaredConstructors): Wrote.
	(_getFields): Declare new native method.
	* java/lang/natClass.cc (_Jv_LookupInterfaceMethod): Removed
	incorrect comment.
	(getMethod): Work correctly when class is primitive.
	(getDeclaredMethods): Likewise.  Compute offset using `method',
	not `mptr'.
	(getDeclaredMethod): Likewise.
	(getConstructor): Wrote.
	(ConstructorClass): New define.
	(getDeclaredConstructor): Wrote.
	(_getConstructors): New method.
	(_getFields): New method.
	(getFields): Wrote.

	* Makefile.in: Rebuilt.
	* Makefile.am (AM_CXXFLAGS): Added -D_GNU_SOURCE.

	* prims.cc: Remove `#pragma implementation'.
	* gcj/array.h: Remove `#pragma interface'.

	* prims.cc (_Jv_equaln): New function.
	* java/lang/Class.java (getSignature): Declare.
	* resolve.cc (_Jv_LookupDeclaredMethod): Moved to natClass.cc.
	* java/lang/natClass.cc (_Jv_LookupDeclaredMethod): Moved from
	resolve.cc.
	(getSignature): New method.
	(getDeclaredMethod): Wrote.
	(getMethod): Wrote.
	Include StringBuffer.h.
	* java/lang/Class.h (Class): Added _Jv_FromReflectedConstructor
	as a friend.  Unconditionally declare _Jv_LookupDeclaredMethod as
	a friend.
	(getSignature): Declare.
	* include/jvm.h (_Jv_GetTypesFromSignature): Declare.
	(_Jv_equaln): Declare.
	(_Jv_CallNonvirtualMethodA): Declare.
	* Makefile.in: Rebuilt.
	* Makefile.am (nat_source_files): Added natConstructor.cc.
	(java/lang/reflect/Constructor.h): New target.
	* java/lang/reflect/natConstructor.cc: New file.
	* java/lang/reflect/Constructor.java (newInstance): Now native.
	(declaringClass): Renamed from decl_class.
	(offset): Renamed from index.
	(getType): New native method.
	(getModifiers): Now native.
	(getParameterTypes): Call getType if required.
	(hashCode): Include hash code from declaring class.
	(modifiers): Removed.
	(toString): Call getType if required.
	* gcj/method.h (_Jv_FromReflectedConstructor): New function.
	* java/lang/reflect/natMethod.cc (hack_call): New method.
	Removed `#if 0' around FFI code.
	Include <gnu/gcj/RawData.h>.
	(invoke): Use _Jv_CallNonvirtualMethodA.  Throw
	IllegalArgumentException when argument object and class disagree.
	(_Jv_GetTypesFromSignature): New function.
	(getType): Use it.
	(ObjectClass): New define.
	(_Jv_CallNonvirtualMethodA): New function.
	* java/lang/reflect/Method.java (hack_trampoline): New method.
	(hack_call): New native method.

1999-12-21  Per Bothner  <per@bothner.com>

	* java/lang/natClass.cc (getDeclaredMethods): Correctly compute
	offset in new Method.

From-SVN: r31199
parent 00da7781
2000-01-04 Tom Tromey <tromey@cygnus.com>
* java/lang/reflect/natConstructor.cc (newInstance): Pass
declaring class as return_type argument to
_Jv_CallNonvirtualMethodA.
* java/lang/reflect/natMethod.cc (_Jv_CallNonvirtualMethodA): In
constructor case, create object and use it as `this' argument.
* java/lang/Class.h (_getConstructors): Declare.
(_getFields): Declare.
* java/lang/Class.java (getConstructors): Wrote.
(_getConstructors): New native method.
(getDeclaredConstructors): Wrote.
(_getFields): Declare new native method.
* java/lang/natClass.cc (_Jv_LookupInterfaceMethod): Removed
incorrect comment.
(getMethod): Work correctly when class is primitive.
(getDeclaredMethods): Likewise. Compute offset using `method',
not `mptr'.
(getDeclaredMethod): Likewise.
(getConstructor): Wrote.
(ConstructorClass): New define.
(getDeclaredConstructor): Wrote.
(_getConstructors): New method.
(_getFields): New method.
(getFields): Wrote.
* Makefile.in: Rebuilt.
* Makefile.am (AM_CXXFLAGS): Added -D_GNU_SOURCE.
* prims.cc: Remove `#pragma implementation'.
* gcj/array.h: Remove `#pragma interface'.
* prims.cc (_Jv_equaln): New function.
* java/lang/Class.java (getSignature): Declare.
* resolve.cc (_Jv_LookupDeclaredMethod): Moved to natClass.cc.
* java/lang/natClass.cc (_Jv_LookupDeclaredMethod): Moved from
resolve.cc.
(getSignature): New method.
(getDeclaredMethod): Wrote.
(getMethod): Wrote.
Include StringBuffer.h.
* java/lang/Class.h (Class): Added _Jv_FromReflectedConstructor
as a friend. Unconditionally declare _Jv_LookupDeclaredMethod as
a friend.
(getSignature): Declare.
* include/jvm.h (_Jv_GetTypesFromSignature): Declare.
(_Jv_equaln): Declare.
(_Jv_CallNonvirtualMethodA): Declare.
* Makefile.in: Rebuilt.
* Makefile.am (nat_source_files): Added natConstructor.cc.
(java/lang/reflect/Constructor.h): New target.
* java/lang/reflect/natConstructor.cc: New file.
* java/lang/reflect/Constructor.java (newInstance): Now native.
(declaringClass): Renamed from decl_class.
(offset): Renamed from index.
(getType): New native method.
(getModifiers): Now native.
(getParameterTypes): Call getType if required.
(hashCode): Include hash code from declaring class.
(modifiers): Removed.
(toString): Call getType if required.
* gcj/method.h (_Jv_FromReflectedConstructor): New function.
* java/lang/reflect/natMethod.cc (hack_call): New method.
Removed `#if 0' around FFI code.
Include <gnu/gcj/RawData.h>.
(invoke): Use _Jv_CallNonvirtualMethodA. Throw
IllegalArgumentException when argument object and class disagree.
(_Jv_GetTypesFromSignature): New function.
(getType): Use it.
(ObjectClass): New define.
(_Jv_CallNonvirtualMethodA): New function.
* java/lang/reflect/Method.java (hack_trampoline): New method.
(hack_call): New native method.
1999-12-21 Per Bothner <per@bothner.com>
* java/lang/natClass.cc (getDeclaredMethods): Correctly compute
offset in new Method.
1999-12-22 Bryce McKinlay <bryce@albatross.co.nz> 1999-12-22 Bryce McKinlay <bryce@albatross.co.nz>
* java/lang/natObject.cc (notify): Throw message with * java/lang/natObject.cc (notify): Throw message with
......
...@@ -74,8 +74,10 @@ JAVAC = $(GCJ) -C ...@@ -74,8 +74,10 @@ JAVAC = $(GCJ) -C
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@ EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
WARNINGS = -W -Wall WARNINGS = -W -Wall
## We need _GNU_SOURCE defined for some Linux builds. It doesn't hurt
## to always define it.
AM_CXXFLAGS = -fno-rtti -fvtable-thunks @LIBGCJ_CXXFLAGS@ @EXCEPTIONSPEC@ \ AM_CXXFLAGS = -fno-rtti -fvtable-thunks @LIBGCJ_CXXFLAGS@ @EXCEPTIONSPEC@ \
$(WARNINGS) $(WARNINGS) -D_GNU_SOURCE
if USING_GCC if USING_GCC
AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS) AM_CFLAGS = @LIBGCJ_CFLAGS@ $(WARNINGS)
else else
...@@ -229,6 +231,12 @@ java/lang/String.h: java/lang/String.class libgcj.zip ...@@ -229,6 +231,12 @@ java/lang/String.h: java/lang/String.class libgcj.zip
-friend 'jstring _Jv_AllocString (jsize);' \ -friend 'jstring _Jv_AllocString (jsize);' \
$(basename $<) $(basename $<)
java/lang/reflect/Constructor.h: java/lang/reflect/Constructor.class libgcj.zip
$(GCJH) -classpath $(top_builddir) \
-friend 'jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);' \
-friend 'java::lang::Class;' \
$(basename $<)
java/lang/reflect/Field.h: java/lang/reflect/Field.class libgcj.zip java/lang/reflect/Field.h: java/lang/reflect/Field.class libgcj.zip
$(GCJH) -classpath $(top_builddir) \ $(GCJH) -classpath $(top_builddir) \
-friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \ -friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \
...@@ -797,6 +805,7 @@ java/lang/natString.cc \ ...@@ -797,6 +805,7 @@ java/lang/natString.cc \
java/lang/natSystem.cc \ java/lang/natSystem.cc \
java/lang/natThread.cc \ java/lang/natThread.cc \
java/lang/reflect/natArray.cc \ java/lang/reflect/natArray.cc \
java/lang/reflect/natConstructor.cc \
java/lang/reflect/natField.cc \ java/lang/reflect/natField.cc \
java/lang/reflect/natMethod.cc \ java/lang/reflect/natMethod.cc \
java/net/natInetAddress.cc \ java/net/natInetAddress.cc \
......
...@@ -158,7 +158,7 @@ EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@ ...@@ -158,7 +158,7 @@ EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
WARNINGS = -W -Wall WARNINGS = -W -Wall
AM_CXXFLAGS = -fno-rtti -fvtable-thunks @LIBGCJ_CXXFLAGS@ @EXCEPTIONSPEC@ \ AM_CXXFLAGS = -fno-rtti -fvtable-thunks @LIBGCJ_CXXFLAGS@ @EXCEPTIONSPEC@ \
$(WARNINGS) $(WARNINGS) -D_GNU_SOURCE
@USING_GCC_TRUE@AM_CFLAGS = \ @USING_GCC_TRUE@AM_CFLAGS = \
@USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS) @USING_GCC_TRUE@@LIBGCJ_CFLAGS@ $(WARNINGS)
...@@ -619,6 +619,7 @@ java/lang/natString.cc \ ...@@ -619,6 +619,7 @@ java/lang/natString.cc \
java/lang/natSystem.cc \ java/lang/natSystem.cc \
java/lang/natThread.cc \ java/lang/natThread.cc \
java/lang/reflect/natArray.cc \ java/lang/reflect/natArray.cc \
java/lang/reflect/natConstructor.cc \
java/lang/reflect/natField.cc \ java/lang/reflect/natField.cc \
java/lang/reflect/natMethod.cc \ java/lang/reflect/natMethod.cc \
java/net/natInetAddress.cc \ java/net/natInetAddress.cc \
...@@ -726,7 +727,7 @@ THANKS acinclude.m4 aclocal.m4 configure configure.in libgcj.spec.in ...@@ -726,7 +727,7 @@ THANKS acinclude.m4 aclocal.m4 configure configure.in libgcj.spec.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = gtar TAR = tar
GZIP_ENV = --best GZIP_ENV = --best
DIST_SUBDIRS = testsuite gcj include gcj include DIST_SUBDIRS = testsuite gcj include gcj include
DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \
...@@ -1267,7 +1268,7 @@ distdir: $(DISTFILES) ...@@ -1267,7 +1268,7 @@ distdir: $(DISTFILES)
@for file in $(DISTFILES); do \ @for file in $(DISTFILES); do \
d=$(srcdir); \ d=$(srcdir); \
if test -d $$d/$$file; then \ if test -d $$d/$$file; then \
cp -pr $$d/$$file $(distdir)/$$file; \ cp -pr $$/$$file $(distdir)/$$file; \
else \ else \
test -f $(distdir)/$$file \ test -f $(distdir)/$$file \
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
...@@ -1513,6 +1514,12 @@ java/lang/String.h: java/lang/String.class libgcj.zip ...@@ -1513,6 +1514,12 @@ java/lang/String.h: java/lang/String.class libgcj.zip
-friend 'jstring _Jv_AllocString (jsize);' \ -friend 'jstring _Jv_AllocString (jsize);' \
$(basename $<) $(basename $<)
java/lang/reflect/Constructor.h: java/lang/reflect/Constructor.class libgcj.zip
$(GCJH) -classpath $(top_builddir) \
-friend 'jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);' \
-friend 'java::lang::Class;' \
$(basename $<)
java/lang/reflect/Field.h: java/lang/reflect/Field.class libgcj.zip java/lang/reflect/Field.h: java/lang/reflect/Field.class libgcj.zip
$(GCJH) -classpath $(top_builddir) \ $(GCJH) -classpath $(top_builddir) \
-friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \ -friend 'jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);' \
......
...@@ -76,12 +76,14 @@ DLLTOOL = @DLLTOOL@ ...@@ -76,12 +76,14 @@ DLLTOOL = @DLLTOOL@
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@ EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXCEPTIONSPEC = @EXCEPTIONSPEC@
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
FORCELIBGCCSPEC = @FORCELIBGCCSPEC@
GCDEPS = @GCDEPS@ GCDEPS = @GCDEPS@
GCINCS = @GCINCS@ GCINCS = @GCINCS@
GCLIBS = @GCLIBS@ GCLIBS = @GCLIBS@
GCOBJS = @GCOBJS@ GCOBJS = @GCOBJS@
GCSPEC = @GCSPEC@ GCSPEC = @GCSPEC@
LD = @LD@ LD = @LD@
LIBDATASTARTSPEC = @LIBDATASTARTSPEC@
LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@
LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@ LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@
LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@ LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@
...@@ -90,7 +92,6 @@ LN_S = @LN_S@ ...@@ -90,7 +92,6 @@ LN_S = @LN_S@
MAINT = @MAINT@ MAINT = @MAINT@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
NM = @NM@ NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@ PACKAGE = @PACKAGE@
PERL = @PERL@ PERL = @PERL@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
...@@ -100,6 +101,7 @@ THREADINCS = @THREADINCS@ ...@@ -100,6 +101,7 @@ THREADINCS = @THREADINCS@
THREADLIBS = @THREADLIBS@ THREADLIBS = @THREADLIBS@
THREADOBJS = @THREADOBJS@ THREADOBJS = @THREADOBJS@
THREADSPEC = @THREADSPEC@ THREADSPEC = @THREADSPEC@
USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
VERSION = @VERSION@ VERSION = @VERSION@
ZDEPS = @ZDEPS@ ZDEPS = @ZDEPS@
ZINCS = @ZINCS@ ZINCS = @ZINCS@
......
...@@ -11,8 +11,6 @@ details. */ ...@@ -11,8 +11,6 @@ details. */
#ifndef __GCJ_ARRAY_H__ #ifndef __GCJ_ARRAY_H__
#define __GCJ_ARRAY_H__ #define __GCJ_ARRAY_H__
#pragma interface
#include <java/lang/Object.h> #include <java/lang/Object.h>
extern "Java" { extern "Java" {
......
...@@ -18,4 +18,11 @@ _Jv_FromReflectedMethod(java::lang::reflect::Method *method) ...@@ -18,4 +18,11 @@ _Jv_FromReflectedMethod(java::lang::reflect::Method *method)
((char *) method->declaringClass->methods + method->offset); ((char *) method->declaringClass->methods + method->offset);
} }
extern inline jmethodID
_Jv_FromReflectedConstructor (java::lang::reflect::Constructor *constructor)
{
return (jmethodID)
((char *) constructor->declaringClass->methods + constructor->offset);
}
#endif /* __GCJ_METHOD_H__ */ #endif /* __GCJ_METHOD_H__ */
...@@ -76,12 +76,14 @@ DLLTOOL = @DLLTOOL@ ...@@ -76,12 +76,14 @@ DLLTOOL = @DLLTOOL@
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@ EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXCEPTIONSPEC = @EXCEPTIONSPEC@
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
FORCELIBGCCSPEC = @FORCELIBGCCSPEC@
GCDEPS = @GCDEPS@ GCDEPS = @GCDEPS@
GCINCS = @GCINCS@ GCINCS = @GCINCS@
GCLIBS = @GCLIBS@ GCLIBS = @GCLIBS@
GCOBJS = @GCOBJS@ GCOBJS = @GCOBJS@
GCSPEC = @GCSPEC@ GCSPEC = @GCSPEC@
LD = @LD@ LD = @LD@
LIBDATASTARTSPEC = @LIBDATASTARTSPEC@
LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@
LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@ LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@
LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@ LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@
...@@ -90,7 +92,6 @@ LN_S = @LN_S@ ...@@ -90,7 +92,6 @@ LN_S = @LN_S@
MAINT = @MAINT@ MAINT = @MAINT@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
NM = @NM@ NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@ PACKAGE = @PACKAGE@
PERL = @PERL@ PERL = @PERL@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
...@@ -100,6 +101,7 @@ THREADINCS = @THREADINCS@ ...@@ -100,6 +101,7 @@ THREADINCS = @THREADINCS@
THREADLIBS = @THREADLIBS@ THREADLIBS = @THREADLIBS@
THREADOBJS = @THREADOBJS@ THREADOBJS = @THREADOBJS@
THREADSPEC = @THREADSPEC@ THREADSPEC = @THREADSPEC@
USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
VERSION = @VERSION@ VERSION = @VERSION@
ZDEPS = @ZDEPS@ ZDEPS = @ZDEPS@
ZINCS = @ZINCS@ ZINCS = @ZINCS@
......
...@@ -53,6 +53,7 @@ _Jv_Utf8Const *_Jv_makeUtf8Const (char *s, int len); ...@@ -53,6 +53,7 @@ _Jv_Utf8Const *_Jv_makeUtf8Const (char *s, int len);
_Jv_Utf8Const *_Jv_makeUtf8Const (jstring string); _Jv_Utf8Const *_Jv_makeUtf8Const (jstring string);
extern jboolean _Jv_equalUtf8Consts (_Jv_Utf8Const *, _Jv_Utf8Const *); extern jboolean _Jv_equalUtf8Consts (_Jv_Utf8Const *, _Jv_Utf8Const *);
extern jboolean _Jv_equal (_Jv_Utf8Const *, jstring, jint); extern jboolean _Jv_equal (_Jv_Utf8Const *, jstring, jint);
extern jboolean _Jv_equaln (_Jv_Utf8Const *, jstring, jint);
#define StringClass _CL_Q34java4lang6String #define StringClass _CL_Q34java4lang6String
extern java::lang::Class StringClass; extern java::lang::Class StringClass;
...@@ -161,6 +162,13 @@ extern jclass _Jv_FindClass (_Jv_Utf8Const *name, ...@@ -161,6 +162,13 @@ extern jclass _Jv_FindClass (_Jv_Utf8Const *name,
java::lang::ClassLoader *loader); java::lang::ClassLoader *loader);
extern jclass _Jv_FindClassFromSignature (char *, extern jclass _Jv_FindClassFromSignature (char *,
java::lang::ClassLoader *loader); java::lang::ClassLoader *loader);
extern void _Jv_GetTypesFromSignature (jmethodID method,
jclass declaringClass,
JArray<jclass> **arg_types_out,
jclass *return_type_out);
extern jobject _Jv_CallNonvirtualMethodA (jobject, jclass,
jmethodID, jboolean,
JArray<jclass> *, jobjectArray);
extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims) extern jobject _Jv_NewMultiArray (jclass, jint ndims, jint* dims)
__attribute__((__malloc__)); __attribute__((__malloc__));
......
// Class.h - Header file for java.lang.Class. -*- c++ -*- // Class.h - Header file for java.lang.Class. -*- c++ -*-
/* Copyright (C) 1998, 1999 Cygnus Solutions /* Copyright (C) 1998, 1999, 2000 Cygnus Solutions
This file is part of libgcj. This file is part of libgcj.
...@@ -94,12 +94,16 @@ public: ...@@ -94,12 +94,16 @@ public:
java::lang::reflect::Field *getField (jstring); java::lang::reflect::Field *getField (jstring);
private: private:
jint _getFields (JArray<java::lang::reflect::Field *> *result, jint offset);
JArray<java::lang::reflect::Constructor *> *_getConstructors (jboolean);
java::lang::reflect::Field *getField (jstring, jint); java::lang::reflect::Field *getField (jstring, jint);
public: public:
JArray<java::lang::reflect::Field *> *getFields (void); JArray<java::lang::reflect::Field *> *getFields (void);
JArray<jclass> *getInterfaces (void); JArray<jclass> *getInterfaces (void);
void getSignature (java::lang::StringBuffer *buffer);
static jstring getSignature (JArray<jclass> *);
java::lang::reflect::Method *getMethod (jstring, JArray<jclass> *); java::lang::reflect::Method *getMethod (jstring, JArray<jclass> *);
JArray<java::lang::reflect::Method *> *getMethods (void); JArray<java::lang::reflect::Method *> *getMethods (void);
...@@ -156,6 +160,8 @@ private: ...@@ -156,6 +160,8 @@ private:
// Friend functions implemented in natClass.cc. // Friend functions implemented in natClass.cc.
friend _Jv_Method *_Jv_GetMethodLocal (jclass klass, _Jv_Utf8Const *name, friend _Jv_Method *_Jv_GetMethodLocal (jclass klass, _Jv_Utf8Const *name,
_Jv_Utf8Const *signature); _Jv_Utf8Const *signature);
friend _Jv_Method* _Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*);
friend void _Jv_InitClass (jclass klass); friend void _Jv_InitClass (jclass klass);
friend jfieldID JvGetFirstInstanceField (jclass); friend jfieldID JvGetFirstInstanceField (jclass);
...@@ -166,6 +172,7 @@ private: ...@@ -166,6 +172,7 @@ private:
friend jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv *, jclass, jfieldID); friend jobject _Jv_JNI_ToReflectedField (_Jv_JNIEnv *, jclass, jfieldID);
friend jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *); friend jfieldID _Jv_FromReflectedField (java::lang::reflect::Field *);
friend jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *); friend jmethodID _Jv_FromReflectedMethod (java::lang::reflect::Method *);
friend jmethodID _Jv_FromReflectedConstructor (java::lang::reflect::Constructor *);
friend class _Jv_PrimClass; friend class _Jv_PrimClass;
...@@ -190,8 +197,6 @@ private: ...@@ -190,8 +197,6 @@ private:
#ifdef INTERPRETER #ifdef INTERPRETER
friend jboolean _Jv_IsInterpretedClass (jclass); friend jboolean _Jv_IsInterpretedClass (jclass);
friend void _Jv_InitField (jobject, jclass, _Jv_Field*); friend void _Jv_InitField (jobject, jclass, _Jv_Field*);
friend _Jv_Method* _Jv_LookupDeclaredMethod (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*);
friend int _Jv_DetermineVTableIndex (jclass, _Jv_Utf8Const *, friend int _Jv_DetermineVTableIndex (jclass, _Jv_Utf8Const *,
_Jv_Utf8Const*); _Jv_Utf8Const*);
friend void _Jv_InitField (jobject, jclass, int); friend void _Jv_InitField (jobject, jclass, int);
......
// Class.java - Representation of a Java class. // Class.java - Representation of a Java class.
/* Copyright (C) 1998, 1999 Cygnus Solutions /* Copyright (C) 1998, 1999, 2000 Cygnus Solutions
This file is part of libgcj. This file is part of libgcj.
...@@ -36,14 +36,27 @@ public final class Class implements Serializable ...@@ -36,14 +36,27 @@ public final class Class implements Serializable
public native Constructor getConstructor (Class[] parameterTypes) public native Constructor getConstructor (Class[] parameterTypes)
throws NoSuchMethodException, SecurityException; throws NoSuchMethodException, SecurityException;
public native Constructor[] getConstructors () throws SecurityException;
public native Class[] getDeclaredClasses () throws SecurityException; // This is used to implement getConstructors and
// getDeclaredConstructors.
private native Constructor[] _getConstructors (boolean declared)
throws SecurityException;
public Constructor[] getConstructors () throws SecurityException
{
return _getConstructors (false);
}
public native Constructor getDeclaredConstructor (Class[] parameterTypes) public native Constructor getDeclaredConstructor (Class[] parameterTypes)
throws NoSuchMethodException, SecurityException; throws NoSuchMethodException, SecurityException;
public native Constructor[] getDeclaredConstructors ()
throws SecurityException; public native Class[] getDeclaredClasses () throws SecurityException;
public Constructor[] getDeclaredConstructors () throws SecurityException
{
return _getConstructors (true);
}
public native Field getDeclaredField (String fieldName) public native Field getDeclaredField (String fieldName)
throws NoSuchFieldException, SecurityException; throws NoSuchFieldException, SecurityException;
public native Field[] getDeclaredFields () throws SecurityException; public native Field[] getDeclaredFields () throws SecurityException;
...@@ -69,10 +82,15 @@ public final class Class implements Serializable ...@@ -69,10 +82,15 @@ public final class Class implements Serializable
throw new NoSuchFieldException(fieldName); throw new NoSuchFieldException(fieldName);
return fld; return fld;
} }
private native Field[] _getFields (Field[] result, int offset);
public native Field[] getFields () throws SecurityException; public native Field[] getFields () throws SecurityException;
public native Class[] getInterfaces (); public native Class[] getInterfaces ();
private final native void getSignature (StringBuffer buffer);
private static final native String getSignature (Class[] parameterTypes);
public native Method getMethod (String methodName, Class[] parameterTypes) public native Method getMethod (String methodName, Class[] parameterTypes)
throws NoSuchMethodException, SecurityException; throws NoSuchMethodException, SecurityException;
public native Method[] getMethods () throws SecurityException; public native Method[] getMethods () throws SecurityException;
......
...@@ -28,12 +28,12 @@ public final class Constructor extends AccessibleObject implements Member ...@@ -28,12 +28,12 @@ public final class Constructor extends AccessibleObject implements Member
if (! (obj instanceof Constructor)) if (! (obj instanceof Constructor))
return false; return false;
Constructor c = (Constructor) obj; Constructor c = (Constructor) obj;
return decl_class == c.decl_class && index == c.index; return declaringClass == c.declaringClass && offset == c.offset;
} }
public Class getDeclaringClass () public Class getDeclaringClass ()
{ {
return decl_class; return declaringClass;
} }
public Class[] getExceptionTypes () public Class[] getExceptionTypes ()
...@@ -41,40 +41,39 @@ public final class Constructor extends AccessibleObject implements Member ...@@ -41,40 +41,39 @@ public final class Constructor extends AccessibleObject implements Member
return (Class[]) exception_types.clone(); return (Class[]) exception_types.clone();
} }
public int getModifiers () public native int getModifiers ();
{
return modifiers;
}
public String getName () public String getName ()
{ {
return decl_class.getName(); return declaringClass.getName();
} }
public Class[] getParameterTypes () public Class[] getParameterTypes ()
{ {
if (parameter_types == null)
getType ();
return (Class[]) parameter_types.clone(); return (Class[]) parameter_types.clone();
} }
public int hashCode () public int hashCode ()
{ {
// FIXME. // FIXME.
return getName().hashCode(); return getName().hashCode() + declaringClass.getName().hashCode();
} }
// FIXME: this must be native. Should share implementation with // Update cached values from method descriptor in class.
// Method.invoke. private native void getType ();
public Object newInstance (Object[] args)
public native Object newInstance (Object[] args)
throws InstantiationException, IllegalAccessException, throws InstantiationException, IllegalAccessException,
IllegalArgumentException, InvocationTargetException IllegalArgumentException, InvocationTargetException;
{
return null;
}
public String toString () public String toString ()
{ {
if (parameter_types == null)
getType ();
StringBuffer b = new StringBuffer (); StringBuffer b = new StringBuffer ();
b.append(Modifier.toString(modifiers)); b.append(Modifier.toString(getModifiers()));
b.append(" "); b.append(" ");
b.append(getName()); b.append(getName());
b.append("("); b.append("(");
...@@ -88,19 +87,19 @@ public final class Constructor extends AccessibleObject implements Member ...@@ -88,19 +87,19 @@ public final class Constructor extends AccessibleObject implements Member
return b.toString(); return b.toString();
} }
// Can't create these. FIXME. // Can't create these.
private Constructor () private Constructor ()
{ {
} }
// Declaring class. // Declaring class.
private Class decl_class; private Class declaringClass;
// Exception types. // Exception types.
private Class[] exception_types; private Class[] exception_types;
// Modifiers.
private int modifiers;
// Parameter types. // Parameter types.
private Class[] parameter_types; private Class[] parameter_types;
// Index of this method in declaring class' method table.
private int index; // Offset in bytes from the start of declaringClass's methods array.
private int offset;
} }
...@@ -10,6 +10,8 @@ details. */ ...@@ -10,6 +10,8 @@ details. */
package java.lang.reflect; package java.lang.reflect;
import gnu.gcj.RawData;
/** /**
* @author Tom Tromey <tromey@cygnus.com> * @author Tom Tromey <tromey@cygnus.com>
* @date December 12, 1998 * @date December 12, 1998
...@@ -17,7 +19,7 @@ package java.lang.reflect; ...@@ -17,7 +19,7 @@ package java.lang.reflect;
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
* "The Java Language Specification", ISBN 0-201-63451-1 * "The Java Language Specification", ISBN 0-201-63451-1
* plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
* Status: Incomplete: invoke() needs to be finished. * Status: Complete, but not correct: access checks aren't done.
*/ */
public final class Method extends AccessibleObject implements Member public final class Method extends AccessibleObject implements Member
...@@ -66,6 +68,30 @@ public final class Method extends AccessibleObject implements Member ...@@ -66,6 +68,30 @@ public final class Method extends AccessibleObject implements Member
return name.hashCode() + declaringClass.getName().hashCode(); return name.hashCode() + declaringClass.getName().hashCode();
} }
// This is used to perform an actual method call via ffi.
private static final native void hack_call (RawData cif,
RawData method,
RawData ret_value,
RawData values);
// Perform an ffi call while capturing exceptions. We have to do
// this because we can't catch Java exceptions from C++.
static final Throwable hack_trampoline (RawData cif,
RawData method,
RawData ret_value,
RawData values)
{
try
{
hack_call (cif, method, ret_value, values);
}
catch (Throwable x)
{
return x;
}
return null;
}
public native Object invoke (Object obj, Object[] args) public native Object invoke (Object obj, Object[] args)
throws IllegalAccessException, IllegalArgumentException, throws IllegalAccessException, IllegalArgumentException,
InvocationTargetException; InvocationTargetException;
......
// natConstructor.cc - Native code for Constructor class.
/* Copyright (C) 1999, 2000 Cygnus Solutions
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 <jvm.h>
#include <java/lang/reflect/Constructor.h>
#include <java/lang/reflect/Method.h>
#include <java/lang/reflect/InvocationTargetException.h>
#include <java/lang/reflect/Modifier.h>
#include <java/lang/InstantiationException.h>
#include <gcj/method.h>
jint
java::lang::reflect::Constructor::getModifiers ()
{
return _Jv_FromReflectedConstructor (this)->accflags;
}
void
java::lang::reflect::Constructor::getType ()
{
_Jv_GetTypesFromSignature (_Jv_FromReflectedConstructor (this),
declaringClass,
&parameter_types,
NULL);
}
jobject
java::lang::reflect::Constructor::newInstance (jobjectArray args)
{
if (parameter_types == NULL)
getType ();
using namespace java::lang::reflect;
if (Modifier::isAbstract (declaringClass->getModifiers()))
JvThrow (new InstantiationException);
jmethodID meth = _Jv_FromReflectedConstructor (this);
// In the constructor case the return type is the type of the
// constructor.
return _Jv_CallNonvirtualMethodA (NULL, declaringClass, meth, true,
parameter_types, args);
}
...@@ -16,8 +16,6 @@ details. */ ...@@ -16,8 +16,6 @@ details. */
#include <string.h> #include <string.h>
#include <signal.h> #include <signal.h>
#pragma implementation "gcj/array.h"
#include <gcj/cni.h> #include <gcj/cni.h>
#include <jvm.h> #include <jvm.h>
#include <java-signal.h> #include <java-signal.h>
...@@ -143,6 +141,26 @@ _Jv_equal (Utf8Const* a, jstring str, jint hash) ...@@ -143,6 +141,26 @@ _Jv_equal (Utf8Const* a, jstring str, jint hash)
return true; return true;
} }
/* Like _Jv_equal, but stop after N characters. */
jboolean
_Jv_equaln (Utf8Const *a, jstring str, jint n)
{
jint len = str->length();
jint i = 0;
jchar *sptr = _Jv_GetStringChars (str);
register unsigned char* ptr = (unsigned char*) a->data;
register unsigned char* limit = ptr + a->length;
for (; n-- > 0; i++, sptr++)
{
int ch = UTF8_GET (ptr, limit);
if (i == len)
return ch < 0;
if (ch != *sptr)
return false;
}
return true;
}
/* Count the number of Unicode chars encoded in a given Ut8 string. */ /* Count the number of Unicode chars encoded in a given Ut8 string. */
int int
_Jv_strLengthUtf8(char* str, int len) _Jv_strLengthUtf8(char* str, int len)
......
...@@ -321,21 +321,6 @@ _Jv_ResolveField (_Jv_Field *field, java::lang::ClassLoader *loader) ...@@ -321,21 +321,6 @@ _Jv_ResolveField (_Jv_Field *field, java::lang::ClassLoader *loader)
} }
} }
_Jv_Method*
_Jv_LookupDeclaredMethod (jclass klass, _Jv_Utf8Const *name,
_Jv_Utf8Const *signature)
{
for (; klass; klass = klass->getSuperclass())
{
_Jv_Method *meth = _Jv_GetMethodLocal (klass, name, signature);
if (meth)
return meth;
}
return NULL;
}
/** FIXME: this is a terribly inefficient algorithm! It would improve /** FIXME: this is a terribly inefficient algorithm! It would improve
things if compiled classes to know vtable offset, and _Jv_Method had things if compiled classes to know vtable offset, and _Jv_Method had
a field for this. a field for this.
......
...@@ -76,12 +76,14 @@ DLLTOOL = @DLLTOOL@ ...@@ -76,12 +76,14 @@ DLLTOOL = @DLLTOOL@
EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@ EH_COMMON_INCLUDE = @EH_COMMON_INCLUDE@
EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXCEPTIONSPEC = @EXCEPTIONSPEC@
EXEEXT = @EXEEXT@ EXEEXT = @EXEEXT@
FORCELIBGCCSPEC = @FORCELIBGCCSPEC@
GCDEPS = @GCDEPS@ GCDEPS = @GCDEPS@
GCINCS = @GCINCS@ GCINCS = @GCINCS@
GCLIBS = @GCLIBS@ GCLIBS = @GCLIBS@
GCOBJS = @GCOBJS@ GCOBJS = @GCOBJS@
GCSPEC = @GCSPEC@ GCSPEC = @GCSPEC@
LD = @LD@ LD = @LD@
LIBDATASTARTSPEC = @LIBDATASTARTSPEC@
LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@ LIBGCJ_CFLAGS = @LIBGCJ_CFLAGS@
LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@ LIBGCJ_CXXFLAGS = @LIBGCJ_CXXFLAGS@
LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@ LIBGCJ_JAVAFLAGS = @LIBGCJ_JAVAFLAGS@
...@@ -90,7 +92,6 @@ LN_S = @LN_S@ ...@@ -90,7 +92,6 @@ LN_S = @LN_S@
MAINT = @MAINT@ MAINT = @MAINT@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
NM = @NM@ NM = @NM@
OBJDUMP = @OBJDUMP@
PACKAGE = @PACKAGE@ PACKAGE = @PACKAGE@
PERL = @PERL@ PERL = @PERL@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
...@@ -100,6 +101,7 @@ THREADINCS = @THREADINCS@ ...@@ -100,6 +101,7 @@ THREADINCS = @THREADINCS@
THREADLIBS = @THREADLIBS@ THREADLIBS = @THREADLIBS@
THREADOBJS = @THREADOBJS@ THREADOBJS = @THREADOBJS@
THREADSPEC = @THREADSPEC@ THREADSPEC = @THREADSPEC@
USE_SYMBOL_UNDERSCORE = @USE_SYMBOL_UNDERSCORE@
VERSION = @VERSION@ VERSION = @VERSION@
ZDEPS = @ZDEPS@ ZDEPS = @ZDEPS@
ZINCS = @ZINCS@ ZINCS = @ZINCS@
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment