List of usage examples for org.objectweb.asm MethodVisitor visitCode
public void visitCode()
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateReadStaticGroup(Schema schema, ClassVisitor cv, String genClassInternalName, boolean javaClassCodec) { MethodVisitor mv = cv.visitMethod(ACC_PROTECTED, "readStaticGroup", "(ILcom/cinnober/msgcodec/io/ByteSource;)Ljava/lang/Object;", null, new String[] { "java/io/IOException" }); int nextVar = 3; mv.visitCode(); Map<Integer, Label> labelsByGroupId = new TreeMap<>(); for (GroupDef group : schema.getGroups()) { if (group.getId() != -1) { labelsByGroupId.put(group.getId(), new Label()); }/*www. j av a 2 s .c om*/ } mv.visitVarInsn(ILOAD, 1); // group id Label unknownGroupIdLabel = new Label(); { int[] caseValues = new int[labelsByGroupId.size()]; int i = 0; for (int groupId : labelsByGroupId.keySet()) { caseValues[i++] = groupId; } Label[] caseLabels = labelsByGroupId.values().toArray(new Label[labelsByGroupId.size()]); mv.visitLookupSwitchInsn(unknownGroupIdLabel, caseValues, caseLabels); } for (Map.Entry<Integer, Label> caseEntry : labelsByGroupId.entrySet()) { GroupDef group = schema.getGroup(caseEntry.getKey().intValue()); Object groupType = group.getGroupType(); String groupDescriptor = getTypeDescriptor(groupType, javaClassCodec); mv.visitLabel(caseEntry.getValue()); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "readStaticGroup_" + group.getName(), "(Lcom/cinnober/msgcodec/io/ByteSource;)" + groupDescriptor, false); mv.visitInsn(ARETURN); } // default case mv.visitLabel(unknownGroupIdLabel); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitVarInsn(ILOAD, 1); mv.visitMethodInsn(INVOKESTATIC, baseclassIName, "unknownGroupId", "(I)Lcom/cinnober/msgcodec/DecodeException;", false); mv.visitInsn(ATHROW); mv.visitMaxs(2, nextVar); mv.visitEnd(); }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateReadStaticGroupForTypeAndCreate(Schema schema, ClassVisitor cv, String genClassInternalName, boolean javaClassCodec) { for (GroupDef group : schema.getGroups()) { Object groupType = group.getGroupType(); String groupDescriptor = getTypeDescriptor(groupType, javaClassCodec); String groupInternalName = getTypeInternalName(groupType, javaClassCodec); MethodVisitor readmv = cv.visitMethod(ACC_PRIVATE, "readStaticGroup_" + group.getName(), "(Lcom/cinnober/msgcodec/io/ByteSource;)" + groupDescriptor, null, new String[] { "java/io/IOException" }); readmv.visitCode(); int nextReadVar = 2; Factory<?> factory = group.getFactory(); if (isPublicConstructorFactory(factory)) { // read, create instance readmv.visitTypeInsn(NEW, groupInternalName); readmv.visitInsn(DUP);/*from w w w . j a va2 s.co m*/ readmv.visitMethodInsn(INVOKESPECIAL, groupInternalName, "<init>", "()V", false); } else { // read, create instance readmv.visitVarInsn(ALOAD, 0); // this readmv.visitFieldInsn(GETFIELD, genClassInternalName, "factory_" + group.getName(), "Lcom/cinnober/msgcodec/Factory;"); readmv.visitMethodInsn(INVOKEINTERFACE, "com/cinnober/msgcodec/Factory", "newInstance", "()Ljava/lang/Object;", true); if (javaClassCodec) { readmv.visitTypeInsn(CHECKCAST, groupInternalName); } } final int readInstanceVar = nextReadVar++; readmv.visitVarInsn(ASTORE, readInstanceVar); readmv.visitVarInsn(ALOAD, 0); readmv.visitVarInsn(ALOAD, 1); readmv.visitVarInsn(ALOAD, readInstanceVar); readmv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "readStaticGroup_" + group.getName(), "(Lcom/cinnober/msgcodec/io/ByteSource;" + groupDescriptor + ")V", false); // end read readmv.visitVarInsn(ALOAD, readInstanceVar); readmv.visitInsn(ARETURN); readmv.visitMaxs(4, nextReadVar); readmv.visitEnd(); } }
From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java
License:Open Source License
protected void generateReadStaticGroupForType(final Schema schema, ClassVisitor cv, final String genClassInternalName, final boolean javaClassCodec) { for (final GroupDef group : schema.getGroups()) { Object groupType = group.getGroupType(); String groupDescriptor = getTypeDescriptor(groupType, javaClassCodec); final MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "readStaticGroup_" + group.getName(), "(Lcom/cinnober/msgcodec/io/ByteSource;" + groupDescriptor + ")V", null, new String[] { "java/io/IOException" }); mv.visitCode(); final LocalVariable nextVar = new LocalVariable(3); // read fields of super group if (group.getSuperGroup() != null) { GroupDef superGroup = schema.getGroup(group.getSuperGroup()); Object superGroupType = superGroup.getGroupType(); String superGroupDescriptor = getTypeDescriptor(superGroupType, javaClassCodec); mv.visitVarInsn(ALOAD, 0);/*from www .j av a 2 s . c o m*/ mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "readStaticGroup_" + superGroup.getName(), "(Lcom/cinnober/msgcodec/io/ByteSource;" + superGroupDescriptor + ")V", false); } // fields for (final FieldDef field : group.getFields()) { final Class<?> javaClass = field.getJavaClass(); Runnable readValue = () -> { Label tryStart = new Label(); Label tryEnd = new Label(); Label tryCatch = new Label(); Label tryAfter = new Label(); mv.visitTryCatchBlock(tryStart, tryEnd, tryCatch, "java/lang/Exception"); mv.visitLabel(tryStart); mv.visitVarInsn(ALOAD, 1); // input stream generateDecodeValue(mv, 1, nextVar, field.isRequired(), field.getType(), javaClass, field.getComponentJavaClass(), schema, genClassInternalName, group.getName() + "_" + field.getName(), group.getName() + "." + field.getName(), javaClassCodec); mv.visitLabel(tryEnd); mv.visitJumpInsn(GOTO, tryAfter); mv.visitLabel(tryCatch); int caughtExVar = nextVar.next(); mv.visitVarInsn(ASTORE, caughtExVar); mv.visitTypeInsn(NEW, "com/cinnober/msgcodec/blink/FieldDecodeException"); mv.visitInsn(DUP); mv.visitLdcInsn(field.getName()); mv.visitVarInsn(ALOAD, caughtExVar); mv.visitMethodInsn(INVOKESPECIAL, "com/cinnober/msgcodec/blink/FieldDecodeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(tryAfter); }; Accessor<?, ?> accessor = field.getAccessor(); if (isPublicFieldAccessor(accessor)) { Field f = ((FieldAccessor) accessor).getField(); mv.visitVarInsn(ALOAD, 2); // instance // value readValue.run(); // store mv.visitFieldInsn(PUTFIELD, Type.getInternalName(f.getDeclaringClass()), f.getName(), Type.getDescriptor(f.getType())); } else if (accessor.getClass() == CreateAccessor.class) { mv.visitVarInsn(ALOAD, 2); // instance Label tryStart = new Label(); Label tryEnd = new Label(); Label tryCatch = new Label(); Label tryAfter = new Label(); mv.visitTryCatchBlock(tryStart, tryEnd, tryCatch, "java/lang/Exception"); mv.visitLabel(tryStart); mv.visitVarInsn(ALOAD, 1); // input stream generateDecodeDummy(mv, 1, nextVar, field.isRequired(), field.getType(), javaClass, field.getComponentJavaClass(), schema, genClassInternalName, group.getName() + "." + field.getName(), javaClassCodec); mv.visitInsn(POP); mv.visitLabel(tryEnd); mv.visitJumpInsn(GOTO, tryAfter); mv.visitLabel(tryCatch); int caughtExVar = nextVar.next(); mv.visitVarInsn(ASTORE, caughtExVar); mv.visitTypeInsn(NEW, "com/cinnober/msgcodec/blink/FieldDecodeException"); mv.visitInsn(DUP); mv.visitLdcInsn(field.getName()); mv.visitVarInsn(ALOAD, caughtExVar); mv.visitMethodInsn(INVOKESPECIAL, "com/cinnober/msgcodec/blink/FieldDecodeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(tryAfter); mv.visitInsn(POP); } else { // accessor mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, genClassInternalName, "accessor_" + group.getName() + "_" + field.getName(), "Lcom/cinnober/msgcodec/Accessor;"); // instance mv.visitVarInsn(ALOAD, 2); // instance // value readValue.run(); if (javaClass.isPrimitive()) { box(mv, javaClass); } // store mv.visitMethodInsn(INVOKEINTERFACE, "com/cinnober/msgcodec/Accessor", "setValue", "(Ljava/lang/Object;Ljava/lang/Object;)V", true); } } mv.visitInsn(RETURN); mv.visitMaxs(6, nextVar.get()); mv.visitEnd(); } }
From source file:com.cinnober.msgcodec.blink.NativeByteCodeGenerator.java
License:Open Source License
@Override protected void generateWriteStaticGroupForTypeWithId(Schema schema, ClassVisitor cv, String genClassInternalName, boolean javaClassCodec) { for (GroupDef group : schema.getGroups()) { Object groupType = group.getGroupType(); String groupDescriptor = getTypeDescriptor(groupType, javaClassCodec); MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "writeStaticGroupWithId_" + group.getName(), "(Lcom/cinnober/msgcodec/io/ByteSink;" + groupDescriptor + ")V", null, new String[] { "java/io/IOException" }); mv.visitCode(); int nextWriteidVar = 3; if (group.getId() != -1) { // write with id mv.visitVarInsn(ALOAD, 1); // out mv.visitLdcInsn(group.getId() & 0xffffffffL); mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt64", "(Lcom/cinnober/msgcodec/io/ByteSink;J)V", false); // add extension offset (four zero bytes) mv.visitVarInsn(ALOAD, 1); // out mv.visitInsn(ICONST_0);/* www. ja v a2 s. c o m*/ generateEncodeUInt32Value(true, mv); mv.visitVarInsn(ALOAD, 0); // this mv.visitVarInsn(ALOAD, 1); // out mv.visitVarInsn(ALOAD, 2); // obj mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "writeStaticGroup_" + group.getName(), "(Lcom/cinnober/msgcodec/io/ByteSink;" + groupDescriptor + ")V", false); mv.visitInsn(RETURN); } else { // write with id mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException"); mv.visitInsn(DUP); mv.visitLdcInsn("No group id"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); } // end mv.visitMaxs(3, nextWriteidVar); mv.visitEnd(); } }
From source file:com.e2info.helloasm.HelloAsmApp.java
License:Open Source License
public static void main(String[] args) throws IOException { String name = "HelloAsm"; int flag = ClassWriter.COMPUTE_MAXS; ClassWriter cw = new ClassWriter(flag); cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, name, null, "java/lang/Object", null); cw.visitSource(name + ".java", null); {/*from ww w . j av a 2 s . c o m*/ MethodVisitor mv; mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mv.visitInsn(Opcodes.RETURN); // we need this call to take effect ClassWriter.COMPUTE_MAXS flag. mv.visitMaxs(0, 0); mv.visitEnd(); } { MethodVisitor mv; mv = cw.visitMethod(Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("hello ASM"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mv.visitInsn(Opcodes.RETURN); // we need this call to take effect ClassWriter.COMPUTE_MAXS flag. mv.visitMaxs(0, 0); mv.visitEnd(); } cw.visitEnd(); // build binary byte[] bin = cw.toByteArray(); // save asm trace for human readable { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); new ClassReader(bin).accept(new TraceClassVisitor(pw), 0); File f = new File(name + ".txt"); FileUtils.writeStringToFile(f, sw.toString()); } // save as calss file { File f = new File(name + ".class"); FileUtils.writeByteArrayToFile(f, bin); } }
From source file:com.facebook.presto.byteCode.MethodDefinition.java
License:Apache License
public void visit(ClassVisitor visitor, boolean addReturn) { String[] exceptions = new String[this.exceptions.size()]; for (int i = 0; i < exceptions.length; i++) { exceptions[i] = this.exceptions.get(i).getClassName(); }// w ww . j av a 2 s . c o m MethodVisitor methodVisitor = visitor.visitMethod(toAccessModifier(access), name, getMethodDescriptor(), genericMethodSignature(returnType, parameterTypes), exceptions); if (methodVisitor == null) { return; } // visit method annotations for (AnnotationDefinition annotation : annotations) { annotation.visitMethodAnnotation(methodVisitor); } // visit parameter annotations for (int parameterIndex = 0; parameterIndex < parameterAnnotations.size(); parameterIndex++) { List<AnnotationDefinition> parameterAnnotations1 = this.parameterAnnotations.get(parameterIndex); for (AnnotationDefinition parameterAnnotation : parameterAnnotations1) { parameterAnnotation.visitParameterAnnotation(parameterIndex, methodVisitor); } } // visit code methodVisitor.visitCode(); // visit instructions body.accept(methodVisitor); if (addReturn) { new InsnNode(RETURN).accept(methodVisitor); } // visit local variable declarations for (LocalVariableNode localVariableNode : localVariableNodes) { localVariableNode.accept(methodVisitor); } // done methodVisitor.visitMaxs(-1, -1); methodVisitor.visitEnd(); }
From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ScriptClassInstrumentor.java
License:Open Source License
private void emitStaticInitializer() { final String className = scriptClassInfo.getJavaName(); if (!staticInitFound) { // no user written <clinit> and so create one final MethodVisitor mv = ClassGenerator.makeStaticInitializer(this); mv.visitCode(); mv.visitInsn(RETURN);/*from w w w.j ava 2 s. c om*/ mv.visitMaxs(Short.MAX_VALUE, 0); mv.visitEnd(); } // Now generate $clinit$ final MethodGenerator mi = ClassGenerator.makeStaticInitializer(this, $CLINIT$); ClassGenerator.emitStaticInitPrefix(mi, className, memberCount); if (memberCount > 0) { for (final MemberInfo memInfo : scriptClassInfo.getMembers()) { if (memInfo.isInstanceProperty() || memInfo.isInstanceFunction()) { ClassGenerator.linkerAddGetterSetter(mi, className, memInfo); } else if (memInfo.isInstanceGetter()) { final MemberInfo setter = scriptClassInfo.findSetter(memInfo); ClassGenerator.linkerAddGetterSetter(mi, className, memInfo, setter); } } } ClassGenerator.emitStaticInitSuffix(mi, className); }
From source file:com.gargoylesoftware.js.nashorn.internal.tools.nasgen.ScriptClassJavaInstrumentor.java
License:Open Source License
private void emitStaticInitializer() { final String className = scriptClassInfo.getJavaName(); if (!staticInitFound) { // no user written <clinit> and so create one final MethodVisitor mv = ClassJavaGenerator.makeStaticInitializer(this); mv.visitCode(); mv.visitInsn(RETURN);/* w w w .ja va 2 s . co m*/ mv.visitMaxs(Short.MAX_VALUE, 0); mv.visitEnd(); } // Now generate $clinit$ final MethodGenerator mi = ClassJavaGenerator.makeStaticInitializer(this, $CLINIT$); ClassJavaGenerator.emitStaticInitPrefix(mi, className, memberCount); if (memberCount > 0) { for (final MemberInfo memInfo : scriptClassInfo.getMembers()) { if (memInfo.isInstanceProperty() || memInfo.isInstanceFunction()) { ClassJavaGenerator.linkerAddGetterSetter(mi, className, memInfo); } else if (memInfo.isInstanceGetter()) { final MemberInfo setter = scriptClassInfo.findSetter(memInfo); ClassJavaGenerator.linkerAddGetterSetter(mi, className, memInfo, setter); } } } ClassJavaGenerator.emitStaticInitSuffix(mi, className); }
From source file:com.github.bmsantos.core.cola.injector.ErrorsClassVisitor.java
License:Apache License
private void injectTestMethod() { final MethodVisitor mv = classVisitor.visitMethod(ACC_PUBLIC, METHOD_NAME, "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0);// www . j a va2 s. com mv.visitLdcInsn(errors); mv.visitMethodInsn(INVOKESTATIC, "org/junit/Assert", "fail", "(Ljava/lang/String;)V", false); mv.visitInsn(RETURN); mv.visitAnnotation("Lorg/junit/Test;", true); mv.visitEnd(); mv.visitMaxs(0, 0); }
From source file:com.github.bmsantos.core.cola.injector.InjectorClassVisitor.java
License:Apache License
private void injectTestMethod(final String feature, final String scenario, final String story, final String projectionValues, final String reports) { final MethodVisitor mv = infoClassVisitor.visitMethod(ACC_PUBLIC, String.format(METHOD_NAME_FORMAT, feature, scenario), "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0);/*w ww . jav a2s .c om*/ mv.visitLdcInsn(feature); mv.visitLdcInsn(scenario); mv.visitLdcInsn(story); mv.visitLdcInsn(projectionValues); mv.visitLdcInsn(reports); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "com/github/bmsantos/core/cola/story/processor/StoryProcessor", "process", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V", false); mv.visitInsn(RETURN); mv.visitAnnotation("Lorg/junit/Test;", true); mv.visitEnd(); mv.visitMaxs(0, 0); }