compilertest.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 146 行

JAVA
146
字号
/*
 * $Id: CompilerTest.java,v 1.8 2004/02/19 20:22:48 epr Exp $
 */
package org.jnode.test;

import java.io.File;
import java.io.OutputStreamWriter;

import org.jnode.assembler.ObjectResolver;
import org.jnode.assembler.x86.TextX86Stream;
import org.jnode.vm.Address;
import org.jnode.vm.Vm;
import org.jnode.vm.VmSystemClassLoader;
import org.jnode.vm.classmgr.VmMethod;
import org.jnode.vm.classmgr.VmType;
import org.jnode.vm.compiler.NativeCodeCompiler;
import org.jnode.vm.x86.VmX86Architecture;
import org.jnode.vm.x86.X86CpuID;

/**
 * @author epr
 */
public class CompilerTest {

    public static void main(String[] args) throws Exception {

        final String clsNames = (args.length > 0) ? args[ 0]
                : "org.jnode.vm.classmgr.VmType,org.jnode.vm.x86.compiler.l1.X86BytecodeVisitor";
        final int level = Integer.parseInt((args.length > 1) ? args[ 1] : "0");
        final String processorId = (args.length > 2) ? args[ 2] : "p5";
        final String dir = System.getProperty("classes.dir", ".");

        final VmX86Architecture arch = new VmX86Architecture();
        final VmSystemClassLoader cl = new VmSystemClassLoader(new File(dir)
                .toURL(), arch);
        VmType.initializeForBootImage(cl);
        final Vm vm = new Vm("?", arch, null, cl.getStatics(), false);
        vm.toString();

        //final ObjectResolver resolver = new DummyResolver();
        final NativeCodeCompiler[] cs = cl.getArchitecture().getCompilers();
        final X86CpuID cpuId = X86CpuID.createID(processorId);
        //NativeCodeCompiler c = cs[0];
        NativeCodeCompiler c = cs[ level];
        c.initialize(cl);

        final long start = System.currentTimeMillis();
        final String clsNamesArr[] = clsNames.split(",");
        for (int k = 0; k < clsNamesArr.length; k++) {
            final String clsName = clsNamesArr[ k];
            final VmType type = cl.loadClass(clsName, true);
            final int cnt = type.getNoDeclaredMethods();
            for (int i = 0; i < cnt; i++) {
                final VmMethod method = type.getDeclaredMethod(i);
                if (method.getName().equals("foo")) {
                    //System.out.println("\n### Method " + method.getName() +
                    // "
                    // ###\n");

                    /*
                     * if (!method.isAbstract()) { BytecodeViewer viewer = new
                     * BytecodeViewer(new
                     * ControlFlowGraph(method.getBytecode()));
                     * BytecodeParser.parse(method.getBytecode(), viewer);
                     */

                    System.out.println("\n### Compiling " + method.getName()
                            + " ###\n");

                    TextX86Stream os = new TextX86Stream(
                            new OutputStreamWriter(System.out), cpuId);
                    //X86Stream os = new X86Stream(cpuId, 0x10000);
                    c.compileBootstrap(method, os, level);
                    //c.compileRuntime(method, resolver, level, os);
                    os.flush();
                }
            }
        }
        final long end = System.currentTimeMillis();
        System.out.println("Compiled in " + (end - start) + "ms");
    }

    static class DummyResolver extends ObjectResolver {

        /**
         * @see org.jnode.assembler.ObjectResolver#add(org.jnode.vm.Address,
         *      int)
         */
        public Address add(Address address, int offset) {
            return address;
        }

        /**
         * @see org.jnode.assembler.ObjectResolver#addressOf(java.lang.Object)
         */
        public Address addressOf(Object object) {
            return null;
        }

        /**
         * @see org.jnode.assembler.ObjectResolver#addressOf32(java.lang.Object)
         */
        public int addressOf32(Object object) {
            return 0;
        }

        /**
         * @see org.jnode.assembler.ObjectResolver#addressOf64(java.lang.Object)
         */
        public long addressOf64(Object object) {
            return 0L;
        }

        /**
         * @see org.jnode.assembler.ObjectResolver#objectAt(org.jnode.vm.Address)
         */
        public Object objectAt(Address ptr) {
            return ptr;
        }

        /**
         * @see org.jnode.assembler.ObjectResolver#objectAt32(int)
         */
        public Object objectAt32(int ptr) {
            return null;
        }

        /**
         * @see org.jnode.assembler.ObjectResolver#objectAt64(long)
         */
        public Object objectAt64(long ptr) {
            return null;
        }

        /**
         * Gets the address of the first element of the given array.
         * 
         * @param array
         * @return The address of the array data.
         */
        public Address addressOfArrayData(Object array) {
            return null;
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?