From 99d296d322c0c2081812dc8e0f99f8085a7dda00 Mon Sep 17 00:00:00 2001 From: jfrijters Date: Thu, 21 Aug 2008 06:53:48 +0000 Subject: [PATCH] - Removed "slow" reflection. - Removed MethodWrapper.Invoke(). - Removed FieldWrapper.GetValue()/SetValue(). - Added ICustomInvoke for the few MethodWrappers that still require custom reflection invocation. --- runtime/MemberWrapper.cs | 158 +----------------- runtime/TypeWrapper.cs | 141 ++++------------ runtime/openjdk.cs | 340 ++++----------------------------------- 3 files changed, 65 insertions(+), 574 deletions(-) diff --git a/runtime/MemberWrapper.cs b/runtime/MemberWrapper.cs index e73dafec..9db761aa 100644 --- a/runtime/MemberWrapper.cs +++ b/runtime/MemberWrapper.cs @@ -276,6 +276,13 @@ namespace IKVM.Internal } } + interface ICustomInvoke + { +#if !STATIC_COMPILER && !FIRST_PASS + object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID); +#endif + } + abstract class MethodWrapper : MemberWrapper { #if !STATIC_COMPILER && !FIRST_PASS @@ -347,18 +354,6 @@ namespace IKVM.Internal ilgen.Emit(OpCodes.Call, ghostMethod); } #endif - -#if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - object wrapper = Activator.CreateInstance(DeclaringType.TypeAsSignatureType); - DeclaringType.GhostRefField.SetValue(wrapper, obj); - - ResolveGhostMethod(); - return InvokeImpl(ghostMethod, wrapper, args, nonVirtual, callerID); - } -#endif // !STATIC_COMPILER } internal static MethodWrapper Create(TypeWrapper declaringType, string name, string sig, MethodBase method, TypeWrapper returnType, TypeWrapper[] parameterTypes, Modifiers modifiers, MemberFlags flags) @@ -825,14 +820,6 @@ namespace IKVM.Internal #endif // !STATIC_COMPILER #if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal virtual object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - AssertLinked(); - ResolveMethod(); - return InvokeImpl(method, obj, args, nonVirtual, callerID); - } - internal void ResolveMethod() { #if !COMPACT_FRAMEWORK @@ -1509,28 +1496,6 @@ namespace IKVM.Internal } } - internal virtual void SetValue(object obj, object val) - { - AssertLinked(); - ResolveField(); - if(fieldType.IsGhost) - { - object temp = field.GetValue(obj); - fieldType.GhostRefField.SetValue(temp, val); - val = temp; - } - try - { - field.SetValue(obj, val); - } - catch(FieldAccessException x) - { -#if !FIRST_PASS - throw new java.lang.IllegalAccessException(x.Message); -#endif - } - } - internal object GetFieldAccessorJNI() { #if FIRST_PASS @@ -1544,22 +1509,6 @@ namespace IKVM.Internal #endif } #endif // !STATIC_COMPILER - - internal virtual object GetValue(object obj) - { - AssertLinked(); -#if STATIC_COMPILER - return field.GetValue(null); -#else - ResolveField(); - object val = field.GetValue(obj); - if(fieldType.IsGhost) - { - val = fieldType.GhostRefField.GetValue(val); - } - return val; -#endif // STATIC_COMPILER - } } sealed class SimpleFieldWrapper : FieldWrapper @@ -1700,24 +1649,6 @@ namespace IKVM.Internal return prop; } -#if !STATIC_COMPILER - internal override object GetValue(object obj) - { - return prop.GetValue(obj, null); - } - - internal override void SetValue(object obj, object val) - { - if(FieldTypeWrapper.IsGhost) - { - object temp = GetValue(obj); - FieldTypeWrapper.GhostRefField.SetValue(temp, val); - val = temp; - } - prop.SetValue(obj, val, null); - } -#endif - #if !COMPACT_FRAMEWORK protected override void EmitGetImpl(CodeEmitter ilgen) { @@ -1833,26 +1764,6 @@ namespace IKVM.Internal #endif } -#if !STATIC_COMPILER && !FIRST_PASS - internal override object GetValue(object obj) - { - if(getter == null) - { - throw new global::java.lang.NoSuchMethodError(); - } - return getter.Invoke(obj, new object[0], false, null); - } - - internal override void SetValue(object obj, object val) - { - if(setter == null) - { - throw new global::java.lang.NoSuchMethodError(); - } - setter.Invoke(obj, new object[] { val }, false, null); - } -#endif - protected override void EmitGetImpl(CodeEmitter ilgen) { if(getter == null) @@ -1938,26 +1849,6 @@ namespace IKVM.Internal this.property = property; } -#if !STATIC_COMPILER && !FIRST_PASS - internal override object GetValue(object obj) - { - if (!property.CanRead) - { - throw new global::java.lang.NoSuchMethodError(); - } - return property.GetValue(obj, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetProperty, null, null, null); - } - - internal override void SetValue(object obj, object val) - { - if(!property.CanWrite) - { - throw new global::java.lang.NoSuchMethodError(); - } - property.SetValue(obj, val, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetProperty, null, null, null); - } -#endif - protected override void EmitGetImpl(CodeEmitter ilgen) { MethodInfo getter = property.GetGetMethod(true); @@ -2116,13 +2007,6 @@ namespace IKVM.Internal } return constant; } - - internal override object GetValue(object obj) - { - // on a non-broken CLR GetValue on a literal will not trigger type initialization, but on Java it should - DeclaringType.RunClassInit(); - return GetConstantValue(); - } } #if !COMPACT_FRAMEWORK @@ -2209,20 +2093,6 @@ namespace IKVM.Internal { ilgen.Emit(OpCodes.Call, setter); } - -#if !STATIC_COMPILER - internal override object GetValue(object obj) - { - // We're MemberFlags.HideFromReflection, so we should never be called - throw new InvalidOperationException(); - } - - internal override void SetValue(object obj, object val) - { - // We're MemberFlags.HideFromReflection, so we should never be called - throw new InvalidOperationException(); - } -#endif // !STATIC_COMPILER } #endif @@ -2265,19 +2135,5 @@ namespace IKVM.Internal ilgen.Emit(OpCodes.Call, setter); } #endif - -#if !STATIC_COMPILER - internal override object GetValue(object obj) - { - // We're MemberFlags.HideFromReflection, so we should never be called - throw new InvalidOperationException(); - } - - internal override void SetValue(object obj, object val) - { - // We're MemberFlags.HideFromReflection, so we should never be called - throw new InvalidOperationException(); - } -#endif // !STATIC_COMPILER } } diff --git a/runtime/TypeWrapper.cs b/runtime/TypeWrapper.cs index 3c53f978..435ccbac 100644 --- a/runtime/TypeWrapper.cs +++ b/runtime/TypeWrapper.cs @@ -9157,7 +9157,7 @@ namespace IKVM.Internal SetFields(fields.ToArray()); } - private class CompiledRemappedMethodWrapper : SmartMethodWrapper + private class CompiledRemappedMethodWrapper : SmartMethodWrapper, ICustomInvoke { private MethodInfo mbHelper; #if !STATIC_COMPILER @@ -9221,7 +9221,7 @@ namespace IKVM.Internal #if !STATIC_COMPILER && !FIRST_PASS [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) + object ICustomInvoke.Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) { MethodBase mb; if(nonVirtual) @@ -9950,7 +9950,7 @@ namespace IKVM.Internal } } - private class DynamicOnlyMethodWrapper : MethodWrapper + private class DynamicOnlyMethodWrapper : MethodWrapper, ICustomInvoke { internal DynamicOnlyMethodWrapper(TypeWrapper declaringType, string name, string sig, TypeWrapper returnType, TypeWrapper[] parameterTypes) : base(declaringType, name, sig, null, returnType, parameterTypes, Modifiers.Public | Modifiers.Abstract, MemberFlags.None) @@ -9966,11 +9966,19 @@ namespace IKVM.Internal } #if !STATIC_COMPILER && !FIRST_PASS - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) + object ICustomInvoke.Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) { - return TypeWrapper.FromClass(NativeCode.ikvm.runtime.Util.getClassFromObject(obj)) - .GetMethodWrapper(this.Name, this.Signature, true) - .Invoke(obj, args, false, callerID); + // a DynamicOnlyMethodWrapper is an interface method, but now that we've been called on an actual object instance, + // we can resolve to a real method and call that instead + TypeWrapper tw = TypeWrapper.FromClass(NativeCode.ikvm.runtime.Util.getClassFromObject(obj)); + MethodWrapper mw = tw.GetMethodWrapper(this.Name, this.Signature, true); + if(mw == null) + { + throw new java.lang.AbstractMethodError(tw.Name + "." + this.Name + this.Signature); + } + java.lang.reflect.Method m = (java.lang.reflect.Method)mw.ToMethodOrConstructor(true); + m.@override = true; + return m.invoke(obj, args, callerID); } #endif // !STATIC_COMPILER && !FIRST_PASS } @@ -10003,6 +10011,11 @@ namespace IKVM.Internal #endif } + internal object GetUnspecifiedValue() + { + return ((EnumFieldWrapper)GetFieldWrapper("__unspecified", this.SigName)).GetValue(); + } + private class EnumFieldWrapper : FieldWrapper { private readonly int ordinal; @@ -10014,7 +10027,7 @@ namespace IKVM.Internal this.ordinal = ordinal; } - internal override object GetValue(object unused) + internal object GetValue() { if(val == null) { @@ -10039,7 +10052,7 @@ namespace IKVM.Internal } } - private class EnumValuesMethodWrapper : MethodWrapper + private class EnumValuesMethodWrapper : MethodWrapper, ICustomInvoke { internal EnumValuesMethodWrapper(TypeWrapper declaringType) : base(declaringType, "values", "()[" + declaringType.SigName, null, declaringType.MakeArrayType(1), TypeWrapper.EmptyArray, Modifiers.Public | Modifiers.Static, MemberFlags.None) @@ -10055,20 +10068,20 @@ namespace IKVM.Internal } #if !STATIC_COMPILER && !FIRST_PASS - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) + object ICustomInvoke.Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) { FieldWrapper[] values = this.DeclaringType.GetFields(); object[] array = (object[])Array.CreateInstance(this.DeclaringType.TypeAsArrayType, values.Length); for(int i = 0; i < values.Length; i++) { - array[i] = values[i].GetValue(null); + array[i] = ((EnumFieldWrapper)values[i]).GetValue(); } return array; } #endif // !STATIC_COMPILER && !FIRST_PASS } - private class EnumValueOfMethodWrapper : MethodWrapper + private class EnumValueOfMethodWrapper : MethodWrapper, ICustomInvoke { internal EnumValueOfMethodWrapper(TypeWrapper declaringType) : base(declaringType, "valueOf", "(Ljava.lang.String;)" + declaringType.SigName, null, declaringType, new TypeWrapper[] { CoreClasses.java.lang.String.Wrapper }, Modifiers.Public | Modifiers.Static, MemberFlags.None) @@ -10084,14 +10097,14 @@ namespace IKVM.Internal } #if !STATIC_COMPILER && !FIRST_PASS - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) + object ICustomInvoke.Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) { FieldWrapper[] values = this.DeclaringType.GetFields(); for(int i = 0; i < values.Length; i++) { if(values[i].Name.Equals(args[0])) { - return values[i].GetValue(null); + return ((EnumFieldWrapper)values[i]).GetValue(); } } throw new java.lang.IllegalArgumentException("" + args[0]); @@ -10463,7 +10476,8 @@ namespace IKVM.Internal } else if(mw.ReturnType is EnumEnumTypeWrapper) { - return mw.ReturnType.GetFieldWrapper("__unspecified", mw.ReturnType.SigName).GetValue(null); + EnumEnumTypeWrapper eetw = (EnumEnumTypeWrapper)mw.ReturnType; + return eetw.GetUnspecifiedValue(); } else if(mw.ReturnType.IsArray) { @@ -11157,15 +11171,6 @@ namespace IKVM.Internal } } #endif - -#if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - // TODO map exceptions - return Delegate.CreateDelegate(DeclaringType.TypeAsTBD, args[0], "Invoke"); - } -#endif // !STATIC_COMPILER && !FIRST_PASS } private class ByRefMethodWrapper : SmartMethodWrapper @@ -11234,35 +11239,6 @@ namespace IKVM.Internal base.PreEmit(ilgen); } #endif - -#if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - object[] newargs = (object[])args.Clone(); - for(int i = 0; i < newargs.Length; i++) - { - if(byrefs[i]) - { - newargs[i] = ((Array)args[i]).GetValue(0); - } - } - try - { - return base.Invoke(obj, newargs, nonVirtual, callerID); - } - finally - { - for(int i = 0; i < newargs.Length; i++) - { - if(byrefs[i]) - { - ((Array)args[i]).SetValue(newargs[i], 0); - } - } - } - } -#endif // !STATIC_COMPILER && !FIRST_PASS } internal static bool IsVisible(Type type) @@ -11285,14 +11261,6 @@ namespace IKVM.Internal // result in our argument being boxed (since that's still sitting on the stack). } #endif - -#if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - return Enum.ToObject(DeclaringType.TypeAsTBD, ((IConvertible)args[0]).ToInt64(null)); - } -#endif // !STATIC_COMPILER && !FIRST_PASS } internal class EnumValueFieldWrapper : FieldWrapper @@ -11325,16 +11293,6 @@ namespace IKVM.Internal } #endif -#if !STATIC_COMPILER - internal override void SetValue(object obj, object val) - { - // NOTE even though the field is final, JNI reflection can still be used to set its value! - // NOTE the CLI spec says that an enum has exactly one instance field, so we take advantage of that fact. - FieldInfo f = DeclaringType.TypeAsTBD.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)[0]; - f.SetValue(obj, val); - } -#endif // !STATIC_COMPILER - // this method takes a boxed Enum and returns its value as a boxed primitive // of the subset of Java primitives (i.e. byte, short, int, long) internal static object GetEnumPrimitiveValue(object obj) @@ -11374,13 +11332,6 @@ namespace IKVM.Internal throw new InvalidOperationException(); } } - -#if !STATIC_COMPILER - internal override object GetValue(object obj) - { - return GetEnumPrimitiveValue(obj); - } -#endif // !STATIC_COMPILER } private class ValueTypeDefaultCtor : MethodWrapper @@ -11398,18 +11349,6 @@ namespace IKVM.Internal ilgen.Emit(OpCodes.Box, DeclaringType.TypeAsTBD); } #endif - -#if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - if(obj == null) - { - obj = Activator.CreateInstance(DeclaringType.TypeAsTBD); - } - return obj; - } -#endif // !STATIC_COMPILER && !FIRST_PASS } private class FinalizeMethodWrapper : MethodWrapper @@ -11428,13 +11367,6 @@ namespace IKVM.Internal { ilgen.Emit(OpCodes.Pop); } - -#if !STATIC_COMPILER && !FIRST_PASS - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - return null; - } -#endif // !STATIC_COMPILER && !FIRST_PASS } private class CloneMethodWrapper : MethodWrapper @@ -11463,13 +11395,6 @@ namespace IKVM.Internal { EmitCall(ilgen); } - -#if !STATIC_COMPILER && !FIRST_PASS - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - return CoreClasses.java.lang.Object.Wrapper.GetMethodWrapper(Name, Signature, false).Invoke(obj, args, nonVirtual, callerID); - } -#endif // !STATIC_COMPILER && !FIRST_PASS } protected override void LazyPublishMembers() @@ -11730,14 +11655,6 @@ namespace IKVM.Internal m.EmitCallvirt(ilgen); } #endif - -#if !STATIC_COMPILER && !FIRST_PASS - [HideFromJava] - internal override object Invoke(object obj, object[] args, bool nonVirtual, ikvm.@internal.CallerID callerID) - { - return m.Invoke(obj, args, nonVirtual, callerID); - } -#endif // !STATIC_COMPILER && !FIRST_PASS } internal static bool IsUnsupportedAbstractMethod(MethodBase mb) diff --git a/runtime/openjdk.cs b/runtime/openjdk.cs index 03e9a814..cc931b68 100644 --- a/runtime/openjdk.cs +++ b/runtime/openjdk.cs @@ -120,27 +120,6 @@ using ssaGetPropertyAction = sun.security.action.GetPropertyAction; using sndResolverConfigurationImpl = sun.net.dns.ResolverConfigurationImpl; #endif -static class DynamicMethodSupport -{ - internal static readonly bool Enabled = IsFullTrust; - - private static bool IsFullTrust - { - get - { - try - { - new System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode).Demand(); - return true; - } - catch (System.Security.SecurityException) - { - return false; - } - } - } -} - namespace IKVM.Runtime { public static class Assertions @@ -871,14 +850,7 @@ namespace IKVM.NativeCode.java #if FIRST_PASS return null; #else - if (DynamicMethodSupport.Enabled) - { - return new FastFieldReflector((jiObjectStreamField[])fieldsObj); - } - else - { - return null; - } + return new FastFieldReflector((jiObjectStreamField[])fieldsObj); #endif } } @@ -5844,7 +5816,7 @@ namespace IKVM.NativeCode.sun.reflect object retval; try { - retval = mw.Invoke(obj, args, false, callerID); + retval = ((ICustomInvoke)mw).Invoke(obj, args, false, callerID); } catch (MethodAccessException x) { @@ -6242,7 +6214,7 @@ namespace IKVM.NativeCode.sun.reflect args = ConvertArgs(mw.GetParameters(), args); try { - return mw.Invoke(null, args, false, null); + return ((ICustomInvoke)mw).Invoke(null, args, false, null); } catch (MethodAccessException x) { @@ -6331,53 +6303,6 @@ namespace IKVM.NativeCode.sun.reflect } } - private sealed class SerializationConstructorAccessorImpl : srConstructorAccessor - { - private Type type; - private MethodWrapper constructor; - - internal SerializationConstructorAccessorImpl(jlrConstructor constructorToCall, jlClass classToInstantiate) - { - constructor = MethodWrapper.FromMethodOrConstructor(constructorToCall); - try - { - TypeWrapper wrapper = TypeWrapper.FromClass(classToInstantiate); - wrapper.Finish(); - type = wrapper.TypeAsBaseType; - } - catch (RetargetableJavaException x) - { - throw x.ToJava(); - } - } - - [IKVM.Attributes.HideFromJava] - public object newInstance(object[] args) - { - // if we're trying to deserialize a string as a TC_OBJECT, just return an emtpy string (Sun does the same) - if (type == typeof(string)) - { - return ""; - } - args = ConvertArgs(constructor.GetParameters(), args); - try - { - object obj = FormatterServices.GetUninitializedObject(type); - constructor.Invoke(obj, args, false, null); - return obj; - } - catch (RetargetableJavaException x) - { - throw x.ToJava(); - } - catch (MethodAccessException x) - { - // this can happen if we're calling a non-public method and the call stack doesn't have ReflectionPermission.MemberAccess - throw new jlIllegalAccessException().initCause(x); - } - } - } - private sealed class FastSerializationConstructorAccessorImpl : srConstructorAccessor { private static readonly MethodInfo GetTypeFromHandleMethod = typeof(Type).GetMethod("GetTypeFromHandle", new Type[] { typeof(RuntimeTypeHandle) }); @@ -6388,6 +6313,10 @@ namespace IKVM.NativeCode.sun.reflect internal FastSerializationConstructorAccessorImpl(jlrConstructor constructorToCall, jlClass classToInstantiate) { MethodWrapper constructor = MethodWrapper.FromMethodOrConstructor(constructorToCall); + if (constructor.GetParameters().Length != 0) + { + throw new NotImplementedException("Serialization constructor cannot have parameters"); + } constructor.Link(); constructor.ResolveMethod(); Type type; @@ -6432,50 +6361,6 @@ namespace IKVM.NativeCode.sun.reflect runInit = fw.DeclaringType.IsInterface; } - private object getImpl(object obj) - { - // if the field is an interface field, we must explicitly run , - // because .NET reflection doesn't - if (runInit) - { - fw.DeclaringType.RunClassInit(); - runInit = false; - } - if (!fw.IsStatic && !fw.DeclaringType.IsInstance(obj)) - { - if (obj == null) - { - throw new jlNullPointerException(); - } - throw new jlIllegalArgumentException(); - } - return fw.GetValue(obj); - } - - private void setImpl(object obj, object value) - { - // if the field is an interface field, we must explicitly run , - // because .NET reflection doesn't - if (runInit) - { - fw.DeclaringType.RunClassInit(); - runInit = false; - } - if (isFinal) - { - throw new jlIllegalAccessException(); - } - if (!fw.IsStatic && !fw.DeclaringType.IsInstance(obj)) - { - if (obj == null) - { - throw new jlNullPointerException(); - } - throw new jlIllegalArgumentException(); - } - fw.SetValue(obj, value); - } - public virtual bool getBoolean(object obj) { throw new jlIllegalArgumentException(); @@ -6559,7 +6444,7 @@ namespace IKVM.NativeCode.sun.reflect public abstract object get(object obj); public abstract void set(object obj, object value); - private class ObjectField : FieldAccessorImplBase + private abstract class ObjectField : FieldAccessorImplBase { private readonly jlClass fieldType; @@ -6568,20 +6453,6 @@ namespace IKVM.NativeCode.sun.reflect { fieldType = field.getType(); } - - public override object get(object obj) - { - return getImpl(obj); - } - - public override void set(object obj, object value) - { - if (value != null && !fieldType.isInstance(value)) - { - throw new jlIllegalArgumentException(); - } - setImpl(obj, value); - } } private class ByteField : FieldAccessorImplBase @@ -6591,11 +6462,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override byte getByte(object obj) - { - return (byte)getImpl(obj); - } - public sealed override short getShort(object obj) { return (sbyte)getByte(obj); @@ -6634,11 +6500,6 @@ namespace IKVM.NativeCode.sun.reflect } setByte(obj, ((jlByte)val).byteValue()); } - - public override void setByte(object obj, byte b) - { - setImpl(obj, b); - } } private class BooleanField : FieldAccessorImplBase @@ -6648,11 +6509,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override bool getBoolean(object obj) - { - return (bool)getImpl(obj); - } - public sealed override object get(object obj) { return jlBoolean.valueOf(getBoolean(obj)); @@ -6666,11 +6522,6 @@ namespace IKVM.NativeCode.sun.reflect } setBoolean(obj, ((jlBoolean)val).booleanValue()); } - - public override void setBoolean(object obj, bool b) - { - setImpl(obj, b); - } } private class CharField : FieldAccessorImplBase @@ -6680,11 +6531,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override char getChar(object obj) - { - return (char)getImpl(obj); - } - public sealed override int getInt(object obj) { return getChar(obj); @@ -6717,11 +6563,6 @@ namespace IKVM.NativeCode.sun.reflect else throw new jlIllegalArgumentException(); } - - public override void setChar(object obj, char c) - { - setImpl(obj, c); - } } private class ShortField : FieldAccessorImplBase @@ -6731,11 +6572,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override short getShort(object obj) - { - return (short)getImpl(obj); - } - public sealed override int getInt(object obj) { return getShort(obj); @@ -6774,11 +6610,6 @@ namespace IKVM.NativeCode.sun.reflect { setShort(obj, (sbyte)b); } - - public override void setShort(object obj, short s) - { - setImpl(obj, s); - } } private class IntField : FieldAccessorImplBase @@ -6788,11 +6619,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override int getInt(object obj) - { - return (int)getImpl(obj); - } - public sealed override long getLong(object obj) { return getInt(obj); @@ -6839,11 +6665,6 @@ namespace IKVM.NativeCode.sun.reflect { setInt(obj, s); } - - public override void setInt(object obj, int i) - { - setImpl(obj, i); - } } private class FloatField : FieldAccessorImplBase @@ -6853,11 +6674,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override float getFloat(object obj) - { - return (float)getImpl(obj); - } - public sealed override double getDouble(object obj) { return getFloat(obj); @@ -6906,11 +6722,6 @@ namespace IKVM.NativeCode.sun.reflect { setFloat(obj, l); } - - public override void setFloat(object obj, float f) - { - setImpl(obj, f); - } } private class LongField : FieldAccessorImplBase @@ -6920,11 +6731,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override long getLong(object obj) - { - return (long)getImpl(obj); - } - public sealed override float getFloat(object obj) { return getLong(obj); @@ -6940,11 +6746,6 @@ namespace IKVM.NativeCode.sun.reflect return jlLong.valueOf(getLong(obj)); } - public override void setLong(object obj, long l) - { - setImpl(obj, l); - } - public sealed override void set(object obj, object val) { if (val is jlLong @@ -6986,11 +6787,6 @@ namespace IKVM.NativeCode.sun.reflect { } - public override double getDouble(object obj) - { - return (double)getImpl(obj); - } - public override object get(object obj) { return jlDouble.valueOf(getDouble(obj)); @@ -7040,11 +6836,6 @@ namespace IKVM.NativeCode.sun.reflect { setDouble(obj, f); } - - public override void setDouble(object obj, double d) - { - setImpl(obj, d); - } } private static Delegate GenerateFastGetter(Type delegateType, Type fieldType, FieldWrapper fw) @@ -7548,104 +7339,41 @@ namespace IKVM.NativeCode.sun.reflect { if (type == jlByte.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastByteFieldAccessor(field, overrideAccessCheck); - } - else - { - return new ByteField(field, overrideAccessCheck); - } + return new FastByteFieldAccessor(field, overrideAccessCheck); } if (type == jlBoolean.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastBooleanFieldAccessor(field, overrideAccessCheck); - } - else - { - return new BooleanField(field, overrideAccessCheck); - } + return new FastBooleanFieldAccessor(field, overrideAccessCheck); } if (type == jlCharacter.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastCharFieldAccessor(field, overrideAccessCheck); - } - else - { - return new CharField(field, overrideAccessCheck); - } + return new FastCharFieldAccessor(field, overrideAccessCheck); } if (type == jlShort.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastShortFieldAccessor(field, overrideAccessCheck); - } - else - { - return new ShortField(field, overrideAccessCheck); - } + return new FastShortFieldAccessor(field, overrideAccessCheck); } if (type == jlInteger.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastIntegerFieldAccessor(field, overrideAccessCheck); - } - else - { - return new IntField(field, overrideAccessCheck); - } + return new FastIntegerFieldAccessor(field, overrideAccessCheck); } if (type == jlFloat.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastFloatFieldAccessor(field, overrideAccessCheck); - } - else - { - return new FloatField(field, overrideAccessCheck); - } + return new FastFloatFieldAccessor(field, overrideAccessCheck); } if (type == jlLong.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastLongFieldAccessor(field, overrideAccessCheck); - } - else - { - return new LongField(field, overrideAccessCheck); - } + return new FastLongFieldAccessor(field, overrideAccessCheck); } if (type == jlDouble.TYPE) { - if (DynamicMethodSupport.Enabled) - { - return new FastDoubleFieldAccessor(field, overrideAccessCheck); - } - else - { - return new DoubleField(field, overrideAccessCheck); - } + return new FastDoubleFieldAccessor(field, overrideAccessCheck); } throw new InvalidOperationException("field type: " + type); } else { - if (DynamicMethodSupport.Enabled) - { - return new FastObjectFieldAccessor(field, overrideAccessCheck); - } - else - { - return new ObjectField(field, overrideAccessCheck); - } + return new FastObjectFieldAccessor(field, overrideAccessCheck); } } } @@ -7666,16 +7394,15 @@ namespace IKVM.NativeCode.sun.reflect return null; #else jlrMethod m = (jlrMethod)method; - if (DynamicMethodSupport.Enabled) + MethodWrapper mw = MethodWrapper.FromMethodOrConstructor(method); + if (mw is ICustomInvoke) { - MethodWrapper mw = MethodWrapper.FromMethodOrConstructor(method); - TypeWrapper tw = TypeWrapper.FromClass(m.getDeclaringClass()); - if (!mw.IsDynamicOnly && !tw.IsRemapped) - { - return new FastMethodAccessorImpl(m, false); - } + return new MethodAccessorImpl(m); + } + else + { + return new FastMethodAccessorImpl(m, false); } - return new MethodAccessorImpl(m); #endif } @@ -7685,14 +7412,14 @@ namespace IKVM.NativeCode.sun.reflect return null; #else jlrConstructor cons = (jlrConstructor)constructor; - if (DynamicMethodSupport.Enabled - && !MethodWrapper.FromMethodOrConstructor(constructor).IsDynamicOnly) + MethodWrapper mw = MethodWrapper.FromMethodOrConstructor(constructor); + if (mw is ICustomInvoke) { - return new FastConstructorAccessorImpl(cons); + return new ConstructorAccessorImpl(cons); } else { - return new ConstructorAccessorImpl(cons); + return new FastConstructorAccessorImpl(cons); } #endif } @@ -7703,16 +7430,7 @@ namespace IKVM.NativeCode.sun.reflect return null; #else jlrConstructor cons = (jlrConstructor)constructorToCall; - if (DynamicMethodSupport.Enabled - && cons.getParameterTypes().Length == 0 - && !MethodWrapper.FromMethodOrConstructor(constructorToCall).IsDynamicOnly) - { - return new FastSerializationConstructorAccessorImpl(cons, (jlClass)classToInstantiate); - } - else - { - return new SerializationConstructorAccessorImpl(cons, (jlClass)classToInstantiate); - } + return new FastSerializationConstructorAccessorImpl(cons, (jlClass)classToInstantiate); #endif } }