vmtype.java

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

JAVA
1,918
字号
/**
 * $Id: VmType.java,v 1.16 2004/02/24 08:04:15 epr Exp $
 */

package org.jnode.vm.classmgr;

import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;

import org.jnode.assembler.NativeStream;
import org.jnode.vm.PragmaLoadStatics;
import org.jnode.vm.Uninterruptible;
import org.jnode.vm.Unsafe;
import org.jnode.vm.VmReflection;
import org.jnode.vm.VmSystemObject;
import org.jnode.vm.compiler.NativeCodeCompiler;

public abstract class VmType extends VmSystemObject implements VmStaticsEntry, Uninterruptible {

    /**
     * The parent of this class. Normally VmClass instance, during loading
     * String instance
     */
    private VmNormalClass superClass;

    /** The classname of the parent of this class. */
    private final String superClassName;

    /** The number of super classes until (and including) Object */
    private int superClassDepth;

    /** The name of this class */
    private String name;

    /** All methods and constructors declared in this class */
    private VmMethod[] methodTable;

    /** All fields declared in this class */
    private VmField[] fieldTable;

    /** My modifiers */
    private int modifiers = -1;

    /** State of this type see {@link VmTypeState}. */
    private int state;

    /** The constant pool */
    private VmCP cp;

    /** Interface implemented by this class */
    private VmImplementedInterface[] interfaceTable;

    /** All interface implemented by this class and its superclasses */
    private VmInterfaceClass[] allInterfaceTable;

    /** Loaded of this class */
    private final VmClassLoader loader;

    /** The corresponding java.lang.Class of this class */
    private Class javaClass;

    /** Have the references in the constant pool been resolved? */
    private boolean resolvedCpRefs;

    /** Size of instances of this class in bytes (1..8) */
    private final int typeSize;

    /** Name of the array class with this class as component type */
    private String arrayClassName;

    /** The array class with this class as component type */
    private VmArrayClass arrayClass;

    /** Array containing all super classes and all implemented interfaces */
    private VmType[] superClassesArray;

    /** The finalize method of this class */
    private VmMethod finalizeMethod;

    /** The mangled name (cache) */
    private String mangledName;

    /** Error message during linkage */
    private String errorMsg;
    
    /** Index of this type in the statics index */
    private final int staticsIndex;

    private static VmNormalClass ObjectClass;

    private static VmInterfaceClass CloneableClass;

    private static VmInterfaceClass SerializableClass;

    private static VmNormalClass BooleanClass;

    private static VmNormalClass ByteClass;

    private static VmNormalClass CharClass;

    private static VmNormalClass ShortClass;

    private static VmNormalClass IntClass;

    private static VmNormalClass FloatClass;

    private static VmNormalClass LongClass;

    private static VmNormalClass DoubleClass;

    private static VmNormalClass VoidClass;

    private static VmArrayClass BooleanArrayClass;

    private static VmArrayClass ByteArrayClass;

    private static VmArrayClass CharArrayClass;

    private static VmArrayClass ShortArrayClass;

    private static VmArrayClass IntArrayClass;

    private static VmArrayClass FloatArrayClass;

    private static VmArrayClass LongArrayClass;

    private static VmArrayClass DoubleArrayClass;

    private static VmArrayClass ObjectArrayClass;

    /**
     * Construct a new VmClass
     * 
     * @param name
     * @param superClassName
     * @param loader
     * @param accessFlags
     */
    protected VmType(String name, String superClassName, VmClassLoader loader,
            int accessFlags) {
        this(name, null, superClassName, loader, accessFlags, -1);
    }

    /**
     * Construct a new VmClass with a given name and superclass
     * 
     * @param name
     * @param superClass
     * @param loader
     * @param typeSize
     */
    VmType(String name, VmNormalClass superClass, VmClassLoader loader,
            int typeSize) {
        this(name, superClass, superClass.getName(), loader,
                Modifier.ACC_PUBLIC, typeSize);
    }

    /**
     * Construct a new VmClass with a given name and superclass
     * 
     * @param name
     * @param superClass
     * @param superClassName
     * @param loader
     * @param accessFlags
     * @param typeSize
     */
    private VmType(String name, VmNormalClass superClass,
            String superClassName, VmClassLoader loader, int accessFlags,
            int typeSize) {
        if (superClassName == null) {
            if (!name.equals("java.lang.Object")) { throw new IllegalArgumentException(
                    "superClassName cannot be null in class " + name); }
        } else if (superClassName.indexOf('/') >= 0) { throw new IllegalArgumentException(
                "superClassName contains '/'"); }
        if (name.indexOf('/') >= 0) { throw new IllegalArgumentException(
                "name contains '/'"); }

        this.name = name;
        this.superClass = superClass;
        this.superClassName = superClassName;
        this.modifiers = accessFlags;
        this.state = VmTypeState.ST_LOADED;
        this.loader = loader;
        this.staticsIndex = loader.getStatics().allocClass(this);
        if (name.charAt(0) == '[') {
            this.interfaceTable = new VmImplementedInterface[] {
                    new VmImplementedInterface(CloneableClass),
                    new VmImplementedInterface(SerializableClass)};
            this.typeSize = loader.getArchitecture().getReferenceSize();
        } else if (typeSize >= 0) {
            this.typeSize = typeSize;
        } else {
            this.typeSize = loader.getArchitecture().getReferenceSize();
        }

    }

