52 string[] declaredExceptions;
53 RuntimeJavaType returnTypeWrapper;
54 RuntimeJavaType[] parameterTypeWrappers;
56#if !IMPORTER && !FIRST_PASS && !EXPORTER
57 volatile java.lang.reflect.Executable reflectionMethod;
64 throw new InvalidOperationException();
67 internal virtual void EmitCallvirt(
CodeEmitter ilgen)
69 throw new InvalidOperationException();
72 internal virtual void EmitCallvirtReflect(
CodeEmitter ilgen)
79 throw new InvalidOperationException();
89 internal virtual bool IsDynamicOnly =>
false;
103 base(declaringType, name, sig,
modifiers, flags)
107 this.method = method;
108 Debug.Assert(((returnType ==
null) == (parameterTypes ==
null)) || (returnType == declaringType.Context.
PrimitiveJavaTypeFactory.VOID));
109 this.returnTypeWrapper = returnType;
110 this.parameterTypeWrappers = parameterTypes;
114 UpdateNonPublicTypeInSignatureFlag();
117 void UpdateNonPublicTypeInSignatureFlag()
121 if (!returnTypeWrapper.IsPublic && !returnTypeWrapper.IsUnloadable)
127 foreach (RuntimeJavaType tw
in parameterTypeWrappers)
129 if (!tw.IsPublic && !tw.IsUnloadable)
143 internal void SetDeclaredExceptions(
string[] exceptions)
145 declaredExceptions = exceptions !=
null && exceptions.Length > 0 ? (
string[])exceptions.Clone() : Array.Empty<
string>();
152 internal string[] GetDeclaredExceptions()
154 return declaredExceptions;
157#if !IMPORTER && !EXPORTER
159 internal java.lang.reflect.Executable ToMethodOrConstructor(
bool copy)
162 throw new NotImplementedException();
164 var method = reflectionMethod;
169 var loader = DeclaringType.ClassLoader;
170 var argTypes = GetParameters();
171 var parameterTypes =
new java.
lang.Class[argTypes.Length];
172 for (
int i = 0; i < argTypes.Length; i++)
173 parameterTypes[i] = argTypes[i].EnsureLoadable(loader).ClassObject;
175 var checkedExceptions = GetExceptions();
178 method =
new java.
lang.reflect.Constructor(
179 DeclaringType.ClassObject,
182 (
int)
Modifiers | (IsInternal ? 0x40000000 : 0),
183 Array.IndexOf(DeclaringType.GetMethods(),
this),
184 DeclaringType.GetGenericMethodSignature(
this),
191 method =
new java.
lang.reflect.Method(
192 DeclaringType.ClassObject,
195 ReturnType.EnsureLoadable(loader).ClassObject,
197 (
int)
Modifiers | (IsInternal ? 0x40000000 : 0),
198 Array.IndexOf(DeclaringType.GetMethods(),
this),
199 DeclaringType.GetGenericMethodSignature(
this),
207 method = reflectionMethod;
212 if (method is
java.
lang.reflect.Constructor ctor)
215 return ((
java.
lang.reflect.Method)method).copy();
227 var classes = declaredExceptions;
228 var types =
Type.EmptyTypes;
234 if (method !=
null && method is not MethodBuilder)
239 classes = attr.classes;
247 var array =
new java.
lang.Class[classes.Length];
248 for (
int i = 0; i < classes.Length; i++)
249 array[i] = DeclaringType.ClassLoader.LoadClassByName(classes[i]).ClassObject;
255 var array =
new java.
lang.Class[types.Length];
256 for (
int i = 0; i < types.Length; i++)
268 throw new NotImplementedException();
270 return RuntimeJavaType.FromClass(executable.getDeclaringClass()).GetMethods()[executable._slot()];
281 [
System.Security.SecurityCritical]
287 internal bool IsLinked
291 return parameterTypeWrappers !=
null;
303 if (parameterTypeWrappers !=
null)
306 var loader = this.DeclaringType.ClassLoader;
307 var ret = loader.RetTypeWrapperFromSig(
Signature, mode);
308 var parameters = loader.ArgJavaTypeListFromSig(
Signature, mode);
318 if (parameterTypeWrappers ==
null)
320 Debug.Assert(returnTypeWrapper ==
null || returnTypeWrapper == DeclaringType.Context.
PrimitiveJavaTypeFactory.VOID);
322 returnTypeWrapper = ret;
323 parameterTypeWrappers = parameters;
324 UpdateNonPublicTypeInSignatureFlag();
335 returnTypeWrapper =
null;
336 parameterTypeWrappers =
null;
347 method = DeclaringType.LinkMethod(
this);
350 [Conditional(
"DEBUG")]
351 internal void AssertLinked()
353 if (!(parameterTypeWrappers !=
null && returnTypeWrapper !=
null))
356 Debug.Assert(parameterTypeWrappers !=
null && returnTypeWrapper !=
null, DeclaringType.Name +
"::" +
Name +
Signature);
359 internal RuntimeJavaType ReturnType
364 return returnTypeWrapper;
368 internal RuntimeJavaType[] GetParameters()
371 return parameterTypeWrappers;
375 internal DefineMethodHelper GetDefineMethodHelper()
377 return new DefineMethodHelper(
this);
381 internal Type ReturnTypeForDefineMethod
385 return ReturnType.TypeAsSignatureType;
389 internal Type[] GetParametersForDefineMethod()
391 RuntimeJavaType[] wrappers = GetParameters();
392 int len = wrappers.Length;
398 for (
int i = 0; i < wrappers.Length; i++)
400 temp[i] = wrappers[i].TypeAsSignatureType;
404 temp[len - 1] = DeclaringType.Context.
JavaBase.TypeOfIkvmInternalCallerID.TypeAsSignatureType;
419 internal string RealName
428 internal bool IsAbstract
436 internal bool RequiresNonVirtualDispatcher
440 return !IsConstructor
445 && !DeclaringType.IsFinal;
449#if !IMPORTER && !EXPORTER
451 internal Type GetDelegateType()
453 var paramTypes = GetParameters();
454 if (paramTypes.Length > MethodHandleUtil.MaxArity)
456 var type = DeclaringType.TypeAsBaseType.Assembly.GetType(ReturnType == DeclaringType.Context.
PrimitiveJavaTypeFactory.VOID ?
"__<>NVIV`" + paramTypes.Length :
"__<>NVI`" + (paramTypes.Length + 1));
458 type = DeclaringType.ClassLoader.GetTypeWrapperFactory().DefineDelegate(paramTypes.Length, ReturnType == DeclaringType.Context.
PrimitiveJavaTypeFactory.VOID);
460 var types =
new Type[paramTypes.Length + (ReturnType == DeclaringType.Context.PrimitiveJavaTypeFactory.VOID ? 0 : 1)];
461 for (
int i = 0; i < paramTypes.Length; i++)
462 types[i] = paramTypes[i].TypeAsSignatureType;
465 types[types.Length - 1] = ReturnType.TypeAsSignatureType;
467 return type.MakeGenericType(types);
470 return DeclaringType.Context.
MethodHandleUtil.CreateMemberWrapperDelegateType(paramTypes, ReturnType);
476 internal void ResolveMethod()
479 throw new NotImplementedException();
482 var mb = method as MethodBuilder;
486 method = mb.Module.ResolveMethod(mb.GetToken().Token);
492 var parameters = GetParameters();
493 var typeLength = parameters.Length;
497 var types =
new Type[typeLength];
498 for (
int i = 0; i < parameters.Length; i++)
500 parameters[i].Finish();
501 types[i] = parameters[i].TypeAsSignatureType;
505 types[typeLength - 1] = DeclaringType.Context.
JavaBase.TypeOfIkvmInternalCallerID.TypeAsSignatureType;
507 if (ReturnType !=
null)
510 var flags = BindingFlags.DeclaredOnly;
511 flags |= mb.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic;
512 flags |= mb.IsStatic ? BindingFlags.Static : BindingFlags.Instance;
513 method = DeclaringType.TypeAsTBD.GetMethods(flags).FirstOrDefault(i => i.Name == mb.Name && i.GetParameters().Select(j => j.ParameterType).SequenceEqual(types) && i.ReturnType.Equals(ReturnType.TypeAsSignatureType));
515 method = DeclaringType.TypeAsTBD.GetConstructor(flags,
null, types,
null);
517 throw new InternalException(
"Could not resolve method against runtime type.");
524 internal virtual object InvokeNonvirtualRemapped(
object obj,
object[] args)
526 throw new InvalidOperationException();
540 throw new NotImplementedException();
544 return mb.Invoke(obj, args);
546 catch (TargetInvocationException e)
548 throw ikvm.runtime.Util.mapException(e.InnerException);
560 internal virtual object Invoke(
object obj,
object[] args)
566 internal virtual object CreateInstance(
object[] args)
569 throw new NotImplementedException();
575 catch (TargetInvocationException x)
577 throw ikvm.runtime.Util.mapException(x.InnerException);
584 internal static OpCode SimpleOpCodeToOpCode(
SimpleOpCode opc) => opc
switch
586 SimpleOpCode.Call => OpCodes.Call,
587 SimpleOpCode.Callvirt => OpCodes.Callvirt,
588 SimpleOpCode.Newobj => OpCodes.Newobj,
589 _ =>
throw new InvalidOperationException(),
592 internal virtual bool IsOptionalAttributeAnnotationValue =>
false;
594 internal bool IsConstructor =>
Name == (object)StringConstants.INIT;
596 internal bool IsClassInitializer =>
Name == (object)StringConstants.CLINIT;
598 internal bool IsVirtual => (
modifiers & (Modifiers.Static |
Modifiers.Private)) == 0 && !IsConstructor;
600 internal bool IsFinalizeOrClone
604 return IsProtected && (DeclaringType == DeclaringType.Context.JavaBase.TypeOfJavaLangObject || DeclaringType == DeclaringType.Context.
JavaBase.TypeOfjavaLangThrowable) && (
Name == StringConstants.CLONE ||
Name == StringConstants.FINALIZE);