44#if FIRST_PASS == false
46 static SystemAccessor systemAccessor;
48 static SystemAccessor SystemAccessor =>
JVM.
Internal.BaseAccessors.Get(
ref systemAccessor);
54 static object ConvertPrimitive(RuntimeJavaType tw,
object value)
58 if (value is global::java.lang.Boolean
boolean)
59 return boolean.booleanValue();
63 if (value is global::java.lang.Byte @
byte)
64 return @
byte.byteValue();
68 if (value is global::java.lang.Character character)
69 return character.charValue();
73 if (value is global::java.lang.Short || value is global::java.lang.Byte)
75 return ((global::java.lang.Number)value).shortValue();
80 if (value is global::java.lang.Integer || value is global::java.lang.Short || value is global::java.lang.Byte)
82 return ((global::java.lang.Number)value).intValue();
84 else if (value is global::java.lang.Character)
86 return (
int)((global::java.lang.Character)value).charValue();
91 if (value is global::java.lang.Long || value is global::java.lang.Integer || value is global::java.lang.Short || value is global::java.lang.Byte)
93 return ((global::java.lang.Number)value).longValue();
95 else if (value is global::java.lang.Character)
97 return (
long)((global::java.lang.Character)value).charValue();
102 if (value is global::java.lang.Float || value is global::java.lang.Long || value is global::java.lang.Integer || value is global::java.lang.Short || value is global::java.lang.Byte)
104 return ((global::java.lang.Number)value).floatValue();
106 else if (value is global::java.lang.Character)
108 return (
float)((global::java.lang.Character)value).charValue();
113 if (value is global::java.lang.Double || value is global::java.lang.Float || value is global::java.lang.Long || value is global::java.lang.Integer || value is global::java.lang.Short || value is global::java.lang.Byte)
115 return ((global::java.lang.Number)value).doubleValue();
117 else if (value is global::java.lang.Character)
119 return (
double)((global::java.lang.Character)value).charValue();
122 throw new global::java.lang.IllegalArgumentException();
125 static object[] ConvertArgs(
RuntimeClassLoader loader, RuntimeJavaType[] argumentTypes,
object[] args)
127 var nargs =
new object[args ==
null ? 0 : args.Length];
128 if (nargs.Length != argumentTypes.Length)
129 throw new global::java.lang.IllegalArgumentException(
"wrong number of arguments");
131 for (
int i = 0; i < nargs.Length; i++)
133 if (argumentTypes[i].IsPrimitive)
135 nargs[i] = ConvertPrimitive(argumentTypes[i], args[i]);
139 if (args[i] !=
null && !argumentTypes[i].EnsureLoadable(loader).IsInstance(args[i]))
140 throw new global::java.lang.IllegalArgumentException();
142 nargs[i] = argumentTypes[i].GhostWrap(args[i]);
149 sealed class MethodAccessorImpl : global::sun.reflect.MethodAccessor
160 this.mw = mw ??
throw new ArgumentNullException(nameof(mw));
166 public object invoke(
object obj,
object[] args, global::ikvm.@
internal.
CallerID callerID)
170 if (!mw.IsStatic && !mw.DeclaringType.IsInstance(obj))
173 throw new global::java.lang.NullPointerException();
175 throw new global::java.lang.IllegalArgumentException(
"object is not an instance of declaring class");
180 args = ConvertArgs(mw.DeclaringType.ClassLoader, mw.GetParameters(), args);
182 catch (InvalidCastException e)
184 throw new global::java.lang.IllegalArgumentException(e);
186 catch (NullReferenceException e)
188 throw new global::java.lang.IllegalArgumentException(e);
193 if (mw.DeclaringType.IsInterface)
194 mw.DeclaringType.RunClassInit();
202 retval = mw.Invoke(obj, args);
206 throw new global::java.lang.reflect.InvocationTargetException(global::ikvm.runtime.Util.mapException(e));
209 if (mw.ReturnType.IsPrimitive && mw.ReturnType != mw.DeclaringType.Context.PrimitiveJavaTypeFactory.VOID)
210 retval =
JVM.Box(retval);
212 retval = mw.ReturnType.GhostUnwrap(retval);
216 catch (NullReferenceException e)
218 Console.Error.WriteLine(
"got nre " + e);
221 catch (global::java.lang.NullPointerException e)
223 Console.Error.WriteLine(
"got npe " + e);
229 sealed class ConstructorAccessorImpl : global::sun.reflect.ConstructorAccessor
246 public object newInstance(
object[] args)
248 args = ConvertArgs(mw.DeclaringType.ClassLoader, mw.GetParameters(), args);
251 return mw.CreateInstance(args);
255 throw new global::java.lang.reflect.InvocationTargetException(global::ikvm.runtime.Util.mapException(x));
260 sealed class SerializationConstructorAccessorImpl : global::sun.reflect.ConstructorAccessor
271 internal SerializationConstructorAccessorImpl(global::java.lang.reflect.Constructor constructorToCall, global::java.lang.Class classToInstantiate)
273 this.type = RuntimeJavaType.FromClass(classToInstantiate).TypeAsBaseType;
275 if (mw.DeclaringType !=
JVM.Context.
JavaBase.TypeOfJavaLangObject)
284 [SecuritySafeCritical]
285 public object newInstance(
object[] args)
288 var obj = FormatterServices.GetUninitializedObject(type);
290 var obj = RuntimeHelpers.GetUninitializedObject(type);
293 mw.Invoke(obj, ConvertArgs(mw.DeclaringType.ClassLoader, mw.GetParameters(), args));
305 static readonly
MethodInfo valueOfByte = typeof(global::java.lang.Byte).GetMethod(
"valueOf",
new Type[] { typeof(
byte) });
306 static readonly
MethodInfo valueOfBoolean = typeof(global::java.lang.Boolean).GetMethod(
"valueOf",
new Type[] { typeof(
bool) });
307 static readonly
MethodInfo valueOfChar = typeof(global::java.lang.Character).GetMethod(
"valueOf",
new Type[] { typeof(
char) });
308 static readonly
MethodInfo valueOfShort = typeof(global::java.lang.Short).GetMethod(
"valueOf",
new Type[] { typeof(
short) });
309 static readonly
MethodInfo valueOfInt = typeof(global::java.lang.Integer).GetMethod(
"valueOf",
new Type[] { typeof(
int) });
310 static readonly
MethodInfo valueOfFloat = typeof(global::java.lang.Float).GetMethod(
"valueOf",
new Type[] { typeof(
float) });
311 static readonly
MethodInfo valueOfLong = typeof(global::java.lang.Long).GetMethod(
"valueOf",
new Type[] { typeof(
long) });
312 static readonly
MethodInfo valueOfDouble = typeof(global::java.lang.Double).GetMethod(
"valueOf",
new Type[] { typeof(
double) });
313 static readonly
MethodInfo byteValue = typeof(global::java.lang.Byte).GetMethod(
"byteValue",
Type.EmptyTypes);
314 static readonly
MethodInfo booleanValue = typeof(global::java.lang.Boolean).GetMethod(
"booleanValue",
Type.EmptyTypes);
315 static readonly
MethodInfo charValue = typeof(global::java.lang.Character).GetMethod(
"charValue",
Type.EmptyTypes);
316 static readonly
MethodInfo shortValue = typeof(global::java.lang.Short).GetMethod(
"shortValue",
Type.EmptyTypes);
317 static readonly
MethodInfo intValue = typeof(global::java.lang.Integer).GetMethod(
"intValue",
Type.EmptyTypes);
318 static readonly
MethodInfo floatValue = typeof(global::java.lang.Float).GetMethod(
"floatValue",
Type.EmptyTypes);
319 static readonly
MethodInfo longValue = typeof(global::java.lang.Long).GetMethod(
"longValue",
Type.EmptyTypes);
320 static readonly
MethodInfo doubleValue = typeof(global::java.lang.Double).GetMethod(
"doubleValue",
Type.EmptyTypes);
322 internal static void EmitUnboxArg(
CodeEmitter ilgen, RuntimeJavaType type)
326 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Byte));
327 ilgen.Emit(OpCodes.Call, byteValue);
331 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Boolean));
332 ilgen.Emit(OpCodes.Call, booleanValue);
336 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Character));
337 ilgen.Emit(OpCodes.Call, charValue);
345 ilgen.Emit(OpCodes.Dup);
346 ilgen.Emit(OpCodes.Isinst, typeof(global::java.lang.Byte));
348 ilgen.EmitBrfalse(next);
349 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Byte));
350 ilgen.Emit(OpCodes.Call, byteValue);
351 ilgen.Emit(OpCodes.Conv_I1);
355 ilgen.MarkLabel(next);
358 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Short));
359 ilgen.Emit(OpCodes.Call, shortValue);
363 ilgen.Emit(OpCodes.Dup);
364 ilgen.Emit(OpCodes.Isinst, typeof(global::java.lang.Short));
365 next = ilgen.DefineLabel();
366 ilgen.EmitBrfalse(next);
367 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Short));
368 ilgen.Emit(OpCodes.Call, shortValue);
371 ilgen.MarkLabel(next);
372 ilgen.Emit(OpCodes.Dup);
373 ilgen.Emit(OpCodes.Isinst, typeof(global::java.lang.Character));
374 next = ilgen.DefineLabel();
375 ilgen.EmitBrfalse(next);
376 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Character));
377 ilgen.Emit(OpCodes.Call, charValue);
380 ilgen.MarkLabel(next);
383 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Integer));
384 ilgen.Emit(OpCodes.Call, intValue);
388 ilgen.Emit(OpCodes.Dup);
389 ilgen.Emit(OpCodes.Isinst, typeof(global::java.lang.Integer));
390 next = ilgen.DefineLabel();
391 ilgen.EmitBrfalse(next);
392 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Integer));
393 ilgen.Emit(OpCodes.Call, intValue);
396 ilgen.MarkLabel(next);
399 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Long));
400 ilgen.Emit(OpCodes.Call, longValue);
404 ilgen.Emit(OpCodes.Dup);
405 ilgen.Emit(OpCodes.Isinst, typeof(global::java.lang.Long));
406 next = ilgen.DefineLabel();
407 ilgen.EmitBrfalse(next);
408 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Long));
409 ilgen.Emit(OpCodes.Call, longValue);
412 ilgen.MarkLabel(next);
415 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Float));
416 ilgen.Emit(OpCodes.Call, floatValue);
420 ilgen.Emit(OpCodes.Dup);
421 ilgen.Emit(OpCodes.Isinst, typeof(global::java.lang.Float));
422 next = ilgen.DefineLabel();
423 ilgen.EmitBrfalse(next);
424 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Float));
425 ilgen.Emit(OpCodes.Call, floatValue);
427 ilgen.MarkLabel(next);
428 ilgen.Emit(OpCodes.Castclass, typeof(global::java.lang.Double));
429 ilgen.Emit(OpCodes.Call, doubleValue);
433 throw new InvalidOperationException();
438 ilgen.MarkLabel(done);
442 type.EmitCheckcast(ilgen);
446 internal static void BoxReturnValue(
CodeEmitter ilgen, RuntimeJavaType type)
450 ilgen.Emit(OpCodes.Ldnull);
454 ilgen.Emit(OpCodes.Call, valueOfByte);
458 ilgen.Emit(OpCodes.Call, valueOfBoolean);
462 ilgen.Emit(OpCodes.Call, valueOfChar);
466 ilgen.Emit(OpCodes.Call, valueOfShort);
470 ilgen.Emit(OpCodes.Call, valueOfInt);
474 ilgen.Emit(OpCodes.Call, valueOfFloat);
478 ilgen.Emit(OpCodes.Call, valueOfLong);
482 ilgen.Emit(OpCodes.Call, valueOfDouble);
486 static void Expand(
CodeEmitter ilgen, RuntimeJavaType type)
490 ilgen.Emit(OpCodes.Conv_R4);
494 ilgen.Emit(OpCodes.Conv_I8);
498 ilgen.Emit(OpCodes.Conv_R8);
506 sealed class FastMethodAccessorImpl : global::sun.reflect.MethodAccessor
510 internal static readonly
ConstructorInfo nullPointerExceptionWithMessageCtor;
512 internal static readonly
ConstructorInfo illegalArgumentExceptionWithMessageCtor;
513 internal static readonly
ConstructorInfo illegalArgumentExceptionWithMessageAndCauseCtor;
514 internal static readonly
ConstructorInfo illegalArgumentExceptionWithCauseCtor;
515 internal static readonly
ConstructorInfo invocationTargetExceptionWithCauseCtor;
517 delegate
object Invoker(
object obj,
object[] args, global::ikvm.@
internal.
CallerID callerID);
523 static FastMethodAccessorImpl()
525 nullPointerExceptionCtor = typeof(global::java.lang.NullPointerException).GetConstructor(
Type.EmptyTypes);
526 nullPointerExceptionWithMessageCtor = typeof(global::java.lang.NullPointerException).GetConstructor(
new[] { typeof(
string) });
527 illegalArgumentExceptionCtor = typeof(global::java.lang.IllegalArgumentException).GetConstructor(
Type.EmptyTypes);
528 illegalArgumentExceptionWithMessageCtor = typeof(global::java.lang.IllegalArgumentException).GetConstructor(
new[] { typeof(
string) });
529 illegalArgumentExceptionWithMessageAndCauseCtor = typeof(global::java.lang.IllegalArgumentException).GetConstructor(
new[] { typeof(
string), typeof(Exception) });
530 illegalArgumentExceptionWithCauseCtor = typeof(global::java.lang.IllegalArgumentException).GetConstructor(
new[] { typeof(Exception) });
531 invocationTargetExceptionWithCauseCtor = typeof(global::java.lang.reflect.InvocationTargetException).GetConstructor(
new[] { typeof(Exception) });
534 sealed class RunClassInit
537 readonly FastMethodAccessorImpl outer;
538 readonly RuntimeJavaType tw;
539 readonly Invoker invoker;
547 internal RunClassInit(FastMethodAccessorImpl outer, RuntimeJavaType tw, Invoker invoker)
551 this.invoker = invoker;
555 internal object invoke(
object obj,
object[] args, global::ikvm.@
internal.
CallerID callerID)
561 outer.invoker = invoker;
562 return invoker(obj, args, callerID);
575 mw.DeclaringType.Finish();
576 var parameters = mw.GetParameters();
578 for (
int i = 0; i < parameters.Length; i++)
580 parameters[i] = parameters[i].EnsureLoadable(mw.DeclaringType.ClassLoader);
581 parameters[i].Finish();
588 var np = !mw.IsPublic || !mw.DeclaringType.IsPublic;
589 var dm =
DynamicMethodUtil.Create($
"__<FastMethodAccessor>__{mw.DeclaringType.Name.Replace(".
", "_
")}__{mw.Name}", mw.DeclaringType.TypeAsBaseType, np, typeof(
object),
new[] { typeof(
object), typeof(
object[]), typeof(global::ikvm.@
internal.
CallerID) });
593 var postLabel = il.DefineLabel();
601 if (mw.IsStatic ==
false)
604 s = il.AllocTempLocal(mw.DeclaringType.TypeAsSignatureType);
607 var endIsNullLabel = il.DefineLabel();
608 il.Emit(OpCodes.Ldarg_0);
609 il.Emit(OpCodes.Ldnull);
610 il.EmitBne_Un(endIsNullLabel);
611 il.Emit(OpCodes.Ldstr,
"object is not an instance of declaring class");
612 il.Emit(OpCodes.Newobj, nullPointerExceptionWithMessageCtor);
613 il.Emit(OpCodes.Throw);
614 il.MarkLabel(endIsNullLabel);
617 var e = il.AllocTempLocal(typeof(Exception));
620 var endConvSelf = il.DefineLabel();
621 il.BeginExceptionBlock();
622 il.Emit(OpCodes.Ldarg_0);
623 mw.DeclaringType.EmitCheckcast(il);
624 mw.DeclaringType.EmitConvStackTypeToSignatureType(il,
null);
625 il.Emit(OpCodes.Stloc, s);
626 il.EmitLeave(endConvSelf);
629 il.BeginCatchBlock(typeof(InvalidCastException));
630 il.Emit(OpCodes.Stloc, e);
631 il.Emit(OpCodes.Ldstr,
"object is not an instance of declaring class");
632 il.Emit(OpCodes.Ldloc, e);
633 il.Emit(OpCodes.Newobj, illegalArgumentExceptionWithMessageAndCauseCtor);
634 il.Emit(OpCodes.Throw);
637 il.BeginCatchBlock(typeof(Exception));
638 il.Emit(OpCodes.Newobj, illegalArgumentExceptionWithCauseCtor);
639 il.Emit(OpCodes.Throw);
642 il.EndExceptionBlock();
643 il.MarkLabel(endConvSelf);
644 il.ReleaseTempLocal(e);
648 var convArgsLabel = il.DefineLabel();
651 if (parameters.Length == 0)
653 il.Emit(OpCodes.Ldarg_1);
654 il.EmitBrfalse(convArgsLabel);
658 var chckArgsLabel = il.DefineLabel();
659 il.Emit(OpCodes.Ldarg_1);
660 il.Emit(OpCodes.Ldnull);
661 il.EmitBne_Un(chckArgsLabel);
662 il.Emit(OpCodes.Ldstr,
"wrong number of arguments");
663 il.Emit(OpCodes.Newobj, illegalArgumentExceptionWithMessageCtor);
664 il.Emit(OpCodes.Throw);
667 il.MarkLabel(chckArgsLabel);
668 il.Emit(OpCodes.Ldarg_1);
669 il.Emit(OpCodes.Ldlen);
670 il.EmitLdc_I4(parameters.Length);
671 il.EmitBeq(convArgsLabel);
672 il.Emit(OpCodes.Ldstr,
"wrong number of arguments");
673 il.Emit(OpCodes.Newobj, illegalArgumentExceptionWithMessageCtor);
674 il.Emit(OpCodes.Throw);
677 il.MarkLabel(convArgsLabel);
680 for (var i = 0; i < parameters.Length; i++)
682 var tw = parameters[i];
685 var o = p[n++] = il.AllocTempLocal(tw.TypeAsSignatureType);
688 var e = il.AllocTempLocal(typeof(Exception));
691 var endConvArgn = il.DefineLabel();
692 il.BeginExceptionBlock();
693 il.Emit(OpCodes.Ldarg_1);
695 il.Emit(OpCodes.Ldelem_Ref);
696 BoxUtil.EmitUnboxArg(il, tw);
697 tw.EmitConvStackTypeToSignatureType(il,
null);
698 il.Emit(OpCodes.Stloc, o);
699 il.EmitLeave(endConvArgn);
702 il.BeginCatchBlock(typeof(InvalidCastException));
703 il.Emit(OpCodes.Stloc, e);
704 il.Emit(OpCodes.Ldstr, $
"argument type mismatch on parameter {i}");
705 il.Emit(OpCodes.Ldloc, e);
706 il.Emit(OpCodes.Newobj, illegalArgumentExceptionWithMessageAndCauseCtor);
707 il.Emit(OpCodes.Throw);
710 il.BeginCatchBlock(typeof(Exception));
711 il.Emit(OpCodes.Stloc, e);
712 il.Emit(OpCodes.Ldstr, $
"exception on parameter {i}");
713 il.Emit(OpCodes.Ldloc, e);
714 il.Emit(OpCodes.Newobj, illegalArgumentExceptionWithMessageAndCauseCtor);
715 il.Emit(OpCodes.Throw);
718 il.EndExceptionBlock();
719 il.MarkLabel(endConvArgn);
720 il.ReleaseTempLocal(e);
724 var rt = il.AllocTempLocal(typeof(
object));
727 il.BeginExceptionBlock();
733 if (mw.DeclaringType.IsNonPrimitiveValueType || mw.DeclaringType.IsGhost)
734 il.Emit(OpCodes.Ldloca, s);
736 il.Emit(OpCodes.Ldloc, s);
739 il.ReleaseTempLocal(s);
743 for (
int i = 0; i < n; i++)
745 il.Emit(OpCodes.Ldloc, p[i]);
746 il.ReleaseTempLocal(p[i]);
751 il.Emit(OpCodes.Ldarg_2);
757 mw.EmitCallvirtReflect(il);
760 mw.ReturnType.EmitConvSignatureTypeToStackType(il);
761 BoxUtil.BoxReturnValue(il, mw.ReturnType);
762 il.Emit(OpCodes.Stloc, rt);
763 il.EmitLeave(postLabel);
766 il.BeginCatchBlock(typeof(Exception));
767 il.Emit(OpCodes.Ldc_I4_0);
768 il.Emit(OpCodes.Call, il.Context.ByteCodeHelperMethods.MapException.MakeGenericMethod(il.Context.Types.Exception));
769 il.Emit(OpCodes.Newobj, invocationTargetExceptionWithCauseCtor);
770 il.Emit(OpCodes.Throw);
771 il.EndExceptionBlock();
774 il.MarkLabel(postLabel);
775 il.Emit(OpCodes.Ldloc, rt);
776 il.ReleaseTempLocal(rt);
777 il.Emit(OpCodes.Ret);
781 invoker = (Invoker)dm.CreateDelegate(typeof(Invoker));
784 if ((mw.IsStatic || mw.DeclaringType.IsInterface) && mw.DeclaringType.HasStaticInitializer)
785 invoker =
new Invoker(
new RunClassInit(
this, mw.DeclaringType, invoker).invoke);
794 public object invoke(
object obj,
object[] args, global::ikvm.@
internal.
CallerID callerID)
798 return invoker(obj, args, callerID);
800 catch (MethodAccessException x)
803 throw new global::java.lang.IllegalAccessException().initCause(x);
805 catch (NullReferenceException e)
807 global::java.lang.System.err.println(
"got NRE " + e);
814 sealed class FastConstructorAccessorImpl : global::sun.reflect.ConstructorAccessor
817 delegate
object Invoker(
object[] args);
820 internal FastConstructorAccessorImpl(global::java.lang.reflect.Constructor constructor)
826 mw.DeclaringType.Finish();
827 var parameters = mw.GetParameters();
829 for (
int i = 0; i < parameters.Length; i++)
831 parameters[i] = parameters[i].EnsureLoadable(mw.DeclaringType.ClassLoader);
832 parameters[i].Finish();
837 var np = !mw.IsPublic || !mw.DeclaringType.IsPublic;
838 var dm =
DynamicMethodUtil.Create($
"__<FastConstructorAccessor>__{mw.DeclaringType.Name.Replace(".
", "_
")}__{mw.Name}", mw.DeclaringType.TypeAsTBD, np, typeof(
object),
new[] { typeof(
object[]) });
842 var postLabel = il.DefineLabel();
849 var convArgsLabel = il.DefineLabel();
852 if (parameters.Length == 0)
854 il.Emit(OpCodes.Ldarg_0);
855 il.EmitBrfalse(convArgsLabel);
859 var chckArgsLabel = il.DefineLabel();
860 il.Emit(OpCodes.Ldarg_0);
861 il.Emit(OpCodes.Ldnull);
862 il.EmitBne_Un(chckArgsLabel);
863 il.Emit(OpCodes.Ldstr,
"wrong number of arguments");
864 il.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionWithMessageCtor);
865 il.Emit(OpCodes.Throw);
868 il.MarkLabel(chckArgsLabel);
869 il.Emit(OpCodes.Ldarg_0);
870 il.Emit(OpCodes.Ldlen);
871 il.EmitLdc_I4(parameters.Length);
872 il.EmitBeq(convArgsLabel);
873 il.Emit(OpCodes.Ldstr,
"wrong number of arguments");
874 il.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionWithMessageCtor);
875 il.Emit(OpCodes.Throw);
878 il.MarkLabel(convArgsLabel);
881 for (var i = 0; i < parameters.Length; i++)
883 var tw = parameters[i];
886 var o = p[n++] = il.AllocTempLocal(tw.TypeAsSignatureType);
889 var e = il.AllocTempLocal(typeof(Exception));
892 var endConvArgn = il.DefineLabel();
893 il.BeginExceptionBlock();
894 il.Emit(OpCodes.Ldarg_0);
896 il.Emit(OpCodes.Ldelem_Ref);
897 BoxUtil.EmitUnboxArg(il, tw);
898 tw.EmitConvStackTypeToSignatureType(il,
null);
899 il.Emit(OpCodes.Stloc, o);
900 il.EmitLeave(endConvArgn);
903 il.BeginCatchBlock(typeof(InvalidCastException));
904 il.Emit(OpCodes.Stloc, e);
905 il.Emit(OpCodes.Ldstr, $
"argument type mismatch on parameter {i}");
906 il.Emit(OpCodes.Ldloc, e);
907 il.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionWithMessageAndCauseCtor);
908 il.Emit(OpCodes.Throw);
911 il.BeginCatchBlock(typeof(Exception));
912 il.Emit(OpCodes.Stloc, e);
913 il.Emit(OpCodes.Ldstr, $
"exception on parameter {i}");
914 il.Emit(OpCodes.Ldloc, e);
915 il.Emit(OpCodes.Newobj, FastMethodAccessorImpl.illegalArgumentExceptionWithMessageAndCauseCtor);
916 il.Emit(OpCodes.Throw);
919 il.EndExceptionBlock();
920 il.MarkLabel(endConvArgn);
921 il.ReleaseTempLocal(e);
925 il.BeginExceptionBlock();
928 for (
int i = 0; i < n; i++)
930 il.Emit(OpCodes.Ldloc, p[i]);
931 il.ReleaseTempLocal(p[i]);
935 var rt = il.AllocTempLocal(typeof(
object));
937 il.Emit(OpCodes.Stloc, rt);
938 il.EmitLeave(postLabel);
941 il.BeginCatchBlock(typeof(Exception));
942 il.Emit(OpCodes.Ldc_I4_0);
943 il.Emit(OpCodes.Call, il.Context.ByteCodeHelperMethods.MapException.MakeGenericMethod(il.Context.Types.Exception));
944 il.Emit(OpCodes.Newobj, FastMethodAccessorImpl.invocationTargetExceptionWithCauseCtor);
945 il.Emit(OpCodes.Throw);
946 il.EndExceptionBlock();
949 il.MarkLabel(postLabel);
950 il.Emit(OpCodes.Ldloc, rt);
951 il.ReleaseTempLocal(rt);
952 il.Emit(OpCodes.Ret);
956 invoker = (Invoker)dm.CreateDelegate(typeof(Invoker));
965 public object newInstance(
object[] args)
969 return invoker(args);
971 catch (MethodAccessException e)
974 throw new global::java.lang.IllegalAccessException().initCause(e);
980 sealed class FastSerializationConstructorAccessorImpl : global::sun.reflect.ConstructorAccessor
983 static readonly
MethodInfo GetTypeFromHandleMethod = typeof(
Type).GetMethod(nameof(
Type.GetTypeFromHandle),
new[] { typeof(RuntimeTypeHandle) });
985 static readonly
MethodInfo GetUninitializedObjectMethod = typeof(FormatterServices).GetMethod(nameof(FormatterServices.GetUninitializedObject),
new[] { typeof(Type) });
987 static readonly
MethodInfo GetUninitializedObjectMethod = typeof(RuntimeHelpers).GetMethod(nameof(RuntimeHelpers.GetUninitializedObject),
new[] { typeof(Type) });
989 delegate
object InvokeCtor();
992 internal FastSerializationConstructorAccessorImpl(global::java.lang.reflect.Constructor constructorToCall, global::java.lang.Class classToInstantiate)
995 if (constructor.GetParameters().Length != 0)
997 throw new NotImplementedException(
"Serialization constructor cannot have parameters");
1000 constructor.ResolveMethod();
1004 RuntimeJavaType wrapper = RuntimeJavaType.FromClass(classToInstantiate);
1006 type = wrapper.TypeAsBaseType;
1012 DynamicMethod dm =
DynamicMethodUtil.Create(
"__<SerializationCtor>", constructor.DeclaringType.TypeAsBaseType,
true, typeof(
object),
null);
1014 ilgen.Emit(OpCodes.Ldtoken, type);
1015 ilgen.Emit(OpCodes.Call, GetTypeFromHandleMethod);
1016 ilgen.Emit(OpCodes.Call, GetUninitializedObjectMethod);
1017 ilgen.Emit(OpCodes.Dup);
1018 constructor.EmitCall(ilgen);
1019 ilgen.Emit(OpCodes.Ret);
1021 invoker = (InvokeCtor)dm.CreateDelegate(typeof(InvokeCtor));
1025 public object newInstance(
object[] args)
1031 catch (MethodAccessException x)
1034 throw new global::java.lang.IllegalAccessException().initCause(x);
1040 sealed class ActivatorConstructorAccessor : global::sun.reflect.ConstructorAccessor
1043 private readonly
Type type;
1047 this.type = mw.DeclaringType.TypeAsBaseType;
1050 public object newInstance(
object[] objarr)
1052 if (objarr !=
null && objarr.Length != 0)
1053 throw new global::java.lang.IllegalArgumentException();
1057 return Activator.CreateInstance(type);
1059 catch (TargetInvocationException x)
1061 throw new global::java.lang.reflect.InvocationTargetException(global::ikvm.runtime.Util.mapException(x.InnerException));
1067 var mb = mw.GetMethod();
1071 && mb.DeclaringType.IsPublic
1072 && mb.DeclaringType == mw.DeclaringType.TypeAsBaseType
1073 && mb.GetParameters().Length == 0;
1078 private abstract class FieldAccessorImplBase : global::sun.reflect.FieldAccessor,
IReflectionException
1081 protected static readonly ushort inflationThreshold = 15;
1083 protected readonly
bool isFinal;
1084 protected ushort numInvocations;
1089 static FieldAccessorImplBase()
1091 if (global::java.security.AccessController.doPrivileged(
new FuncPrivilegedAction<string>(() => SystemAccessor.InvokeGetProperty(
"ikvm.reflect.field.inflationThreshold"))) is
string s && ushort.TryParse(s, out var value))
1092 inflationThreshold = value;
1103 this.isFinal = isFinal;
1106 private string GetQualifiedFieldName()
1108 return fw.DeclaringType.Name +
"." + fw.Name;
1111 private string GetFieldTypeName()
1113 return fw.FieldTypeWrapper.IsPrimitive
1114 ? fw.FieldTypeWrapper.ClassObject.getName()
1115 : fw.FieldTypeWrapper.Name;
1118 public global::java.lang.IllegalArgumentException GetIllegalArgumentException(
object obj)
1121 return SetIllegalArgumentException(obj);
1124 public global::java.lang.IllegalArgumentException SetIllegalArgumentException(
object obj)
1127 return SetIllegalArgumentException(obj !=
null ? global::ikvm.runtime.Util.getClassFromObject(obj).getName() :
"",
"");
1130 private global::java.lang.IllegalArgumentException SetIllegalArgumentException(
string attemptedType,
string attemptedValue)
1132 return new global::java.lang.IllegalArgumentException(GetSetMessage(attemptedType, attemptedValue));
1135 protected global::java.lang.IllegalAccessException FinalFieldIllegalAccessException(
object obj)
1137 return FinalFieldIllegalAccessException(obj !=
null ? global::ikvm.runtime.Util.getClassFromObject(obj).getName() :
"",
"");
1140 private global::java.lang.IllegalAccessException FinalFieldIllegalAccessException(
string attemptedType,
string attemptedValue)
1142 return new global::java.lang.IllegalAccessException(GetSetMessage(attemptedType, attemptedValue));
1145 private global::java.lang.IllegalArgumentException GetIllegalArgumentException(
string type)
1147 return new global::java.lang.IllegalArgumentException(
"Attempt to get " + GetFieldTypeName() +
" field \"" + GetQualifiedFieldName() +
"\" with illegal data type conversion to " + type);
1151 private string GetSetMessage(String attemptedType, String attemptedValue)
1153 String err =
"Can not set";
1158 err +=
" " + GetFieldTypeName() +
" field " + GetQualifiedFieldName() +
" to ";
1159 if (attemptedValue.Length > 0)
1161 err +=
"(" + attemptedType +
")" + attemptedValue;
1165 if (attemptedType.Length > 0)
1166 err += attemptedType;
1168 err +=
"null value";
1173 public virtual bool getBoolean(
object obj)
1175 throw GetIllegalArgumentException(
"boolean");
1178 public virtual byte getByte(
object obj)
1180 throw GetIllegalArgumentException(
"byte");
1183 public virtual char getChar(
object obj)
1185 throw GetIllegalArgumentException(
"char");
1188 public virtual short getShort(
object obj)
1190 throw GetIllegalArgumentException(
"short");
1193 public virtual int getInt(
object obj)
1195 throw GetIllegalArgumentException(
"int");
1198 public virtual long getLong(
object obj)
1200 throw GetIllegalArgumentException(
"long");
1203 public virtual float getFloat(
object obj)
1205 throw GetIllegalArgumentException(
"float");
1208 public virtual double getDouble(
object obj)
1210 throw GetIllegalArgumentException(
"double");
1213 public virtual void setBoolean(
object obj,
bool z)
1215 throw SetIllegalArgumentException(
"boolean", global::java.lang.Boolean.toString(z));
1218 public virtual void setByte(
object obj,
byte b)
1220 throw SetIllegalArgumentException(
"byte", global::java.lang.Byte.toString(b));
1223 public virtual void setChar(
object obj,
char c)
1225 throw SetIllegalArgumentException(
"char", global::java.lang.Character.toString(c));
1228 public virtual void setShort(
object obj,
short s)
1230 throw SetIllegalArgumentException(
"short", global::java.lang.Short.toString(s));
1233 public virtual void setInt(
object obj,
int i)
1235 throw SetIllegalArgumentException(
"int", global::java.lang.Integer.toString(i));
1238 public virtual void setLong(
object obj,
long l)
1240 throw SetIllegalArgumentException(
"long", global::java.lang.Long.toString(l));
1243 public virtual void setFloat(
object obj,
float f)
1245 throw SetIllegalArgumentException(
"float", global::java.lang.Float.toString(f));
1248 public virtual void setDouble(
object obj,
double d)
1250 throw SetIllegalArgumentException(
"double", global::java.lang.Double.toString(d));
1253 public abstract object get(
object obj);
1254 public abstract void set(
object obj,
object value);
1256 private abstract class FieldAccessor<T> : FieldAccessorImplBase
1261 protected delegate
void Setter(
object obj, T value, FieldAccessor<T> acc);
1262 protected delegate T Getter(
object obj, FieldAccessor<T> acc);
1263 private static readonly Setter initialSetter = lazySet;
1264 private static readonly Getter initialGetter = lazyGet;
1265 protected Setter setter = initialSetter;
1266 protected Getter getter = initialGetter;
1271 if (!IsSlowPathCompatible(fw))
1274 numInvocations = inflationThreshold;
1281 if (fw.IsVolatile && (fw.FieldTypeWrapper == context.PrimitiveJavaTypeFactory.LONG || fw.FieldTypeWrapper == context.PrimitiveJavaTypeFactory.DOUBLE))
1290 private static T lazyGet(
object obj, FieldAccessor<T> acc)
1292 return acc.lazyGet(obj);
1295 private static void lazySet(
object obj, T value, FieldAccessor<T> acc)
1297 acc.lazySet(obj, value);
1300 private T lazyGet(
object obj)
1303 if (numInvocations >= inflationThreshold)
1307 fw.DeclaringType.RunClassInit();
1308 getter = (Getter)GenerateFastGetter(typeof(Getter), typeof(T), fw);
1309 return getter(obj,
this);
1316 else if (obj ==
null)
1318 throw new global::java.lang.NullPointerException();
1320 else if (!fw.DeclaringType.IsInstance(obj))
1322 throw GetIllegalArgumentException(obj);
1324 else if (fw.DeclaringType.IsRemapped && !fw.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
1326 throw GetUnsupportedRemappedFieldException(obj);
1328 if (numInvocations == 0)
1330 fw.DeclaringType.RunClassInit();
1331 fw.DeclaringType.Finish();
1335 return (T)fw.FieldTypeWrapper.GhostUnwrap(fw.GetValue(obj));
1338 private void lazySet(
object obj, T value)
1343 fw.DeclaringType.RunClassInit();
1344 throw FinalFieldIllegalAccessException(JavaBox(value));
1347 if (numInvocations >= inflationThreshold)
1351 fw.DeclaringType.RunClassInit();
1352 setter = (Setter)GenerateFastSetter(typeof(Setter), typeof(T), fw);
1353 setter(obj, value,
this);
1361 else if (obj ==
null)
1363 throw new global::java.lang.NullPointerException();
1365 else if (!fw.DeclaringType.IsInstance(obj))
1367 throw SetIllegalArgumentException(obj);
1369 else if (fw.DeclaringType.IsRemapped && !fw.DeclaringType.TypeAsBaseType.IsInstanceOfType(obj))
1371 throw GetUnsupportedRemappedFieldException(obj);
1374 if (numInvocations == 0)
1376 fw.DeclaringType.RunClassInit();
1377 fw.DeclaringType.Finish();
1381 fw.SetValue(obj, fw.FieldTypeWrapper.GhostWrap(value));
1384 private Exception GetUnsupportedRemappedFieldException(
object obj)
1386 return new global::java.lang.IllegalAccessException(
"Accessing field " + fw.DeclaringType.Name +
"." + fw.Name +
" in an object of type " + global::ikvm.runtime.Util.getClassFromObject(obj).getName() +
" is not supported");
1389 protected virtual void CheckValue(T value)
1393 protected abstract object JavaBox(T value);
1396 private sealed class ByteField : FieldAccessor<byte>
1399 : base(field, isFinal)
1403 public sealed override short getShort(
object obj)
1405 return (sbyte)getByte(obj);
1408 public sealed override int getInt(
object obj)
1410 return (sbyte)getByte(obj);
1413 public sealed override long getLong(
object obj)
1415 return (sbyte)getByte(obj);
1418 public sealed override float getFloat(
object obj)
1420 return (sbyte)getByte(obj);
1423 public sealed override double getDouble(
object obj)
1425 return (sbyte)getByte(obj);
1428 public sealed override object get(
object obj)
1430 return global::java.lang.Byte.valueOf(getByte(obj));
1433 public sealed override void set(
object obj,
object val)
1435 if (!(val is global::java.lang.Byte))
1437 throw SetIllegalArgumentException(val);
1439 setByte(obj, ((global::java.lang.Byte)val).byteValue());
1442 public sealed override byte getByte(
object obj)
1446 return getter(obj,
this);
1448 catch (FieldAccessException x)
1450 throw new global::java.lang.IllegalAccessException().initCause(x);
1454 public sealed override void setByte(
object obj,
byte value)
1458 setter(obj, value,
this);
1460 catch (FieldAccessException x)
1462 throw new global::java.lang.IllegalAccessException().initCause(x);
1466 protected sealed override object JavaBox(
byte value)
1468 return global::java.lang.Byte.valueOf(value);
1472 private sealed class BooleanField : FieldAccessor<bool>
1475 : base(field, isFinal)
1479 public sealed override object get(
object obj)
1481 return global::java.lang.Boolean.valueOf(getBoolean(obj));
1484 public sealed override void set(
object obj,
object val)
1486 if (!(val is global::java.lang.Boolean))
1488 throw SetIllegalArgumentException(val);
1490 setBoolean(obj, ((global::java.lang.Boolean)val).booleanValue());
1493 public sealed override bool getBoolean(
object obj)
1497 return getter(obj,
this);
1499 catch (FieldAccessException x)
1501 throw new global::java.lang.IllegalAccessException().initCause(x);
1505 public sealed override void setBoolean(
object obj,
bool value)
1509 setter(obj, value,
this);
1511 catch (FieldAccessException x)
1513 throw new global::java.lang.IllegalAccessException().initCause(x);
1517 protected sealed override object JavaBox(
bool value)
1519 return global::java.lang.Boolean.valueOf(value);
1523 private sealed class CharField : FieldAccessor<char>
1526 : base(field, isFinal)
1530 public sealed override int getInt(
object obj)
1532 return getChar(obj);
1535 public sealed override long getLong(
object obj)
1537 return getChar(obj);
1540 public sealed override float getFloat(
object obj)
1542 return getChar(obj);
1545 public sealed override double getDouble(
object obj)
1547 return getChar(obj);
1550 public sealed override object get(
object obj)
1552 return global::java.lang.Character.valueOf(getChar(obj));
1555 public sealed override void set(
object obj,
object val)
1557 if (val is global::java.lang.Character)
1558 setChar(obj, ((global::java.lang.Character)val).charValue());
1560 throw SetIllegalArgumentException(val);
1563 public sealed override char getChar(
object obj)
1567 return getter(obj,
this);
1569 catch (FieldAccessException x)
1571 throw new global::java.lang.IllegalAccessException().initCause(x);
1575 public sealed override void setChar(
object obj,
char value)
1579 setter(obj, value,
this);
1581 catch (FieldAccessException x)
1583 throw new global::java.lang.IllegalAccessException().initCause(x);
1587 protected sealed override object JavaBox(
char value)
1589 return global::java.lang.Character.valueOf(value);
1593 private sealed class ShortField : FieldAccessor<short>
1596 : base(field, isFinal)
1600 public sealed override int getInt(
object obj)
1602 return getShort(obj);
1605 public sealed override long getLong(
object obj)
1607 return getShort(obj);
1610 public sealed override float getFloat(
object obj)
1612 return getShort(obj);
1615 public sealed override double getDouble(
object obj)
1617 return getShort(obj);
1620 public sealed override object get(
object obj)
1622 return global::java.lang.Short.valueOf(getShort(obj));
1625 public sealed override void set(
object obj,
object val)
1627 if (val is global::java.lang.Byte
1628 || val is global::java.lang.Short)
1629 setShort(obj, ((global::java.lang.Number)val).shortValue());
1631 throw SetIllegalArgumentException(val);
1634 public sealed override void setByte(
object obj,
byte b)
1636 setShort(obj, (sbyte)b);
1639 public sealed override short getShort(
object obj)
1643 return getter(obj,
this);
1645 catch (FieldAccessException x)
1647 throw new global::java.lang.IllegalAccessException().initCause(x);
1651 public sealed override void setShort(
object obj,
short value)
1655 setter(obj, value,
this);
1657 catch (FieldAccessException x)
1659 throw new global::java.lang.IllegalAccessException().initCause(x);
1663 protected sealed override object JavaBox(
short value)
1665 return global::java.lang.Short.valueOf(value);
1669 private sealed class IntField : FieldAccessor<int>
1672 : base(field, isFinal)
1676 public sealed override long getLong(
object obj)
1681 public sealed override float getFloat(
object obj)
1686 public sealed override double getDouble(
object obj)
1691 public sealed override object get(
object obj)
1693 return global::java.lang.Integer.valueOf(getInt(obj));
1696 public sealed override void set(
object obj,
object val)
1698 if (val is global::java.lang.Byte
1699 || val is global::java.lang.Short
1700 || val is global::java.lang.Integer)
1701 setInt(obj, ((global::java.lang.Number)val).intValue());
1702 else if (val is global::java.lang.Character)
1703 setInt(obj, ((global::java.lang.Character)val).charValue());
1705 throw SetIllegalArgumentException(val);
1708 public sealed override void setByte(
object obj,
byte b)
1710 setInt(obj, (sbyte)b);
1713 public sealed override void setChar(
object obj,
char c)
1718 public sealed override void setShort(
object obj,
short s)
1723 public sealed override int getInt(
object obj)
1727 return getter(obj,
this);
1729 catch (FieldAccessException x)
1731 throw new global::java.lang.IllegalAccessException().initCause(x);
1735 public sealed override void setInt(
object obj,
int value)
1739 setter(obj, value,
this);
1741 catch (FieldAccessException x)
1743 throw new global::java.lang.IllegalAccessException().initCause(x);
1747 protected sealed override object JavaBox(
int value)
1749 return global::java.lang.Integer.valueOf(value);
1753 private sealed class FloatField : FieldAccessor<float>
1756 : base(field, isFinal)
1760 public sealed override double getDouble(
object obj)
1762 return getFloat(obj);
1765 public sealed override object get(
object obj)
1767 return global::java.lang.Float.valueOf(getFloat(obj));
1770 public sealed override void set(
object obj,
object val)
1772 if (val is global::java.lang.Float
1773 || val is global::java.lang.Byte
1774 || val is global::java.lang.Short
1775 || val is global::java.lang.Integer
1776 || val is global::java.lang.Long)
1777 setFloat(obj, ((global::java.lang.Number)val).floatValue());
1778 else if (val is global::java.lang.Character)
1779 setFloat(obj, ((global::java.lang.Character)val).charValue());
1781 throw SetIllegalArgumentException(val);
1784 public sealed override void setByte(
object obj,
byte b)
1786 setFloat(obj, (sbyte)b);
1789 public sealed override void setChar(
object obj,
char c)
1794 public sealed override void setShort(
object obj,
short s)
1799 public sealed override void setInt(
object obj,
int i)
1804 public sealed override void setLong(
object obj,
long l)
1809 public sealed override float getFloat(
object obj)
1813 return getter(obj,
this);
1815 catch (FieldAccessException x)
1817 throw new global::java.lang.IllegalAccessException().initCause(x);
1821 public sealed override void setFloat(
object obj,
float value)
1825 setter(obj, value,
this);
1827 catch (FieldAccessException x)
1829 throw new global::java.lang.IllegalAccessException().initCause(x);
1833 protected sealed override object JavaBox(
float value)
1835 return global::java.lang.Float.valueOf(value);
1839 private sealed class LongField : FieldAccessor<long>
1842 : base(field, isFinal)
1846 public sealed override float getFloat(
object obj)
1848 return getLong(obj);
1851 public sealed override double getDouble(
object obj)
1853 return getLong(obj);
1856 public sealed override object get(
object obj)
1858 return global::java.lang.Long.valueOf(getLong(obj));
1861 public sealed override void set(
object obj,
object val)
1863 if (val is global::java.lang.Long
1864 || val is global::java.lang.Byte
1865 || val is global::java.lang.Short
1866 || val is global::java.lang.Integer)
1867 setLong(obj, ((global::java.lang.Number)val).longValue());
1868 else if (val is global::java.lang.Character)
1869 setLong(obj, ((global::java.lang.Character)val).charValue());
1871 throw SetIllegalArgumentException(val);
1874 public sealed override void setByte(
object obj,
byte b)
1876 setLong(obj, (sbyte)b);
1879 public sealed override void setChar(
object obj,
char c)
1884 public sealed override void setShort(
object obj,
short s)
1889 public sealed override void setInt(
object obj,
int i)
1894 public sealed override long getLong(
object obj)
1898 return getter(obj,
this);
1900 catch (FieldAccessException x)
1902 throw new global::java.lang.IllegalAccessException().initCause(x);
1906 public sealed override void setLong(
object obj,
long value)
1910 setter(obj, value,
this);
1912 catch (FieldAccessException x)
1914 throw new global::java.lang.IllegalAccessException().initCause(x);
1918 protected sealed override object JavaBox(
long value)
1920 return global::java.lang.Long.valueOf(value);
1924 private sealed class DoubleField : FieldAccessor<double>
1927 : base(field, isFinal)
1931 public sealed override object get(
object obj)
1933 return global::java.lang.Double.valueOf(getDouble(obj));
1936 public sealed override void set(
object obj,
object val)
1938 if (val is global::java.lang.Double
1939 || val is global::java.lang.Float
1940 || val is global::java.lang.Byte
1941 || val is global::java.lang.Short
1942 || val is global::java.lang.Integer
1943 || val is global::java.lang.Long)
1944 setDouble(obj, ((global::java.lang.Number)val).doubleValue());
1945 else if (val is global::java.lang.Character)
1946 setDouble(obj, ((global::java.lang.Character)val).charValue());
1948 throw SetIllegalArgumentException(val);
1951 public sealed override void setByte(
object obj,
byte b)
1953 setDouble(obj, (sbyte)b);
1956 public sealed override void setChar(
object obj,
char c)
1961 public sealed override void setShort(
object obj,
short s)
1966 public sealed override void setInt(
object obj,
int i)
1971 public sealed override void setLong(
object obj,
long l)
1976 public sealed override void setFloat(
object obj,
float f)
1981 public sealed override double getDouble(
object obj)
1985 return getter(obj,
this);
1987 catch (FieldAccessException x)
1989 throw new global::java.lang.IllegalAccessException().initCause(x);
1993 public sealed override void setDouble(
object obj,
double value)
1997 setter(obj, value,
this);
1999 catch (FieldAccessException x)
2001 throw new global::java.lang.IllegalAccessException().initCause(x);
2005 protected sealed override object JavaBox(
double value)
2007 return global::java.lang.Double.valueOf(value);
2011 private sealed class ObjectField : FieldAccessor<object>
2014 : base(field, isFinal)
2018 protected sealed override void CheckValue(
object value)
2020 if (value !=
null && !fw.FieldTypeWrapper.EnsureLoadable(fw.DeclaringType.ClassLoader).IsInstance(value))
2022 throw SetIllegalArgumentException(value);
2026 public sealed override object get(
object obj)
2030 return getter(obj,
this);
2032 catch (FieldAccessException x)
2034 throw new global::java.lang.IllegalAccessException().initCause(x);
2038 public sealed override void set(
object obj,
object value)
2042 setter(obj, value,
this);
2044 catch (FieldAccessException x)
2046 throw new global::java.lang.IllegalAccessException().initCause(x);
2050 protected sealed override object JavaBox(
object value)
2059 RuntimeJavaType fieldTypeWrapper;
2062 fieldTypeWrapper = fw.FieldTypeWrapper.EnsureLoadable(fw.DeclaringType.ClassLoader);
2063 fieldTypeWrapper.Finish();
2064 fw.DeclaringType.Finish();
2071 DynamicMethod dm =
DynamicMethodUtil.Create(
"__<Getter>", fw.DeclaringType.TypeAsBaseType, !fw.IsPublic || !fw.DeclaringType.IsPublic, fieldType,
new Type[] { typeof(IReflectionException), typeof(object), typeof(object) });
2076 fieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgen);
2080 ilgen.BeginExceptionBlock();
2081 ilgen.Emit(OpCodes.Ldarg_1);
2082 ilgen.Emit(OpCodes.Castclass, fw.DeclaringType.TypeAsBaseType);
2084 fieldTypeWrapper.EmitConvSignatureTypeToStackType(ilgen);
2086 ilgen.Emit(OpCodes.Stloc, local);
2088 ilgen.EmitLeave(label);
2089 ilgen.BeginCatchBlock(typeof(InvalidCastException));
2090 ilgen.Emit(OpCodes.Ldarg_0);
2091 ilgen.Emit(OpCodes.Ldarg_1);
2092 ilgen.Emit(OpCodes.Callvirt, typeof(
IReflectionException).GetMethod(
"GetIllegalArgumentException"));
2093 ilgen.Emit(OpCodes.Throw);
2094 ilgen.EndExceptionBlock();
2095 ilgen.MarkLabel(label);
2096 ilgen.Emit(OpCodes.Ldloc, local);
2098 ilgen.Emit(OpCodes.Ret);
2100 return dm.CreateDelegate(delegateType,
this);
2105 RuntimeJavaType fieldTypeWrapper;
2108 fieldTypeWrapper = fw.FieldTypeWrapper.EnsureLoadable(fw.DeclaringType.ClassLoader);
2109 fieldTypeWrapper.Finish();
2110 fw.DeclaringType.Finish();
2117 DynamicMethod dm =
DynamicMethodUtil.Create(
"__<Setter>", fw.DeclaringType.TypeAsBaseType, !fw.IsPublic || !fw.DeclaringType.IsPublic,
null,
new Type[] { typeof(IReflectionException), typeof(object), fieldType, typeof(object) });
2121 if (fieldType == typeof(
object))
2123 ilgen.BeginExceptionBlock();
2124 ilgen.Emit(OpCodes.Ldarg_2);
2125 fieldTypeWrapper.EmitCheckcast(ilgen);
2126 fieldTypeWrapper.EmitConvStackTypeToSignatureType(ilgen,
null);
2129 ilgen.EmitLeave(label);
2130 ilgen.BeginCatchBlock(typeof(InvalidCastException));
2131 ilgen.Emit(OpCodes.Ldarg_0);
2132 ilgen.Emit(OpCodes.Ldarg_1);
2133 ilgen.Emit(OpCodes.Callvirt, typeof(
IReflectionException).GetMethod(
"SetIllegalArgumentException"));
2134 ilgen.Emit(OpCodes.Throw);
2135 ilgen.EndExceptionBlock();
2136 ilgen.MarkLabel(label);
2140 ilgen.Emit(OpCodes.Ldarg_2);
2146 ilgen.BeginExceptionBlock();
2147 ilgen.Emit(OpCodes.Ldarg_1);
2148 ilgen.Emit(OpCodes.Castclass, fw.DeclaringType.TypeAsBaseType);
2149 ilgen.Emit(OpCodes.Ldarg_2);
2150 if (fieldType == typeof(
object))
2152 fieldTypeWrapper.EmitCheckcast(ilgen);
2154 fieldTypeWrapper.EmitConvStackTypeToSignatureType(ilgen,
null);
2157 ilgen.EmitLeave(label);
2158 ilgen.BeginCatchBlock(typeof(InvalidCastException));
2159 ilgen.Emit(OpCodes.Ldarg_0);
2160 ilgen.Emit(OpCodes.Ldarg_1);
2161 ilgen.Emit(OpCodes.Callvirt, typeof(
IReflectionException).GetMethod(
"SetIllegalArgumentException"));
2162 ilgen.Emit(OpCodes.Throw);
2163 ilgen.EndExceptionBlock();
2164 ilgen.MarkLabel(label);
2166 ilgen.Emit(OpCodes.Ret);
2168 return dm.CreateDelegate(delegateType,
this);
2172 internal static FieldAccessorImplBase Create(
RuntimeJavaField field,
bool isFinal)
2174 RuntimeJavaType type = field.FieldTypeWrapper;
2175 if (type.IsPrimitive)
2179 return new ByteField(field, isFinal);
2183 return new BooleanField(field, isFinal);
2187 return new CharField(field, isFinal);
2191 return new ShortField(field, isFinal);
2195 return new IntField(field, isFinal);
2199 return new FloatField(field, isFinal);
2203 return new LongField(field, isFinal);
2207 return new DoubleField(field, isFinal);
2209 throw new InvalidOperationException(
"field type: " + type);
2213 return new ObjectField(field, isFinal);
2219 public static global::sun.reflect.FieldAccessor
newFieldAccessor(
object thisFactory, global::java.lang.reflect.Field field,
bool overrideAccessCheck)
2225 int modifiers = field.getModifiers();
2226 bool isStatic = global::java.lang.reflect.Modifier.isStatic(modifiers);
2227 bool isFinal = global::java.lang.reflect.Modifier.isFinal(modifiers);
2228 return FieldAccessorImplBase.Create(
RuntimeJavaField.FromField(field), isFinal && (!overrideAccessCheck || isStatic));
2233 internal static global::sun.reflect.FieldAccessor NewFieldAccessorJNI(
RuntimeJavaField field)
2235 return FieldAccessorImplBase.Create(field,
false);
2239 public static global::sun.reflect.MethodAccessor
newMethodAccessor(
object thisFactory, global::java.lang.reflect.Method method)
2246 if (!mw.IsDynamicOnly)
2248 return new FastMethodAccessorImpl(mw);
2251 return new MethodAccessorImpl(mw);
2255 public static global::sun.reflect.ConstructorAccessor
newConstructorAccessor0(
object thisFactory, global::java.lang.reflect.Constructor constructor)
2261 if (ActivatorConstructorAccessor.IsSuitable(mw))
2266 return new ActivatorConstructorAccessor(mw);
2271 return new ConstructorAccessorImpl(mw);
2273 return new FastConstructorAccessorImpl(constructor);
2287 return new SerializationConstructorAccessorImpl(constructorToCall, classToInstantiate);
2289 return new FastSerializationConstructorAccessorImpl(constructorToCall, classToInstantiate);
2292 catch (SecurityException x)
2294 throw new global::java.lang.SecurityException(x.Message, global::ikvm.runtime.Util.mapException(x));