List of usage examples for org.objectweb.asm MethodVisitor visitCode
public void visitCode()
From source file:erjang.beam.CompilerVisitor.java
License:Apache License
/** * /*from ww w. j a v a2 s . c o m*/ */ private void generate_classinit() { MethodVisitor mv = cv.visitMethod(ACC_STATIC | ACC_PRIVATE, "<clinit>", "()V", null, null); mv.visitCode(); for (Map.Entry<String, String> ent : funs.entrySet()) { String field = ent.getKey(); String clazz = ent.getValue(); mv.visitTypeInsn(NEW, clazz); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, clazz, "<init>", "()V"); mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), field, "L" + funt.get(field) + ";"); } for (Map.Entry<EObject, String> ent : constants.entrySet()) { EObject term = ent.getKey(); term.emit_const(mv); mv.visitFieldInsn(Opcodes.PUTSTATIC, self_type.getInternalName(), ent.getValue(), Type.getType(term.getClass()).getDescriptor()); } cv.visitField(ACC_STATIC | ACC_PRIVATE, "attributes", ESEQ_TYPE.getDescriptor(), null, null); atts.emit_const(mv); mv.visitFieldInsn(Opcodes.PUTSTATIC, self_type.getInternalName(), "attributes", ESEQ_TYPE.getDescriptor()); if (this.module_md5 != null) { cv.visitField(ACC_STATIC, "module_md5", EBINARY_TYPE.getDescriptor(), null, null); module_md5.emit_const(mv); mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), "module_md5", EBINARY_TYPE.getDescriptor()); } mv.visitInsn(RETURN); mv.visitMaxs(200, 10); mv.visitEnd(); // make the method module_name mv = cv.visitMethod(ACC_PROTECTED, "module_name", "()Ljava/lang/String;", null, null); mv.visitCode(); mv.visitLdcInsn(this.module_name.getName()); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); // make the method attributes mv = cv.visitMethod(ACC_PROTECTED, "attributes", "()" + ESEQ_TYPE.getDescriptor(), null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, self_type.getInternalName(), "attributes", ESEQ_TYPE.getDescriptor()); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); // make default constructor mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, ECOMPILEDMODULE_NAME, "<init>", "()V"); mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); mv = cv.visitMethod(ACC_PUBLIC, "registerImportsAndExports", "()V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, ECOMPILEDMODULE_NAME, "registerImportsAndExports", "()V"); for (Lambda l : lambdas_xx.values()) { mv.visitTypeInsn(NEW, Type.getInternalName(LocalFunID.class)); mv.visitInsn(DUP); module_name.emit_const(mv); l.fun.emit_const(mv); push_int(mv, l.arity); push_int(mv, l.old_index); push_int(mv, l.index); push_int(mv, l.old_uniq); mv.visitFieldInsn(GETSTATIC, self_type.getInternalName(), "module_md5", EBINARY_TYPE.getDescriptor()); mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(LocalFunID.class), "<init>", "(" + EATOM_DESC + EATOM_DESC + "IIII" + EBINARY_TYPE.getDescriptor() + ")V"); mv.visitInsn(DUP); cv.visitField(ACC_STATIC, anon_fun_name(l), Type.getDescriptor(LocalFunID.class), null, null) .visitEnd(); mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), anon_fun_name(l), Type.getDescriptor(LocalFunID.class)); String mname = EUtil.getJavaName(l.fun, l.arity - l.freevars); String outer_name = self_type.getInternalName(); String inner_name = "FN_" + mname; String full_inner_name = outer_name + "$" + inner_name; mv.visitLdcInsn(full_inner_name.replace('/', '.')); mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(Class.class), "forName", "(Ljava/lang/String;)Ljava/lang/Class;"); mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(EModuleManager.class), "register_lambda", "(" + Type.getDescriptor(LocalFunID.class) + Type.getDescriptor(Class.class) + ")V"); } mv.visitInsn(RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); }
From source file:erjang.beam.CompilerVisitor.java
License:Apache License
static public byte[] make_invoker(String module, String function, Type self_type, String mname, String fname, int arity, boolean proc, boolean exported, Lambda lambda, Type return_type, boolean is_tail_call, final boolean is_pausable) { int freevars = lambda == null ? 0 : lambda.freevars; String outer_name = self_type.getInternalName(); String inner_name = "FN_" + mname; String full_inner_name = outer_name + "$" + inner_name; ClassWriter cw = new ClassWriter(true); int residual_arity = arity - freevars; String super_class_name = EFUN_NAME + residual_arity + (exported ? "Exported" : ""); if (exported) EFun.ensure_exported(residual_arity); else//from w w w.j a va 2 s.c o m EFun.ensure(residual_arity); cw.visit(V1_6, ACC_FINAL | ACC_PUBLIC, full_inner_name, null, super_class_name, null); if (lambda != null) { cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "index", "I", null, new Integer(lambda.index)); cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "old_index", "I", null, new Integer(lambda.old_index)); cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "old_uniq", "I", null, new Integer(lambda.old_uniq)); /** */ MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode", "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor()); mv.visitLdcInsn(module); mv.visitFieldInsn(GETSTATIC, full_inner_name, "old_index", "I"); mv.visitInsn(I2L); mv.visitLdcInsn(new Integer(arity)); mv.visitFieldInsn(GETSTATIC, outer_name, "module_md5", EBINARY_TYPE.getDescriptor()); mv.visitFieldInsn(GETSTATIC, full_inner_name, "index", "I"); mv.visitInsn(I2L); mv.visitFieldInsn(GETSTATIC, full_inner_name, "old_uniq", "I"); mv.visitInsn(I2L); mv.visitLdcInsn(new Integer(freevars)); mv.visitTypeInsn(ANEWARRAY, EOBJECT_NAME); for (int i = 0; i < freevars; i++) { mv.visitInsn(DUP); if (i <= 5) { mv.visitInsn(ICONST_0 + i); } else { mv.visitLdcInsn(new Integer(i)); } mv.visitVarInsn(ALOAD, 0); // load self mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i, EOBJECT_DESC); mv.visitInsn(AASTORE); } mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(EOutputStream.class), "write_fun", "(" + EPID_TYPE.getDescriptor() + "Ljava/lang/String;" + "JI" + EBINARY_TYPE.getDescriptor() + "JJ" + Type.getDescriptor(EObject[].class) + ")V"); mv.visitInsn(RETURN); mv.visitMaxs(10, 3); mv.visitEnd(); } make_constructor(cw, module, function, full_inner_name, super_class_name, lambda, exported); make_go_method(cw, outer_name, fname, full_inner_name, arity, proc, freevars, return_type, is_tail_call, is_pausable); make_go2_method(cw, outer_name, fname, full_inner_name, arity, proc, freevars, return_type, is_tail_call, is_pausable); return cw.toByteArray(); }
From source file:erjang.beam.CompilerVisitor.java
License:Apache License
private static void make_constructor(ClassWriter cw, String module_name, String function_name, String full_inner_name, String super_class_name, Lambda lambda, boolean exported) { StringBuilder sb = new StringBuilder("("); int freevars = lambda == null ? 0 : lambda.freevars; if (lambda != null) { sb.append(EPID_TYPE.getDescriptor()); cw.visitField(ACC_PUBLIC | ACC_FINAL, "pid", EPID_TYPE.getDescriptor(), null, null); }//from w w w . j a v a 2 s .c o m // create the free vars for (int i = 0; i < freevars; i++) { cw.visitField(ACC_PUBLIC | ACC_FINAL, "fv" + i, EOBJECT_DESC, null, null); sb.append(EOBJECT_DESC); } sb.append(")V"); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", sb.toString(), null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); if (exported) { mv.visitLdcInsn(module_name); mv.visitLdcInsn(function_name); mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V"); } else { mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V"); } if (lambda != null) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor()); } for (int i = 0; i < freevars; i++) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, i + 2); mv.visitFieldInsn(PUTFIELD, full_inner_name, "fv" + i, EOBJECT_DESC); } mv.visitInsn(RETURN); mv.visitMaxs(3, 3); mv.visitEnd(); if (lambda != null) { mv = cw.visitMethod(ACC_PROTECTED, "get_env", "()" + ESEQ_DESC, null, null); mv.visitCode(); mv.visitFieldInsn(GETSTATIC, ERT_NAME, "NIL", ENIL_TYPE.getDescriptor()); for (int i = freevars - 1; i >= 0; i--) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i, EOBJECT_DESC); mv.visitMethodInsn(INVOKEVIRTUAL, ESEQ_NAME, "cons", "(" + EOBJECT_DESC + ")" + ESEQ_DESC); } mv.visitInsn(ARETURN); mv.visitMaxs(3, 3); mv.visitEnd(); mv = cw.visitMethod(ACC_PROTECTED, "get_pid", "()" + EOBJECT_DESC, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor()); mv.visitInsn(ARETURN); mv.visitMaxs(3, 3); mv.visitEnd(); mv = cw.visitMethod(ACC_PROTECTED, "get_id", "()" + Type.getDescriptor(FunID.class), null, null); mv.visitCode(); mv.visitFieldInsn(GETSTATIC, full_inner_name.substring(0, full_inner_name.indexOf('$')), anon_fun_name(lambda), Type.getDescriptor(LocalFunID.class)); mv.visitInsn(ARETURN); mv.visitMaxs(3, 3); mv.visitEnd(); } }
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 w w .ja v a 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
public static void make_invoketail_method(ClassWriter cw, String full_inner, int arity, int freevars) { MethodVisitor mv; mv = cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "invoke_tail", EUtil.getSignature(arity - freevars, true), null, null);/* w ww . j a v a 2s. c om*/ mv.visitCode(); for (int i = 0; i < arity - freevars; i++) { mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, i + 2); mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC); } mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "tail", EFUN_DESCRIPTOR); if (EProc.TAIL_MARKER == null) { mv.visitInsn(ACONST_NULL); } else { mv.visitFieldInsn(GETSTATIC, EPROC_NAME, "TAIL_MARKER", EOBJECT_DESC); } 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. ja v a 2s. 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 w w w . j ava 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.EFun.java
License:Apache License
static byte[] gen_fun_class_data(int arity) { String self_type = EFUN_TYPE.getInternalName() + arity; ClassWriter cw = new ClassWriter(true); cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, self_type, null, EFUN_TYPE.getInternalName(), null); make_invoke_method(cw, self_type, arity); CompilerVisitor.make_invoketail_method(cw, self_type, arity, 0); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "arity", "()I", null, null); mv.visitCode(); mv.visitLdcInsn(new Integer(arity)); mv.visitInsn(Opcodes.IRETURN);/*w ww.j av a2 s .com*/ mv.visitMaxs(2, 2); mv.visitEnd(); mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "invoke", "(" + EPROC_TYPE.getDescriptor() + EOBJECT_ARR_TYPE.getDescriptor() + ")" + EOBJECT_TYPE.getDescriptor(), null, PAUSABLE_EX); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); // load this mv.visitVarInsn(Opcodes.ALOAD, 1); // load proc for (int i = 0; i < arity; i++) { mv.visitVarInsn(Opcodes.ALOAD, 2); push_int(mv, i); mv.visitInsn(Opcodes.AALOAD); } mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, self_type, "invoke", EUtil.getSignature(arity, true)); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(arity + 2, arity + 2); mv.visitEnd(); mv = cw.visitMethod(Opcodes.ACC_PROTECTED, "<init>", "()V", null, null); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, EFUN_TYPE.getInternalName(), "<init>", "()V"); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); make_cast_method(cw, arity); cw.visitEnd(); byte[] data = cw.toByteArray(); return data; }
From source file:erjang.EFun.java
License:Apache License
public static EFun get_fun_with_handler(String module, String function, int arity, EFunHandler handler, ClassLoader loader) {//from w w w . j av a2 s .c om String signature = module + function + arity; Constructor<? extends EFun> h = handlers.get(signature); if (h == null) { get_fun_class(arity); String safe_function = JAVA_ID.matcher(function).matches() ? function : make_valid_java_id(function); StringBuffer sb = new StringBuffer(); String self_type = sb.append(EFUN_TYPE.getInternalName()).append(module).append(safe_function) .append("Handler").append(arity).toString(); ClassWriter cw = new ClassWriter(true); String super_class_name = EFUN_TYPE.getInternalName() + arity; cw.visit(Opcodes.V1_4, ACC_PUBLIC, self_type, null, super_class_name, null); // create handler field cw.visitField(ACC_PRIVATE, "handler", EFUNHANDLER_TYPE.getDescriptor(), null, null).visitEnd(); cw.visitField(ACC_PRIVATE | ACC_FINAL, "module_name", EATOM_DESC, null, null).visitEnd(); cw.visitField(ACC_PRIVATE | ACC_FINAL, "function_name", EATOM_DESC, null, null).visitEnd(); // make constructor MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + EFUNHANDLER_TYPE.getDescriptor() + ")V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor()); mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn(module); mv.visitMethodInsn(INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern", "(Ljava/lang/String;)Lerjang/EAtom;"); mv.visitFieldInsn(PUTFIELD, self_type, "module_name", EATOM_DESC); mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn(function); mv.visitMethodInsn(INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern", "(Ljava/lang/String;)Lerjang/EAtom;"); mv.visitFieldInsn(PUTFIELD, self_type, "function_name", EATOM_DESC); mv.visitInsn(RETURN); mv.visitMaxs(3, 3); mv.visitEnd(); /** forward toString to handler */ mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); // load self mv.visitFieldInsn(GETFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor()); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;"); mv.visitInsn(ARETURN); mv.visitMaxs(3, 3); mv.visitEnd(); // make invoke_tail method //CompilerVisitor.make_invoketail_method(cw, self_type, arity, 0); make_invoke_method(cw, self_type, arity); make_go_method(cw, self_type, arity); make_encode_method(cw, self_type, arity); cw.visitEnd(); byte[] data = cw.toByteArray(); data = weave(data); Class<? extends EFun> clazz = ERT.defineClass(loader, self_type.replace('/', '.'), data); try { h = clazz.getConstructor(EFunHandler.class); } catch (Exception e) { throw new Error(e); } handlers.put(signature, h); } try { return h.newInstance(handler); } catch (Exception e) { throw new Error(e); } }
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(); mv.visitVarInsn(Opcodes.ALOAD, 0);// w w w . j a va2s . c om 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(); }