Example usage for org.objectweb.asm Handle getOwner

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

Introduction

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

Prototype

public String getOwner() 

Source Link

Document

Returns the internal name of the class that owns the field or method designated by this 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
    }//from  w w w.j av  a 2  s.co 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:co.paralleluniverse.fibers.instrument.LabelSuspendableCallSitesClassVisitor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
        final String[] exceptions) {
    if ((access & Opcodes.ACC_NATIVE) == 0 && !isYieldMethod(className, name)) {
        // Bytecode-level AST of a method, being a MethodVisitor itself can be filled through delegation from another visitor
        // Analyze, fill and enqueue method ASTs
        final MethodVisitor outMV = super.visitMethod(access, name, desc, signature, exceptions);

        return new MethodVisitor(ASMAPI, outMV) {
            private int currLineNumber = -1;

            @Override/* w  w w  . j a  va 2  s. co  m*/
            public void visitLineNumber(int i, Label label) {
                currLineNumber = i;
                super.visitLineNumber(i, label);
            }

            @Override
            public void visitMethodInsn(int opcode, String owner, String name, String desc,
                    boolean isInterface) {
                final int type = AbstractInsnNode.METHOD_INSN;
                if (InstrumentMethod.isSuspendableCall(db, type, opcode, owner, name, desc)) {
                    final Label l = new Label();
                    super.visitLabel(l);
                    super.visitLineNumber(currLineNumber, l); // Force label
                }
                super.visitMethodInsn(opcode, owner, name, desc, isInterface);
            }

            @Override
            public void visitInvokeDynamicInsn(String name, String desc, Handle handle, Object... objects) {
                final int type = AbstractInsnNode.INVOKE_DYNAMIC_INSN;
                final int opcode = Opcodes.INVOKEDYNAMIC;
                if (InstrumentMethod.isSuspendableCall(db, type, opcode, handle.getOwner(), name, desc)) {
                    final Label l = new Label();
                    super.visitLabel(l);
                    super.visitLineNumber(currLineNumber, l); // Force label
                }
                super.visitInvokeDynamicInsn(name, desc, handle, objects);
            }
        };
    }
    return super.visitMethod(access, name, desc, signature, exceptions);
}

From source file:co.paralleluniverse.fibers.instrument.SuspOffsetsAfterInstrClassVisitor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(final int access, final String name, final String desc, final String signature,
        final String[] exceptions) {
    if ((access & Opcodes.ACC_NATIVE) == 0 && !isYieldMethod(className, name)) {
        // Bytecode-level AST of a method, being a MethodVisitor itself can be filled through delegation from another visitor
        final MethodNode mn = new MethodNode(access, name, desc, signature, exceptions);

        // Analyze, fill and enqueue method ASTs
        final MethodVisitor outMV = super.visitMethod(access, name, desc, signature, exceptions);

        return new MethodVisitor(ASMAPI, outMV) {
            private Label currLabel = null;
            private int prevOffset = -1;
            private boolean instrumented;
            private boolean optimized = false;
            private int methodStart = -1, methodEnd = -1;

            private List<Integer> suspOffsetsAfterInstrL = new ArrayList<>();
            private int[] suspCallSites = new int[0];

            @Override//from   ww w  .ja  va 2 s  .co  m
            public AnnotationVisitor visitAnnotation(final String adesc, boolean visible) {
                if (Classes.INSTRUMENTED_DESC.equals(adesc)) {
                    instrumented = true;

                    return new AnnotationVisitor(ASMAPI) { // Only collect info
                        @Override
                        public void visit(String name, Object value) {
                            if (Instrumented.FIELD_NAME_METHOD_START.equals(name))
                                methodStart = (Integer) value;
                            else if (Instrumented.FIELD_NAME_METHOD_END.equals(name))
                                methodEnd = (Integer) value;
                            else if (Instrumented.FIELD_NAME_METHOD_OPTIMIZED.equals(name))
                                optimized = (Boolean) value;
                            else if (Instrumented.FIELD_NAME_SUSPENDABLE_CALL_SITES.equals(name))
                                suspCallSites = (int[]) value;
                            else //noinspection StatementWithEmptyBody
                            if (Instrumented.FIELD_NAME_SUSPENDABLE_CALL_SITES_OFFSETS_AFTER_INSTR.equals(name))
                                ; // Ignore, we're filling it
                            else
                                throw new RuntimeException("Unexpected `@Instrumented` field: " + name);
                        }
                    };
                }

                return super.visitAnnotation(adesc, visible);
            }

            @Override
            public void visitLocalVariable(String name, String desc, String sig, Label lStart, Label lEnd,
                    int slot) {
                super.visitLocalVariable(name, desc, sig, lStart, lEnd, slot);
            }

            @Override
            public void visitLabel(Label label) {
                if (instrumented) {
                    currLabel = label;
                }

                super.visitLabel(label);
            }

            @Override
            public void visitMethodInsn(int opcode, String owner, String name, String desc,
                    boolean isInterface) {
                if (instrumented) {
                    final int type = AbstractInsnNode.METHOD_INSN;
                    if (InstrumentMethod.isSuspendableCall(db, type, opcode, owner, name, desc)
                            && !Classes.STACK_NAME.equals(owner) && // postRestore
                    currLabel != null && currLabel.info instanceof Integer)
                        addLine();
                }

                super.visitMethodInsn(opcode, owner, name, desc, isInterface);
            }

            @Override
            public void visitInvokeDynamicInsn(String name, String desc, Handle handle, Object... objects) {
                if (instrumented) {
                    final int type = AbstractInsnNode.INVOKE_DYNAMIC_INSN;
                    final int opcode = Opcodes.INVOKEDYNAMIC;
                    if (InstrumentMethod.isSuspendableCall(db, type, opcode, handle.getOwner(), name, desc)
                            && !Classes.STACK_NAME.equals(handle.getOwner()) && // postRestore
                    currLabel != null && currLabel.info instanceof Integer)
                        addLine();
                }
                super.visitInvokeDynamicInsn(name, desc, handle, objects);
            }

            @Override
            public void visitEnd() {
                if (instrumented)
                    InstrumentMethod.emitInstrumentedAnn(db, outMV, mn, sourceName, className, optimized,
                            methodStart, methodEnd, suspCallSites, toIntArray(suspOffsetsAfterInstrL));

                super.visitEnd();
            }

            private void addLine() {
                final int currOffset = (Integer) currLabel.info;
                if (currOffset > prevOffset) {
                    suspOffsetsAfterInstrL.add(currOffset);
                    prevOffset = currOffset;
                }
            }
        };
    }

    return super.visitMethod(access, name, desc, signature, exceptions);
}

