- Removed MethodWrapper.Invoke().
- Removed FieldWrapper.GetValue()/SetValue().
- Added ICustomInvoke for the few MethodWrappers that still require custom reflection invocation.
This commit is contained in:
jfrijters 2008-08-21 06:53:48 +00:00
Родитель 6bce58f1bc
Коммит 99d296d322
3 изменённых файлов: 65 добавлений и 574 удалений

Просмотреть файл

@ -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
}
}

Просмотреть файл

@ -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)

Просмотреть файл

@ -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 <clinit>,
// 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 <clinit>,
// 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
}
}