List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn
public void visitLdcInsn(final Object value)
From source file:com.tencent.tinker.build.auxiliaryclass.AuxiliaryClassInjectAdapter.java
License:Open Source License
@Override public void visitEnd() { // If method <clinit> and <init> are not found, we should generate a <clinit>. if (!this.isClInitExists && !this.isInitExists) { MethodVisitor mv = super.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode();/*from www . j a v a 2 s.c o m*/ mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "lineSeparator", "()Ljava/lang/String;", false); Label lblSkipInvalidInsn = new Label(); mv.visitJumpInsn(Opcodes.IFNONNULL, lblSkipInvalidInsn); mv.visitLdcInsn(Type.getType(this.auxiliaryClassDesc)); mv.visitVarInsn(Opcodes.ASTORE, 0); mv.visitLabel(lblSkipInvalidInsn); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); } super.visitEnd(); }
From source file:com.toolazydogs.maiden.agent.asm.AsmUtils.java
License:Apache License
/** * Generates the instruction to push the given value on the stack. * * @param methodVisitor the visitor to which to send the instruction * @param value the value to be pushed on the stack. *///from w w w . j av a 2 s . c o m public static void push(MethodVisitor methodVisitor, int value) { if (value >= -1 && value <= 5) { methodVisitor.visitInsn(Opcodes.ICONST_0 + value); } else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) { methodVisitor.visitIntInsn(Opcodes.BIPUSH, value); } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) { methodVisitor.visitIntInsn(Opcodes.SIPUSH, value); } else { methodVisitor.visitLdcInsn(value); } }
From source file:com.toolazydogs.maiden.agent.asm.AsmUtils.java
License:Apache License
/** * Generates the instruction to push the given value on the stack. * * @param methodVisitor the visitor to which to send the instruction * @param value the value to be pushed on the stack. *//*from w ww .j a va2 s.co m*/ public static void push(MethodVisitor methodVisitor, long value) { if (value == 0L || value == 1L) { methodVisitor.visitInsn(Opcodes.LCONST_0 + (int) value); } else { methodVisitor.visitLdcInsn(value); } }
From source file:com.toolazydogs.maiden.agent.asm.IronClassVisitor.java
License:Apache License
public MethodVisitor visitMethod(int access, final String name, final String desc, String signature, String[] exceptions) {/*from ww w. j a v a 2 s. c o m*/ LOGGER.entering(CLASS_NAME, "visitMethod", new Object[] { access, name, desc, signature, exceptions }); boolean isNative = (access & ACC_NATIVE) != 0; boolean isSynchronized = (access & ACC_SYNCHRONIZED) != 0; boolean isStatic = (access & ACC_STATIC) != 0; MethodVisitor mv; /** * If native method prefix is supported we inject our own wrapper method. */ if (nativeMethodPrefixSupported && isNative) { delegate.visitMethod(access, IronAgent.NATIVE_METHOD_PREFIX + name, desc, signature, exceptions); mv = delegate.visitMethod(access ^ (ACC_NATIVE | ACC_SYNCHRONIZED), name, desc, signature, exceptions); } else { mv = delegate.visitMethod((isSynchronized ? access ^ ACC_SYNCHRONIZED : access), name, desc, signature, exceptions); } mv = new WaitNotifyMethodVisitor(mv); BeginEndMethodVisitor bemv = new BeginEndMethodVisitor(mv, access, name, desc, signature, exceptions); if (isSynchronized) { LOGGER.finest("Method is synchronized"); final Type classType = Type.getType("L" + clazz.replaceAll("\\.", "/") + ";.class"); if (isStatic) { LOGGER.finest("Method is static"); bemv.getListeners().add(new BeginEndMethodListener() { @Override public void begin(MethodVisitor visitor) { push(visitor, line); visitor.visitLdcInsn(classType); visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "lockObject", "(ILjava/lang/Object;)V"); } @Override public void end(MethodVisitor visitor) { push(visitor, line); visitor.visitLdcInsn(classType); visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "unlockObject", "(ILjava/lang/Object;)V"); } }); } else { LOGGER.finest("Method is not static"); bemv.getListeners().add(new BeginEndMethodListener() { @Override public void begin(MethodVisitor visitor) { push(visitor, line); visitor.visitVarInsn(ALOAD, 0); visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "lockObject", "(ILjava/lang/Object;)V"); } @Override public void end(MethodVisitor visitor) { push(visitor, line); visitor.visitVarInsn(ALOAD, 0); visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "unlockObject", "(ILjava/lang/Object;)V"); } }); } } bemv.getListeners().add(new BeginEndMethodListener() { @Override public void begin(MethodVisitor visitor) { visitor.visitLdcInsn(clazz); visitor.visitLdcInsn(name); visitor.visitLdcInsn(desc); visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "push", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); } @Override public void end(MethodVisitor visitor) { push(visitor, line); visitor.visitMethodInsn(INVOKESTATIC, "com/toolazydogs/maiden/IronMaiden", "pop", "(I)V"); } }); MethodVisitor result = new MonitorMethodVisitor(bemv); if (nativeMethodPrefixSupported && isNative) { MethodAdapter adapter = new MethodAdapter(result); adapter.visitCode(); int args = 0; if (!isStatic) adapter.visitVarInsn(ALOAD, args++); for (Type param : Type.getArgumentTypes(desc)) { adapter.visitVarInsn(param.getOpcode(ILOAD), args); args += param.getSize(); } adapter.visitMethodInsn((isStatic ? INVOKESTATIC : INVOKEVIRTUAL), clazz.replaceAll("\\.", "/"), IronAgent.NATIVE_METHOD_PREFIX + name, desc); Type returnType = Type.getReturnType(desc); adapter.visitInsn(returnType.getOpcode(Opcodes.IRETURN)); adapter.visitMaxs(0, 0); adapter.visitEnd(); result = null; } LOGGER.exiting(CLASS_NAME, "visitMethod", result); return result; }
From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java
License:Apache License
public static byte[] dumpArrayList(final TypeModel tm) { final ClassWriter cw = new ClassWriter(0); FieldVisitor fv;/*from w w w . j a va2s. c o m*/ MethodVisitor mv; final Class interfaceClass = tm.type(); final String name = interfaceClass.getName().replace('.', '/'); cw.visit( V1_5, ACC_PUBLIC + ACC_SUPER, name + "ArrayList", "L" + collections + "impl/AbstractHugeArrayList<L" + name + ";L" + name + "Allocation;L" + name + "Element;>;", collections + "impl/AbstractHugeArrayList", null); cw.visitSource(tm.type().getSimpleName() + "ArrayList.java", null); for (final FieldModel fm : tm.fields()) { if (fm instanceof Enum8FieldModel) { fv = cw.visitField(ACC_FINAL, fm.fieldName() + "FieldModel", "L" + collections + "model/Enum8FieldModel;", "L" + collections + "model/Enum8FieldModel<Ljava/lang/annotation/ElementType;>;", null); fv.visitEnd(); } else if (fm instanceof Enumerated16FieldModel) { fv = cw.visitField(ACC_FINAL, fm.fieldName() + "FieldModel", "L" + collections + "model/Enumerated16FieldModel;", "L" + collections + "model/Enumerated16FieldModel<Ljava/lang/String;>;", null); fv.visitEnd(); } } final List<FieldModel> fields = new ArrayList<FieldModel>(); { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(L" + collections + "HugeArrayBuilder;)V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(35, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, collections + "impl/AbstractHugeArrayList", "<init>", "(L" + collections + "HugeArrayBuilder;)V"); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(29, l1); for (final FieldModel fm : tm.fields()) { if (fm instanceof Enum8FieldModel) { mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, fm.bcModelType()); mv.visitInsn(DUP); mv.visitLdcInsn(fm.fieldName()); mv.visitIntInsn(BIPUSH, fm.fieldNumber()); mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitMethodInsn(INVOKESTATIC, fm.bcFieldType(), "values", "()[" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKESPECIAL, fm.bcModelType(), "<init>", "(Ljava/lang/String;ILjava/lang/Class;[Ljava/lang/Enum;)V"); mv.visitFieldInsn(PUTFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, collections + "HugeArrayBuilder", "baseDirectory", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "baseDirectory", "(Ljava/lang/String;)V"); fields.add(fm); } else if (fm instanceof Enumerated16FieldModel) { mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, fm.bcModelType()); mv.visitInsn(DUP); mv.visitLdcInsn(fm.fieldName()); mv.visitIntInsn(BIPUSH, fm.fieldNumber()); mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitMethodInsn(INVOKESPECIAL, fm.bcModelType(), "<init>", "(Ljava/lang/String;ILjava/lang/Class;)V"); mv.visitFieldInsn(PUTFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, collections + "HugeArrayBuilder", "baseDirectory", "()Ljava/lang/String;"); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "baseDirectory", "(Ljava/lang/String;)V"); fields.add(fm); } } mv.visitInsn(RETURN); final Label l4 = new Label(); mv.visitLabel(l4); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l4, 0); mv.visitLocalVariable("hab", "L" + collections + "HugeArrayBuilder;", null, l0, l4, 1); mv.visitMaxs(7, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "createAllocation", "(L" + collections + "impl/MappedFileChannel;)L" + name + "Allocation;", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(43, l0); mv.visitTypeInsn(NEW, name + "Allocation"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", "allocationSize", "I"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, name + "Allocation", "<init>", "(IL" + collections + "impl/MappedFileChannel;)V"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("mfc", "L" + collections + "impl/MappedFileChannel;", null, l0, l1, 1); mv.visitMaxs(4, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "createElement", "(J)L" + name + "Element;", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(48, l0); mv.visitTypeInsn(NEW, name + "Element"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(LLOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, name + "Element", "<init>", "(L" + collections + "impl/AbstractHugeArrayList;J)V"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("n", "J", null, l0, l1, 1); mv.visitMaxs(5, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "createImpl", "()L" + name + ";", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(53, l0); mv.visitTypeInsn(NEW, name + "Impl"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, name + "Impl", "<init>", "()V"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitMaxs(2, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "compactStart", "()V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(57, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactStart", "()V"); } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(58, l1); mv.visitInsn(RETURN); final Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "compactOnAllocation", "(L" + name + "Allocation;J)V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(65, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_string", fm.bcLStoreType()); mv.visitVarInsn(LLOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactScan", "(" + fm.bcLStoreType() + "J)V"); } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(66, l1); mv.visitInsn(RETURN); final Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0); mv.visitLocalVariable("allocation", "L" + name + "Allocation;", null, l0, l2, 1); mv.visitLocalVariable("thisSize", "J", null, l0, l2, 2); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "compactEnd", "()V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(69, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "compactEnd", "()V"); } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(70, l1); mv.visitInsn(RETURN); final Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l2, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "clear", "()V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(74, l0); for (final FieldModel fm : fields) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "ArrayList", fm.fieldName() + "FieldModel", fm.bcLModelType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcModelType(), "clear", "()V"); } final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(77, l3); mv.visitInsn(RETURN); final Label l4 = new Label(); mv.visitLabel(l4); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l4, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createImpl", "()Ljava/lang/Object;", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createImpl", "()L" + name + ";"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createElement", "(J)L" + collections + "impl/AbstractHugeElement;", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(LLOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createElement", "(J)L" + name + "Element;"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("x0", "J", null, l0, l1, 1); mv.visitMaxs(3, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "compactOnAllocation", "(L" + collections + "api/HugeAllocation;J)V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name + "Allocation"); mv.visitVarInsn(LLOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "compactOnAllocation", "(L" + name + "Allocation;J)V"); mv.visitInsn(RETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("x0", "L" + collections + "api/HugeAllocation;", null, l0, l1, 1); mv.visitLocalVariable("x1", "J", null, l0, l1, 2); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED + ACC_BRIDGE + ACC_SYNTHETIC, "createAllocation", "(L" + collections + "impl/MappedFileChannel;)L" + collections + "api/HugeAllocation;", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(29, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, name + "ArrayList", "createAllocation", "(L" + collections + "impl/MappedFileChannel;)L" + name + "Allocation;"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name + "ArrayList;", null, l0, l1, 0); mv.visitLocalVariable("x0", "L" + collections + "impl/MappedFileChannel;", null, l0, l1, 1); mv.visitMaxs(2, 2); mv.visitEnd(); } cw.visitEnd(); final byte[] bytes = cw.toByteArray(); // ClassReader cr = new ClassReader(bytes); // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0); return bytes; }
From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java
License:Apache License
public static byte[] dumpAllocation(final TypeModel tm) { final ClassWriter cw = new ClassWriter(0); FieldVisitor fv;/*w w w.j av a 2 s. c o m*/ MethodVisitor mv; final Class interfaceClass = tm.type(); final String name = interfaceClass.getName().replace('.', '/'); cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, name + "Allocation", null, "java/lang/Object", new String[] { collections + "api/HugeAllocation" }); cw.visitSource(tm.type().getSimpleName() + "Allocation.java", null); for (final FieldModel fm : tm.fields()) { fv = cw.visitField(0, "m_" + fm.fieldName(), fm.bcLStoreType(), null, null); fv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(IL" + collections + "impl/MappedFileChannel;)V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(46, l0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); for (final FieldModel fm : tm.fields()) { mv.visitVarInsn(ALOAD, 0); if (fm instanceof ObjectFieldModel) { mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitVarInsn(ILOAD, 1); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "newArrayOfField", "(Ljava/lang/Class;I)[Ljava/lang/Object;"); mv.visitTypeInsn(CHECKCAST, fm.bcLStoreType()); } else { mv.visitVarInsn(ILOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "newArrayOfField", "(IL" + collections + "impl/MappedFileChannel;)" + fm.bcLStoreType()); } mv.visitFieldInsn(PUTFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); } mv.visitInsn(RETURN); final Label l14 = new Label(); mv.visitLabel(l14); mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l14, 0); mv.visitLocalVariable("allocationSize", "I", null, l0, l14, 1); mv.visitLocalVariable("mfc", "L" + collections + "impl/MappedFileChannel;", null, l0, l14, 2); mv.visitMaxs(3, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "clear", "()V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(62, l0); for (final FieldModel fm : tm.fields()) { if (fm instanceof ObjectFieldModel) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); mv.visitInsn(ACONST_NULL); mv.visitMethodInsn(INVOKESTATIC, "java/util/Arrays", "fill", "([Ljava/lang/Object;Ljava/lang/Object;)V"); } } final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(63, l1); mv.visitInsn(RETURN); final Label l2 = new Label(); mv.visitLabel(l2); mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l2, 0); mv.visitMaxs(2, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "destroy", "()V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(66, l0); for (final FieldModel fm : tm.fields()) { if (!fm.isBufferStore()) { continue; } mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); mv.visitTypeInsn(CHECKCAST, "java/nio/Buffer"); mv.visitMethodInsn(INVOKESTATIC, GenerateHugeArrays.class.getName().replace('.', '/'), "clean", "(Ljava/nio/Buffer;)V"); } final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(69, l3); mv.visitInsn(RETURN); final Label l4 = new Label(); mv.visitLabel(l4); mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l4, 0); mv.visitLocalVariable("m", "Ljava/lang/Object;", null, l3, l4, 1); mv.visitMaxs(1, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PROTECTED, "finalize", "()V", null, new String[] { "java/lang/Throwable" }); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(76, l0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "finalize", "()V"); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLineNumber(77, l1); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name + "Allocation", "destroy", "()V"); final Label l2 = new Label(); mv.visitLabel(l2); mv.visitLineNumber(78, l2); mv.visitInsn(RETURN); final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLocalVariable("this", "L" + name + "Allocation;", null, l0, l3, 0); mv.visitMaxs(1, 1); mv.visitEnd(); } cw.visitEnd(); final byte[] bytes = cw.toByteArray(); // ClassReader cr = new ClassReader(bytes); // cr.accept(new ASMifierClassVisitor(new PrintWriter(System.out)), 0); return bytes; }
From source file:com.weibo.lodil.mmap.impl.GenerateHugeArrays.java
License:Apache License
private static void appendToStringHashCodeEqualsCopyOf(final TypeModel tm, final ClassWriter cw, final String name2, final boolean hasListField) { final String name = tm.bcType(); MethodVisitor mv; {// ww w . ja va 2 s . c om mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(176, l0); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V"); mv.visitLdcInsn(tm.type().getSimpleName() + "{"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); String sep = ""; for (final FieldModel fm : tm.fields()) { final boolean text = CharSequence.class.isAssignableFrom(tm.type()); mv.visitLdcInsn(sep + fm.fieldName() + "=" + (text ? "'" : "")); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;"); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); String appendType = "Ljava/lang/Object;"; final Class fmType = fm.type(); if (fmType.isPrimitive()) { if ((fmType == byte.class) || (fmType == short.class)) { appendType = "I"; } else { appendType = fm.bcLFieldType(); } } mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(" + appendType + ")Ljava/lang/StringBuilder;"); sep = text ? "', " : ", "; } if (sep.startsWith("'")) { mv.visitIntInsn(BIPUSH, 39); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;"); } mv.visitIntInsn(BIPUSH, 125); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(C)Ljava/lang/StringBuilder;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;"); mv.visitInsn(ARETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0); mv.visitMaxs(3, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(194, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); final Label l1 = new Label(); mv.visitJumpInsn(IF_ACMPNE, l1); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitLabel(l1); mv.visitLineNumber(195, l1); mv.visitVarInsn(ALOAD, 1); final Label l2 = new Label(); mv.visitJumpInsn(IFNULL, l2); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;"); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;"); final Label l3 = new Label(); mv.visitJumpInsn(IF_ACMPEQ, l3); mv.visitLabel(l2); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(l3); mv.visitLineNumber(197, l3); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name2); mv.visitVarInsn(ASTORE, 2); final Label l4 = new Label(); mv.visitLabel(l4); mv.visitLineNumber(199, l4); final FieldModel[] fieldModels = tm.fields().clone(); Arrays.sort(fieldModels, new Comparator<FieldModel>() { // reverse sort the preferences to optimise the public int compare(final FieldModel o1, final FieldModel o2) { return o2.equalsPreference() - o1.equalsPreference(); } }); for (final FieldModel fm : fieldModels) { // System.out.println(fm.fieldName()); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); final Label l5 = new Label(); if (fm.isCallsNotEquals()) { mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "notEquals", "(" + fm.bcLSetType() + fm.bcLSetType() + ")Z"); mv.visitJumpInsn(IFEQ, l5); } else { mv.visitJumpInsn(IF_ICMPEQ, l5); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(l5); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); final Label l17 = new Label(); mv.visitLabel(l17); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l17, 0); mv.visitLocalVariable("o", "Ljava/lang/Object;", null, l0, l17, 1); mv.visitLocalVariable("that", "L" + name2 + ";", null, l4, l17, 2); mv.visitMaxs(4, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); int count = 0; for (final FieldModel fm : tm.fields()) { // if (count > 5) break; // System.out.println(fm.fieldName()); if (count > 0) { mv.visitIntInsn(BIPUSH, 31); mv.visitInsn(IMUL); } mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); if (fm.isCallsHashCode()) { mv.visitMethodInsn(INVOKESTATIC, fm.bcLModelType(), "hashCode", "(" + fm.bcLSetType() + ")I"); } if (count > 0) { mv.visitInsn(IADD); } count++; } mv.visitInsn(IRETURN); final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l3, 0); mv.visitMaxs(6, 1); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "copyOf", "(L" + name + ";)V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(240, l0); boolean copySimpleValues = false; for (final FieldModel fm : tm.fields()) { if (!fm.copySimpleValue() || !hasListField) { // if (true) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V"); } else { copySimpleValues = true; } } final Label l4 = new Label(); final Label l6 = new Label(); if (copySimpleValues) { final Label l3 = new Label(); mv.visitLabel(l3); mv.visitLineNumber(243, l3); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(INSTANCEOF, name2); mv.visitJumpInsn(IFEQ, l4); final Label l5 = new Label(); mv.visitLabel(l5); mv.visitLineNumber(238, l5); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name2); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l6); mv.visitLineNumber(239, l6); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name2, "container", "L" + collections + "impl/AbstractHugeContainer;"); mv.visitJumpInsn(IF_ACMPNE, l4); for (final FieldModel fm : tm.fields()) { if (fm.copySimpleValue()) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;"); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, name2, "offset", "I"); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, name2, "allocation", "L" + name + "Allocation;"); mv.visitFieldInsn(GETFIELD, name + "Allocation", "m_" + fm.fieldName(), fm.bcLStoreType()); mv.visitVarInsn(ALOAD, 2); mv.visitFieldInsn(GETFIELD, name2, "offset", "I"); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "get", "(I)" + fm.bcLStoredType()); mv.visitMethodInsn(INVOKEVIRTUAL, fm.bcStoreType(), "put", "(I" + fm.bcLStoredType() + ")" + fm.bcLStoreType()); mv.visitInsn(POP); } } } final Label l16 = new Label(); mv.visitLabel(l16); mv.visitLineNumber(238, l16); final Label l17 = new Label(); mv.visitJumpInsn(GOTO, l17); mv.visitLabel(l4); mv.visitLineNumber(241, l4); for (final FieldModel fm : tm.fields()) { if (fm.copySimpleValue()) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEINTERFACE, name, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V"); } } mv.visitLabel(l17); mv.visitLineNumber(251, l17); mv.visitInsn(RETURN); final Label l27 = new Label(); mv.visitLabel(l27); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l27, 0); mv.visitLocalVariable("t", "L" + name + ";", null, l0, l27, 1); if (copySimpleValues) { mv.visitLocalVariable("mte", "L" + name + "Element;", null, l6, l4, 2); } mv.visitMaxs(4, 3); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "copyOf", "(Ljava/lang/Object;)V", null, null); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(275, l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, name); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "copyOf", "(L" + name + ";)V"); mv.visitInsn(RETURN); final Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l1, 0); mv.visitLocalVariable("x0", "Ljava/lang/Object;", null, l0, l1, 1); mv.visitMaxs(2, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "writeExternal", "(Ljava/io/ObjectOutput;)V", null, new String[] { "java/io/IOException" }); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(185, l0); for (final FieldModel fm : tm.fields()) { mv.visitVarInsn(ALOAD, 1); if (fm.bcLSetType().equals(fm.bcLFieldType())) { mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write", "(Ljava/io/ObjectOutput;" + fm.bcLSetType() + ")V"); } else { mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, name2, "get" + fm.titleFieldName(), "()" + fm.bcLFieldType()); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "write", "(Ljava/io/ObjectOutput;Ljava/lang/Class;" + fm.bcLSetType() + ")V"); } } final Label l13 = new Label(); mv.visitLabel(l13); mv.visitLineNumber(288, l13); mv.visitInsn(RETURN); final Label l14 = new Label(); mv.visitLabel(l14); mv.visitLocalVariable("this", "L" + name2 + ';', null, l0, l14, 0); mv.visitLocalVariable("out", "Ljava/io/ObjectOutput;", null, l0, l14, 1); mv.visitMaxs(4, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "readExternal", "(Ljava/io/ObjectInput;)V", null, new String[] { "java/io/IOException", "java/lang/ClassNotFoundException" }); mv.visitCode(); final Label l0 = new Label(); mv.visitLabel(l0); mv.visitLineNumber(287, l0); for (final FieldModel fm : tm.fields()) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); if (fm.bcLSetType().equals(fm.bcLFieldType())) { mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read", "(Ljava/io/ObjectInput;)" + fm.bcLSetType()); } else { mv.visitLdcInsn(Type.getType(fm.bcLFieldType())); mv.visitMethodInsn(INVOKESTATIC, fm.bcModelType(), "read", "(Ljava/io/ObjectInput;Ljava/lang/Class;)" + fm.bcLSetType()); mv.visitTypeInsn(CHECKCAST, fm.bcFieldType()); } mv.visitMethodInsn(INVOKEVIRTUAL, name2, "set" + fm.titleFieldName(), "(" + fm.bcLFieldType() + ")V"); } final Label l13 = new Label(); mv.visitLabel(l13); mv.visitLineNumber(305, l13); mv.visitInsn(RETURN); final Label l14 = new Label(); mv.visitLabel(l14); mv.visitLocalVariable("this", "L" + name2 + ";", null, l0, l14, 0); mv.visitLocalVariable("in", "Ljava/io/ObjectInput;", null, l0, l14, 1); mv.visitMaxs(3, 2); mv.visitEnd(); } }
From source file:com.yahoo.yqlplus.engine.internal.bytecode.LDCConstant.java
@Override public void generate(CodeEmitter environment) { MethodVisitor mv = environment.getMethodVisitor(); if (constant instanceof Integer) { environment.emitIntConstant((int) constant); } else {// w w w. j a v a2s . co m mv.visitLdcInsn(constant); } }
From source file:com.yahoo.yqlplus.engine.internal.compiler.CodeEmitter.java
public void emitStringSwitch(Map<String, Label> labels, Label defaultCase, boolean caseInsensitive) { MethodVisitor mv = getMethodVisitor(); if (caseInsensitive) { mv.visitFieldInsn(GETSTATIC, "java/util/Locale", "ENGLISH", "Ljava/util/Locale;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toUpperCase", "(Ljava/util/Locale;)Ljava/lang/String;", false); }//from www .j a v a 2 s . c o m mv.visitInsn(DUP); AssignableValue tmp = allocate(String.class); tmp.write(BaseTypeAdapter.STRING).generate(this); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "hashCode", "()I", false); Multimap<Integer, SwitchLabel> keys = ArrayListMultimap.create(); for (Map.Entry<String, Label> e : labels.entrySet()) { String name = e.getKey(); if (caseInsensitive) { name = name.toUpperCase(Locale.ENGLISH); } keys.put(name.hashCode(), new SwitchLabel(name, e.getValue())); } List<Integer> codes = Lists.newArrayList(keys.keySet()); Collections.sort(codes); int[] k = new int[codes.size()]; Label[] kl = new Label[codes.size()]; for (int i = 0; i < k.length; ++i) { k[i] = codes.get(i); kl[i] = new Label(); } mv.visitLookupSwitchInsn(defaultCase, k, kl); for (int i = 0; i < k.length; ++i) { mv.visitLabel(kl[i]); for (SwitchLabel switchLabel : keys.get(k[i])) { mv.visitLdcInsn(switchLabel.name); tmp.read().generate(this); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "equals", "(Ljava/lang/Object;)Z", false); mv.visitJumpInsn(IFNE, switchLabel.label); } mv.visitJumpInsn(GOTO, defaultCase); } }
From source file:com.yahoo.yqlplus.engine.internal.source.MissingRequiredFieldExpr.java
@Override public void generate(CodeEmitter code) { MethodVisitor mv = code.getMethodVisitor(); mv.visitTypeInsn(Opcodes.NEW, Type.getInternalName(IllegalArgumentException.class)); mv.visitInsn(Opcodes.DUP);//from www . j ava2s .co m mv.visitLdcInsn(String.format("%s::%s Missing required property '%s' (%s)", className, methodName, propertyName, type.getTypeName())); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(IllegalArgumentException.class), "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(String.class)), false); mv.visitInsn(Opcodes.ATHROW); }