List of usage examples for org.objectweb.asm Label Label
public Label()
From source file:co.paralleluniverse.fibers.instrument.InstrumentMethod.java
License:Open Source License
private void emitPopMethod(MethodVisitor mv) { // emitVerifyInstrumentation(mv); final Label lbl = new Label(); if (DUAL) {/*from www . j av a 2s .c om*/ mv.visitVarInsn(Opcodes.ALOAD, lvarStack); mv.visitJumpInsn(Opcodes.IFNULL, lbl); } mv.visitVarInsn(Opcodes.ALOAD, lvarStack); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, STACK_NAME, "popMethod", "()V"); if (DUAL) mv.visitLabel(lbl); }
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/* ww w. j av a 2s . c o 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:com.alibaba.hotswap.processor.constructor.ConstructorVisitor.java
License:Open Source License
@SuppressWarnings({ "unchecked" }) private void addUniformConstructor(ClassMeta classMeta) { int access = Opcodes.ACC_PUBLIC + Opcodes.ACC_SYNTHETIC; String name = HotswapConstants.INIT; String desc = HotswapConstants.UNIFORM_CONSTRUCTOR_DESC; MethodVisitor hotswapInit = new ConstructorInvokeModifier(cv.visitMethod(access, name, desc, null, null), access, name, desc);/* w w w. j av a 2 s .c o m*/ GeneratorAdapter hotswapInitAdapter = new GeneratorAdapter(hotswapInit, access, name, desc); hotswapInitAdapter.visitCode(); TreeMap<MethodMeta, MethodNode> initMethodMap = new TreeMap<MethodMeta, MethodNode>( new ConstructorIndexComparator()); for (MethodNode node : initNodes.values()) { MethodMeta meta = new MethodMeta(node.access, node.name, node.desc, node.signature, ((String[]) node.exceptions.toArray(new String[node.exceptions.size()]))); meta.setIndex(HotswapMethodIndexHolder.getMethodIndex(className, node.name, node.desc)); classMeta.refreshInitMeta(meta, true); initMethodMap.put(meta, node); } List<MethodMeta> keys = new ArrayList<MethodMeta>(initMethodMap.keySet()); List<MethodNode> values = new ArrayList<MethodNode>(initMethodMap.values()); Label defaultLabel = new Label(); int[] indexes = new int[keys.size()]; Label[] labels = new Label[keys.size()]; for (int i = 0; i < keys.size(); i++) { indexes[i] = keys.get(i).getIndex(); labels[i] = new Label(); } for (int i = 0; i < values.size(); i++) { MethodNode node = values.get(i); for (int j = 0; j < node.tryCatchBlocks.size(); j++) { ((TryCatchBlockNode) node.tryCatchBlocks.get(j)).accept(hotswapInitAdapter); } } hotswapInitAdapter.loadArg(1); hotswapInitAdapter.visitLookupSwitchInsn(defaultLabel, indexes, labels); for (int i = 0; i < keys.size(); i++) { MethodMeta methodMeta = keys.get(i); hotswapInitAdapter.visitLabel(labels[i]); MethodNode node = values.get(i); storeArgs(hotswapInitAdapter, hotswapInit, methodMeta); MethodVisitor methodVisitor = new ConstructorLVTAdjustModifier(hotswapInit, 3); node.instructions.accept(methodVisitor); for (int j = 0; j < (node.localVariables == null ? 0 : node.localVariables.size()); j++) { ((LocalVariableNode) node.localVariables.get(j)).accept(methodVisitor); } } hotswapInitAdapter.mark(defaultLabel); hotswapInitAdapter.push(this.className); hotswapInitAdapter.loadArg(1); hotswapInitAdapter.invokeStatic(Type.getType(HotswapMethodUtil.class), Method.getMethod("Throwable noSuchMethodError(String, int)")); hotswapInitAdapter.throwException(); hotswapInitAdapter.endMethod(); }
From source file:com.alibaba.hotswap.processor.jdk.classloader.modifier.DefineClassMethodModifier.java
License:Open Source License
@Override public void visitCode() { super.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 1);//from www. j a v a 2 s.c om mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapConfiguration.class), "getClassPathInWorkspace", "(Ljava/lang/String;)Ljava/lang/String;"); mv.visitInsn(Opcodes.DUP); Label old = new Label(); mv.visitJumpInsn(Opcodes.IFNULL, old); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "updateClassMeta", "(Ljava/lang/String;Ljava/lang/ClassLoader;)V"); mv.visitVarInsn(Opcodes.ALOAD, 1); // className mv.visitInsn(Opcodes.SWAP); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(CustomerLoadClassBytes.class), "loadBytesFromPath", "(Ljava/lang/String;Ljava/lang/String;)[B"); mv.visitVarInsn(Opcodes.ASTORE, 2);// store class bytes into 2 mv.visitVarInsn(Opcodes.ALOAD, 2);// load class bytes mv.visitInsn(Opcodes.ARRAYLENGTH); // length of the class bytes mv.visitVarInsn(Opcodes.ISTORE, 4);// store length into 4 Label end = new Label(); mv.visitJumpInsn(Opcodes.GOTO, end); mv.visitLabel(old); mv.visitInsn(Opcodes.POP); mv.visitLabel(end); }
From source file:com.alibaba.hotswap.processor.jdk.classloader.modifier.DefineClassMethodModifier.java
License:Open Source License
@Override public void visitInsn(int opcode) { if (opcode == Opcodes.ARETURN) { mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "hasClassMeta", "(Ljava/lang/String;)Z"); Label end = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, end); mv.visitInsn(Opcodes.DUP);//from w w w . ja v a2 s . c o m mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitInsn(Opcodes.SWAP); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "updateClassMetaClass", "(Ljava/lang/String;Ljava/lang/Class;)V"); mv.visitLabel(end); } super.visitInsn(opcode); }
From source file:com.alibaba.hotswap.processor.jdk.classloader.modifier.FindClassMethodModifier.java
License:Open Source License
@Override public void visitCode() { super.visitCode(); Label normal = new Label(); mv.visitVarInsn(Opcodes.ALOAD, 0);/*from w w w . j a v a2 s. c o m*/ mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(ClassLoaderHelper.class), "tryLoadVClass", "(Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;"); mv.visitInsn(Opcodes.DUP); mv.visitJumpInsn(Opcodes.IFNULL, normal); mv.visitInsn(Opcodes.ARETURN); mv.visitLabel(normal); mv.visitInsn(Opcodes.POP); }
From source file:com.alibaba.hotswap.processor.jdk.lang.modifier.ClassNewInstanceModifier.java
License:Open Source License
@Override public void visitCode() { super.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0);/*from w w w . ja va 2 s .c o m*/ mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "hasClassMeta", "(Ljava/lang/String;)Z"); Label old = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, old); // check it as a primary constructor mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "getClassMeta", "(Ljava/lang/String;)Lcom/alibaba/hotswap/meta/ClassMeta;"); mv.visitLdcInsn(HotswapConstants.INIT); mv.visitLdcInsn("()V"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ClassMeta.class), "isPrimaryInitMethod", "(Ljava/lang/String;Ljava/lang/String;)Z"); mv.visitJumpInsn(Opcodes.IFNE, old); // get uniform constructor mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapMethodUtil.class), "getConstructorParamTypes", "()[Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"); // index and objs mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitLdcInsn(HotswapConstants.INIT); mv.visitLdcInsn("()V"); loadArgs(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapMethodUtil.class), "getMethodParams", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)[Ljava/lang/Object;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/reflect/Constructor", "newInstance", "([Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(Opcodes.ARETURN); mv.visitLabel(old); }
From source file:com.alibaba.hotswap.processor.jdk.lang.modifier.PrivateGetDeclaredConstructors.java
License:Open Source License
@Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { if (opcode == Opcodes.INVOKESPECIAL && owner.equals("java/lang/Class") && name.equals("getDeclaredConstructors0") && desc.equals("(Z)[Ljava/lang/reflect/Constructor;")) { mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "hasClassMeta", "(Ljava/lang/String;)Z"); Label old = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, old); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(MethodReflectHelper.class), "getDeclaredConstructors0", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;"); Label end = new Label(); mv.visitJumpInsn(Opcodes.GOTO, end); mv.visitLabel(old);//w ww. java2 s .co m super.visitMethodInsn(opcode, owner, name, desc); mv.visitLabel(end); } else { super.visitMethodInsn(opcode, owner, name, desc); } }
From source file:com.alibaba.hotswap.processor.jdk.lang.modifier.PrivateGetDeclaredFieldsModifier.java
License:Open Source License
@Override public void visitMethodInsn(int opcode, String owner, String name, String desc) { if (opcode == Opcodes.INVOKESPECIAL && owner.equals("java/lang/Class") && name.equals("getDeclaredFields0") && desc.equals("(Z)[Ljava/lang/reflect/Field;")) { mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "hasClassMeta", "(Ljava/lang/String;)Z"); Label old = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, old); // mv.visitInsn(Opcodes.POP2); // mv.visitVarInsn(Opcodes.ALOAD, 0); // mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(FieldReflectHelper.class), "privateGetDeclaredFields0", "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;"); Label end = new Label(); mv.visitJumpInsn(Opcodes.GOTO, end); mv.visitLabel(old);//from w w w .j a v a 2 s. c om super.visitMethodInsn(opcode, owner, name, desc); mv.visitLabel(end); } else { super.visitMethodInsn(opcode, owner, name, desc); } }
From source file:com.alibaba.hotswap.processor.jdk.reflect.modifier.ConstructorNewInstanceModifier.java
License:Open Source License
@Override public void visitCode() { super.visitCode(); Label old = new Label(); mv.visitVarInsn(Opcodes.ALOAD, 0);/*w w w. jav a 2 s . c om*/ mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/reflect/Constructor", "parameterTypes", "[Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(MethodReflectHelper.class), "isUniformConstructorArgsType", "([Ljava/lang/Class;)Z"); ifZCmp(NE, old); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/reflect/Constructor", "clazz", "Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "hasClassMeta", "(Ljava/lang/String;)Z"); mv.visitJumpInsn(Opcodes.IFEQ, old); // check it as a primary constructor mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/reflect/Constructor", "clazz", "Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapRuntime.class), "getClassMeta", "(Ljava/lang/String;)Lcom/alibaba/hotswap/meta/ClassMeta;"); mv.visitLdcInsn(HotswapConstants.INIT); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(Type.class), "getConstructorDescriptor", "(Ljava/lang/reflect/Constructor;)Ljava/lang/String;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ClassMeta.class), "isPrimaryInitMethod", "(Ljava/lang/String;Ljava/lang/String;)Z"); mv.visitJumpInsn(Opcodes.IFNE, old); // get uniform constructor mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/reflect/Constructor", "clazz", "Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapMethodUtil.class), "getConstructorParamTypes", "()[Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getConstructor", "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"); // index and objs mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, "java/lang/reflect/Constructor", "clazz", "Ljava/lang/Class;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;"); mv.visitLdcInsn(HotswapConstants.INIT); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(Type.class), "getConstructorDescriptor", "(Ljava/lang/reflect/Constructor;)Ljava/lang/String;"); loadArgs(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(HotswapMethodUtil.class), "getMethodParams", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)[Ljava/lang/Object;"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/reflect/Constructor", "newInstance", "([Ljava/lang/Object;)Ljava/lang/Object;"); mv.visitInsn(Opcodes.ARETURN); mv.visitLabel(old); }