Java 类java.lang.invoke.ConstantCallSite 实例源码

项目:openjdk-jdk10    文件:HotSpotGraphBuilderPlugins.java   
private static void registerCallSitePlugins(InvocationPlugins plugins) {
    InvocationPlugin plugin = new InvocationPlugin() {
        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            ValueNode callSite = receiver.get();
            ValueNode folded = CallSiteTargetNode.tryFold(GraphUtil.originalValue(callSite), b.getMetaAccess(), b.getAssumptions());
            if (folded != null) {
                b.addPush(JavaKind.Object, folded);
            } else {
                b.addPush(JavaKind.Object, new CallSiteTargetNode(b.getInvokeKind(), targetMethod, b.bci(), b.getInvokeReturnStamp(b.getAssumptions()), callSite));
            }
            return true;
        }

        @Override
        public boolean inlineOnly() {
            return true;
        }
    };
    plugins.register(plugin, ConstantCallSite.class, "getTarget", Receiver.class);
    plugins.register(plugin, MutableCallSite.class, "getTarget", Receiver.class);
    plugins.register(plugin, VolatileCallSite.class, "getTarget", Receiver.class);
}
项目:graal-core    文件:HotSpotGraphBuilderPlugins.java   
private static void registerCallSitePlugins(InvocationPlugins plugins) {
    InvocationPlugin plugin = new InvocationPlugin() {
        @Override
        public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
            ValueNode callSite = receiver.get();
            ValueNode folded = CallSiteTargetNode.tryFold(GraphUtil.originalValue(callSite), b.getMetaAccess(), b.getAssumptions());
            if (folded != null) {
                b.addPush(JavaKind.Object, folded);
            } else {
                b.addPush(JavaKind.Object, new CallSiteTargetNode(b.getInvokeKind(), targetMethod, b.bci(), b.getInvokeReturnStamp(b.getAssumptions()), callSite));
            }
            return true;
        }

        @Override
        public boolean inlineOnly() {
            return true;
        }
    };
    plugins.register(plugin, ConstantCallSite.class, "getTarget", Receiver.class);
    plugins.register(plugin, MutableCallSite.class, "getTarget", Receiver.class);
    plugins.register(plugin, VolatileCallSite.class, "getTarget", Receiver.class);
}
项目:vmboiler    文件:RT.java   
public static CallSite bsm_op(Lookup lookup, String name, MethodType methodType, Linker linker) {
  //System.out.println("link op " + name + methodType);

  MethodHandle[] mhs = Ops.OP_MAP.get(name);
  if (mhs == null) {
    throw new UnsupportedOperationException(name + methodType);
  }
  MethodHandle target;
  if (mhs[0].type() == methodType) {
    target = mhs[0];
  } else {
    target = mhs[1];
    if (target.type().returnType() != methodType.returnType()) {
      target = MethodHandles.filterReturnValue(target, checkTypeAndConvert(methodType.returnType()));
    }
    target = target.asType(methodType);
  }
  return new ConstantCallSite(target);
}
项目:vmboiler    文件:Linker.java   
public CallSite getCallSite(String name, MethodType methodType) {
  // try built-ins first
  if (name.equals("print")) {
    MethodHandle mh;
    try {
      mh = MethodHandles.publicLookup().findVirtual(PrintStream.class, "println",
          MethodType.methodType(void.class, methodType.parameterType(0)));
    } catch (NoSuchMethodException | IllegalAccessException e) {
      throw new AssertionError(e);
    }
    mh = mh.bindTo(System.out);
    return new ConstantCallSite(mh.asType(mh.type().changeReturnType(methodType.returnType())));
  }

  Function function = functionMap.get(name);
  if (function == null || function.fn.parameters().size() != methodType.parameterCount()) {
    throw new IllegalStateException("no function matching " + name + methodType + " found");
  }

  return function.createCallSite(this, name, methodType);
}
项目:vmboiler    文件:RT.java   
/**
 * Bootstrap method called called in a deoptimisation path when a return value
 * doesn't fit in the return type.
 *  
 * @param lookup the lookup object.
 * @param name the name of the method
 * @param methodType always (Object)OptimisiticError
 * @param deoptRet the callback to cause to indicate a deopt error.
 * @param deoptRetCsts the constant arguments of deoptRet
 * @return a call site
 * @throws Throwable if an error occurs
 */
