bytecodewriter.java

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

JAVA
990
字号
/*
 * $Id: BytecodeWriter.java,v 1.1 2003/11/25 11:42:13 epr Exp $
 */
package org.jnode.vm.bytecode;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

/**
 * @author Ewout Prangsma (epr@users.sourceforge.net)
 */
public class BytecodeWriter {

	private byte[] code;
	private int used;
	private HashSet labels;

	public BytecodeWriter() {
	}

	public byte[] toByteArray() {
		// Test all labels, they must have been resolved
		if (labels != null) {
			for (Iterator i = labels.iterator(); i.hasNext();) {
				final Label l = (Label) i.next();
				if (!l.isResolved()) {
					throw new RuntimeException("Unresolved label " + l);
				}
			}
		}
		if (used > 0) {
			final byte[] result = new byte[used];
			System.arraycopy(code, 0, result, 0, used);
			return result;
		} else {
			return null;
		}
	}

	public Label newLabel(String text) {
		final Label l = new Label(text);
		if (labels == null) {
			labels = new HashSet();
		}
		labels.add(l);
		return l;
	}

	public void clear() {
		used = 0;
		if (labels != null) {
			labels.clear();
		}
	}

	public void aaload() {
		write8(0x32);
	}

	public void aastore() {
		write8(0x53);
	}

	public void aconst_null() {
		write8(0x01);
	}

	public void aload(int index) {
		if ((index >= 0) && (index <= 3)) {
			write8(0x2A + index);
		} else {
			write8(0x19);
			write8(index);
		}
	}

	public void anewarray(int index) {
		write8(0xbd);
		write16(index);
	}

	public void areturn() {
		write8(0xb0);
	}

	public void arraylength() {
		write8(0xbe);
	}

	public void astore(int index) {
		if ((index >= 0) && (index <= 3)) {
			write8(0x4b + index);
		} else {
			write8(0x3a);
			write8(index);
		}
	}

	public void athrow() {
		write8(0xbf);
	}

	public void baload() {
		write8(0x33);
	}

	public void bastore() {
		write8(0x54);
	}

	public void bipush() {
		write8(0x10);
	}

	public void caload() {
		write8(0x34);
	}

	public void castore() {
		write8(0x55);
	}

	public void checkcast() {
		write8(0xc0);
	}

	public void d2f() {
		write8(0x90);
	}

	public void d2i() {
		write8(0x8e);
	}

	public void d2l() {
		write8(0x8f);
	}

	public void dadd() {
		write8(0x63);
	}

	public void daload() {
		write8(0x31);
	}

	public void dastore() {
		write8(0x52);
	}

	public void dcmpg() {
		write8(0x98);
	}

	public void dcmpl() {
		write8(0x97);
	}

	public void dconst_0() {
		write8(0x0e);
	}

	public void dconst_1() {
		write8(0x0f);
	}

	public void ddiv() {
		write8(0x6f);
	}

	public void dload(int index) {
		if ((index >= 0) && (index <= 3)) {
			write8(0x26 + index);
		} else {
			write8(0x18);
			write8(index);
		}
	}

	public void dmul() {
		write8(0x6b);
	}

	public void dneg() {
		write8(0x77);
	}

	public void drem() {
		write8(0x73);
	}

	public void dreturn() {
		write8(0xaf);
	}

	public void dstore(int index) {
		if ((index >= 0) && (index <= 3)) {
			write8(0x39 + index);
		} else {
			write8(0x47);
			write8(index);
		}
	}

	public void dsub() {
		write8(0x67);
	}

	public void dup() {
		write8(0x59);
	}

	public void dup_x1() {
		write8(0x5a);
	}

	public void dup_x2() {
		write8(0x5b);
	}

	public void dup2() {
		write8(0x5c);
	}

	public void dup2_x1() {
		write8(0x5d);
	}

	public void dup2_x2() {
		write8(0x5e);
	}

	public void f2d() {
		write8(0x8d);
	}

	public void f2i() {
		write8(0x8b);
	}

	public void f2l() {
		write8(0x8c);
	}

	public void fadd() {
		write8(0x62);
	}

