@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 Lambda(String declaringClass, MethodInsnNode method, Handle h) { this(declaringClass, h.getOwner(), h.getDesc(), h.getName(), method.name, null, null); }
@Override public void visitLdcInsn(Object cst) { super.visitLdcInsn(cst); if (cst instanceof Handle) { Handle methodHandle = (Handle) cst; scb.addDep(AsmUtil.toBaseType(methodHandle.getOwner())); } }
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()); }
return addConstantMethodHandle( handle.getTag(), handle.getOwner(), handle.getName(), handle.getDesc(),
addConstantMethodHandle( bootstrapMethodHandle.getTag(), bootstrapMethodHandle.getOwner(), bootstrapMethodHandle.getName(), bootstrapMethodHandle.getDesc(),
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) { InvokeDynamicInsnNode mnode = new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs); if (needsFrameGuard(INVOKEDYNAMIC, bsm.getOwner(), name, desc)) { Label label = new Label(); super.visitLabel(label); labels.add(label); nodes.add(mnode); } instructions.add(mnode); }
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { InvokeDynamicInsnNode mnode = new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs); if (needsFrameGuard(INVOKEDYNAMIC, bsm.getOwner(), name, desc)) { Label label = new Label(); super.visitLabel(label); labels.add(label); nodes.add(mnode); } instructions.add(mnode); }
public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { InvokeDynamicInsnNode mnode = new InvokeDynamicInsnNode(name, desc, bsm, bsmArgs); if (needsFrameGuard(INVOKEDYNAMIC, bsm.getOwner(), name, desc)) { Label label = new Label(); super.visitLabel(label); labels.add(label); nodes.add(mnode); } instructions.add(mnode); }
void addConstant(final Object constant) { if (constant instanceof Type) { addType((Type) constant); } else if (constant instanceof Handle) { Handle handle = (Handle) constant; addInternalType(handle.getOwner()); addMethodTypes(handle.getDesc()); } }
void addConstant(final Object constant) { if (constant instanceof Type) { addType((Type) constant); } else if (constant instanceof Handle) { Handle handle = (Handle) constant; addInternalType(handle.getOwner()); addMethodTypes(handle.getDesc()); } }
void addConstant(final Object constant) { if (constant instanceof Type) { addType((Type) constant); } else if (constant instanceof Handle) { Handle handle = (Handle) constant; addInternalType(handle.getOwner()); addMethodTypes(handle.getDesc()); } }
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; }
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); }