39 var tw = RuntimeJavaType.FromClass(clazz);
41 return tw.IsInstance(obj) || (tw == tw.Context.JavaBase.TypeOfCliSystemObject && obj is Array);
44 public static void init(global::java.lang.invoke.MemberName
self,
object refObj)
46 init(
self, refObj,
false);
50 public static void init(global::java.lang.invoke.MemberName
self,
object refObj,
bool wantSpecial)
53 throw new NotImplementedException();
55 global::java.lang.reflect.Method method;
56 global::java.lang.reflect.Constructor constructor;
57 global::java.lang.reflect.Field field;
58 if ((method = refObj as global::java.lang.reflect.Method) !=
null)
62 else if ((constructor = refObj as global::java.lang.reflect.Constructor) !=
null)
66 else if ((field = refObj as global::java.lang.reflect.Field) !=
null)
69 self._clazz(fw.DeclaringType.ClassObject);
70 int flags = (int)fw.Modifiers | global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_FIELD;
71 flags |= (fw.IsStatic ? global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic : global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField) << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
76 throw new InvalidOperationException();
81 static void InitMethodImpl(global::java.lang.invoke.MemberName
self,
RuntimeJavaMethod mw,
bool wantSpecial)
84 throw new NotImplementedException();
86 int flags = (int)mw.Modifiers;
87 flags |= mw.IsConstructor ? global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_CONSTRUCTOR : global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_METHOD;
90 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
92 else if (mw.IsConstructor && !wantSpecial)
94 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_newInvokeSpecial << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
96 else if (mw.IsPrivate || mw.IsFinal || mw.IsConstructor || wantSpecial)
98 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeSpecial << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
100 else if (mw.DeclaringType.IsInterface)
102 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
106 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
108 if (mw.HasCallerID ||
RuntimeByteCodeJavaType.RequiresDynamicReflectionCallerClass(mw.DeclaringType.Name, mw.Name, mw.Signature))
110 flags |= global::java.lang.invoke.MemberName.CALLER_SENSITIVE;
112 if (mw.IsConstructor && mw.DeclaringType ==
JVM.Context.
JavaBase.TypeOfJavaLangString)
114 global::java.lang.Class[] parameters1 =
new global::java.lang.Class[mw.GetParameters().Length];
115 for (
int i = 0; i < mw.GetParameters().Length; i++)
117 parameters1[i] = mw.GetParameters()[i].ClassObject;
119 global::java.lang.invoke.MethodType mt = global::java.lang.invoke.MethodType.methodType(
JVM.Context.
PrimitiveJavaTypeFactory.VOID.ClassObject, parameters1);
122 self._clazz(mw.DeclaringType.ClassObject);
123 self.vmtarget = CreateMemberNameDelegate(mw,
null,
false,
self.getMethodType().changeReturnType(
JVM.Context.
JavaBase.TypeOfJavaLangString.ClassObject));
127 self._clazz(mw.DeclaringType.ClassObject);
128 int firstParam = mw.IsStatic ? 0 : 1;
129 global::java.lang.Class[] parameters =
new global::java.lang.Class[mw.GetParameters().Length + firstParam];
130 for (
int i = 0; i < mw.GetParameters().Length; i++)
132 parameters[i + firstParam] = mw.GetParameters()[i].ClassObject;
136 parameters[0] = mw.DeclaringType.ClassObject;
138 self.vmtarget = CreateMemberNameDelegate(mw, mw.ReturnType.ClassObject, !wantSpecial, global::java.lang.invoke.MethodType.methodType(mw.ReturnType.ClassObject, parameters));
144 static void SetModifiers(global::java.lang.invoke.MemberName
self,
RuntimeJavaMember mw)
146 self._flags(
self._flags() | (
int)mw.Modifiers);
151 public static void expand(global::java.lang.invoke.MemberName
self)
153 throw new NotImplementedException();
156 public static global::java.lang.invoke.MemberName
resolve(global::java.lang.invoke.MemberName
self, global::java.lang.Class caller)
159 switch (
self.getReferenceKind())
161 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic:
162 if (
self.getDeclaringClass() ==
JVM.Context.
JavaBase.TypeOfJavaLangInvokeMethodHandle.ClassObject)
164 switch (
self.getName())
166 case "linkToVirtual":
168 case "linkToSpecial":
169 case "linkToInterface":
172 self._flags(
self._flags() | global::java.lang.reflect.Modifier.STATIC | global::java.lang.reflect.Modifier.NATIVE | global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_METHOD);
176 ResolveMethod(
self, caller);
178 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual:
179 if (
self.getDeclaringClass() ==
JVM.Context.
JavaBase.TypeOfJavaLangInvokeMethodHandle.ClassObject)
181 switch (
self.getName())
187 self._flags(
self._flags() | global::java.lang.reflect.Modifier.NATIVE | global::java.lang.reflect.Modifier.FINAL | global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_METHOD);
191 ResolveMethod(
self, caller);
193 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface:
194 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeSpecial:
195 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_newInvokeSpecial:
196 ResolveMethod(
self, caller);
198 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField:
199 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putField:
200 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic:
201 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic:
205 throw new InvalidOperationException();
213 static void ResolveMethod(global::java.lang.invoke.MemberName
self, global::java.lang.Class caller)
215 bool invokeSpecial =
self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeSpecial;
216 bool newInvokeSpecial =
self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_newInvokeSpecial;
217 bool searchBaseClasses = !newInvokeSpecial;
218 RuntimeJavaMethod mw = RuntimeJavaType.FromClass(
self.getDeclaringClass()).GetMethod(
self.getName(),
self.getSignature().Replace(
'/',
'.'), searchBaseClasses);
221 if (
self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface)
223 mw = RuntimeJavaType.FromClass(
self.getDeclaringClass()).GetInterfaceMethod(
self.getName(),
self.getSignature().Replace(
'/',
'.'));
226 mw =
JVM.Context.
JavaBase.TypeOfJavaLangObject.GetMethod(
self.getName(),
self.getSignature().Replace(
'/',
'.'),
false);
228 if (mw !=
null && mw.IsConstructor)
230 throw new global::java.lang.IncompatibleClassChangeError(
"Found interface " +
self.getDeclaringClass().getName() +
", but class was expected");
235 string msg = String.Format(invokeSpecial ?
"{0}: method {1}{2} not found" :
"{0}.{1}{2}",
self.getDeclaringClass().getName(),
self.getName(),
self.getSignature());
236 throw new global::java.lang.NoSuchMethodError(msg);
239 if (mw.IsStatic != IsReferenceKindStatic(
self.getReferenceKind()))
241 string msg = String.Format(mw.IsStatic ?
"Expecting non-static method {0}.{1}{2}" :
"Expected static method {0}.{1}{2}", mw.DeclaringType.Name,
self.getName(),
self.getSignature());
242 throw new global::java.lang.IncompatibleClassChangeError(msg);
244 if (
self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual && mw.DeclaringType.IsInterface)
246 throw new global::java.lang.IncompatibleClassChangeError(
"Found interface " + mw.DeclaringType.Name +
", but class was expected");
248 if (!mw.IsPublic &&
self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface)
250 throw new global::java.lang.IncompatibleClassChangeError(
"private interface method requires invokespecial, not invokeinterface: method " +
self.getDeclaringClass().getName() +
"." +
self.getName() +
self.getSignature());
252 if (mw.IsConstructor && mw.DeclaringType ==
JVM.Context.
JavaBase.TypeOfJavaLangString)
254 self.vmtarget = CreateMemberNameDelegate(mw, caller,
false,
self.getMethodType().changeReturnType(
JVM.Context.
JavaBase.TypeOfJavaLangString.ClassObject));
256 else if (!mw.IsConstructor || invokeSpecial || newInvokeSpecial)
258 global::java.lang.invoke.MethodType methodType =
self.getMethodType();
261 methodType = methodType.insertParameterTypes(0, mw.DeclaringType.ClassObject);
262 if (newInvokeSpecial)
264 methodType = methodType.changeReturnType(global::java.lang.Void.TYPE);
267 self.vmtarget = CreateMemberNameDelegate(mw, caller,
self.hasReceiverTypeDispatch(), methodType);
269 SetModifiers(
self, mw);
270 self._flags(
self._flags() | (mw.IsConstructor ? global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_CONSTRUCTOR : global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_METHOD));
271 if (
self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual && (mw.IsPrivate || mw.IsFinal || mw.IsConstructor))
273 int flags =
self._flags();
274 flags -= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
275 flags += global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeSpecial << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
278 if (mw.HasCallerID ||
RuntimeByteCodeJavaType.RequiresDynamicReflectionCallerClass(mw.DeclaringType.Name, mw.Name, mw.Signature))
280 self._flags(
self._flags() | global::java.lang.invoke.MemberName.CALLER_SENSITIVE);
284 private static void ResolveField(global::java.lang.invoke.MemberName
self)
286 RuntimeJavaField fw = RuntimeJavaType.FromClass(
self.getDeclaringClass()).GetFieldWrapper(
self.getName(),
self.getSignature().Replace(
'/',
'.'));
289 throw new global::java.lang.NoSuchFieldError(
self.getName());
291 SetModifiers(
self, fw);
292 self._flags(
self._flags() | global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_FIELD);
293 if (fw.IsStatic != IsReferenceKindStatic(
self.getReferenceKind()))
295 int newReferenceKind;
296 switch (
self.getReferenceKind())
298 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField:
299 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic;
301 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putField:
302 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic;
304 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic:
305 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField;
307 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic:
308 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_putField;
311 throw new InvalidOperationException();
313 int flags =
self._flags();
314 flags -=
self.getReferenceKind() << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
315 flags += newReferenceKind << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
320 private static bool IsReferenceKindStatic(
int referenceKind)
322 switch (referenceKind)
324 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField:
325 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putField:
326 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual:
327 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeSpecial:
328 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_newInvokeSpecial:
329 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface:
331 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic:
332 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic:
333 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic:
336 throw new InvalidOperationException();
341 static Delegate CreateMemberNameDelegate(
RuntimeJavaMethod mw, global::java.lang.Class caller,
bool doDispatch, global::java.lang.invoke.MethodType type)
344 throw new NotImplementedException();
346 if (mw.IsDynamicOnly)
351 if (mw.IsFinalizeOrClone)
353 RuntimeJavaType thisType = RuntimeJavaType.FromClass(caller);
356 if (thisType.IsAssignableTo(thisType.Context.
JavaBase.TypeOfCliSystemObject))
358 mw = thisType.Context.
JavaBase.TypeOfCliSystemObject.GetMethod(mw.Name, mw.Signature,
true);
360 else if (thisType.IsAssignableTo(thisType.Context.
JavaBase.TypeOfCliSystemException))
362 mw = thisType.Context.
JavaBase.TypeOfCliSystemException.GetMethod(mw.Name, mw.Signature,
true);
364 else if (thisType.IsAssignableTo(thisType.Context.
JavaBase.TypeOfjavaLangThrowable))
366 mw = thisType.Context.
JavaBase.TypeOfjavaLangThrowable.GetMethod(mw.Name, mw.Signature,
true);
369 RuntimeJavaType tw = mw.DeclaringType;
377 && tw.Context.
MethodHandleUtil.HasOnlyBasicTypes(mw.GetParameters(), mw.ReturnType)
380 return Delegate.CreateDelegate(tw.Context.
MethodHandleUtil.CreateMemberWrapperDelegateType(mw.GetParameters(), mw.ReturnType), mi);
390 public static int getMembers(global::java.lang.Class defc,
string matchName,
string matchSig,
int matchFlags, global::java.lang.Class caller,
int skip, global::java.lang.invoke.MemberName[] results)
393 throw new NotImplementedException();
395 if (matchName !=
null || matchSig !=
null || matchFlags != global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_METHOD)
396 throw new NotImplementedException();
398 var methods = RuntimeJavaType.FromClass(defc).GetMethods();
399 for (
int i = skip, len = Math.Min(results.Length, methods.Length - skip); i < len; i++)
400 if (!methods[i].IsConstructor && !methods[i].IsClassInitializer)
401 results[i - skip] =
new global::java.lang.invoke.MemberName((global::java.lang.reflect.Method)methods[i].ToMethodOrConstructor(
true),
false);
403 return methods.Length - skip;
416 throw new NotImplementedException();
418 var fw = RuntimeJavaType.FromClass(
self.getDeclaringClass()).GetFieldWrapper(
self.getName(),
self.getSignature().Replace(
'/',
'.'));
420 throw new global::java.lang.IllegalArgumentException();
422 return (
long)fw.Cookie;
435 throw new NotImplementedException();
437 var fw = RuntimeJavaType.FromClass(
self.getDeclaringClass()).GetFieldWrapper(
self.getName(),
self.getSignature().Replace(
'/',
'.'));
438 if (fw.IsStatic ==
false)
439 throw new global::java.lang.IllegalArgumentException();
441 return (
long)fw.Cookie;
454 throw new NotImplementedException();
456 var fw = RuntimeJavaType.FromClass(
self.getDeclaringClass()).GetFieldWrapper(
self.getName(),
self.getSignature().Replace(
'/',
'.'));
457 if (fw.IsStatic ==
false)
458 throw new global::java.lang.IllegalArgumentException();
460 return fw.DeclaringType;
464#if FIRST_PASS == false
466 internal static void InitializeCallSite(global::java.lang.invoke.CallSite site)
475 public static void setCallSiteTargetNormal(global::java.lang.invoke.CallSite site, global::java.lang.invoke.MethodHandle target)
478 throw new NotImplementedException();
480 if (site.ics ==
null)
481 InitializeCallSite(site);
485 site.target = target;
486 site.ics.SetTarget(target);
504 throw new NotImplementedException();
508 return new object[] { global::java.lang.Long.valueOf(0),
self.getDeclaringClass() };
510 if (global::java.lang.invoke.MethodHandleNatives.refKindDoesDispatch(
self.getReferenceKind()))
512 return new object[] { global::java.lang.Long.valueOf(0),
self };
514 return new object[] { global::java.lang.Long.valueOf(-1),
self };
526 throw new NotImplementedException();
528 var fields = typeof(global::java.lang.invoke.MethodHandleNatives.Constants).GetFields(BindingFlags.Static | BindingFlags.NonPublic);
529 if (which >= fields.Length)
534 name[0] = fields[which].Name;
535 return ((IConvertible)fields[which].GetRawConstantValue()).ToInt32(
null);