Commit b9b5672b by Bryce McKinlay Committed by Bryce McKinlay

Constructor.java (toString): Avoid extra whitespace on constructor with no modifiers.

2003-10-26  Bryce McKinlay  <bryce@mckinlay.net.nz>

	* java/lang/reflect/Constructor.java (toString): Avoid extra
	whitespace on constructor with no modifiers.
	* java/lang/reflect/natConstructor.java (newInstance): Look up
	caller and perform accessibility check only if constructor is
	non-public and accessible flag is not set.

2003-10-26  Bryce McKinlay  <bryce@mckinlay.net.nz>

	* jni.cc (_Jv_JNI_CallAnyMethodV, _Jv_JNI_CallAnyMethodA,
	_Jv_JNI_CallAnyVoidMethodV, _Jv_JNI_CallAnyVoidMethodA): Don't
	use _Jv_LookupDeclaredMethod(). Call _Jv_CallAnyMethodA with
	is_virtual_call argument.
	* include/jvm.h (_Jv_isVirtualMethod): Moved and renamed from
	natClass.cc.
	* java/lang/natClass.cc (_Jv_LayoutVTableMethods): Use
	_Jv_isVirtualMethod.
	* java/lang/reflect/natMethod.cc (invoke): Don't use
	_Jv_LookupDeclaredMethod.
	(_Jv_CallAnyMethodA): New is_virtual_call argument. If specified,
	look up method in target object's vtable.

