IKVM11  11
Java SE 11 Virtual Machine for .NET
Loading...
Searching...
No Matches
MethodHandleNatives.cs
Go to the documentation of this file.
1/*
2 Copyright (C) 2011-2015 Jeroen Frijters
3
4 This software is provided 'as-is', without any express or implied
5 warranty. In no event will the authors be held liable for any damages
6 arising from the use of this software.
7
8 Permission is granted to anyone to use this software for any purpose,
9 including commercial applications, and to alter it and redistribute it
10 freely, subject to the following restrictions:
11
12 1. The origin of this software must not be misrepresented; you must not
13 claim that you wrote the original software. If you use this software
14 in a product, an acknowledgment in the product documentation would be
15 appreciated but is not required.
16 2. Altered source versions must be plainly marked as such, and must not be
17 misrepresented as being the original software.
18 3. This notice may not be removed or altered from any source distribution.
19
20 Jeroen Frijters
21 jeroen@frijters.net
22
23*/
24using System;
25using System.Reflection;
26using System.Threading;
27
28using IKVM.Runtime;
29
31{
32
34 {
35
36 // called from map.xml as a replacement for Class.isInstance() in JlInvoke.MethodHandleImpl.castReference()
37 public static bool Class_isInstance(global::java.lang.Class clazz, object obj)
38 {
39 var tw = RuntimeJavaType.FromClass(clazz);
40 // handle the type system hole that is caused by arrays being both derived from cli.System.Array and directly from java.lang.Object
41 return tw.IsInstance(obj) || (tw == tw.Context.JavaBase.TypeOfCliSystemObject && obj is Array);
42 }
43
44 public static void init(global::java.lang.invoke.MemberName self, object refObj)
45 {
46 init(self, refObj, false);
47 }
48
49 // this overload is called via a map.xml patch to the MemberName(Method, boolean) constructor, because we need wantSpecial
50 public static void init(global::java.lang.invoke.MemberName self, object refObj, bool wantSpecial)
51 {
52#if FIRST_PASS
53 throw new NotImplementedException();
54#else
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)
59 {
60 InitMethodImpl(self, RuntimeJavaMethod.FromExecutable(method), wantSpecial);
61 }
62 else if ((constructor = refObj as global::java.lang.reflect.Constructor) != null)
63 {
64 InitMethodImpl(self, RuntimeJavaMethod.FromExecutable(constructor), wantSpecial);
65 }
66 else if ((field = refObj as global::java.lang.reflect.Field) != null)
67 {
68 RuntimeJavaField fw = RuntimeJavaField.FromField(field);
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;
72 self._flags(flags);
73 }
74 else
75 {
76 throw new InvalidOperationException();
77 }
78#endif
79 }
80
81 static void InitMethodImpl(global::java.lang.invoke.MemberName self, RuntimeJavaMethod mw, bool wantSpecial)
82 {
83#if FIRST_PASS
84 throw new NotImplementedException();
85#else
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;
88 if (mw.IsStatic)
89 {
90 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
91 }
92 else if (mw.IsConstructor && !wantSpecial)
93 {
94 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_newInvokeSpecial << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
95 }
96 else if (mw.IsPrivate || mw.IsFinal || mw.IsConstructor || wantSpecial)
97 {
98 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeSpecial << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
99 }
100 else if (mw.DeclaringType.IsInterface)
101 {
102 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
103 }
104 else
105 {
106 flags |= global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual << global::java.lang.invoke.MethodHandleNatives.Constants.MN_REFERENCE_KIND_SHIFT;
107 }
108 if (mw.HasCallerID || RuntimeByteCodeJavaType.RequiresDynamicReflectionCallerClass(mw.DeclaringType.Name, mw.Name, mw.Signature))
109 {
110 flags |= global::java.lang.invoke.MemberName.CALLER_SENSITIVE;
111 }
112 if (mw.IsConstructor && mw.DeclaringType == JVM.Context.JavaBase.TypeOfJavaLangString)
113 {
114 global::java.lang.Class[] parameters1 = new global::java.lang.Class[mw.GetParameters().Length];
115 for (int i = 0; i < mw.GetParameters().Length; i++)
116 {
117 parameters1[i] = mw.GetParameters()[i].ClassObject;
118 }
119 global::java.lang.invoke.MethodType mt = global::java.lang.invoke.MethodType.methodType(JVM.Context.PrimitiveJavaTypeFactory.VOID.ClassObject, parameters1);
120 self._type(mt);
121 self._flags(flags);
122 self._clazz(mw.DeclaringType.ClassObject);
123 self.vmtarget = CreateMemberNameDelegate(mw, null, false, self.getMethodType().changeReturnType(JVM.Context.JavaBase.TypeOfJavaLangString.ClassObject));
124 return;
125 }
126 self._flags(flags);
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++)
131 {
132 parameters[i + firstParam] = mw.GetParameters()[i].ClassObject;
133 }
134 if (!mw.IsStatic)
135 {
136 parameters[0] = mw.DeclaringType.ClassObject;
137 }
138 self.vmtarget = CreateMemberNameDelegate(mw, mw.ReturnType.ClassObject, !wantSpecial, global::java.lang.invoke.MethodType.methodType(mw.ReturnType.ClassObject, parameters));
139#endif
140 }
141
142#if !FIRST_PASS
143
144 static void SetModifiers(global::java.lang.invoke.MemberName self, RuntimeJavaMember mw)
145 {
146 self._flags(self._flags() | (int)mw.Modifiers);
147 }
148
149#endif
150
151 public static void expand(global::java.lang.invoke.MemberName self)
152 {
153 throw new NotImplementedException();
154 }
155
156 public static global::java.lang.invoke.MemberName resolve(global::java.lang.invoke.MemberName self, global::java.lang.Class caller)
157 {
158#if !FIRST_PASS
159 switch (self.getReferenceKind())
160 {
161 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeStatic:
162 if (self.getDeclaringClass() == JVM.Context.JavaBase.TypeOfJavaLangInvokeMethodHandle.ClassObject)
163 {
164 switch (self.getName())
165 {
166 case "linkToVirtual":
167 case "linkToStatic":
168 case "linkToSpecial":
169 case "linkToInterface":
170 // this delegate is never used normally, only by the PrivateInvokeTest white-box JSR-292 tests
171 self.vmtarget = MethodHandleUtil.DynamicMethodBuilder.CreateMethodHandleLinkTo(JVM.Context, self);
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);
173 return self;
174 }
175 }
176 ResolveMethod(self, caller);
177 break;
178 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual:
179 if (self.getDeclaringClass() == JVM.Context.JavaBase.TypeOfJavaLangInvokeMethodHandle.ClassObject)
180 {
181 switch (self.getName())
182 {
183 case "invoke":
184 case "invokeExact":
185 case "invokeBasic":
186 self.vmtarget = MethodHandleUtil.DynamicMethodBuilder.CreateMethodHandleInvoke(JVM.Context, self);
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);
188 return self;
189 }
190 }
191 ResolveMethod(self, caller);
192 break;
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);
197 break;
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:
202 ResolveField(self);
203 break;
204 default:
205 throw new InvalidOperationException();
206 }
207#endif
208 return self;
209 }
210
211#if !FIRST_PASS
212
213 static void ResolveMethod(global::java.lang.invoke.MemberName self, global::java.lang.Class caller)
214 {
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);
219 if (mw == null)
220 {
221 if (self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface)
222 {
223 mw = RuntimeJavaType.FromClass(self.getDeclaringClass()).GetInterfaceMethod(self.getName(), self.getSignature().Replace('/', '.'));
224 if (mw == null)
225 {
226 mw = JVM.Context.JavaBase.TypeOfJavaLangObject.GetMethod(self.getName(), self.getSignature().Replace('/', '.'), false);
227 }
228 if (mw != null && mw.IsConstructor)
229 {
230 throw new global::java.lang.IncompatibleClassChangeError("Found interface " + self.getDeclaringClass().getName() + ", but class was expected");
231 }
232 }
233 if (mw == null)
234 {
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);
237 }
238 }
239 if (mw.IsStatic != IsReferenceKindStatic(self.getReferenceKind()))
240 {
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);
243 }
244 if (self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeVirtual && mw.DeclaringType.IsInterface)
245 {
246 throw new global::java.lang.IncompatibleClassChangeError("Found interface " + mw.DeclaringType.Name + ", but class was expected");
247 }
248 if (!mw.IsPublic && self.getReferenceKind() == global::java.lang.invoke.MethodHandleNatives.Constants.REF_invokeInterface)
249 {
250 throw new global::java.lang.IncompatibleClassChangeError("private interface method requires invokespecial, not invokeinterface: method " + self.getDeclaringClass().getName() + "." + self.getName() + self.getSignature());
251 }
252 if (mw.IsConstructor && mw.DeclaringType == JVM.Context.JavaBase.TypeOfJavaLangString)
253 {
254 self.vmtarget = CreateMemberNameDelegate(mw, caller, false, self.getMethodType().changeReturnType(JVM.Context.JavaBase.TypeOfJavaLangString.ClassObject));
255 }
256 else if (!mw.IsConstructor || invokeSpecial || newInvokeSpecial)
257 {
258 global::java.lang.invoke.MethodType methodType = self.getMethodType();
259 if (!mw.IsStatic)
260 {
261 methodType = methodType.insertParameterTypes(0, mw.DeclaringType.ClassObject);
262 if (newInvokeSpecial)
263 {
264 methodType = methodType.changeReturnType(global::java.lang.Void.TYPE);
265 }
266 }
267 self.vmtarget = CreateMemberNameDelegate(mw, caller, self.hasReceiverTypeDispatch(), methodType);
268 }
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))
272 {
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;
276 self._flags(flags);
277 }
278 if (mw.HasCallerID || RuntimeByteCodeJavaType.RequiresDynamicReflectionCallerClass(mw.DeclaringType.Name, mw.Name, mw.Signature))
279 {
280 self._flags(self._flags() | global::java.lang.invoke.MemberName.CALLER_SENSITIVE);
281 }
282 }
283
284 private static void ResolveField(global::java.lang.invoke.MemberName self)
285 {
286 RuntimeJavaField fw = RuntimeJavaType.FromClass(self.getDeclaringClass()).GetFieldWrapper(self.getName(), self.getSignature().Replace('/', '.'));
287 if (fw == null)
288 {
289 throw new global::java.lang.NoSuchFieldError(self.getName());
290 }
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()))
294 {
295 int newReferenceKind;
296 switch (self.getReferenceKind())
297 {
298 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField:
299 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic;
300 break;
301 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putField:
302 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic;
303 break;
304 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_getStatic:
305 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_getField;
306 break;
307 case global::java.lang.invoke.MethodHandleNatives.Constants.REF_putStatic:
308 newReferenceKind = global::java.lang.invoke.MethodHandleNatives.Constants.REF_putField;
309 break;
310 default:
311 throw new InvalidOperationException();
312 }
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;
316 self._flags(flags);
317 }
318 }
319
320 private static bool IsReferenceKindStatic(int referenceKind)
321 {
322 switch (referenceKind)
323 {
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:
330 return false;
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:
334 return true;
335 }
336 throw new InvalidOperationException();
337 }
338#endif
339
340 // TODO consider caching this delegate in MethodWrapper
341 static Delegate CreateMemberNameDelegate(RuntimeJavaMethod mw, global::java.lang.Class caller, bool doDispatch, global::java.lang.invoke.MethodType type)
342 {
343#if FIRST_PASS
344 throw new NotImplementedException();
345#else
346 if (mw.IsDynamicOnly)
347 {
348 return MethodHandleUtil.DynamicMethodBuilder.CreateDynamicOnly(mw.DeclaringType.Context, mw, type);
349 }
350 // HACK this code is duplicated in compiler.cs
351 if (mw.IsFinalizeOrClone)
352 {
353 RuntimeJavaType thisType = RuntimeJavaType.FromClass(caller);
354 // HACK we may need to redirect finalize or clone from java.lang.Object/Throwable
355 // to a more specific base type.
356 if (thisType.IsAssignableTo(thisType.Context.JavaBase.TypeOfCliSystemObject))
357 {
358 mw = thisType.Context.JavaBase.TypeOfCliSystemObject.GetMethod(mw.Name, mw.Signature, true);
359 }
360 else if (thisType.IsAssignableTo(thisType.Context.JavaBase.TypeOfCliSystemException))
361 {
362 mw = thisType.Context.JavaBase.TypeOfCliSystemException.GetMethod(mw.Name, mw.Signature, true);
363 }
364 else if (thisType.IsAssignableTo(thisType.Context.JavaBase.TypeOfjavaLangThrowable))
365 {
366 mw = thisType.Context.JavaBase.TypeOfjavaLangThrowable.GetMethod(mw.Name, mw.Signature, true);
367 }
368 }
369 RuntimeJavaType tw = mw.DeclaringType;
370 tw.Finish();
371 mw.Link();
372 mw.ResolveMethod();
373 MethodInfo mi = mw.GetMethod() as MethodInfo;
374 if (mi != null
375 && !mw.HasCallerID
376 && mw.IsStatic
377 && tw.Context.MethodHandleUtil.HasOnlyBasicTypes(mw.GetParameters(), mw.ReturnType)
378 && type.parameterCount() <= MethodHandleUtil.MaxArity)
379 {
380 return Delegate.CreateDelegate(tw.Context.MethodHandleUtil.CreateMemberWrapperDelegateType(mw.GetParameters(), mw.ReturnType), mi);
381 }
382 else
383 {
384 // slow path where we emit a DynamicMethod
385 return MethodHandleUtil.DynamicMethodBuilder.CreateMemberName(tw.Context, mw, type, doDispatch);
386 }
387#endif
388 }
389
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)
391 {
392#if FIRST_PASS
393 throw new NotImplementedException();
394#else
395 if (matchName != null || matchSig != null || matchFlags != global::java.lang.invoke.MethodHandleNatives.Constants.MN_IS_METHOD)
396 throw new NotImplementedException();
397
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);
402
403 return methods.Length - skip;
404#endif
405 }
406
413 public static long objectFieldOffset(global::java.lang.invoke.MemberName self)
414 {
415#if FIRST_PASS
416 throw new NotImplementedException();
417#else
418 var fw = RuntimeJavaType.FromClass(self.getDeclaringClass()).GetFieldWrapper(self.getName(), self.getSignature().Replace('/', '.'));
419 if (fw.IsStatic)
420 throw new global::java.lang.IllegalArgumentException();
421
422 return (long)fw.Cookie;
423#endif
424 }
425
432 public static long staticFieldOffset(global::java.lang.invoke.MemberName self)
433 {
434#if FIRST_PASS
435 throw new NotImplementedException();
436#else
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();
440
441 return (long)fw.Cookie;
442#endif
443 }
444
451 public static object staticFieldBase(global::java.lang.invoke.MemberName self)
452 {
453#if FIRST_PASS
454 throw new NotImplementedException();
455#else
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();
459
460 return fw.DeclaringType;
461#endif
462 }
463
464#if FIRST_PASS == false
465
466 internal static void InitializeCallSite(global::java.lang.invoke.CallSite site)
467 {
468 var type = typeof(IKVM.Runtime.IndyCallSite<>).MakeGenericType(JVM.Context.MethodHandleUtil.GetDelegateTypeForInvokeExact(site.type()));
469 var ics = (IKVM.Runtime.IIndyCallSite)Activator.CreateInstance(type, true);
470 Interlocked.CompareExchange(ref site.ics, ics, null);
471 }
472
473#endif
474
475 public static void setCallSiteTargetNormal(global::java.lang.invoke.CallSite site, global::java.lang.invoke.MethodHandle target)
476 {
477#if FIRST_PASS
478 throw new NotImplementedException();
479#else
480 if (site.ics == null)
481 InitializeCallSite(site);
482
483 lock (site.ics)
484 {
485 site.target = target;
486 site.ics.SetTarget(target);
487 }
488#endif
489 }
490
491 public static void setCallSiteTargetVolatile(global::java.lang.invoke.CallSite site, global::java.lang.invoke.MethodHandle target)
492 {
493 setCallSiteTargetNormal(site, target);
494 }
495
496 public static void registerNatives()
497 {
498
499 }
500
501 public static object getMemberVMInfo(global::java.lang.invoke.MemberName self)
502 {
503#if FIRST_PASS
504 throw new NotImplementedException();
505#else
506 if (self.isField())
507 {
508 return new object[] { global::java.lang.Long.valueOf(0), self.getDeclaringClass() };
509 }
510 if (global::java.lang.invoke.MethodHandleNatives.refKindDoesDispatch(self.getReferenceKind()))
511 {
512 return new object[] { global::java.lang.Long.valueOf(0), self };
513 }
514 return new object[] { global::java.lang.Long.valueOf(-1), self };
515#endif
516 }
517
518 public static int getConstant(int which)
519 {
520 return 0;
521 }
522
523 public static int getNamedCon(int which, object[] name)
524 {
525#if FIRST_PASS
526 throw new NotImplementedException();
527#else
528 var fields = typeof(global::java.lang.invoke.MethodHandleNatives.Constants).GetFields(BindingFlags.Static | BindingFlags.NonPublic);
529 if (which >= fields.Length)
530 {
531 name[0] = null;
532 return -1;
533 }
534 name[0] = fields[which].Name;
535 return ((IConvertible)fields[which].GetRawConstantValue()).ToInt32(null);
536#endif
537 }
538
539 }
540
541}
System.Threading.Interlocked Interlocked
IKVM.Reflection.MethodInfo MethodInfo
static object staticFieldBase(global::java.lang.invoke.MemberName self)
Implements the native method 'staticFieldBase'.
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)
static void expand(global::java.lang.invoke.MemberName self)
static void setCallSiteTargetVolatile(global::java.lang.invoke.CallSite site, global::java.lang.invoke.MethodHandle target)
static void setCallSiteTargetNormal(global::java.lang.invoke.CallSite site, global::java.lang.invoke.MethodHandle target)
static object getMemberVMInfo(global::java.lang.invoke.MemberName self)
static void init(global::java.lang.invoke.MemberName self, object refObj, bool wantSpecial)
static global::java.lang.invoke.MemberName resolve(global::java.lang.invoke.MemberName self, global::java.lang.Class caller)
static bool Class_isInstance(global::java.lang.Class clazz, object obj)
static long objectFieldOffset(global::java.lang.invoke.MemberName self)
Implements the native method 'objectFieldOffset'.
static long staticFieldOffset(global::java.lang.invoke.MemberName self)
Implements the native method 'staticFieldOffset'.
static void init(global::java.lang.invoke.MemberName self, object refObj)
Main state of the running JVM.
MethodHandleUtil MethodHandleUtil
Gets the MethodHandleUtil associated with this instance of the runtime.
RuntimePrimitiveJavaTypeFactory PrimitiveJavaTypeFactory
Gets the RuntimePrimitiveJavaTypeFactory associated with this instance of the runtime.
CoreClasses JavaBase
Gets the CoreClasses associated with this instance of the runtime.