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