зеркало из https://github.com/mono/ikvm-fork.git
- Removed "slow" reflection.
- Removed MethodWrapper.Invoke(). - Removed FieldWrapper.GetValue()/SetValue(). - Added ICustomInvoke for the few MethodWrappers that still require custom reflection invocation.
This commit is contained in:
Родитель
6bce58f1bc
Коммит
99d296d322
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче