List of usage examples for org.objectweb.asm Label Label
public Label()
From source file:edu.mit.streamjit.util.bytecode.MethodUnresolver.java
License:Open Source License
private void createLabels() { for (BasicBlock b : method.basicBlocks()) labels.put(b, new LabelNode(new Label())); }
From source file:edu.ubc.mirrors.holograms.HologramMethodGenerator.java
License:Open Source License
@Override public void visitCode() { super.visitCode(); if (name.equals("<clinit>")) { initializeStaticFields(owner, this); // Skip the static initializer for classes that were already defined - // these will have already been executed when // loading the original class and state will be proxied by ClassMirrors instead. Label afterEarlyReturn = new Label(); new MethodHandle() { protected void methodCall() throws Throwable { ((ClassMirror) null).initialized(); }/*from ww w. j av a 2 s.c om*/ }.invoke(this); ifeq(afterEarlyReturn); areturn(Type.VOID_TYPE); mark(afterEarlyReturn); visitFrame(Opcodes.F_NEW, 0, new Object[0], 0, new Object[0]); } if (name.equals("<init>")) { lvs.newLocal(instanceMirrorType); if (owner.equals(getHologramType(Throwable.class))) { load(0, owner); load((methodType.getArgumentsAndReturnSizes() >> 2) - 1, instanceMirrorType); putfield(owner.getInternalName(), "mirror", Type.getDescriptor(ObjectMirror.class)); } } }
From source file:erjang.beam.CompilerVisitor.java
License:Apache License
private static void make_invoke_method(ClassWriter cw, String outer_name, String mname, int arity, boolean proc, int freevars, Type returnType, boolean isTailCall) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "invoke", EUtil.getSignature(arity - freevars, true), null, PAUSABLE_EX);//from w ww .ja v a2 s.c o m mv.visitCode(); if (proc) { mv.visitVarInsn(ALOAD, 1); } for (int i = 0; i < arity - freevars; i++) { mv.visitVarInsn(ALOAD, i + 2); } for (int i = 0; i < freevars; i++) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, outer_name + "$FN_" + mname, "fv" + i, EOBJECT_DESC); } mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType)); if (isTailCall) { mv.visitVarInsn(ASTORE, arity + 2); Label done = new Label(); Label loop = new Label(); mv.visitLabel(loop); mv.visitVarInsn(ALOAD, arity + 2); if (EProc.TAIL_MARKER == null) { mv.visitJumpInsn(IFNONNULL, done); } else { mv.visitFieldInsn(GETSTATIC, EPROC_NAME, "TAIL_MARKER", EOBJECT_DESC); mv.visitJumpInsn(IF_ACMPNE, done); } // load proc mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, EPROC_NAME, "tail", EFUN_DESCRIPTOR); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, EFUN_NAME, "go", GO_DESC); mv.visitVarInsn(ASTORE, arity + 2); mv.visitJumpInsn(GOTO, loop); mv.visitLabel(done); mv.visitVarInsn(ALOAD, arity + 2); } mv.visitInsn(ARETURN); mv.visitMaxs(arity + 2, arity + 2); mv.visitEnd(); }
From source file:erjang.EFun.java
License:Apache License
private static void make_cast_method(ClassWriter cw, int n) { MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast", "(" + EOBJECT_DESC + ")L" + EFUN_NAME + n + ";", null, null); mv.visitCode();/* w w w . java 2 s. c om*/ mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitTypeInsn(INSTANCEOF, EFUN_NAME + n); Label fail = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, fail); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitTypeInsn(Opcodes.CHECKCAST, EFUN_NAME + n); mv.visitInsn(Opcodes.ARETURN); mv.visitLabel(fail); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); }
From source file:erjang.EFun.java
License:Apache License
private static void make_invoke_method(ClassWriter cw, String self_type, int arity) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "invoke", EUtil.getSignature(arity, true), null, PAUSABLE_EX); mv.visitCode();/*from www .jav a2s .co m*/ mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); for (int i = 0; i < arity; i++) { mv.visitVarInsn(ALOAD, i + 2); } mv.visitMethodInsn(INVOKEVIRTUAL, self_type, "invoke_tail", EUtil.getSignature(arity, true)); mv.visitVarInsn(ASTORE, arity + 2); Label done = new Label(); Label loop = new Label(); mv.visitLabel(loop); mv.visitVarInsn(ALOAD, arity + 2); if (EProc.TAIL_MARKER == null) { mv.visitJumpInsn(IFNONNULL, done); } else { mv.visitFieldInsn(GETSTATIC, EPROC_TYPE.getInternalName(), "TAIL_MARKER", EOBJECT_TYPE.getDescriptor()); mv.visitJumpInsn(IF_ACMPNE, done); } // load proc mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, EPROC_TYPE.getInternalName(), "tail", EFUN_TYPE.getDescriptor()); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, EFUN_TYPE.getInternalName(), "go", GO_DESC); mv.visitVarInsn(ASTORE, arity + 2); mv.visitJumpInsn(GOTO, loop); mv.visitLabel(done); mv.visitVarInsn(ALOAD, arity + 2); mv.visitInsn(ARETURN); mv.visitMaxs(arity + 2, arity + 2); mv.visitEnd(); }
From source file:erjang.ETuple.java
License:Apache License
private static void create_tuple_nth(int n_cells, ClassAdapter cw, String this_class_name) { MethodVisitor mv;//from w w w . ja v a 2s. c om mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "elm", "(I)" + ETERM_TYPE.getDescriptor(), null, null); mv.visitCode(); Label dflt = new Label(); Label[] labels = new Label[n_cells]; for (int i = 0; i < n_cells; i++) { labels[i] = new Label(); } mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitTableSwitchInsn(1, n_cells, dflt, labels); for (int zbase = 0; zbase < n_cells; zbase++) { mv.visitLabel(labels[zbase]); mv.visitVarInsn(Opcodes.ALOAD, 0); // load this String field = "elem" + (zbase + 1); mv.visitFieldInsn(Opcodes.GETFIELD, this_class_name, field, ETERM_TYPE.getDescriptor()); mv.visitInsn(Opcodes.ARETURN); } mv.visitLabel(dflt); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "bad_nth", "(I)" + ETERM_TYPE.getDescriptor()); mv.visitInsn(Opcodes.ARETURN); // make compiler happy mv.visitMaxs(3, 2); mv.visitEnd(); }
From source file:erjang.ETuple.java
License:Apache License
private static void create_tuple_set(int n_cells, ClassAdapter cw, String this_class_name) { MethodVisitor mv;//from ww w . j a v a 2 s .c o m mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "set", "(I" + ETERM_TYPE.getDescriptor() + ")V", null, null); mv.visitCode(); Label dflt = new Label(); Label[] labels = new Label[n_cells]; for (int i = 0; i < n_cells; i++) { labels[i] = new Label(); } mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitTableSwitchInsn(1, n_cells, dflt, labels); for (int zbase = 0; zbase < n_cells; zbase++) { mv.visitLabel(labels[zbase]); mv.visitVarInsn(Opcodes.ALOAD, 0); // load this mv.visitVarInsn(Opcodes.ALOAD, 2); // load term String field = "elem" + (zbase + 1); mv.visitFieldInsn(Opcodes.PUTFIELD, this_class_name, field, ETERM_TYPE.getDescriptor()); mv.visitInsn(Opcodes.RETURN); } mv.visitLabel(dflt); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ILOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "bad_nth", "(I)" + ETERM_TYPE.getDescriptor()); mv.visitInsn(Opcodes.POP); mv.visitInsn(Opcodes.RETURN); // make compiler happy mv.visitMaxs(3, 3); mv.visitEnd(); }
From source file:erjang.ETuple.java
License:Apache License
private static void create_cast(ClassAdapter cw, int n) { MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast", "(L" + ETUPLE_NAME + ";)L" + ETUPLE_NAME + n + ";", null, null); mv.visitCode();//from w w w . j av a 2 s . c o m mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "arity", "()I"); if (n <= 5) { mv.visitInsn(Opcodes.ICONST_0 + n); } else { mv.visitLdcInsn(new Integer(n)); } Label fail = new Label(); mv.visitJumpInsn(Opcodes.IF_ICMPNE, fail); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitTypeInsn(Opcodes.CHECKCAST, ETUPLE_NAME + n); mv.visitInsn(Opcodes.ARETURN); mv.visitLabel(fail); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); }
From source file:erjang.ETuple.java
License:Apache License
private static void create_cast2(ClassAdapter cw, int n) { MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast", "(L" + Type.getInternalName(EObject.class) + ";)L" + ETUPLE_NAME + n + ";", null, null); mv.visitCode();/*from ww w .j a v a2 s.c om*/ mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitInsn(Opcodes.DUP); mv.visitTypeInsn(Opcodes.INSTANCEOF, ETUPLE_NAME + n); Label fail = new Label(); mv.visitJumpInsn(Opcodes.IFEQ, fail); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitTypeInsn(Opcodes.CHECKCAST, ETUPLE_NAME + n); mv.visitInsn(Opcodes.ARETURN); mv.visitLabel(fail); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeGenerationGoloIrVisitor.java
License:Apache License
@Override public void visitBlock(Block block) { ReferenceTable referenceTable = block.getReferenceTable(); context.referenceTableStack.push(referenceTable); Label blockStart = new Label(); Label blockEnd = new Label(); methodVisitor.visitLabel(blockStart); for (GoloStatement statement : block.getStatements()) { visitLine(statement, methodVisitor); statement.accept(this); insertMissingPop(statement);//from w w w . j ava2 s .c o m } methodVisitor.visitLabel(blockEnd); for (LocalReference localReference : referenceTable.ownedReferences()) { if (localReference.isModuleState()) { continue; } methodVisitor.visitLocalVariable(localReference.getName(), TOBJECT, null, blockStart, blockEnd, localReference.getIndex()); } context.referenceTableStack.pop(); }