List of usage examples for org.objectweb.asm Handle getOwner
public String getOwner()
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(); }