    /**
     * Load the system classes during our bootstrap process.
     * 
     * @param clc
     * @return VmClass[]
     * @throws ClassNotFoundException
     */
    public final static VmType[] initializeForBootImage(VmClassLoader clc)
            throws ClassNotFoundException {
        ObjectClass = (VmNormalClass) clc.loadClass("java.lang.Object", false);
        CloneableClass = (VmInterfaceClass) clc.loadClass(
                "java.lang.Cloneable", false);
        SerializableClass = (VmInterfaceClass) clc.loadClass(
                "java.io.Serializable", false);

        ObjectClass.link();
        CloneableClass.link();
        SerializableClass.link();

        BooleanClass = new VmPrimitiveClass("boolean", ObjectClass, clc, 1,
                false);
        ByteClass = new VmPrimitiveClass("byte", ObjectClass, clc, 1, false);
        CharClass = new VmPrimitiveClass("char", ObjectClass, clc, 2, false);
        ShortClass = new VmPrimitiveClass("short", ObjectClass, clc, 2, false);
        IntClass = new VmPrimitiveClass("int", ObjectClass, clc, 4, false);
        FloatClass = new VmPrimitiveClass("float", ObjectClass, clc, 4, true);
        LongClass = new VmPrimitiveClass("long", ObjectClass, clc, 8, false);
        DoubleClass = new VmPrimitiveClass("double", ObjectClass, clc, 8, true);
        VoidClass = new VmPrimitiveClass("void", ObjectClass, clc, 0, false);

        BooleanClass.link();
        ByteClass.link();
        CharClass.link();
        ShortClass.link();
        IntClass.link();
        FloatClass.link();
        LongClass.link();
        DoubleClass.link();
        VoidClass.link();

        BooleanArrayClass = BooleanClass.getArrayClass("[Z");
        ByteArrayClass = ByteClass.getArrayClass("[B");
        CharArrayClass = CharClass.getArrayClass("[C");
        ShortArrayClass = ShortClass.getArrayClass("[S");
        IntArrayClass = IntClass.getArrayClass("[I");
        FloatArrayClass = FloatClass.getArrayClass("[F");
        LongArrayClass = LongClass.getArrayClass("[J");
        DoubleArrayClass = DoubleClass.getArrayClass("[D");
        ObjectArrayClass = ObjectClass.getArrayClass();

        BooleanArrayClass.link();
        ByteArrayClass.link();
        CharArrayClass.link();
        ShortArrayClass.link();
        IntArrayClass.link();
        FloatArrayClass.link();
        LongArrayClass.link();
        DoubleArrayClass.link();
        ObjectArrayClass.link();

        return new VmType[] { ObjectClass, CloneableClass, SerializableClass,
                BooleanClass, ByteClass, CharClass, ShortClass, IntClass,
                FloatClass, LongClass, DoubleClass, VoidClass,
                BooleanArrayClass, ByteArrayClass, CharArrayClass,
                ShortArrayClass, IntArrayClass, FloatArrayClass,
                LongArrayClass, DoubleArrayClass, ObjectArrayClass,};
    }

