Package org.objectweb.asm

Examples of org.objectweb.asm.ClassWriter


  public ASMClassWriter(JVMClass jvmClass) {
    this.jvmClass = jvmClass;
  }

  public ClassWriter newClassWriter() {
    return new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) {

      @Override
      protected String getCommonSuperClass(String type1, String type2) {
        return "java/lang/Object";
      }
View Full Code Here


     * Generates a proxy class.
     * @param spec the proxied service specification
     * @return the byte[] for the generated proxy class.
     */
    public static byte[] dumpProxy(Class spec) {
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        String internalClassName = Type.getInternalName(spec); // Specification class internal name.
        String[] itfs = new String[] {internalClassName}// Implemented interface.
        String className = internalClassName + "$$Proxy"; // Unique name.
        Method[] methods = spec.getMethods(); // Method to delegate
       
        cw.visit(Opcodes.V1_3, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, className, null, "java/lang/Object", itfs);
        addDependencyField(cw);
        generateConstructor(cw, className);
       
        // For each method, create the delegator code.
        for (int i = 0; i < methods.length; i++) {
            if ((methods[i].getModifiers() & (Modifier.STATIC | Modifier.FINAL)) == 0) {
                generateDelegator(cw, methods[i], className, internalClassName);
            }
        }       
       
        cw.visitEnd();
       
        return cw.toByteArray();
       
    }
View Full Code Here

            final ClassReader reader = new ClassReader(new FileInputStream(fileName));
            reader.accept(cn, 0);

            // For target Java7 and above use: ClassWriter.COMPUTE_MAXS  | ClassWriter.COMPUTE_FRAMES
            final int mask = (cn.version > 50 ? ClassWriter.COMPUTE_MAXS  | ClassWriter.COMPUTE_FRAMES : 0);
            final ClassWriter writer = new ClassWriter(mask) {

                @Override
                protected String getCommonSuperClass(final String type1, final String type2) {
                    Class<?> c, d;
                    try {
                        c = classLoader.loadClass(type1.replace('/', '.'));
                        d = classLoader.loadClass(type2.replace('/', '.'));
                    } catch (final Exception e) {
                        throw new RuntimeException(e.toString(), e);
                    }
                    if (c.isAssignableFrom(d)) {
                        return type1;
                    }
                    if (d.isAssignableFrom(c)) {
                        return type2;
                    }
                    if (c.isInterface() || d.isInterface()) {
                        return "java/lang/Object";
                    }
                    do {
                        c = c.getSuperclass();
                    } while (!c.isAssignableFrom(d));
                    return c.getName().replace('.', '/');
                }

            };

            cn.accept(writer);
            if ( createBind ) {
                logger.debug("Adding bind " + className + " " + fieldName);

                createMethod(writer, className, referenceName, fieldName, typeName, true);
            }
            if ( createUnbind ) {
                logger.debug("Adding unbind " + className + " " + fieldName);

                createMethod(writer, className, referenceName, fieldName, typeName, false);
            }

            final FileOutputStream fos = new FileOutputStream(fileName);
            fos.write(writer.toByteArray());
            fos.close();
        } catch (final Exception e) {
            throw new SCRDescriptorException("Unable to add methods to " + className, typeName, e);
        }
    }
View Full Code Here

  public static void compile(BeamFileData data, ClassRepo repo) throws IOException {
    // reset thread-local data
    ClassWeaver.reset();
   
    // class writer, phase 4
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);

    // class checker, optional phase
    //CheckClassAdapter ca = new CheckClassAdapter(cw);

    // the java bytecode generator, phase 3
    CompilerVisitor cv = new CompilerVisitor(cw, repo);

    // the type analysis, phase 2
    BeamTypeAnalysis analysis = new BeamTypeAnalysis(cv);

    // the module analyzer, phase 1 (not chained to phase 2)
    ModuleAnalyzer ma = new ModuleAnalyzer();
    data.accept(ma);

    cv.setFunInfos(ma.getFunInfos());

    try {
      // go!
      data.accept(analysis);
    } catch (Error e) {
      e.printStackTrace();
    }

    byte[] byteArray = cw.toByteArray();

     // to emit pre-kilim code [for debugging] 
    repo.store("raw/"+cv.getInternalClassName(), byteArray);

    boolean written = false;