// called by generated code
public static CallSite bsm_optimistic_failure(Lookup lookup, String name, MethodType methodType, MethodHandle deoptRet, Object... deoptRetCsts) throws Throwable {
  //System.out.println("bsm_optimistic_failure " +  name + " with " + deoptRet + "/" + deoptRetCsts.length);

  // do some checks
  //if (!deoptRet.type().equals(MethodType.methodType(boolean.class, Object.class))) {
  //  throw new WrongMethodTypeException("invalid deop callback signature ! " + deoptRet.type());
  //}

  // prepend lookup/name/methodType
  deoptRet = MethodHandles.insertArguments(deoptRet, 0, lookup, name, methodType);

  // bundle deoptRet constant arguments with deoptRet if necessary
  if (deoptRetCsts.length != 0) {
    deoptRet = MethodHandles.insertArguments(deoptRet, 1, deoptRetCsts);
  }

  return new ConstantCallSite(
      MethodHandles.filterReturnValue(OPTIMISTIC_ERROR_VALUE,
          deoptCallback(MethodHandles.identity(Object.class), deoptRet)));
}
项目:boon    文件:Lng.java   
/**
 * Reduce by functional support for int arrays.
 * @param array array of items to reduce by
 * @param object object that contains the reduce by function
 * @param <T> the type of object
 * @return the final reduction
 */
public  static <T> long reduceBy( final long[] array, T object ) {
    if (object.getClass().isAnonymousClass()) {
        return reduceByR(array, object );
    }


    try {
        ConstantCallSite callSite = Invoker.invokeReducerLongIntReturnLongMethodHandle(object);
        MethodHandle methodHandle = callSite.dynamicInvoker();
        try {

            long sum = 0;
            for ( long v : array ) {
                sum = (long) methodHandle.invokeExact( sum, v );

            }
            return sum;
        } catch (Throwable throwable) {
            return handle(Long.class, throwable, "Unable to perform reduceBy");
        }
    } catch (Exception ex) {
        return reduceByR(array, object);
    }

}
项目:boon    文件:Flt.java   
/**
 * Reduce by functional support for int arrays.
 * @param array array of items to reduce by
 * @param object object that contains the reduce by function
 * @param <T> the type of object
 * @return the final reduction
 */
public  static <T> double reduceBy( final float[] array, T object ) {
    if (object.getClass().isAnonymousClass()) {
        return reduceByR(array, object );
    }


    try {
        ConstantCallSite callSite = Invoker.invokeReducerLongIntReturnLongMethodHandle(object);
        MethodHandle methodHandle = callSite.dynamicInvoker();
        try {

            double sum = 0;
            for ( float v : array ) {
                sum = (double) methodHandle.invokeExact( sum, v );

            }
            return sum;
        } catch (Throwable throwable) {
            return Exceptions.handle(Long.class, throwable, "Unable to perform reduceBy");
        }
    } catch (Exception ex) {
        return reduceByR(array, object);
    }

}
项目:boon    文件:Int.java   
/**
 * Reduce by functional support for int arrays.
 * @param array array of items to reduce by
 * @param object object that contains the reduce by function
 * @param <T> the type of object
 * @return the final reduction
 */
public  static <T> long reduceBy( final int[] array, T object ) {
    if (object.getClass().isAnonymousClass()) {
        return reduceByR(array, object );
    }


    try {
        ConstantCallSite callSite = Invoker.invokeReducerLongIntReturnLongMethodHandle(object);
        MethodHandle methodHandle = callSite.dynamicInvoker();
        try {

            long sum = 0;
            for ( int v : array ) {
                sum = (long) methodHandle.invokeExact( sum, v );

            }
            return sum;
        } catch (Throwable throwable) {
            return handle(Long.class, throwable, "Unable to perform reduceBy");
        }
    } catch (Exception ex) {
        return reduceByR(array, object);
    }

}
项目:boon    文件:Dbl.java   
/**
 * Reduce by functional support for int arrays.
 * @param array array of items to reduce by
 * @param object object that contains the reduce by function
 * @param <T> the type of object
 * @return the final reduction
 */