From source file:com.devexperts.usages.ClassUsagesAnalyzer.java

License:Open Source License

private void markHandleUse(Handle handle, Member usedFrom, UseKind useKind) {
    markTypeUse(Type.getType(handle.getDesc()), usedFrom, useKind);
    String className = Type.getType(handle.getOwner()).getClassName();
    switch (handle.getTag()) {
    case Opcodes.H_GETFIELD:
    case Opcodes.H_GETSTATIC:
    case Opcodes.H_PUTFIELD:
    case Opcodes.H_PUTSTATIC:
        markMemberUse(className, handle.getName(), usedFrom, useKind);
        break;/*  ww w  .  j a va2  s.co m*/
    case Opcodes.H_INVOKEVIRTUAL:
    case Opcodes.H_INVOKESTATIC:
    case Opcodes.H_INVOKESPECIAL:
    case Opcodes.H_NEWINVOKESPECIAL:
    case Opcodes.H_INVOKEINTERFACE:
        markMemberUse(className, Member.methodMemberName(handle.getName(), Type.getType(handle.getDesc())),
                usedFrom, useKind);
    }
}

From source file:com.geeksaga.light.profiler.util.ConstantPoolWrapper.java

License:Apache License

public Constant newConst(final Object cst, boolean isExtend) {
    if (cst instanceof Integer) {
        int val = (Integer) cst;
        return newInteger(val, isExtend);
    } else if (cst instanceof Float) {
        float val = (Float) cst;
        return newFloat(val, isExtend);
    } else if (cst instanceof Long) {
        long val = (Long) cst;
        return newLong(val, isExtend);
    } else if (cst instanceof Double) {
        double val = (Double) cst;
        return newDouble(val, isExtend);
    } else if (cst instanceof String) {
        return newString((String) cst);
    } else if (cst instanceof Type) {
        Type t = (Type) cst;
        int s = t.getSort();
        if (s == Type.OBJECT) {
            return newClass(t.getInternalName(), isExtend);
        } else if (s == Type.METHOD) {
            return newMethodType(t.getDescriptor(), isExtend);
        } else {/*from  w  w w. j av a 2s .  c  o  m*/
            return newClass(t.getDescriptor(), isExtend);
        }
    } else if (cst instanceof Handle) {
        Handle h = (Handle) cst;
        return newHandle(h.getTag(), h.getOwner(), h.getName(), h.getDesc(), h.isInterface(), isExtend);
    } else {
        throw new IllegalArgumentException("value " + cst);
    }
}

From source file:com.geeksaga.light.profiler.util.ConstantPoolWrapper.java

License:Apache License