View Full Code Here

            }
        }
  }

  static byte[] make_tuple_class_data(int num_cells) {
    ClassWriter cww = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);

    CheckClassAdapter cw = new CheckClassAdapter(cww);

    String this_class_name = ETUPLE_NAME + num_cells;
    String super_class_name = ETUPLE_NAME;
    cw.visit(Opcodes.V1_4, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER,
        this_class_name, null, super_class_name, null);

    // create fields

    for (int i = 1; i <= num_cells; i++) {
      cw.visitField(Opcodes.ACC_PUBLIC, "elem" + i, ETERM_TYPE
          .getDescriptor(), null, null);
    }

    // create count method
    create_count(cw, num_cells);

    // create cast method
    create_cast(cw, num_cells);
    create_cast2(cw, num_cells);

    // create constructor
    create_constructor(cw, super_class_name);

    // create copy
    create_tuple_copy(num_cells, cw, this_class_name, super_class_name);

    create_tuple_make(num_cells, cw, this_class_name, super_class_name);
    create_tuple_make2(num_cells, cw, this_class_name, super_class_name);
    // create nth
    create_tuple_nth(num_cells, cw, this_class_name);

    // create set
    create_tuple_set(num_cells, cw, this_class_name);

    cw.visitEnd();
    byte[] data = cww.toByteArray();

    // dump(this_class_name, data);

    return data;
  }
View Full Code Here

public class GetNameClassWriter extends ClassVisitor
{
    private String className;
   
    public GetNameClassWriter(int flags) {
        super(Opcodes.ASM4,new ClassWriter(flags));
    }
View Full Code Here

     */
    static byte[] gen_fun_class_data(int arity) {

        String self_type = EFUN_TYPE.getInternalName() + arity;

        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
        cw.visit(Opcodes.V1_6, 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);
        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;
    }
View Full Code Here

            StringBuffer sb = new StringBuffer();
            String self_type = sb.append(EFUN_TYPE.getInternalName())
                    // .append(safe_module).append(safe_function)
                    .append("Handler").append(arity).toString();

            ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
            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()
                    + EATOM_DESC
                    + EATOM_DESC
                    + ")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.visitVarInsn(ALOAD, 2);
            mv.visitFieldInsn(PUTFIELD, self_type, "module_name", EATOM_DESC);
            mv.visitVarInsn(ALOAD, 0);
            mv.visitVarInsn(ALOAD, 3);
            mv.visitFieldInsn(PUTFIELD, self_type, "function_name", EATOM_DESC);

            mv.visitInsn(RETURN);
            mv.visitMaxs(4, 4);
            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);

View Full Code Here

        ensure(arity); // Ensure presence of superclass.
        String super_type = EFUN_TYPE.getInternalName() + arity;
        String self_type = super_type + "Exported";

        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
        cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
                self_type, null, super_type, null);

        cw.visitField(ACC_PROTECTED | ACC_FINAL, "module_name",
                EATOM_TYPE.getDescriptor(), null, null)
                .visitEnd();

        cw.visitField(ACC_PROTECTED | ACC_FINAL, "function_name",
                EATOM_TYPE.getDescriptor(), null, null)
                .visitEnd();

        MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PROTECTED, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V", null, null);

        mv.visitVarInsn(Opcodes.ALOAD, 0);
        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, super_type, "<init>", "()V");

        mv.visitVarInsn(Opcodes.ALOAD, 0);
        mv.visitVarInsn(Opcodes.ALOAD, 1);
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, EATOM_TYPE.getInternalName(),
                "intern", "(Ljava/lang/String;)Lerjang/EAtom;");
        mv.visitFieldInsn(Opcodes.PUTFIELD, self_type, "module_name", EATOM_DESC);

        mv.visitVarInsn(Opcodes.ALOAD, 0);
        mv.visitVarInsn(Opcodes.ALOAD, 2);
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, EATOM_TYPE.getInternalName(),
                "intern", "(Ljava/lang/String;)Lerjang/EAtom;");
        mv.visitFieldInsn(Opcodes.PUTFIELD, self_type, "function_name", EATOM_DESC);

        mv.visitInsn(Opcodes.RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        make_encode_method_for_exported(cw, self_type, arity);

        cw.visitEnd();

        byte[] data = cw.toByteArray();
        return data;
    }
View Full Code Here

        ensure(arity); // Ensure presence of superclass.
        String super_type = EFUN_TYPE.getInternalName() + arity;
        String self_type = super_type + "Guard";

        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
        cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT,
                self_type, null, super_type, null);

        // TODO: Factor out default-constructor creation.
        MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC/*PROTECTED*/, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(Opcodes.ALOAD, 0);
        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, super_type, "<init>", "()V");
        mv.visitInsn(Opcodes.RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
        cw.visitEnd();

        byte[] data = cw.toByteArray();
        return data;
    }
View Full Code Here

TOP

Related Classes of org.objectweb.asm.ClassWriter

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.