vmaddressmap.java

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

JAVA
115
字号
/*
 * $Id: VmAddressMap.java,v 1.1 2003/11/25 11:41:14 epr Exp $
 */
package org.jnode.vm.classmgr;

import java.io.PrintStream;

import org.jnode.util.NumberUtils;
import org.jnode.vm.VmSystemObject;

/**
 * This table is a mapping between a program counter and an address of that
 * program counter in compiled code.
 * @author epr
 */
public class VmAddressMap extends VmSystemObject {
	
	private AddressPcEntry list;
	private int[] table;
	
	/**
	 * Create a new instance
	 */
	public VmAddressMap() {
	}
	
	/**
	 * Add an address-pc mapping
	 * @param offset Offset from the start of the method
	 * @param pc
	 */
	public void add(int pc, int offset) {
		if (table != null) {
			throw new RuntimeException("Address table is locked");
		}
		final AddressPcEntry entry = new AddressPcEntry(pc, offset);
		if (list == null) {
			list = entry;
		} else {
			AddressPcEntry p = list;
			while (p.next != null) {
				p = p.next;
			}
			p.next = entry;
		}
	}
	
	/**
	 * Find the PC for the given address
	 * @param offset Offset from the start of the method
	 * @return The pc
	 */
	public int findPC(int offset) {
		final int[] table = this.table;
		if (table != null) {
			final int length = table.length;
			int lastPC = 0;
			for (int i = 0; i < length; i += 2) {
				final int o = table[i+1];
				if (o > offset) {
					return lastPC;
				} else {
					lastPC = table[i+0];
				}
			}
		}
		return 0;
	}
	
	/**
	 * Convert to a final contents.
	 * After a call to this method, the add method cannot be used.
	 */
	final void lock() {
		AddressPcEntry p = list;
		int count = 0;
		while (p != null) {
			count++;
			p = p.next;
		}
		
		final int[] table = new int[count*2];
		p = list;
		int i = 0;
		while (p != null) {
			table[i+0] = p.pc;
			table[i+1] = p.offset;
			i += 2;
			p = p.next;
		}
		this.table = table;
		this.list = null; 
	}
	
	public void writeTo(PrintStream out) {
		for (int i = 0; i < table.length; i += 2) {
			final int pc = table[i+0];
			final int offset = table[i+1];
			
			out.println("PC[" + pc + "]\t0x" + NumberUtils.hex(offset));
		}
	}
	
	static class AddressPcEntry extends VmSystemObject {
		final int pc;
		final int offset;
		AddressPcEntry next;
		
		public AddressPcEntry(int pc, int offset) {
			this.pc = pc;
			this.offset = offset;
		}
	}
}

⌨️ 快捷键说明

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