Example usage for org.objectweb.asm Handle Handle

List of usage examples for org.objectweb.asm Handle Handle

Introduction

In this page you can find the example usage for org.objectweb.asm Handle Handle.

Prototype

@Deprecated
public Handle(final int tag, final String owner, final String name, final String descriptor) 

Source Link

Document

Constructs a new field or method handle.

Usage

From source file:ch.eiafr.cojac.FloatReplacerMethodVisitor.java

License:Apache License

@Override
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
    if (!bsm.getOwner().equals("java/lang/invoke/LambdaMetafactory")) {
        mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
        return; // TODO: handle any bootstrap method in invokedynamic
    }//  ww w . j ava  2 s  .c o m
    if (!(bsmArgs[0] instanceof Type) || !(bsmArgs[1] instanceof Handle) || !(bsmArgs[2] instanceof Type)) {
        mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
        return;
    }
    Type a0 = (Type) (bsmArgs[0]);
    Type a2 = (Type) (bsmArgs[2]);
    Handle target = (Handle) (bsmArgs[1]);
    String handleOwner = target.getOwner();
    if (!references.hasToBeInstrumented(handleOwner)) {
        mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
        return;
    }
    Object[] bsmArgsAfter = new Object[bsmArgs.length];
    for (int i = 0; i < bsmArgs.length; i++) {
        bsmArgsAfter[i] = bsmArgs[i];
    }
    String a0Before = a0.getInternalName(), a2Before = a2.getInternalName();
    String a0After = replaceFloatMethodDescription(a0Before), a2After = replaceFloatMethodDescription(a2Before);
    bsmArgsAfter[0] = Type.getType(a0After);
    bsmArgsAfter[2] = Type.getType(a2After);
    bsmArgsAfter[1] = new Handle(target.getTag(), target.getOwner(), target.getName(),
            replaceFloatMethodDescription(target.getDesc()));
    mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgsAfter);
}

From source file:clientapi.load.transform.ITransformer.java

License:Apache License

/**
 * Creates a handle for a method/* w  w w  .  j a v  a2 s  .c  o  m*/
 *
 * @param tag The handle tag
 * @param owner The method container
 * @param method The method name
 * @param desc The method description
 */
default Handle createMethodHandle(int tag, String owner, String method, String desc) {
    return new Handle(tag, owner, method, desc);
}

From source file:com.facebook.presto.sql.gen.LambdaBytecodeGenerator.java

License:Apache License

private static CompiledLambda defineLambdaMethodAndField(RowExpressionCompiler innerExpressionCompiler,
        ClassDefinition classDefinition, String fieldAndMethodName, List<Parameter> inputParameters,
        LambdaDefinitionExpression lambda) {
    checkCondition(inputParameters.size() <= 254, NOT_SUPPORTED, "Too many arguments for lambda expression");
    Class<?> returnType = Primitives.wrap(lambda.getBody().getType().getJavaType());
    MethodDefinition method = classDefinition.declareMethod(a(PUBLIC), fieldAndMethodName, type(returnType),
            inputParameters);//  w  w  w  .j  ava2s .  com

    Scope scope = method.getScope();
    Variable wasNull = scope.declareVariable(boolean.class, "wasNull");
    BytecodeNode compiledBody = innerExpressionCompiler.compile(lambda.getBody(), scope);
    method.getBody().putVariable(wasNull, false).append(compiledBody)
            .append(boxPrimitiveIfNecessary(scope, returnType)).ret(returnType);

    FieldDefinition staticField = classDefinition.declareField(a(PRIVATE, STATIC, FINAL), fieldAndMethodName,
            type(MethodHandle.class));
    FieldDefinition instanceField = classDefinition.declareField(a(PRIVATE, FINAL),
            "binded_" + fieldAndMethodName, type(MethodHandle.class));

    classDefinition.getClassInitializer().getBody()
            .append(setStatic(staticField,
                    invokeStatic(Reflection.class, "methodHandle", MethodHandle.class,
                            constantClass(classDefinition.getType()), constantString(fieldAndMethodName),
                            newArray(type(Class[].class), inputParameters.stream().map(Parameter::getType)
                                    .map(BytecodeExpressions::constantClass).collect(toImmutableList())))));

    Handle lambdaAsmHandle = new Handle(Opcodes.H_INVOKEVIRTUAL, method.getThis().getType().getClassName(),
            method.getName(), method.getMethodDescriptor());

    return new CompiledLambda(lambdaAsmHandle, method.getReturnType(), method.getParameterTypes(), staticField,
            instanceField);
}

From source file:com.gargoylesoftware.js.nashorn.internal.codegen.MethodEmitter.java

License:Open Source License

