List of usage examples for org.objectweb.asm MethodVisitor visitMethodInsn
@Deprecated public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor)
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);//w ww.java 2 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.beam.CompilerVisitor.java
License:Apache License
private static void make_go_method(ClassWriter cw, String outer_name, String mname, String full_inner, int arity, boolean proc, int freevars, Type returnType, boolean isTailCall, boolean isPausable) { if (!isPausable) return;/*w ww.j a va2 s. c o m*/ MethodVisitor mv; mv = cw.visitMethod(ACC_PUBLIC, "go", GO_DESC, null, PAUSABLE_EX); mv.visitCode(); for (int i = 0; i < arity - freevars; i++) { mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC); mv.visitVarInsn(ASTORE, i + 2); } for (int i = 0; i < arity - freevars; i++) { mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ACONST_NULL); mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC); } 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, full_inner, "fv" + i, EOBJECT_DESC); } mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType)); mv.visitInsn(ARETURN); mv.visitMaxs(arity + 2, arity + 2); mv.visitEnd(); cw.visitEnd(); }
From source file:erjang.beam.CompilerVisitor.java
License:Apache License
private static void make_go2_method(ClassWriter cw, String outer_name, String mname, String full_inner, int arity, boolean proc, int freevars, Type returnType, boolean isTailCall, boolean isPausable) { if (isPausable) { if (ModuleAnalyzer.log.isLoggable(Level.FINE)) { ModuleAnalyzer.log.fine("not generating go2 (pausable) for " + full_inner); }//from www .jav a 2 s.c o m return; } MethodVisitor mv; mv = cw.visitMethod(ACC_PUBLIC, "go2", GO_DESC, null, null); mv.visitCode(); for (int i = 0; i < arity - freevars; i++) { mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(GETFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC); mv.visitVarInsn(ASTORE, i + 2); } for (int i = 0; i < arity - freevars; i++) { mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ACONST_NULL); mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC); } 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, full_inner, "fv" + i, EOBJECT_DESC); } mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType)); mv.visitInsn(ARETURN); mv.visitMaxs(arity + 2, arity + 2); mv.visitEnd(); cw.visitEnd(); }
From source file:erjang.EAtom.java
License:Apache License
@Override public org.objectweb.asm.Type emit_const(MethodVisitor fa) { Type type = EATOM_TYPE;/* w w w . java2 s. c o m*/ fa.visitLdcInsn(value); fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "intern", "(" + STRING_TYPE.getDescriptor() + ")" + type.getDescriptor()); return type; }
From source file:erjang.EBig.java
License:Apache License
@Override public org.objectweb.asm.Type emit_const(MethodVisitor fa) { Type type = EBIG_TYPE;// w w w .j a v a2 s . c o m fa.visitLdcInsn(value.toString()); fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString", "(" + STRING_TYPE.getDescriptor() + ")" + type.getDescriptor()); return type; }
From source file:erjang.EBigString.java
License:Apache License
@Override public Type emit_const(MethodVisitor fa) { Type type = ESTRING_TYPE;//from ww w. j a va2 s . c o m fa.visitLdcInsn(this.stringValue()); fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString", "(" + STRING_TYPE.getDescriptor() + ")" + type.getDescriptor()); return type; }
From source file:erjang.EBinary.java
License:Apache License
@Override public Type emit_const(MethodVisitor fa) { char[] chs = new char[byteSize()]; for (int i = 0; i < byteSize(); i++) { chs[i] = (char) (0xff & octetAt(i)); }/*from w w w .ja v a2 s .c om*/ String str = new String(chs); fa.visitLdcInsn(str); fa.visitMethodInsn(Opcodes.INVOKESTATIC, EBINARY_NAME, "fromString", "(Ljava/lang/String;)L" + EBINARY_NAME + ";"); return EBINARY_TYPE; }
From source file:erjang.EBinList.java
License:Apache License
@Override public Type emit_const(MethodVisitor fa) { Type type = EBINLIST_TYPE;/* ww w. j av a 2 s .c o m*/ char[] ch = new char[len]; for (int i = 0; i < len; i++) { ch[i] = (char) (0xff & (int) data[off + i]); } fa.visitLdcInsn(new String(ch)); tail.emit_const(fa); fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString", "(" + STRING_TYPE.getDescriptor() + EOBJECT_DESC + ")" + type.getDescriptor()); return type; }