tibbuilder.java

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

JAVA
136
字号
/*
 * $Id: TIBBuilder.java,v 1.2 2004/02/15 11:06:18 epr Exp $
 */
package org.jnode.vm.classmgr;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * @author epr
 */
public final class TIBBuilder implements TIBLayout {

    private static final int DEFAULT_SIZE = MIN_TIB_LENGTH + 16;

    private final ArrayList tibAsList;
    private final HashMap nameSignature2Index;

    private Object[] tibAsArray;

    /**
     * Create a blank instance
     * 
     * @param vmClass
     */
    public TIBBuilder(VmClassType vmClass, int methodCount) {
        tibAsList = new ArrayList(DEFAULT_SIZE);
        for (int i = 0; i < MIN_TIB_LENGTH; i++) {
            tibAsList.add(null);
        }
        tibAsList.set(VMTYPE_INDEX, vmClass);
        nameSignature2Index = new HashMap(methodCount);
    }

    /**
     * Create a copied instance
     * 
     * @param vmClass
     * @param src
     */
    public TIBBuilder(VmClassType vmClass, Object[] src, int methodCount) {
        this(vmClass, src.length + methodCount);
        final int length = src.length;
        for (int i = FIRST_METHOD_INDEX; i < length; i++) {
            tibAsList.add(src[ i]);
            nameSignature2Index.put(getNameSignature((VmInstanceMethod)src[i]), new Integer(i));
        }
    }

    /**
     * Add an instance method to this VMT. The VMT offset of the method is
     * adjusted.
     * 
     * @param method
     */
    public void add(VmInstanceMethod method) {
        if (tibAsArray != null) { throw new RuntimeException(
                "This VMT is locked"); }
        final int idx = tibAsList.size();
        tibAsList.add(method);
        nameSignature2Index.put(getNameSignature(method), new Integer(idx));
        method.setTibOffset(idx);
    }

    /**
     * Overwrite a method at a given index The VMT offset of the method is
     * adjusted.
     * 
     * @param index
     * @param method
     */
    public void set(int index, VmInstanceMethod method) {
        if (tibAsArray != null) { throw new RuntimeException(
                "This VMT is locked"); }
        if (index < FIRST_METHOD_INDEX) { throw new IndexOutOfBoundsException(
                "Index (" + index + ")must be >= " + FIRST_METHOD_INDEX); }
        tibAsList.set(index, method);
        nameSignature2Index.put(getNameSignature(method), new Integer(index));
        method.setTibOffset(index);
    }

    /**
     * Search through a given VMT for a method with a given name & signature.
     * Return the index in the VMT (0..length-1) if found, -1 otherwise.
     * 
     * @param name
     * @param signature
     * @return int
     */
    public int indexOf(String name, String signature) {
        // Note that index 0 of the VMT contain the class, so
        // skip index 0
        final Object idx = nameSignature2Index.get(getNameSignature(name, signature));
        if (idx != null) {
            return ((Integer)idx).intValue();
        } else {
            return -1;
        }
        /*final int hash = VmMember.calcHashCode(name, signature);
        final int length = tibAsList.size();
        for (int i = FIRST_METHOD_INDEX; i < length; i++) {
            final VmInstanceMethod mts = (VmInstanceMethod) tibAsList.get(i);
            if (hash == mts.getMemberHashCode()) {
                final String mts_name = mts.getName();
                final String mts_signature = mts.getSignature();
                if (name.equals(mts_name) && signature.equals(mts_signature)) { 
                // We found it
                return i; }
            }
        }
        return -1;*/
    }

    /**
     * Convert this TIB to a TIB array. After a call to this method, the TIB
     * cannot be changed anymore.
     * 
     * @return The TIB
     */
    public Object[] toArray() {
        if (tibAsArray == null) {
            tibAsArray = new Object[ tibAsList.size()];
            tibAsList.toArray(tibAsArray);
        }
        return tibAsArray;
    }
    
    private final String getNameSignature(String name, String signature) {
        return name + '#' + signature;
    }
    
    private final String getNameSignature(VmInstanceMethod method) {
        return method.getName() + '#' + method.getSignature();
    }
}

⌨️ 快捷键说明

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