/**
 * Push a method handle to the stack// w  w  w  .ja  va2s .  c o m
 *
 * @param className  class name
 * @param methodName method name
 * @param descName   descriptor
 * @param flags      flags that describe this handle, e.g. invokespecial new, or invoke virtual
 *
 * @return the method emitter
 */
MethodEmitter loadHandle(final String className, final String methodName, final String descName,
        final EnumSet<Flag> flags) {
    debug("load handle ");
    pushType(Type.OBJECT.ldc(method, new Handle(Flag.getValue(flags), className, methodName, descName)));
    return this;
}

From source file:com.gargoylesoftware.js.nashorn.internal.runtime.linker.JavaAdapterBytecodeGenerator.java

License:Open Source License

private void generateFinalizerOverride(final String finalizerDelegateName) {
    final InstructionAdapter mv = new InstructionAdapter(
            cw.visitMethod(ACC_PUBLIC, "finalize", VOID_NOARG_METHOD_DESCRIPTOR, null, null));
    // Overridden finalizer will take a MethodHandle to the finalizer delegating method, ...
    mv.aconst(new Handle(Opcodes.H_INVOKESTATIC, generatedClassName, finalizerDelegateName,
            Type.getMethodDescriptor(Type.VOID_TYPE, OBJECT_TYPE)));
    mv.visitVarInsn(ALOAD, 0);//from  w  w  w .  j av  a 2 s .co m
    // ...and invoke it through JavaAdapterServices.invokeNoPermissions
    mv.invokestatic(SERVICES_CLASS_TYPE_NAME, "invokeNoPermissions",
            Type.getMethodDescriptor(METHOD_HANDLE_TYPE, OBJECT_TYPE), false);
    mv.visitInsn(RETURN);
    endMethod(mv);
}

From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ClassGenerator.java

License:Open Source License

static void newFunction(final MethodGenerator mi, final String className, final MemberInfo memInfo,
        final List<MemberInfo> specs) {
    final boolean arityFound = (memInfo.getArity() != MemberInfo.DEFAULT_ARITY);

    mi.loadLiteral(memInfo.getName());//w w  w. j  a va 2  s  . c o  m
    mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, memInfo.getJavaName(), memInfo.getJavaDesc()));

    assert specs != null;
    if (!specs.isEmpty()) {
        mi.memberInfoArray(className, specs);
        mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN,
                SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC);
    } else {
        mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_DESC);
    }

    if (arityFound) {
        mi.dup();
        mi.push(memInfo.getArity());
        mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETARITY, SCRIPTFUNCTION_SETARITY_DESC);
    }
}

From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ClassGenerator.java

License:Open Source License

static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo memInfo) {
    final String propertyName = memInfo.getName();
    // stack: Collection
    // dup of Collection instance
    mi.dup();/*from   w w  w  . ja  v a 2s.  co m*/

    // property = AccessorProperty.create(key, flags, getter, setter);
    mi.loadLiteral(propertyName);
    // setup flags
    mi.push(memInfo.getAttributes());
    // setup getter method handle
    String javaName = GETTER_PREFIX + memInfo.getJavaName();
    mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, getterDesc(memInfo)));
    // setup setter method handle
    if (memInfo.isFinal()) {
        mi.pushNull();
    } else {
        javaName = SETTER_PREFIX + memInfo.getJavaName();
        mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, setterDesc(memInfo)));
    }
    mi.invokeStatic(ACCESSORPROPERTY_TYPE, ACCESSORPROPERTY_CREATE, ACCESSORPROPERTY_CREATE_DESC);
    // boolean Collection.add(property)
    mi.invokeInterface(COLLECTION_TYPE, COLLECTION_ADD, COLLECTION_ADD_DESC);
    // pop return value of Collection.add
    mi.pop();
    // stack: Collection
}

From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ClassGenerator.java

License:Open Source License

static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo getter,
        final MemberInfo setter) {
    final String propertyName = getter.getName();
    // stack: Collection
    // dup of Collection instance
    mi.dup();//from   w  ww.  j a v  a2 s . c  o  m

    // property = AccessorProperty.create(key, flags, getter, setter);
    mi.loadLiteral(propertyName);
    // setup flags
    mi.push(getter.getAttributes());
    // setup getter method handle
    mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, getter.getJavaName(), getter.getJavaDesc()));
    // setup setter method handle
    if (setter == null) {
        mi.pushNull();
    } else {
        mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, setter.getJavaName(), setter.getJavaDesc()));
    }
    mi.invokeStatic(ACCESSORPROPERTY_TYPE, ACCESSORPROPERTY_CREATE, ACCESSORPROPERTY_CREATE_DESC);
    // boolean Collection.add(property)
    mi.invokeInterface(COLLECTION_TYPE, COLLECTION_ADD, COLLECTION_ADD_DESC);
    // pop return value of Collection.add
    mi.pop();
    // stack: Collection
}

