about summary refs log tree commit diff stats
path: root/transect/010vm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'transect/010vm.cc')
-rw-r--r--transect/010vm.cc230
1 files changed, 0 insertions, 230 deletions
diff --git a/transect/010vm.cc b/transect/010vm.cc
deleted file mode 100644
index fad1ee77..00000000
--- a/transect/010vm.cc
+++ /dev/null
@@ -1,230 +0,0 @@
-//: type definitions start with either 'record' or 'choice'
-
-:(before "End Types")
-typedef int type_id;
-:(before "End Globals")
-map</*name*/string, type_id> Type_id;
-map<type_id, type_info> Type_info;
-type_id Next_type_id = 1;
-// primitive types
-type_id Literal_type_id = 0, Int_type_id = 0, Byte_type_id = 0, Address_type_id = 0, Array_type_id = 0, Ref_type_id = 0;
-:(before "End Types")
-struct type_info {
-  type_id id;
-  string name;
-  kind_of_type kind;
-  int size;  // in bytes
-  vector<type_declaration> elements;
-  type_info() :kind(PRIMITIVE), size(0) {}
-};
-:(before "struct type_info")
-enum kind_of_type {
-  PRIMITIVE,
-  RECORD,
-  CHOICE,
-};
-struct type_declaration {
-  string name;
-  vector<type_id> type;
-};
-
-//: global definitions start with 'var'
-
-:(before "End Types")
-typedef int global_id;
-:(before "End Globals")
-map</*name*/string, global_id> Global_id;
-map<global_id, global_info> Global_info;
-global_id Next_global_id = 1;
-:(before "End Types")
-struct global_info {
-  global_id id;
-  vector<type_id> type;
-  int address;
-  global_info() :address(0) {}
-};
-
-//: function definitions start with 'fn'
-
-:(before "End Types")
-typedef int function_id;
-:(before "End Globals")
-map</*name*/string, function_id> Function_id;
-map<function_id, function_info> Function_info;
-function_id Next_function_id = 1;
-:(before "End Types")
-struct function_info {
-  function_id id;
-  string name;
-  vector<operand> in;
-  vector<operand> in_out;
-  vector<instruction> instructions;
-  map</*local variable name*/string, int> stack_offset;
-  function_info() :id(0) {}
-};
-:(before "struct function_info")
-// operands have form name/property1/property2/... : (type1 type2 ...)
-struct operand {
-  string name;
-  vector<type_id> type;
-  vector<string> properties;
-  operand(string);
-  void set_type(istream&);
-};
-
-struct instruction {
-  function_id id;
-  string name;
-  vector<operand> in;
-  vector<operand> in_out;
-};
-:(code)
-operand::operand(string s) {
-  istringstream in(s);
-  name = slurp_until(in, '/');
-  while (has_data(in))
-    properties.push_back(slurp_until(in, '/'));
-}
-
-// extremely hacky; assumes a single-level list of words in parens, with no nesting
-void operand::set_type(istream& in) {
-  assert(has_data(in));
-  string curr;
-  in >> curr;
-//?   cerr << "2: " << curr << '\n';
-  if (curr.at(0) != '(') {
-    type.push_back(get(Type_id, curr));
-    return;
-  }
-  curr = curr.substr(/*skip '('*/1);
-  while (!ends_with(curr, ")")) {
-    if (curr.empty()) continue;
-    assert(curr.at(0) != '(');
-    type.push_back(get(Type_id, curr));
-    // update
-    assert(has_data(in));
-    in >> curr;
-  }
-  assert(ends_with(curr, ")"));
-  curr = curr.substr(0, SIZE(curr)-1);
-  if (!curr.empty()) {
-    /*'(' or ')' isn't a token by itself*/
-    type.push_back(get(Type_id, curr));
-  }
-}
-
-string to_string(const operand& o) {
-  ostringstream out;
-  out << o.name;
-  if (o.type.empty()) return out.str();
-  out << " : ";
-  if (SIZE(o.type) == 1) {
-    out << get(Type_info, o.type.at(0)).name;
-    return out.str();
-  }
-  out << "(";
-  for (int i = 0;  i < SIZE(o.type);  ++i) {
-    if (i > 0) out << ", ";
-    out << get(Type_info, o.type.at(i)).name;
-  }
-  out << ")";
-  return out.str();
-}
-
-string slurp_until(istream& in, char delim) {
-  ostringstream out;
-  char c;
-  while (in >> c) {
-    if (c == delim) {
-      // drop the delim
-      break;
-    }
-    out << c;
-  }
-  return out.str();
-}
-
-bool ends_with(const string& s, const string& pat) {
-  for (string::const_reverse_iterator p = s.rbegin(), q = pat.rbegin();  q != pat.rend();  ++p, ++q) {
-    if (p == s.rend()) return false;  // pat too long
-    if (*p != *q) return false;
-  }
-  return true;
-}
-
-:(before "End One-time Setup")
-init_primitive_types();
-:(code)
-void init_primitive_types() {
-  Literal_type_id = new_type("literal", PRIMITIVE, 0);
-  Int_type_id = new_type("int", PRIMITIVE, 4);
-  Byte_type_id = new_type("byte", PRIMITIVE, 1);
-  Address_type_id = new_type("address", PRIMITIVE, 4);
-  Array_type_id = new_type("array", PRIMITIVE, 0);  // size will depend on length
-  Ref_type_id = new_type("ref", PRIMITIVE, 8);  // address + alloc id
-}
-
-type_id new_type(string name, kind_of_type kind, int size) {
-  assert(!contains_key(Type_id, name));
-  int result = Next_type_id++;
-  put(Type_id, name, result);
-  assert(!contains_key(Type_info, result));
-  type_info& curr = Type_info[result];  // insert
-  curr.id = result;
-  curr.name = name;
-  curr.kind = kind;
-  curr.size = size;
-  return result;
-}
-
-//: Start each test by undoing the previous test's types, globals and functions
-
-:(before "End One-time Setup")
-save_snapshots();
-:(before "End Reset")
-restore_snapshots();
-
-:(before "End Globals")
-map<string, type_id> Type_id_snapshot;
-map<type_id, type_info> Type_info_snapshot;
-type_id Next_type_id_snapshot = 0;
-
-map<string, global_id> Global_id_snapshot;
-map<global_id, global_info> Global_info_snapshot;
-global_id Next_global_id_snapshot = 0;
-
-map<string, function_id> Function_id_snapshot;
-map<function_id, function_info> Function_info_snapshot;
-function_id Next_function_id_snapshot = 0;
-:(code)
-void save_snapshots() {
-  Type_id_snapshot = Type_id;
-  Type_info_snapshot = Type_info;
-  Next_type_id_snapshot = Next_type_id;
-
-  Global_id_snapshot = Global_id;
-  Global_info_snapshot = Global_info;
-  Next_global_id_snapshot = Next_global_id;
-
-  Function_id_snapshot = Function_id;
-  Function_info_snapshot = Function_info;
-  Next_function_id_snapshot = Next_function_id;
-}
-
-void restore_snapshots() {
-  Type_id = Type_id_snapshot;
-  Type_info = Type_info_snapshot;
-  Next_type_id = Next_type_id_snapshot;
-
-  Global_id = Global_id_snapshot;
-  Global_info = Global_info_snapshot;
-  Next_global_id = Next_global_id_snapshot;
-
-  Function_id = Function_id_snapshot;
-  Function_info = Function_info_snapshot;
-  Next_function_id = Next_function_id_snapshot;
-}
-
-:(before "End Includes")
-#include <map>
-using std::map;