private static MethodHandle BindCaller(MethodHandle target, Class hostClass) { MethodHandle cbmh = MethodHandleImpl.BindCaller(target, hostClass); if (target.VarargsCollector) { MethodType type = cbmh.Type(); int arity = type.ParameterCount(); return(cbmh.AsVarargsCollector(type.ParameterType(arity - 1))); } return(cbmh); }
static MethodHandleNatives() { registerNatives(); COUNT_GWT = getConstant(Constants.GC_COUNT_GWT) != 0; // The JVM calls MethodHandleNatives.<clinit>. Cascade the <clinit> calls as needed: MethodHandleImpl.InitStatics(); //JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final': //ORIGINAL LINE: final int HR_MASK = ((1 << REF_getField) | (1 << REF_putField) | (1 << REF_invokeVirtual) | (1 << REF_invokeSpecial) | (1 << REF_invokeInterface)); int HR_MASK = ((1 << REF_getField) | (1 << REF_putField) | (1 << REF_invokeVirtual) | (1 << REF_invokeSpecial) | (1 << REF_invokeInterface)); for (sbyte refKind = REF_NONE + 1; refKind < REF_LIMIT; refKind++) { assert(RefKindHasReceiver(refKind) == (((1 << refKind) & HR_MASK) != 0)) : refKind; } assert(VerifyConstants()); }
// hooked up via map.xml (as a replacement for makePairwiseConvertByEditor) public static MethodHandle makePairwiseConvert(MethodHandle target, MethodType srcType, bool strict, bool monobox) { #if FIRST_PASS return(null); #else object[] convSpecs = MethodHandleImpl.computeValueConversions(srcType, target.type(), strict, monobox); List <LambdaForm.Name> names = new List <LambdaForm.Name>(); names.Add(new LambdaForm.Name(0, LambdaForm.BasicType.L_TYPE)); for (int i = 0; i < srcType.parameterCount(); i++) { names.Add(new LambdaForm.Name(i + 1, LambdaForm.BasicType.basicType(srcType.parameterType(i)))); } LambdaForm.Name[] invokeArgs = new LambdaForm.Name[srcType.parameterCount()]; for (int i = 0; i < invokeArgs.Length; i++) { object convSpec = convSpecs[i]; if (convSpec == null) { invokeArgs[i] = names[i + 1]; } else { LambdaForm.Name temp = new LambdaForm.Name(convSpec as MethodHandle ?? MethodHandleImpl.Lazy.MH_castReference.bindTo(convSpec), names[i + 1]); names.Add(temp); invokeArgs[i] = temp; } } names.Add(new LambdaForm.Name(target, invokeArgs)); if (convSpecs[convSpecs.Length - 1] != null) { object convSpec = convSpecs[convSpecs.Length - 1]; if (convSpec != java.lang.Void.TYPE) { names.Add(new LambdaForm.Name(convSpec as MethodHandle ?? MethodHandleImpl.Lazy.MH_castReference.bindTo(convSpec), names[names.Count - 1])); } } if (target.type().returnType() == java.lang.Void.TYPE && srcType.returnType() != java.lang.Void.TYPE) { names.Add(new LambdaForm.Name(LambdaForm.constantZero(LambdaForm.BasicType.basicType(srcType.returnType())))); } LambdaForm form = new LambdaForm("PairwiseConvert", srcType.parameterCount() + 1, names.ToArray()); return(new LightWeightMethodHandle(srcType, form)); #endif }
static CallSite() { MethodHandleImpl.InitStatics(); try { GET_TARGET = IMPL_LOOKUP.findVirtual(typeof(CallSite), "getTarget", MethodType.MethodType(typeof(MethodHandle))); THROW_UCS = IMPL_LOOKUP.findStatic(typeof(CallSite), "uninitializedCallSite", MethodType.MethodType(typeof(Object), typeof(Object[]))); } catch (ReflectiveOperationException e) { throw newInternalError(e); } try { TARGET_OFFSET = UNSAFE.objectFieldOffset(typeof(CallSite).getDeclaredField("target")); } catch (Exception ex) { throw new Error(ex); } }