// -*- mode: Java; c-basic-offset: 3; tab-width: 8; indent-tabs-mode: nil -*- // Copyright (C) 2008 Andreas Krey, Ulm, Germany <a.krey@gmx.de> package gloop; import java.util.Vector; import java.io.ByteArrayOutputStream; public class Code { CodeStore store; ByteArrayOutputStream bytes = new ByteArrayOutputStream (); private static String [] codes = { "nop", "up", // Get frame pointer n levels up "lstore", // into a local variable (via current fp) "store", // into a scoped variable (via fp in acc) "lload", // load from local frame "load", // load from frame in acc "print", "nullval", "push", "mult", "numval", "strval", "push", "swap", "call", "fun", "meth", "ret", "stop" }; public Code (CodeStore s) { store = s; } public Code (Code c) { store = c.store; } public static String getCode (int i) { if (i >= 0 && i < codes.length) { return codes [i]; } return null; } public int finish () { return store.take (bytes); } private final void putint (int v) { bytes.write ((byte)v); } private final void putop (String op) { for (int i = 0; i < codes.length; i ++) { if (codes [i] == op) { putint (i); return; } } throw new IllegalArgumentException ("undefined op: " + op); } private final void putpar (int val) { if (val > 0) { putpar (val / 16); putint (240 + (val % 16)); } } public void put (String op, String par) { Tokenizer.println (" (" + op + " " + par + ")"); putpar (store.putStr (par)); putop (op); } public void put (String op, int par) { Tokenizer.println (" (" + op + " " + par + ")"); putpar (par); putop (op); } public void put (String op) { Tokenizer.println (" (" + op + ")"); putop (op); } }