From-SVN: r72942
parent 077a148b
2003-10-26 Bryce McKinlay <bryce@mckinlay.net.nz>
* java/lang/reflect/Constructor.java (toString): Avoid extra
whitespace on constructor with no modifiers.
* java/lang/reflect/natConstructor.java (newInstance): Look up
caller and perform accessibility check only if constructor is
non-public and accessible flag is not set.
2003-10-26 Bryce McKinlay <bryce@mckinlay.net.nz>
* jni.cc (_Jv_JNI_CallAnyMethodV, _Jv_JNI_CallAnyMethodA,
_Jv_JNI_CallAnyVoidMethodV, _Jv_JNI_CallAnyVoidMethodA): Don't
use _Jv_LookupDeclaredMethod(). Call _Jv_CallAnyMethodA with
is_virtual_call argument.
* include/jvm.h (_Jv_isVirtualMethod): Moved and renamed from
natClass.cc.
* java/lang/natClass.cc (_Jv_LayoutVTableMethods): Use
_Jv_isVirtualMethod.
* java/lang/reflect/natMethod.cc (invoke): Don't use
_Jv_LookupDeclaredMethod.
(_Jv_CallAnyMethodA): New is_virtual_call argument. If specified,
look up method in target object's vtable.
2003-10-25 Graydon Hoare <graydon@redhat.com> 2003-10-25 Graydon Hoare <graydon@redhat.com>
* gnu/java/awt/ClasspathToolkit.java: New abstract class. * gnu/java/awt/ClasspathToolkit.java: New abstract class.
......
...@@ -335,6 +335,14 @@ _Jv_VTable::new_vtable (int count) ...@@ -335,6 +335,14 @@ _Jv_VTable::new_vtable (int count)
return (_Jv_VTable *) _Jv_AllocBytes (size); return (_Jv_VTable *) _Jv_AllocBytes (size);
} }
// Determine if METH gets an entry in a VTable.
static inline jboolean _Jv_isVirtualMethod (_Jv_Method *meth)
{
using namespace java::lang::reflect;
return (((meth->accflags & (Modifier::STATIC | Modifier::PRIVATE)) == 0)
&& meth->name->data[0] != '<');
}
// This function is used to determine the hash code of an object. // This function is used to determine the hash code of an object.
inline jint inline jint
_Jv_HashCode (jobject obj) _Jv_HashCode (jobject obj)
...@@ -418,6 +426,7 @@ extern void _Jv_CallAnyMethodA (jobject obj, ...@@ -418,6 +426,7 @@ extern void _Jv_CallAnyMethodA (jobject obj,
jclass return_type, jclass return_type,
jmethodID meth, jmethodID meth,
jboolean is_constructor, jboolean is_constructor,
jboolean is_virtual_call,
JArray<jclass> *parameter_types, JArray<jclass> *parameter_types,
jvalue *args, jvalue *args,
jvalue *result, jvalue *result,
......
...@@ -1779,16 +1779,6 @@ _Jv_linkExceptionClassTable (jclass self) ...@@ -1779,16 +1779,6 @@ _Jv_linkExceptionClassTable (jclass self)
self->catch_classes->classname = (_Jv_Utf8Const *)-1; self->catch_classes->classname = (_Jv_Utf8Const *)-1;
} }
// Returns true if METH should get an entry in a VTable.
static jboolean
isVirtualMethod (_Jv_Method *meth)
{
using namespace java::lang::reflect;
return (((meth->accflags & (Modifier::STATIC | Modifier::PRIVATE)) == 0)
&& meth->name->data[0] != '<');
}
// This is put in empty vtable slots. // This is put in empty vtable slots.
static void static void
_Jv_abstractMethodError (void) _Jv_abstractMethodError (void)
...@@ -1842,7 +1832,7 @@ _Jv_LayoutVTableMethods (jclass klass) ...@@ -1842,7 +1832,7 @@ _Jv_LayoutVTableMethods (jclass klass)
_Jv_Method *meth = &klass->methods[i]; _Jv_Method *meth = &klass->methods[i];
_Jv_Method *super_meth = NULL; _Jv_Method *super_meth = NULL;
if (! isVirtualMethod (meth)) if (! _Jv_isVirtualMethod (meth))
continue; continue;
if (superclass != NULL) if (superclass != NULL)
......
...@@ -151,8 +151,12 @@ public final class Constructor extends AccessibleObject implements Member ...@@ -151,8 +151,12 @@ public final class Constructor extends AccessibleObject implements Member
if (parameter_types == null) if (parameter_types == null)
getType (); getType ();
StringBuffer b = new StringBuffer (); StringBuffer b = new StringBuffer ();
Modifier.toString(getModifiers(), b); int mods = getModifiers();
b.append(" "); if (mods != 0)
{
Modifier.toString(mods, b);
b.append(" ");
}
Method.appendClassName (b, declaringClass); Method.appendClassName (b, declaringClass);
b.append("("); b.append("(");
for (int i = 0; i < parameter_types.length; ++i) for (int i = 0; i < parameter_types.length; ++i)
......
...@@ -45,34 +45,39 @@ java::lang::reflect::Constructor::getType () ...@@ -45,34 +45,39 @@ java::lang::reflect::Constructor::getType ()
jobject jobject
java::lang::reflect::Constructor::newInstance (jobjectArray args) java::lang::reflect::Constructor::newInstance (jobjectArray args)
{ {
using namespace java::lang::reflect;
if (parameter_types == NULL) if (parameter_types == NULL)
getType (); getType ();
gnu::gcj::runtime::StackTrace *t jmethodID meth = _Jv_FromReflectedConstructor (this);
= new gnu::gcj::runtime::StackTrace(4);
Class *caller = NULL; // Check accessibility, if required.
try if (! (Modifier::isPublic (meth->accflags) || this->isAccessible()))
{ {
for (int i = 1; !caller; i++) gnu::gcj::runtime::StackTrace *t
= new gnu::gcj::runtime::StackTrace(4);
Class *caller = NULL;
try
{
for (int i = 1; !caller; i++)
{
caller = t->classAt (i);
}
}
catch (::java::lang::ArrayIndexOutOfBoundsException *e)
{ {
caller = t->classAt (i);
} }
}
catch (::java::lang::ArrayIndexOutOfBoundsException *e)
{
}
if (! isAccessible() && ! _Jv_CheckAccess(caller, declaringClass, if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags))
declaringClass->getModifiers())) throw new IllegalAccessException;
throw new java::lang::IllegalAccessException; }
using namespace java::lang::reflect;
if (Modifier::isAbstract (declaringClass->getModifiers())) if (Modifier::isAbstract (declaringClass->getModifiers()))
throw new InstantiationException; throw new InstantiationException;
_Jv_InitClass (declaringClass); _Jv_InitClass (declaringClass);
jmethodID meth = _Jv_FromReflectedConstructor (this);
// In the constructor case the return type is the type of the // In the constructor case the return type is the type of the
// constructor. // constructor.
return _Jv_CallAnyMethodA (NULL, declaringClass, meth, true, return _Jv_CallAnyMethodA (NULL, declaringClass, meth, true,
......
...@@ -149,26 +149,22 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args) ...@@ -149,26 +149,22 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
jmethodID meth = _Jv_FromReflectedMethod (this); jmethodID meth = _Jv_FromReflectedMethod (this);
jclass klass; jclass objClass;
if (! Modifier::isStatic(meth->accflags))
{ if (Modifier::isStatic(meth->accflags))
if (! obj)
throw new java::lang::NullPointerException;
klass = obj->getClass();
if (! declaringClass->isAssignableFrom(klass))
throw new java::lang::IllegalArgumentException;
// Find the possibly overloaded method based on the runtime type
// of the object.
meth = _Jv_LookupDeclaredMethod (klass, meth->name, meth->signature);
}
else
{ {
// We have to initialize a static class. It is safe to do this // We have to initialize a static class. It is safe to do this
// here and not in _Jv_CallAnyMethodA because JNI initializes a // here and not in _Jv_CallAnyMethodA because JNI initializes a
// class whenever a method lookup is done. // class whenever a method lookup is done.
_Jv_InitClass (declaringClass); _Jv_InitClass (declaringClass);
klass = declaringClass; objClass = declaringClass;
}
else
{
objClass = JV_CLASS (obj);
if (! _Jv_IsAssignableFrom (declaringClass, objClass))
throw new java::lang::IllegalArgumentException;
} }
// Check accessibility, if required. // Check accessibility, if required.
...@@ -188,7 +184,7 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args) ...@@ -188,7 +184,7 @@ java::lang::reflect::Method::invoke (jobject obj, jobjectArray args)
{ {
} }
if (! _Jv_CheckAccess(caller, klass, meth->accflags)) if (! _Jv_CheckAccess(caller, objClass, meth->accflags))
throw new IllegalAccessException; throw new IllegalAccessException;
} }
...@@ -341,6 +337,7 @@ _Jv_CallAnyMethodA (jobject obj, ...@@ -341,6 +337,7 @@ _Jv_CallAnyMethodA (jobject obj,
jclass return_type, jclass return_type,
jmethodID meth, jmethodID meth,
jboolean is_constructor, jboolean is_constructor,
jboolean is_virtual_call,
JArray<jclass> *parameter_types, JArray<jclass> *parameter_types,
jvalue *args, jvalue *args,
jvalue *result, jvalue *result,
...@@ -465,9 +462,21 @@ _Jv_CallAnyMethodA (jobject obj, ...@@ -465,9 +462,21 @@ _Jv_CallAnyMethodA (jobject obj,
break; break;
} }
void *ncode;
if (is_virtual_call)
{
_Jv_VTable *vtable = *(_Jv_VTable **) obj;
ncode = vtable->get_method (meth->index);
}
else
{
ncode = meth->ncode;
}
try try
{ {
ffi_call (&cif, (void (*)()) meth->ncode, &ffi_result, values); ffi_call (&cif, (void (*)()) ncode, &ffi_result, values);
} }
catch (Throwable *ex) catch (Throwable *ex)
{ {
...@@ -599,6 +608,7 @@ _Jv_CallAnyMethodA (jobject obj, ...@@ -599,6 +608,7 @@ _Jv_CallAnyMethodA (jobject obj,
jvalue ret_value; jvalue ret_value;
_Jv_CallAnyMethodA (obj, return_type, meth, is_constructor, _Jv_CallAnyMethodA (obj, return_type, meth, is_constructor,
_Jv_isVirtualMethod (meth),
parameter_types, argvals, &ret_value, parameter_types, argvals, &ret_value,
false); false);
......
...@@ -767,9 +767,6 @@ static T ...@@ -767,9 +767,6 @@ static T
obj = unwrap (obj); obj = unwrap (obj);
klass = unwrap (klass); klass = unwrap (klass);
if (style == normal)
id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
jclass decl_class = klass ? klass : obj->getClass (); jclass decl_class = klass ? klass : obj->getClass ();
JvAssert (decl_class != NULL); JvAssert (decl_class != NULL);
...@@ -791,6 +788,7 @@ static T ...@@ -791,6 +788,7 @@ static T
jvalue result; jvalue result;
_Jv_CallAnyMethodA (obj, return_type, id, _Jv_CallAnyMethodA (obj, return_type, id,
style == constructor, style == constructor,
style == normal,
arg_types, args, &result); arg_types, args, &result);
return wrap_value (env, extract_from_jvalue<T>(result)); return wrap_value (env, extract_from_jvalue<T>(result));
...@@ -826,9 +824,6 @@ static T ...@@ -826,9 +824,6 @@ static T
obj = unwrap (obj); obj = unwrap (obj);
klass = unwrap (klass); klass = unwrap (klass);
if (style == normal)
id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
jclass decl_class = klass ? klass : obj->getClass (); jclass decl_class = klass ? klass : obj->getClass ();
JvAssert (decl_class != NULL); JvAssert (decl_class != NULL);
...@@ -857,6 +852,7 @@ static T ...@@ -857,6 +852,7 @@ static T
jvalue result; jvalue result;
_Jv_CallAnyMethodA (obj, return_type, id, _Jv_CallAnyMethodA (obj, return_type, id,
style == constructor, style == constructor,
style == normal,
arg_types, arg_copy, &result); arg_types, arg_copy, &result);
return wrap_value (env, extract_from_jvalue<T>(result)); return wrap_value (env, extract_from_jvalue<T>(result));
...@@ -877,9 +873,6 @@ static void ...@@ -877,9 +873,6 @@ static void
obj = unwrap (obj); obj = unwrap (obj);
klass = unwrap (klass); klass = unwrap (klass);
if (style == normal)
id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
jclass decl_class = klass ? klass : obj->getClass (); jclass decl_class = klass ? klass : obj->getClass ();
JvAssert (decl_class != NULL); JvAssert (decl_class != NULL);
...@@ -899,6 +892,7 @@ static void ...@@ -899,6 +892,7 @@ static void
_Jv_CallAnyMethodA (obj, return_type, id, _Jv_CallAnyMethodA (obj, return_type, id,
style == constructor, style == constructor,
style == normal,
arg_types, args, NULL); arg_types, args, NULL);
} }
catch (jthrowable t) catch (jthrowable t)
...@@ -924,9 +918,6 @@ static void ...@@ -924,9 +918,6 @@ static void
(JNICALL _Jv_JNI_CallAnyVoidMethodA) (JNIEnv *env, jobject obj, jclass klass, (JNICALL _Jv_JNI_CallAnyVoidMethodA) (JNIEnv *env, jobject obj, jclass klass,
jmethodID id, jvalue *args) jmethodID id, jvalue *args)
{ {
if (style == normal)
id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
jclass decl_class = klass ? klass : obj->getClass (); jclass decl_class = klass ? klass : obj->getClass ();
JvAssert (decl_class != NULL); JvAssert (decl_class != NULL);
...@@ -950,6 +941,7 @@ static void ...@@ -950,6 +941,7 @@ static void
_Jv_CallAnyMethodA (obj, return_type, id, _Jv_CallAnyMethodA (obj, return_type, id,
style == constructor, style == constructor,
style == normal,
arg_types, args, NULL); arg_types, args, NULL);
} }
catch (jthrowable t) catch (jthrowable t)
......
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