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 void generateInvokeDynamic(MutableClass mutableClass, MethodNode originalMethod, String originalMethodName, RobolectricGeneratorAdapter generator) { Handle original = new Handle(getTag(originalMethod), mutableClass.classType.getInternalName(), originalMethod.name, originalMethod.desc); if (generator.isStatic()) { generator.loadArgs(); generator.invokeDynamic(originalMethodName, originalMethod.desc, BOOTSTRAP_STATIC, original); } else { String desc = "(" + mutableClass.classType.getDescriptor() + originalMethod.desc.substring(1); generator.loadThis(); generator.loadArgs(); generator.invokeDynamic(originalMethodName, desc, BOOTSTRAP, original); } generator.returnValue(); }
if (handle.getOwner().equals(visitedClassName)) { handle.getName(), handle.getDesc(), classAndInterfaceNode); if (lambdaMethod == null) { throw new RuntimeException( "Internal wormhole error while locating lambda %s" + "in class %s, please file a bug", handle.getName(), visitedClassName)); ? "(L" + visitedClassName + ";" + handle.getDesc().substring(1) : handle.getDesc(); return new Handle( handle.getName(), desc, false);
@Override public void visitLdcInsn(Object cst) { super.visitLdcInsn(cst); if (cst instanceof Handle) { Handle methodHandle = (Handle) cst; scb.addDep(AsmUtil.toBaseType(methodHandle.getOwner())); } }
@Override public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) { if (!bsm.getOwner().equals(lambdaMetafactory) || bsm.getName().equals("metafactory")) { Type returnType = Type.getReturnType(desc); if (returnType.getSort() == Type.OBJECT) { if (returnType.getClassName().equals(Action.class.getName())) { instrumented = true; transformAction(desc, bsmArgs); return; } else if (returnType.getClassName().equals(Computation.class.getName())) { instrumented = true; transformComputation(desc, bsmArgs); return; } } } super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); }
&& handle.getTag() != Opcodes.H_INVOKESTATIC)) {
.ifPresent(handle -> { methods.stream() .filter(m -> m.name.equals(handle.getName())) .findFirst() .ifPresent(pathAction -> {
appendDescriptor(HANDLE_DESCRIPTOR, getMethodDescriptor(handle.getDesc())); } else { buf.append(arg);
int hashCode = bsm.hashCode(); bootstrapMethods.putShort(newHandle(bsm.tag, bsm.owner, bsm.name, bsm.desc, bsm.isInterface()));
@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); }
if (((MethodHandle) c).isMethodRef()) { SootMethodRef methodRef = ((MethodHandle) c).getMethodRef(); handle = new Handle(((MethodHandle) c).getKind(), slashify(methodRef.declaringClass().getName()), methodRef.name(), toTypeDesc(methodRef), methodRef.declaringClass().isInterface()); } else { SootFieldRef fieldRef = ((MethodHandle) c).getFieldRef(); handle = new Handle(((MethodHandle) c).getKind(), slashify(fieldRef.declaringClass().getName()), fieldRef.name(), toTypeDesc(fieldRef.type()), fieldRef.declaringClass().isInterface());
@Override public void visitInvokeDynamicInsn(String name, String desc, Handle bootstrapMethod, Object... bootstrapMethodArgs) { for (Object arg : bootstrapMethodArgs) { if (arg instanceof Type) { addImport((Type) arg); } else if (arg instanceof Handle) { addImportWithInternalName(((Handle) arg).getOwner()); Arrays.asList(Type.getArgumentTypes(desc)).forEach(this::addImport); } else if ((arg instanceof Number) == false && (arg instanceof String) == false) { throw new AssertionError("Unexpected type " + arg.getClass() + " with value '" + arg + "'"); } } }
@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); }
int hashCode = bsm.hashCode(); bootstrapMethods.putShort(newHandle(bsm.tag, bsm.owner, bsm.name, bsm.desc, bsm.isInterface()));
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); }