public Constant newInvokeDynamic(String name, String desc, Handle bsm, boolean isExtend, Object... bsmArgs) {
    if (isExtend) {
        super.newInvokeDynamic(name, desc, bsm, bsmArgs);
    }//from  w  w  w . ja v  a2s .  c om

    key5.set(name, desc, bsm, bsmArgs);

    Constant result = getConstant(key5);
    if (result == null) {
        newNameType(name, desc, isExtend);
        newHandle(bsm.getTag(), bsm.getOwner(), bsm.getName(), bsm.getDesc(), isExtend);

        for (Object bsmArg : bsmArgs) {
            newConst(bsmArg, isExtend);
        }

        return putConstant(new Constant(key5));
    }

    return result;
}

From source file:com.github.anba.es6draft.compiler.assembler.SimpleTypeTextifier.java

License:Open Source License

@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()));
        buf.setLength(0);//from ww w . j  a v a  2s  . c o  m
        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);
}

From source file:com.github.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
    }//from www  . j  a va  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()));
    desc = replaceFloatMethodDescription(desc);
    mv.visitInvokeDynamicInsn(name, desc, bsm, bsmArgsAfter);
}

From source file:com.github.wolf480pl.mias4j.java8.rewrite.AbstractDynamicRewritePolicy.java

License:Open Source License

@Override
public Handle interceptDynamic(Type caller, String name, Type desc, Handle bootstrapMethod,
        Object[] bootstrapArgs, List<Object> newBootstrapArgs) throws RewriteAbortException {
    InvocationType invType = InvocationType.fromHandleOpcode(bootstrapMethod.getTag());
    Type bsmOwner = Type.getObjectType(bootstrapMethod.getOwner());
    Type bsmType = Type.getMethodType(bootstrapMethod.getDesc());

    boolean should = shouldIntercept(caller, invType, bsmOwner, bootstrapMethod.getName(), bsmType);

    if (!should) {
        return null;
    }/*  w  w w . jav  a2 s . c  o  m*/

    newBootstrapArgs.add(invType.id());
    newBootstrapArgs.add(bsmOwner.getClassName());
    newBootstrapArgs.add(bootstrapMethod.getName());
    newBootstrapArgs.add(bsmType);
    // NOTE: Varags collection for bootstrap methods works only since Java 8
    newBootstrapArgs.addAll(Arrays.asList(bootstrapArgs));

    return new Handle(Opcodes.H_INVOKESTATIC, Type.getInternalName(Bootstraps.class), WRAPDYNAMIC_NAME,
            WRAPDYNAMIC_DESC);
}

From source file:com.google.devtools.build.android.desugar.LambdaDesugaring.java

License:Open Source License

@Override
public void visitEnd() {
    for (Map.Entry<Handle, MethodReferenceBridgeInfo> bridge : bridgeMethods.entrySet()) {
        Handle original = bridge.getKey();
        Handle neededMethod = bridge.getValue().bridgeMethod();
        checkState(//from  ww  w .  j a v a  2s.c  om
                neededMethod.getTag() == Opcodes.H_INVOKESTATIC
                        || neededMethod.getTag() == Opcodes.H_INVOKEVIRTUAL,
                "Cannot generate bridge method %s to reach %s", neededMethod, original);
        checkState(bridge.getValue().referenced() != null, "Need referenced method %s to generate bridge %s",
                original, neededMethod);

        int access = Opcodes.ACC_BRIDGE | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_FINAL;
        if (neededMethod.getTag() == Opcodes.H_INVOKESTATIC) {
            access |= Opcodes.ACC_STATIC;
        }
        MethodVisitor bridgeMethod = super.visitMethod(access, neededMethod.getName(), neededMethod.getDesc(),
                (String) null, toInternalNames(bridge.getValue().referenced().getExceptionTypes()));

        // Bridge is a factory method calling a constructor
        if (original.getTag() == Opcodes.H_NEWINVOKESPECIAL) {
            bridgeMethod.visitTypeInsn(Opcodes.NEW, original.getOwner());
            bridgeMethod.visitInsn(Opcodes.DUP);
        }

        int slot = 0;
        if (neededMethod.getTag() != Opcodes.H_INVOKESTATIC) {
            bridgeMethod.visitVarInsn(Opcodes.ALOAD, slot++);
        }
        Type neededType = Type.getMethodType(neededMethod.getDesc());
        for (Type arg : neededType.getArgumentTypes()) {
            bridgeMethod.visitVarInsn(arg.getOpcode(Opcodes.ILOAD), slot);
            slot += arg.getSize();
        }
        bridgeMethod.visitMethodInsn(invokeOpcode(original), original.getOwner(), original.getName(),
                original.getDesc(), original.isInterface());
        bridgeMethod.visitInsn(neededType.getReturnType().getOpcode(Opcodes.IRETURN));

        bridgeMethod.visitMaxs(0, 0); // rely on class writer to compute these
        bridgeMethod.visitEnd();
    }
    super.visitEnd();
}