public  static <T> double reduceBy( final double[] array, T object ) {
    if (object.getClass().isAnonymousClass()) {
        return reduceByR(array, object );
    }


    try {
        ConstantCallSite callSite = Invoker.invokeReducerLongIntReturnLongMethodHandle(object);
        MethodHandle methodHandle = callSite.dynamicInvoker();
        try {

            double sum = 0;
            for ( double v : array ) {
                sum = (double) methodHandle.invokeExact( sum, v );

            }
            return sum;
        } catch (Throwable throwable) {
            return Exceptions.handle(Long.class, throwable, "Unable to perform reduceBy");
        }
    } catch (Exception ex) {
        return reduceByR(array, object);
    }

}
项目:presto    文件:Bootstrap.java   
public static CallSite bootstrap(MethodHandles.Lookup callerLookup, String name, MethodType type, long bindingId)
{
    try {
        ClassLoader classLoader = callerLookup.lookupClass().getClassLoader();
        checkArgument(classLoader instanceof DynamicClassLoader, "Expected %s's classloader to be of type %s", callerLookup.lookupClass().getName(), DynamicClassLoader.class.getName());

        DynamicClassLoader dynamicClassLoader = (DynamicClassLoader) classLoader;
        MethodHandle target = dynamicClassLoader.getCallSiteBindings().get(bindingId);
        checkArgument(target != null, "Binding %s for function %s%s not found", bindingId, name, type.parameterList());

        return new ConstantCallSite(target);
    }
    catch (Throwable e) {
        if (e instanceof InterruptedException) {
            Thread.currentThread().interrupt();
        }
        throw Throwables.propagate(e);
    }
}
项目:invokedynamic-proxy    文件:DynamicProxySmokeTest.java   
@Test
public void testCallBinding() throws Throwable {
    CountDownLatch latch = new CountDownLatch(1);
    MethodHandle invokee = LOOKUP.findVirtual(CountDownLatch.class, "countDown", MethodType.methodType(Void.TYPE))
                                 .bindTo(latch);
    MethodHandle boundInvokee = MethodHandles.dropArguments(invokee, 0, Object.class);
    DynamicInvocationHandler handler = (lookup, name, type, superMethod) -> new ConstantCallSite(boundInvokee.asType(type));

    DynamicProxy proxy = DynamicProxy.builder()
            .withInterfaces(OneMethodInterface.class)
            .withInvocationHandler(handler)
            .build();
    ((OneMethodInterface)proxy.supplier().get()).foo();

    assertEquals(0, latch.getCount());
}
项目:invokedynamic-proxy    文件:DynamicProxySuperclassTests.java   
@Test
public void whenDefaultImplementationAvailable_itCanBeOverridden() throws Throwable {
    DynamicInvocationHandler handler = (lookup, name, type, superMethod) -> {
        MethodHandle h;
        if (name.equals("foo")) {
            h = MethodHandles.dropArguments(
                    MethodHandles.constant(String.class, "bar"),
                    0,
                    Object.class
            ).asType(type);
        } else {
            h = superMethod.asType(type);
        }

        return new ConstantCallSite(h);
    };

    I1 obj = (I1) DynamicProxy.builder()
            .withInvocationHandler(handler)
            .withInterfaces(I1.class)
            .build()
            .constructor()
            .invoke();

    assertEquals("bar", obj.foo());
}
项目:invokedynamic-proxy    文件:DynamicProxySuperclassTests.java   
@Test
public void whenInterfacesHaveMultipleInheritance_interfaceMethodsAreProxied() throws Throwable {
    DynamicInvocationHandler handler = (lookup, name, type, supermethod) -> new ConstantCallSite(
            MethodHandles.dropArguments(
                    MethodHandles.constant(type.returnType(), null),
                    0,
                    type.parameterList()
            )
    );

    IFaceC obj = DynamicProxy.builder()
            .withInvocationHandler(handler)
            .withInterfaces(IFaceC.class)
            .build()
            .construct();

    obj.a();
    obj.b();
}
项目:jsjs    文件:RT.java   
public static CallSite bsm(Lookup lookup, String name, MethodType methodType) {
  int index = name.indexOf(':');
  String protocol = name.substring(0, index);
  String op = name.substring(index + 1);

  MethodHandle target;
  switch(protocol) {
  case "call":         // function call
  case "binary":       // binary op
  case "instanceof":   // instanceof op
  case "asthrowable":  // wrap into an error if needed
    JSFunction function = (JSFunction)GLOBAL_MAP.get(lookup.lookupClass()).get(op);
    if (function == null) {  // add an error message if the object is not a function
      throw new Error("fail to do " + protocol + " on " + op);
    }
    target = function.getFunctionTarget(genericMethodType(methodType.parameterCount())).asType(methodType);
    break;
  case "truth":  // give me the truth
    target = identity(Object.class).asType(methodType(boolean.class, Object.class));
    break;
  default:
    throw new Error("unknown protocol " + protocol + ":" + op);
  }
  return new ConstantCallSite(target.asType(methodType));
}
项目:proxy2    文件:Intercept.java   
public static void main(String[] args) {
  ProxyFactory<IntBinaryOperator> factory = Proxy2.createAnonymousProxyFactory(IntBinaryOperator.class, new Class<?>[] { IntBinaryOperator.class },
      new ProxyHandler.Default() { 
        @Override
        public CallSite bootstrap(ProxyContext context) throws Throwable {
          MethodHandle target =
            methodBuilder(context.type())
              .dropFirst()
              .before(b -> b
                  .dropFirst()
                  .unreflect(publicLookup(), Intercept.class.getMethod("intercept", int.class, int.class)))
              .unreflect(publicLookup(), context.method());
          return new ConstantCallSite(target);
        }
      });

  //IntBinaryOperator op = (a, b) -> a + b;
  IntBinaryOperator op = (a, b) -> {
    throw null;
  };

  IntBinaryOperator op2 = factory.create(op);
  System.out.println(op2.applyAsInt(1, 2));
}
项目:proxy2    文件:Delegation.java   
public static void main(String[] args) {
  ProxyFactory<Delegation> factory = Proxy2.createAnonymousProxyFactory(Delegation.class, new Class<?>[] { PrintStream.class },
      new ProxyHandler.Default() { 
        @Override
        public CallSite bootstrap(ProxyContext context) throws Throwable {
          MethodHandle target =
            methodBuilder(context.type())
              .dropFirst()
              .unreflect(publicLookup(), PrintStream.class.getMethod("println", String.class));
          return new ConstantCallSite(target);
        }
      });

  Delegation hello = factory.create(System.out);
  hello.println("hello proxy2");
}
项目:proxy2    文件:Print.java   
public static void main(String[] args) {
  ProxyFactory<Print> factory = Proxy2.createAnonymousProxyFactory(Print.class, new ProxyHandler.Default() { 
    @Override
    public CallSite bootstrap(ProxyContext context) throws Throwable {
      MethodHandle target =
          methodBuilder(context.type())
            .dropFirst()
            .insertAt(0, PrintStream.class, System.out)
            .unreflect(publicLookup(), PrintStream.class.getMethod("println", String.class));
      return new ConstantCallSite(target);
    }
  });

  Print hello = factory.create();
  hello.println("hello proxy2");
}
项目:proxy2    文件:Transparent.java   
public static void main(String[] args) {
  ProxyFactory<IntBinaryOperator> factory = Proxy2.createAnonymousProxyFactory(IntBinaryOperator.class, new Class<?>[] { IntBinaryOperator.class },
      new ProxyHandler.Default() { 
        @Override
        public CallSite bootstrap(ProxyContext context) throws Throwable {
          MethodHandle target =
            methodBuilder(context.type())
              .dropFirst()
              .unreflect(publicLookup(), context.method());
          return new ConstantCallSite(target);
        }
      });

  IntBinaryOperator op = (a, b) -> a + b;

  IntBinaryOperator op2 = factory.create(op);
  System.out.println(op2.applyAsInt(1, 2));
}
项目:proxy2    文件:GCTest.java   
public static void main(String[] args) {
  ProxyFactory<Runnable> factory = Proxy2.createAnonymousProxyFactory(Runnable.class, new ProxyHandler.Default() { 
    @Override
    public CallSite bootstrap(ProxyContext context) throws Throwable {
      return new ConstantCallSite(
          dropArguments(
            insertArguments(
              publicLookup().findVirtual(PrintStream.class, "println",
                  methodType(void.class, String.class)),
              0, System.out, "hello proxy"),
            0, Object.class));
    }
  });
  Runnable runnable = factory.create();
  runnable.run();

  factory = null;
  runnable = null;

  System.gc();  // should unload the proxy class
}
项目:proxy2    文件:Intercept2.java   
public static void main(String[] args) {
  ProxyFactory<IntBinaryOperator> factory = Proxy2.createAnonymousProxyFactory(IntBinaryOperator.class, new Class<?>[] { IntBinaryOperator.class },
      new ProxyHandler.Default() { 
        @Override
        public CallSite bootstrap(ProxyContext context) throws Throwable {
          MethodHandle target =
            methodBuilder(context.type())
              .dropFirst()
              .before(b -> b
                  .dropFirst()
                  .boxAll()
                  .unreflect(publicLookup(), Intercept2.class.getMethod("intercept", Object[].class)))
              .unreflect(publicLookup(), context.method());
          return new ConstantCallSite(target);
        }
      });

  IntBinaryOperator op = (a, b) -> a + b;

  IntBinaryOperator op2 = factory.create(op);
  System.out.println(op2.applyAsInt(1, 2));
}
项目:proxy2    文件:ORMapper.java   
@Override
protected MethodHandle computeValue(Class<?> type) {
  Lookup lookup = lookup();
  return Proxy2.createAnonymousProxyFactory(publicLookup(), methodType(type), new ProxyHandler.Default() {
    @Override
    public CallSite bootstrap(ProxyContext context) throws Throwable {
      Method method = context.method();
      switch(method.getName()) {
      case "create":
        MethodHandle target = methodBuilder(context.type())
            .dropFirst()
            .insertAt(0, ClassValue.class, beanFactories)
            .insertAt(1, Class.class, method.getReturnType())
            .convertTo(Object.class, ClassValue.class, Class.class)
            .unreflect(lookup, ORMapper.class.getDeclaredMethod("newBean", ClassValue.class, Class.class));
        return new ConstantCallSite(target);
      default:
        throw new NoSuchMethodError(method.toString());
      }
    }
  });
}
项目:proxy2    文件:Hello.java   
public static void main(String[] args) {
  ProxyFactory<Hello> factory = Proxy2.createAnonymousProxyFactory(Hello.class, new ProxyHandler.Default() { 
    @Override
    public CallSite bootstrap(ProxyContext context) throws Throwable {
      System.out.println("bootstrap method " + context.method());
      System.out.println("bootstrap type " + context.type());
      MethodHandle target =
          methodBuilder(context.type())
            .dropFirst()
            .unreflect(publicLookup(), String.class.getMethod("concat", String.class));
      return new ConstantCallSite(target);
    }
  });

  Hello simple = factory.create();
  System.out.println(simple.message("hello ", "proxy"));
  System.out.println(simple.message("hello ", "proxy 2"));
}
项目:vmboiler    文件:RT.java   
public static CallSite bsm_op(Lookup lookup, String name, MethodType methodType, Linker linker) {
  //System.out.println("link op " + name + methodType);

  MethodHandle[] mhs = Ops.OP_MAP.get(name);
  if (mhs == null) {
    throw new UnsupportedOperationException(name + methodType);
  }
  MethodHandle target;
  if (mhs[0].type() == methodType) {
    target = mhs[0];
  } else {
    target = mhs[1];
    if (target.type().returnType() != methodType.returnType()) {
      target = MethodHandles.filterReturnValue(target, checkTypeAndConvert(methodType.returnType()));
    }
    target = target.asType(methodType);
  }
  return new ConstantCallSite(target);
}
项目:vmboiler    文件:Linker.java   
public CallSite getCallSite(String name, MethodType methodType) {
  // try built-ins first
  if (name.equals("print")) {
    MethodHandle mh;
    try {
      mh = MethodHandles.publicLookup().findVirtual(PrintStream.class, "println",
          MethodType.methodType(void.class, methodType.parameterType(0)));
    } catch (NoSuchMethodException | IllegalAccessException e) {
      throw new AssertionError(e);
    }
    mh = mh.bindTo(System.out);
    return new ConstantCallSite(mh.asType(mh.type().changeReturnType(methodType.returnType())));
  }

  Function function = functionMap.get(name);
  if (function == null || function.fn.parameters().size() != methodType.parameterCount()) {
    throw new IllegalStateException("no function matching " + name + methodType + " found");
  }

  return function.createCallSite(this, name, methodType);
}
项目:vmboiler    文件:RT.java   
/**
 * Bootstrap method called called in a deoptimisation path when a return value
 * doesn't fit in the return type.
 *  
 * @param lookup the lookup object.
 * @param name the name of the method
 * @param methodType always (Object)OptimisiticError
 * @param deoptRet the callback to cause to indicate a deopt error.
 * @param deoptRetCsts the constant arguments of deoptRet
 * @return a call site
 * @throws Throwable if an error occurs
 */