From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ClassJavaGenerator.java

License:Open Source License

static void newFunction(final MethodGenerator mi, final String className, final MemberInfo memInfo,
        final List<MemberInfo> specs) {
    final boolean arityFound = (memInfo.getArity() != MemberInfo.DEFAULT_ARITY);

    mi.loadLiteral(memInfo.getName());//  w ww.  j av a  2  s.  c  om
    mi.visitLdcInsn(new Handle(H_INVOKESTATIC, className, memInfo.getJavaName(), memInfo.getJavaDesc()));

    assert specs != null;
    if (!specs.isEmpty()) {
        mi.memberInfoArray(className, specs);
        mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN,
                SCRIPTFUNCTION_CREATEBUILTIN_SPECS_DESC);
        builder.append("ScriptFunction.createBuiltin(\"" + memInfo.getName() + "\"," + System.lineSeparator());
        builder.append("                    staticHandle(\"" + memInfo.getJavaName() + "\", "
                + descToJava(memInfo.getJavaDesc()) + ")");
        builder.append(", new Specialization[] {" + System.lineSeparator());
        for (int i = 0; i < specs.size(); i++) {
            final MemberInfo m = specs.get(i);
            builder.append("                        new Specialization(staticHandle(\"" + m.getJavaName()
                    + "\", " + descToJava(m.getJavaDesc()) + "), " + m.isOptimistic() + ")");
            if (i < specs.size() - 1) {
                builder.append(',');
            }
            builder.append(System.lineSeparator());
        }
        builder.append("                    });" + System.lineSeparator());
    } else {
        builder.append("ScriptFunction.createBuiltin(\"" + memInfo.getName() + "\"," + System.lineSeparator());
        builder.append("                    staticHandle(\"" + memInfo.getJavaName() + "\", "
                + descToJava(memInfo.getJavaDesc()) + "));" + System.lineSeparator());
        mi.invokeStatic(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_CREATEBUILTIN, SCRIPTFUNCTION_CREATEBUILTIN_DESC);
    }

    if (arityFound) {
        mi.dup();
        mi.push(memInfo.getArity());
        mi.invokeVirtual(SCRIPTFUNCTION_TYPE, SCRIPTFUNCTION_SETARITY, SCRIPTFUNCTION_SETARITY_DESC);
        builder.append("            " + memInfo.getJavaName() + ".setArity(" + memInfo.getArity() + ");"
                + System.lineSeparator());
    }
}

From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ClassJavaGenerator.java

License:Open Source License

static void linkerAddGetterSetter(final MethodGenerator mi, final String className, final MemberInfo memInfo) {
    final String propertyName = memInfo.getName();
    // stack: Collection
    // dup of Collection instance
    mi.dup();//  ww w.ja va  2s  . co  m

    // property = AccessorProperty.create(key, flags, getter, setter);
    mi.loadLiteral(propertyName);
    // setup flags
    mi.push(memInfo.getAttributes());
    // setup getter method handle
    String javaName = GETTER_PREFIX + memInfo.getJavaName();
    mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, getterDesc(memInfo)));
    String condition = getBrowserCondition(memInfo);
    if (condition != null) {
        builder.append("            if (" + condition + ") {");
        builder.append(System.lineSeparator());
        builder.append("    ");
    }
    builder.append("            list.add(AccessorProperty.create(\"" + propertyName + "\", "
            + attributesToJava(memInfo.getAttributes()) + ", " + System.lineSeparator()
            + "                    virtualHandle(\"" + javaName + "\", "
            + descToJava(Type.getMethodDescriptor(memInfoTypeScriptFuntion(memInfo))) + "),"
            + System.lineSeparator());

    // setup setter method handle
    if (memInfo.isFinal()) {
        mi.pushNull();
        builder.append("null");
    } else {
        javaName = SETTER_PREFIX + memInfo.getJavaName();
        mi.visitLdcInsn(new Handle(H_INVOKEVIRTUAL, className, javaName, setterDesc(memInfo)));
        builder.append("                    virtualHandle(\"" + javaName + "\", "
                + descToJava(Type.getMethodDescriptor(Type.VOID_TYPE, memInfoTypeScriptFuntion(memInfo)))
                + ")");
    }
    builder.append("));" + System.lineSeparator());
    if (condition != null) {
        builder.append("            }").append(System.lineSeparator());
    }
    mi.invokeStatic(ACCESSORPROPERTY_TYPE, ACCESSORPROPERTY_CREATE, ACCESSORPROPERTY_CREATE_DESC);
    // boolean Collection.add(property)
    mi.invokeInterface(COLLECTION_TYPE, COLLECTION_ADD, COLLECTION_ADD_DESC);
    // pop return value of Collection.add
    mi.pop();
    // stack: Collection
}