gcverifyvisitor.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 109 行
JAVA
109 行
/*
* $Id: GCVerifyVisitor.java,v 1.3 2004/02/18 06:59:20 epr Exp $
*/
package org.jnode.vm.memmgr.def;
import org.jnode.vm.Monitor;
import org.jnode.vm.ObjectVisitor;
import org.jnode.vm.Unsafe;
import org.jnode.vm.VmArchitecture;
import org.jnode.vm.classmgr.VmArrayClass;
import org.jnode.vm.classmgr.VmNormalClass;
import org.jnode.vm.classmgr.VmType;
import org.jnode.vm.memmgr.HeapHelper;
/**
* @author Ewout Prangsma (epr@users.sourceforge.net)
*/
final class GCVerifyVisitor extends ObjectVisitor {
private final HeapHelper helper;
private final DefaultHeapManager heapManager;
private final VmArchitecture arch;
private int errorCount;
public GCVerifyVisitor(DefaultHeapManager heapManager, VmArchitecture arch) {
this.helper = heapManager.getHelper();
this.heapManager = heapManager;
this.arch = arch;
}
public void reset() {
errorCount = 0;
}
/**
* @see org.jnode.vm.ObjectVisitor#visit(java.lang.Object)
*/
public boolean visit(Object object) {
final VmType vmClass = helper.getVmClass(object);
if (vmClass == null) {
helper.die("GCVerifyError: vmClass");
} else if (vmClass.isArray()) {
if (!((VmArrayClass) vmClass).isPrimitiveArray()) {
verifyArray(object);
}
} else {
verifyObject(object, (VmNormalClass) vmClass);
}
verifyChild(helper.getTib(object), object, "tib");
final Monitor monitor = helper.getInflatedMonitor(object, arch);
if (monitor != null) {
verifyChild(monitor, object, "monitor");
}
return true;
}
private void verifyArray(Object object) {
final Object[] arr = (Object[]) object;
final int length = arr.length;
for (int i = 0; i < length; i++) {
final Object child = arr[i];
if (child != null) {
verifyChild(child, object, "Object[]");
}
}
}
private void verifyObject(Object object, VmNormalClass vmClass) {
final int[] referenceOffsets = vmClass.getReferenceOffsets();
final int cnt = referenceOffsets.length;
final int size = vmClass.getObjectSize();
for (int i = 0; i < cnt; i++) {
int offset = referenceOffsets[ i];
if ((offset < 0) || (offset >= size)) {
Unsafe.debug("reference offset out of range!");
Unsafe.debug(vmClass.getName());
helper.die("Class internal error");
} else {
final Object child = helper.getObject(object, offset);
if (child != null) {
verifyChild(child, object, "object child");
}
}
}
}
private void verifyChild(Object child, Object parent, String where) {
if (child != null) {
if (!heapManager.isObject(helper.addressOf(child))) {
Unsafe.debug("GCVerifyError: in ");
Unsafe.debug(where);
Unsafe.debug(", parent type ");
Unsafe.debug(helper.getVmClass(parent).getName());
Unsafe.debug("; child is not an object. ");
errorCount++;
}
}
}
/**
* @return Returns the errorCount.
*/
public final int getErrorCount() {
return this.errorCount;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?