// called by generated code
public static CallSite bsm_optimistic_failure(Lookup lookup, String name, MethodType methodType, MethodHandle deoptRet, Object... deoptRetCsts) throws Throwable {
  //System.out.println("bsm_optimistic_failure " +  name + " with " + deoptRet + "/" + deoptRetCsts.length);

  // do some checks
  //if (!deoptRet.type().equals(MethodType.methodType(boolean.class, Object.class))) {
  //  throw new WrongMethodTypeException("invalid deop callback signature ! " + deoptRet.type());
  //}

  // prepend lookup/name/methodType
  deoptRet = MethodHandles.insertArguments(deoptRet, 0, lookup, name, methodType);

  // bundle deoptRet constant arguments with deoptRet if necessary
  if (deoptRetCsts.length != 0) {
    deoptRet = MethodHandles.insertArguments(deoptRet, 1, deoptRetCsts);
  }

  return new ConstantCallSite(
      MethodHandles.filterReturnValue(OPTIMISTIC_ERROR_VALUE,
          deoptCallback(MethodHandles.identity(Object.class), deoptRet)));
}
项目:smartass    文件:Script.java   
@MethodInfo(hidden=true)
public static CallSite bsm_symbol(Lookup lookup, String name, @SuppressWarnings("unused")MethodType mtype, String symbol) {
  ScriptClassLoader classLoader = (ScriptClassLoader)lookup.lookupClass().getClassLoader();
  Script script = classLoader.getScript();

  Object constant = script.resolveKlass(symbol);
  if (constant == null) {
    if (!name.equals("symbolOrString")) {
      throw new BootstrapMethodError("unknown local variable " + symbol);
    }
    constant = symbol;
  }

  //System.out.println("resolved symbol " + symbol + " as " + constant.getClass());
  return new ConstantCallSite(MethodHandles.constant(Object.class, constant));
}
项目:smartass    文件:Script.java   
@MethodInfo(hidden=true)
public static CallSite bsm_lambda(Lookup lookup, @SuppressWarnings("unused") String name, MethodType type, int constantIndex) {
  ScriptClassLoader classLoader = (ScriptClassLoader)lookup.lookupClass().getClassLoader();
  Script script = classLoader.getScript();
  ProtoFun protoFun = (ProtoFun)script.dictionary.getConstantAt(constantIndex);
  List<String> freeVars = protoFun.freeVars;
  Lambda lambda = protoFun.lambda;
  List<String> parameters = lambda.getParameters().stream().map(Parameter::getName).collect(Collectors.toList());

  // no free variables, always return the same function
  if (freeVars.isEmpty()) {
    Function function = Function.createFromLambda(script, freeVars, parameters, lambda);
    return new ConstantCallSite(MethodHandles.constant(Object.class, function));
  }

  BoundInfo boundInfo = new BoundInfo(script, freeVars, parameters, lambda);
  return new ConstantCallSite(BOUND_FUNCTION.bindTo(boundInfo).asCollector(Object[].class, type.parameterCount()));
}
项目:guards    文件:Linker.java   
@NotNull
CallSite bootstrap(@NotNull MethodHandles.Lookup caller,
                   @NotNull MethodType type,
                   @NotNull String targetMethodName,
                   @NotNull String targetMethodDescriptor,
                   @NotNull int parameterIndex,
                   @NotNull String parameterName) {
    //assert type.returnType() == void.class;
    //assert type.parameterCount() == 1;
    //assert parameterIndex >= -1;
    MethodType targetType = MethodType.fromMethodDescriptorString(targetMethodDescriptor, caller.lookupClass().getClassLoader());
    MethodGuards guards = callSiteCache.get(new MethodPointer(targetMethodName, targetType));
    if ( guards == null ) {
        return new ConstantCallSite(Indy.nopHandle(type.parameterType(0)));
        //throw new GuardsInternalError("Guards requested for non-guarded method " + Diagnostics.toString(caller.lookupClass(), name, guardedMethodType));
    }
    else {
        return guards.getCallSite(parameterIndex, parameterName);
    }
}
项目:es6draft    文件:NativeCalls.java   
/**
 * Returns the native call {@code CallSite} object.
 * 
 * @param caller
 *            the caller lookup object
 * @param name
 *            the native call name
 * @param type
 *            the native call type
 * @return the native call {@code CallSite} object
 */
