private Lambda(String declaringClass, MethodInsnNode method, Handle h) { this(declaringClass, h.getOwner(), h.getDesc(), h.getName(), method.name, null, null); }
.ifPresent(handle -> { methods.stream() .filter(m -> m.name.equals(handle.getName())) .findFirst() .ifPresent(pathAction -> {
@Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { if (!classFlow.isWoven) { if (bsm.getOwner().equals("java/lang/invoke/LambdaMetafactory")) { Handle lambdaBody = (Handle)bsmArgs[1]; String lambdaDesc = lambdaBody.getDesc(); if (detector.isPausable(lambdaBody.getOwner(), lambdaBody.getName(), lambdaDesc)) { hasPausableInvokeDynamic = true; } } } super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); }
private void transformIndyBootstrap(MethodVisitor mv, AbstractInsnNode ain) { InvokeDynamicInsnNode indy = (InvokeDynamicInsnNode)ain; Object[]bsmArgs = indy.bsmArgs; // Is it a lambda conversion if (indy.bsm.getOwner().equals("java/lang/invoke/LambdaMetafactory")) { Handle lambdaBody = (Handle)bsmArgs[1]; String desc = lambdaBody.getDesc(); if (detector.isPausable(lambdaBody.getOwner(), lambdaBody.getName(), desc)) { bsmArgs[0] = addFiberType((Type)bsmArgs[0]); bsmArgs[1] = new Handle(lambdaBody.getTag(), lambdaBody.getOwner(), lambdaBody.getName(), desc.replace(")", D_FIBER_LAST_ARG), lambdaBody.isInterface()); bsmArgs[2] = addFiberType((Type)bsmArgs[2]); } } ain.accept(mv); }
private SootMethodRef toSootMethodRef(Handle methodHandle) { String bsmClsName = AsmUtil.toQualifiedName(methodHandle.getOwner()); SootClass bsmCls = Scene.v().getSootClass(bsmClsName); List<Type> bsmSigTypes = AsmUtil.toJimpleDesc(methodHandle.getDesc()); Type returnType = bsmSigTypes.remove(bsmSigTypes.size() - 1); return Scene.v().makeMethodRef(bsmCls, methodHandle.getName(), bsmSigTypes, returnType, methodHandle.getTag() == MethodHandle.Kind.REF_INVOKE_STATIC.getValue()); }
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { ppn("invokedynamic " + name + desc); indent(4); pn("; bootstrap = " + bsm.getOwner() + "." + bsm.getName() + bsm.getDesc()); for (int i = 0; i < bsmArgs.length; i++) { pn("; arg[" + i + "] = " + bsmArgs[0]); } dedent(4); }
private SootFieldRef toSootFieldRef(Handle methodHandle) { String bsmClsName = AsmUtil.toQualifiedName(methodHandle.getOwner()); SootClass bsmCls = Scene.v().getSootClass(bsmClsName); Type t = AsmUtil.toJimpleDesc(methodHandle.getDesc()).get(0); int kind = methodHandle.getTag(); return Scene.v().makeFieldRef(bsmCls, methodHandle.getName(), t, kind == MethodHandle.Kind.REF_GET_FIELD_STATIC.getValue() || kind == MethodHandle.Kind.REF_PUT_FIELD_STATIC.getValue()); }
handle.getTag(), handle.getOwner(), handle.getName(), handle.getDesc(), handle.isInterface());
bootstrapMethodHandle.getTag(), bootstrapMethodHandle.getOwner(), bootstrapMethodHandle.getName(), bootstrapMethodHandle.getDesc(), bootstrapMethodHandle.isInterface())
private MethodHandle parseHandle(Handle handle) { String owner = referenceCache.getCached(handle.getOwner().replace('/', '.')); String name = referenceCache.getCached(handle.getName()); switch (handle.getTag()) { case Opcodes.H_GETFIELD: return MethodHandle.fieldGetter(owner, name, referenceCache.getCached(ValueType.parse(handle.getDesc()))); case Opcodes.H_GETSTATIC: return MethodHandle.staticFieldGetter(owner, name, referenceCache.getCached(ValueType.parse(handle.getDesc()))); case Opcodes.H_PUTFIELD: return MethodHandle.fieldSetter(owner, name, referenceCache.getCached(ValueType.parse(handle.getDesc()))); case Opcodes.H_PUTSTATIC: return MethodHandle.staticFieldSetter(owner, name, referenceCache.getCached(ValueType.parse(handle.getDesc()))); case Opcodes.H_INVOKEVIRTUAL: return MethodHandle.virtualCaller(owner, name, parseSignature(handle.getDesc())); case Opcodes.H_INVOKESTATIC: return MethodHandle.staticCaller(owner, name, parseSignature(handle.getDesc())); case Opcodes.H_INVOKESPECIAL: return MethodHandle.specialCaller(owner, name, parseSignature(handle.getDesc())); case Opcodes.H_NEWINVOKESPECIAL: return MethodHandle.constructorCaller(owner, name, parseSignature(handle.getDesc())); case Opcodes.H_INVOKEINTERFACE: return MethodHandle.interfaceCaller(owner, name, parseSignature(handle.getDesc())); default: throw new IllegalArgumentException("Unknown handle tag: " + handle.getTag()); } }
@Override public void visitInvokeDynamicInsn( String name, String desc, Handle bsm, Object... bsmArgs ) { if ( LAMBDA_METAFACTORY.equals( bsm.getOwner() ) ) { if ( "metafactory".equals( bsm.getName() ) || "altMetafactory".equals( bsm.getName() ) ) { // check the method reference Handle methodHandle = (Handle) bsmArgs[1]; check( methodHandle.getOwner(), methodHandle.getName() + methodHandle.getDesc() ); // check the functional interface type checkType( Type.getReturnType( desc ) ); } } }
@Override public void visitInvokeDynamicInsn( String name, String desc, Handle bsm, Object... bsmArgs ) { if ( LAMBDA_METAFACTORY.equals( bsm.getOwner() ) ) { if ( "metafactory".equals( bsm.getName() ) || "altMetafactory".equals( bsm.getName() ) ) { // check the method reference Handle methodHandle = (Handle) bsmArgs[1]; check( methodHandle.getOwner(), methodHandle.getName() + methodHandle.getDesc() ); // check the functional interface type checkType( Type.getReturnType( desc ) ); } } }
@Override public void visitLdcInsn(Object cst) { if (cst instanceof Handle) { Handle handle = (Handle) cst; handle = new Handle(handle.getTag(), handle.getOwner(), handle.getName(), getMethodDescriptor(handle.getDesc()), handle.isInterface()); StringBuilder buf = stringBuilder; buf.setLength(0); buf.append(tab2).append("LDC "); buf.append(handle.getOwner()).append('.').append(handle.getName()).append(handle.getDesc()); buf.append('\n'); text.add(buf.toString()); return; } super.visitLdcInsn(cst); }
@Override public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) { savePreviousFrame(); Type deferredReturnType = deferReturnType(descriptor); currentFrame.popStackBySignature(descriptor); if (deferredReturnType != Type.VOID_TYPE) currentFrame.pushStack(deferredReturnType); if (logger.isDebugEnabled()) logger.debug("invokeDynamic " + name + " " + descriptor + " " + bootstrapMethodHandle.getName()); delegate.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); }
@Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { for (Object arg : bsmArgs) { if (arg instanceof Handle) { Handle handle = (Handle) arg; Type declaringType = Type.getObjectType(handle.getOwner()); Reference reference = ReferenceExtractor.this.addMethodReference(declaringType, handle.getName(), handle.getDesc(), IReference.REF_VIRTUALMETHOD, 0); if (reference != null) { this.linePositionTracker.addLocation(reference); } } } }
public static Instruction buildInvokeDynamic(final String className, final String name, final String desc, final Handle handle, final Label label) { final MethodIdentifier actualIdentifier = of(handle.getOwner(), handle.getName(), handle.getDesc(), handle.getTag() == Opcodes.H_INVOKESTATIC); final MethodIdentifier dynamicIdentifier = of(className, name, desc, true); return new InvokeDynamicInstruction(actualIdentifier, dynamicIdentifier, label); }
public static Instruction buildInvokeDynamic(final String className, final String name, final String desc, final Handle handle, final Label label) { final MethodIdentifier actualIdentifier = of(handle.getOwner(), handle.getName(), handle.getDesc(), handle.getTag() == Opcodes.H_INVOKESTATIC); final MethodIdentifier dynamicIdentifier = of(className, name, desc, true); return new InvokeDynamicInstruction(actualIdentifier, dynamicIdentifier, label); }
@Override public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) { final org.objectweb.asm.Type method = org.objectweb.asm.Type.getMethodType(descriptor); for(Type type : method.getArgumentTypes()) { this.typeReceiver.apply(this.parent,AccessPoint.create(nameTransformer.transform(type.getClassName())),AccessType.USES); } this.typeReceiver.apply(this.parent,AccessPoint.create(nameTransformer.transform(method.getReturnType().getClassName())),AccessType.USES); for(Object o : bootstrapMethodArguments) { if (o != null && o instanceof Handle) { final Handle h = (Handle) o; this.typeReceiver.apply(this.parent,AccessPoint.create(ElementName.fromString(h.getOwner()),AccessPointName.create(h.getName(),h.getDesc())),AccessType.USES); } } }
public Object mapValue(Object value) { if (value instanceof Type) { return mapType((Type) value); } if (value instanceof Handle) { Handle h = (Handle) value; return new Handle(h.getTag(), mapType(h.getOwner()), mapMethodName( h.getOwner(), h.getName(), h.getDesc()), mapMethodDesc(h.getDesc()), h.isInterface()); } return value; }
public Object mapValue(Object value) { if (value instanceof Type) { return mapType((Type) value); } if (value instanceof Handle) { Handle h = (Handle) value; return new Handle(h.getTag(), mapType(h.getOwner()), mapMethodName( h.getOwner(), h.getName(), h.getDesc()), mapMethodDesc(h.getDesc()), h.isInterface()); } return value; }