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 + -
显示快捷键?