public static CallSite bootstrapDynamic(MethodHandles.Lookup caller, String name, MethodType type) {
    MethodHandle target;
    try {
        if (!name.startsWith("native:")) {
            throw new IllegalArgumentException();
        }
        String methodName = name.substring("native:".length());
        MethodHandle mh = nativeMethods.computeIfAbsent(methodName, NativeCalls::getNativeMethodHandle);
        if (mh == null) {
            return createRuntimeCallSite(methodName, type);
        }
        target = adaptMethodHandle(methodName, type, mh);
    } catch (IllegalArgumentException e) {
        target = invalidCallHandle(name, type);
    }
    return new ConstantCallSite(target);
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmLookupStaticWithExtraArgs(
    MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)
    throws NoSuchMethodException, IllegalAccessException {
  System.out.println(i);
  System.out.println(l);
  System.out.println(f);
  System.out.println(d);
  final MethodHandles.Lookup lookup = MethodHandles.lookup();
  final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
  return new ConstantCallSite(targetMH.asType(type));
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmCreateCallSite(
    MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
    throws Throwable {
  // Using mh to create the call site fails when run on Art. See b/36957105 for details.
  final MethodHandle targetMH = MethodHandles.lookup().findSpecial(Super.class,
              "targetMethodTest5", MethodType.methodType(void.class), InvokeCustom.class);
  return new ConstantCallSite(targetMH);
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmCreateCallCallingtargetMethodTest6(
    MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
    throws Throwable {
  // Using mh to create the call site fails when run on Art. See b/36957105 for details.
  final MethodHandle targetMH =
      MethodHandles.lookup().findVirtual(
          I.class, "targetMethodTest6", MethodType.methodType(void.class));
  return new ConstantCallSite(targetMH);
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmCreateCallCallingtargetMethodTest7(
    MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
    throws Throwable {
  // Using mh to create the call site fails when run on Art. See b/36957105 for details.
  final MethodHandle targetMH =
      MethodHandles.lookup().findVirtual(
          J.class, "targetMethodTest7", MethodType.methodType(void.class));
  return new ConstantCallSite(targetMH);
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmCreateCallCallingtargetMethodTest8(
    MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
    throws Throwable {
  // Using mh to create the call site fails when run on Art. See b/36957105 for details.
  final MethodHandle targetMH =
      MethodHandles.lookup().findVirtual(
          J.class, "targetMethodTest8", MethodType.methodType(void.class));
  return new ConstantCallSite(targetMH);
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmCreateCallCallingtargetMethodTest9(
    MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
    throws Throwable {
  // Using mh to create the call site fails when run on Art. See b/36957105 for details.
  final MethodHandle targetMH =
      MethodHandles.lookup().findVirtual(
          InvokeCustom.class, "targetMethodTest9", MethodType.methodType(void.class));
  return new ConstantCallSite(targetMH);
}
项目:r8    文件:InvokeCustom.java   
public static CallSite bsmCreateCallCallingtargetMethodTest10(
    MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
    throws Throwable {
  // Using mh to create the call site fails when run on Art. See b/36957105 for details.
  final MethodHandle targetMH =
      MethodHandles.lookup().findVirtual(
          InvokeCustom.class, "targetMethodTest10", MethodType.methodType(void.class));
  return new ConstantCallSite(targetMH);
}
项目:openjdk-jdk10    文件:HotSpotMethodSubstitutionTest.java   
public static String testCallSiteGetTargetSnippet(int i) throws Exception {
    ConstantCallSite site;
    MethodHandles.Lookup lookup = MethodHandles.lookup();
    switch (i) {
        case 1:
            site = GraalDirectives.opaque(new ConstantCallSite(lookup.findVirtual(String.class, "replace", MethodType.methodType(String.class, char.class, char.class))));
            break;
        default:
            site = GraalDirectives.opaque(new ConstantCallSite(lookup.findStatic(java.util.Arrays.class, "asList", MethodType.methodType(java.util.List.class, Object[].class))));
    }
    return site.getTarget().toString();
}
项目:openjdk-jdk10    文件:HotSpotObjectConstantImpl.java   
public JavaConstant getCallSiteTarget(Assumptions assumptions) {
    if (object instanceof CallSite) {
        CallSite callSite = (CallSite) object;
        MethodHandle target = callSite.getTarget();
        if (!(callSite instanceof ConstantCallSite)) {
            if (assumptions == null) {
                return null;
            }
            assumptions.record(new Assumptions.CallSiteTargetValue(callSite, target));
        }
        return HotSpotObjectConstantImpl.forObject(target);
    }
    return null;
}
项目:openjdk-jdk10    文件:BootstrapMethodErrorTest.java   
public static CallSite getCallSite() {
    try {
        MethodHandle mh = MethodHandles.lookup().findStatic(
                BootstrapMethodErrorTest.class,
                "target",
                MethodType.methodType(Object.class, Object.class));
        return new ConstantCallSite(mh);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
项目:openjdk-jdk10    文件:VMAnonymousClasses.java   
public static void main(String[] args) throws ReflectiveOperationException  {
    // Objects
    test(new Object());
    test("TEST");
    test(new VMAnonymousClasses());
    test(null);

    // Class
    test(String.class);

    // Arrays
    test(new boolean[0]);
    test(new byte[0]);
    test(new char[0]);
    test(new short[0]);
    test(new int[0]);
    test(new long[0]);
    test(new float[0]);
    test(new double[0]);
    test(new Object[0]);

    // Multi-dimensional arrays
    test(new byte[0][0]);
    test(new Object[0][0]);

    // MethodHandle-related
    MethodType   mt = MethodType.methodType(void.class, String[].class);
    MethodHandle mh = MethodHandles.lookup().findStatic(VMAnonymousClasses.class, "main", mt);
    test(mt);
    test(mh);
    test(new ConstantCallSite(mh));
    test(new MutableCallSite(MethodType.methodType(void.class)));
    test(new VolatileCallSite(MethodType.methodType(void.class)));

    System.out.println("TEST PASSED");
}