- // Each instruction is an opcode and a literal. Any operation
- // that accesses the top of the stack and does not have a
- // mandatory literal can be performed on a literal instead of
- // the top of the stack.
-
- // opcodes:
- public static final byte arithmetic = -1; // -- arithmetic operators from parser
- public static final byte LITERAL = -2; // < String | Number | null > -- push a literal onto the stack
- public static final byte ARRAY = -3; // < size > -- create a new array of size <size>
- public static final byte OBJECT = -4; // -- push an empty object onto the stack
- public static final byte FUNCTION = -5; // < bytecode_block > -- push a new instance of a function with the given bytecode
- public static final byte DECLARE = -6; // < name > -- declare <name> in the current scope
- public static final byte THIS = -7; // -- push the topmost non-transparent scope onto the stack
- public static final byte GET = -8; // -- get stack[0] from stack[1]
- public static final byte PUT = -9; // -- put stack[1] to key stack[0] on stack[2]; leaves object on the stack
- public static final byte THROW = -10; // -- throw topmost element
- public static final byte RETURN = -11; // -- return the topmost value on the stack
- public static final byte ASSERT = -12; // -- fail if topmost element is not true
- public static final byte JT = -13; // < relative_address > -- pop the stack; if true, jump to <relative_address>
- public static final byte JF = -21; // < relative_address > -- pop the stack; if false, jump to <relative_address>
- public static final byte JMP = -22; // < relative_address > -- jump to <relative_address>
- static public final byte POP = -14; // -- discard the top element on the stack
-
- public static final byte CALL = -15; // < numargs > -- call stack[0] with the topmost <numargs> values as arguments
- public static final byte TRY = -16; // < bytecode_block > -- run the block pointed to; returns with thrown exn on top of stack
-
- public static final byte INSTANCEOF = -17; // -- ??
- public static final byte TYPEOF = -18; // --
-
- public static final byte FOR__IN = -19; // -- ??
- public static final byte EXPR = -20; // -- transitional
- public static final byte SWAP = -23; // -- transitional
- public static final byte SCOPE = -30; // -- transitional
-
- int[] op = new int[10];
- Object[] arg = new Object[10];
- int size = 0;
-
- public ByteCode(int line) { super(line, "foo"); }
- public ByteCode(int line, int op_, Object arg_) { this(line); add(op_, arg_); }
-
- public int size() { return size; }
- public void set(int pos, int op_, Object arg_) { op[pos] = op_; arg[pos] = arg_; }
- public ByteCode add(int op_, Object arg_) {
- if (size == op.length - 1) {
- int[] op2 = new int[op.length * 2]; System.arraycopy(op, 0, op2, 0, op.length); op = op2;
- Object[] arg2 = new Object[op.length * 2]; System.arraycopy(arg, 0, arg2, 0, arg.length); arg = arg2;