List of usage examples for org.objectweb.asm Handle Handle
@Deprecated public Handle(final int tag, final String owner, final String name, final String descriptor)
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 }