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