    /**
     * Load the system classes from an array of system classes. This method is
     * called during the boot of the system.
     * 
     * @param bootClasses
     */
    protected static void loadFromBootClassArray(VmType[] bootClasses)
    throws PragmaLoadStatics {
        Unsafe.debug("loadFromBootClassArray");
        int count = bootClasses.length;
        for (int i = 0; i < count; i++) {
            VmType vmClass = bootClasses[ i];
            String name = vmClass.name;
            if (vmClass.isPrimitive()) {
                if (name.equals("boolean")) {
                    BooleanClass = (VmNormalClass) vmClass;
                } else if (name.equals("byte")) {
                    ByteClass = (VmNormalClass) vmClass;
                } else if (name.equals("char")) {
                    CharClass = (VmNormalClass) vmClass;
                } else if (name.equals("short")) {
                    ShortClass = (VmNormalClass) vmClass;
                } else if (name.equals("int")) {
                    IntClass = (VmNormalClass) vmClass;
                } else if (name.equals("float")) {
                    FloatClass = (VmNormalClass) vmClass;
                } else if (name.equals("long")) {
                    LongClass = (VmNormalClass) vmClass;
                } else if (name.equals("double")) {
                    DoubleClass = (VmNormalClass) vmClass;
                } else if (name.equals("void")) {
                    VoidClass = (VmNormalClass) vmClass;
                }
            } else if (vmClass.isArray()) {
                if (name.equals("[Z")) {
                    BooleanArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[B")) {
                    ByteArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[C")) {
                    CharArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[S")) {
                    ShortArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[I")) {
                    IntArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[F")) {
                    FloatArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[J")) {
                    LongArrayClass = (VmArrayClass) vmClass;
                } else if (name.equals("[D")) {
                    DoubleArrayClass = (VmArrayClass) vmClass;
                }
            } else if (name.equals("java.lang.Object")) {
                ObjectClass = (VmNormalClass) vmClass;
            } else if (name.equals("java.lang.Cloneable")) {
                CloneableClass = (VmInterfaceClass) vmClass;
            } else if (name.equals("java.io.Serializable")) {
                SerializableClass = (VmInterfaceClass) vmClass;
            }
        }
    }

    /**
     * Create an array classname with a this class as component type.
     * 
     * @return char[]
     */
    public final String getArrayClassName() {
        if (arrayClassName == null) {
            char[] result;
            int count = name.length();
            if (isPrimitive() || isArray()) {
                result = new char[ count + 1];
                result[ 0] = '[';
                for (int i = 0; i < count; i++) {
                    result[ i + 1] = name.charAt(i);
                }
            } else {
                result = new char[ count + 3];
                result[ 0] = '[';
                result[ 1] = 'L';
                result[ count + 2] = ';';
                for (int i = 0; i < count; i++) {
                    result[ i + 2] = name.charAt(i);
                }
            }
            arrayClassName = new String(result);
        }
        return arrayClassName;
    }

    /**
     * Gets the array class with this class as its component type
     * 
     * @param arrayClassName
     * @return The array class
     */
    final VmArrayClass getArrayClass(String arrayClassName) {
        if (arrayClass == null) {
            arrayClass = createArrayClass(true, arrayClassName);
        } else {
            arrayClass.link();
        }
        return arrayClass;
    }

    /**
     * Gets the array class with this class as its component type
     * 
     * @return The array class
     */
    public final VmArrayClass getArrayClass() {
        return getArrayClass(null);
    }

    /**
     * Gets the array class with this class as its component type
     * 
     * @param link
     * @return The array class
     */
    final VmArrayClass getArrayClass(boolean link) {
        if (arrayClass == null) {
            arrayClass = createArrayClass(link, null);
        }
        return arrayClass;
    }

    /**
     * Create an array class with a given component type.
     * 
     * @param link
     *            True if the new class should be linked, false otherwise
     * @param arrayClassName
     * @return VmClass
     */
    private final VmArrayClass createArrayClass(boolean link,
            String arrayClassName) {
        final String name;
        if (arrayClassName != null) {
            name = arrayClassName;
        } else {
            name = getArrayClassName();
        }
        final VmArrayClass arrayClass = new VmArrayClass(name,
                this.getLoader(), this, -1);
        if (link) {
            arrayClass.link();
        }
        return arrayClass;
    }

    /**
     * Gets the VmClass of java.lang.Object.
     * 
     * @return The class
     */
    public final static VmNormalClass getObjectClass() {
        return ObjectClass;
    }

    /**
     * Gets the primitive class corresponding to the given signature type.
     * 
     * @param type
     * @return VmClass
     */
    public final static VmNormalClass getPrimitiveClass(char type) {
        switch (type) {
        case 'Z':
            return BooleanClass;
        case 'B':
            return ByteClass;
        case 'C':
            return CharClass;
        case 'S':
            return ShortClass;
        case 'I':
            return IntClass;
        case 'F':
            return FloatClass;
        case 'J':
            return LongClass;
        case 'D':
            return DoubleClass;
        case 'V':
            return VoidClass;
        default:
            throw new IllegalArgumentException("Unknown type " + type);
        }
    }

    /**
     * Gets the primitive arrayclass corresponding to the given signature type.
     * 
     * @param type
     * @return VmClass
     */
    public final static VmType getPrimitiveArrayClass(char type) {
        switch (type) {
        case 'Z':
            return BooleanArrayClass;
        case 'B':
            return ByteArrayClass;
        case 'C':
            return CharArrayClass;
        case 'S':
            return ShortArrayClass;
        case 'I':
            return IntArrayClass;
        case 'F':
            return FloatArrayClass;

⌨️ 快捷键说明

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