List of usage examples for org.objectweb.asm Handle getTag
public int getTag()
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 }//w ww. ja v a2 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: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;/*from www . j a v a 2 s . c o 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.gargoylesoftware.js.nashorn.internal.ir.debug.NashornTextifier.java
License:Open Source License
private static void appendHandle(final StringBuilder sb, final Handle h) { switch (h.getTag()) { case Opcodes.H_GETFIELD: sb.append("getfield"); break;/* ww w. ja v a 2s .co m*/ case Opcodes.H_GETSTATIC: sb.append("getstatic"); break; case Opcodes.H_PUTFIELD: sb.append("putfield"); break; case Opcodes.H_PUTSTATIC: sb.append("putstatic"); break; case Opcodes.H_INVOKEINTERFACE: sb.append("interface"); break; case Opcodes.H_INVOKESPECIAL: sb.append("special"); break; case Opcodes.H_INVOKESTATIC: sb.append("static"); break; case Opcodes.H_INVOKEVIRTUAL: sb.append("virtual"); break; case Opcodes.H_NEWINVOKESPECIAL: sb.append("new_special"); break; default: assert false; break; } sb.append(" '"); sb.append(h.getName()); sb.append("'"); }
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 www. j a v a2s. com*/ 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); }/* ww w. j a v a 2 s . c o m*/ 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);/*w w w .ja v a 2 s . 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 w ww.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; }/* ww w . j a v 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 w w w . j a v a 2 s . co m 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(); }
From source file:com.google.devtools.build.android.desugar.LambdaDesugaring.java
License:Open Source License
/** * Makes {@link #visitEnd} generate a bridge method for the given method handle if the * referenced method will be invisible to the generated lambda class. * * @return struct containing either {@code invokedMethod} or {@code invokedMethod} and a handle * representing the bridge method that will be generated for {@code invokedMethod}. *//* ww w. java2 s . c o m*/ private MethodReferenceBridgeInfo queueUpBridgeMethodIfNeeded(Handle invokedMethod) throws ClassNotFoundException { if (invokedMethod.getName().startsWith("lambda$")) { // We adjust lambda bodies to be visible return MethodReferenceBridgeInfo.noBridge(invokedMethod); } // invokedMethod is a method reference if we get here Executable invoked = findTargetMethod(invokedMethod); if (isVisibleToLambdaClass(invoked, invokedMethod.getOwner())) { // Referenced method is visible to the generated class, so nothing to do return MethodReferenceBridgeInfo.noBridge(invokedMethod); } // We need a bridge method if we get here checkState(!isInterface, "%s is an interface and shouldn't need bridge to %s", internalName, invokedMethod); checkState(!invokedMethod.isInterface(), "%s's lambda classes can't see interface method: %s", internalName, invokedMethod); MethodReferenceBridgeInfo result = bridgeMethods.get(invokedMethod); if (result != null) { return result; // we're already queued up a bridge method for this method reference } String name = uniqueInPackage(internalName, "bridge$lambda$" + bridgeMethods.size()); Handle bridgeMethod; switch (invokedMethod.getTag()) { case Opcodes.H_INVOKESTATIC: bridgeMethod = new Handle(invokedMethod.getTag(), internalName, name, invokedMethod.getDesc(), /*itf*/ false); break; case Opcodes.H_INVOKEVIRTUAL: case Opcodes.H_INVOKESPECIAL: // we end up calling these using invokevirtual bridgeMethod = new Handle(Opcodes.H_INVOKEVIRTUAL, internalName, name, invokedMethod.getDesc(), /*itf*/ false); break; case Opcodes.H_NEWINVOKESPECIAL: { // Call invisible constructor through generated bridge "factory" method, so we need to // compute the descriptor for the bridge method from the constructor's descriptor String desc = Type.getMethodDescriptor(Type.getObjectType(invokedMethod.getOwner()), Type.getArgumentTypes(invokedMethod.getDesc())); bridgeMethod = new Handle(Opcodes.H_INVOKESTATIC, internalName, name, desc, /*itf*/ false); break; } case Opcodes.H_INVOKEINTERFACE: // Shouldn't get here default: throw new UnsupportedOperationException("Cannot bridge " + invokedMethod); } result = MethodReferenceBridgeInfo.bridge(invokedMethod, invoked, bridgeMethod); MethodReferenceBridgeInfo old = bridgeMethods.put(invokedMethod, result); checkState(old == null, "Already had bridge %s so we don't also want %s", old, result); return result; }