	public void faload() {
		write8(0x30);
	}

	public void fastore() {
		write8(0x51);
	}

	public void fcmpg() {
		write8(0x96);
	}

	public void fcmpl() {
		write8(0x95);
	}

	public void fconst_0() {
		write8(0x0b);
	}

	public void fconst_1() {
		write8(0x0c);
	}

	public void fconst_2() {
		write8(0x0d);
	}

	public void fdiv() {
		write8(0x6e);
	}

	public void fload(int index) {
		if ((index >= 0) && (index <= 3)) {
			write8(0x22 + index);
		} else {
			write8(0x17);
			write8(index);
		}
	}

	public void fmul() {
		write8(0x6a);
	}

	public void fneg() {
		write8(0x76);
	}

	public void frem() {
		write8(0x72);
	}

	public void freturn() {
		write8(0xae);
	}

	public void fstore(int index) {
		if ((index >= 0) && (index <= 3)) {
			write8(0x43 + index);
		} else {
			write8(0x38);
			write8(index);
		}
	}

	public void fsub() {
		write8(0x66);
	}

	public void getfield(int index) {
		write8(0xb4);
		write16(index);
	}

	public void getstatic(int index) {
		write8(0xb2);
		write16(index);
	}

	public void goto_(Label label) {
		final int start = used;
		write8(0xa7);
		write16(start, label);
	}

	/*public void goto_w(Label label) {
		write8(0xc8);
		write32(label);
	}*/

	public void i2b() {
		write8(0x91);
	}

	public void i2c() {
		write8(0x92);
	}

	public void i2d() {
		write8(0x87);
	}

	public void i2f() {
		write8(0x86);
	}

	public void i2l() {
		write8(0x85);
	}

	public void i2s() {
		write8(0x93);
	}

	public void iadd() {
		write8(0x60);
	}

	public void iaload() {
		write8(0x2e);
	}

	public void iand() {
		write8(0x7e);
	}

	public void iastore() {
		write8(0x4f);
	}

	public void iconst_m1() {
		write8(0x02);
	}

	public void iconst_0() {
		write8(0x03);
	}

	public void iconst_1() {
		write8(0x04);
	}

	public void iconst_2() {
		write8(0x05);
	}

	public void iconst_3() {
		write8(0x06);
	}

	public void iconst_4() {
		write8(0x07);
	}

	public void iconst_5() {
		write8(0x08);
	}

	public void idiv() {
		write8(0x6c);
	}

	public void if_acmpeq(Label label) {
		final int start = used;
		write8(0xa5);
		write16(start, label);
	}

	public void if_acmpne(Label label) {
		final int start = used;
		write8(0xa6);
		write16(start, label);
	}

	public void if_icmpeq(Label label) {
		final int start = used;
		write8(0x97);
		write16(start, label);
	}

	public void if_icmpne(Label label) {
		final int start = used;
		write8(0xa0);
		write16(start, label);
	}

	public void if_icmplt(Label label) {
		final int start = used;
		write8(0xa1);
		write16(start, label);
	}

	public void if_icmpge(Label label) {
		final int start = used;
		write8(0xa2);
		write16(start, label);
	}

	public void if_icmpgt(Label label) {
		final int start = used;
		write8(0xa3);
		write16(start, label);
	}

	public void if_icmple(Label label) {
		final int start = used;
		write8(0xa4);
		write16(start, label);
	}

	public void ifeq(Label label) {
		final int start = used;
		write8(0x99);
		write16(start, label);
	}

	public void ifne(Label label) {
		final int start = used;
		write8(0x9a);
		write16(start, label);
	}

	public void iflt(Label label) {
		final int start = used;
		write8(0x9b);
		write16(start, label);
	}

	public void ifge(Label label) {
		final int start = used;
		write8(0x9c);
		write16(start, label);
	}

	public void ifgt(Label label) {
		final int start = used;
		write8(0x9d);
		write16(start, label);
	}

	public void ifle(Label label) {
		final int start = used;
		write8(0x9e);
		write16(start, label);

⌨️ 快捷键说明

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