WARNING! Access to this system is limited to authorised users only.
Unauthorised users may be subject to prosecution.
Unauthorised access to this system is a criminal offence under Australian law (Federal Crimes Act 1914 Part VIA)
It is a criminal offence to:
(1) Obtain access to data without authority. -Penalty 2 years imprisonment.
(2) Damage, delete, alter or insert data without authority. -Penalty 10 years imprisonment.
User activity is monitored and recorded. Anyone using this system expressly consents to such monitoring and recording.

To protect your data, the CISO officer has suggested users to enable 2FA as soon as possible.
Currently 2.7% of users enabled 2FA.

Commit fdb3be28 authored by Stefan Marr's avatar Stefan Marr
Browse files

Slowly transcribing the Universe

- step by step, driven by missing functionality of the basic unit tests
Signed-off-by: default avatarStefan Marr <git@stefan-marr.de>
parent 5f77c19e
class Interpreter(object):
def __init__(self, universe):
self._universe = universe
\ No newline at end of file
class SymbolTable(object):
\ No newline at end of file
from som.interpreter.interpreter import Interpreter
from som.vm.symbol_table import SymbolTable
from som.vmobjects.object import Object
import os
class Universe(object):
def __init__(self):
self._interpreter = Interpreter(self)
self._symbol_table = SymbolTable()
self._globals = {}
self._nilObject = None
self._trueObject = None
self._falseObject = None
self._objectClass = None
self._classClass = None
self._metaclassClass = None
self._nilClass = None
self._integerClass = None
self._bigintegerClass= None
self._arrayClass = None
self._methodClass = None
self._symbolClass = None
self._frameClass = None
self._primitiveClass = None
self._systemClass = None
self._blockClass = None
self._doubleClass = None
self._last_exit_code = 0
self._classpath = None
self._dump_bytecodes = False
def interpret(self, arguments):
# Check for command line switches
arguments = self.handleArguments(arguments)
# Initialize the known universe
def handleArguments(self, arguments):
got_classpath = False
remaining_args = []
i = 0
while i < len(arguments):
if arguments[i] == "-cp":
if i + 1 >= len(arguments):
self._setup_classpath(arguments[i + 1])
i += 1 # skip class path
got_classpath = True
elif arguments[i] == "-d":
self._dump_bytecodes = True
i += 1
if not got_classpath:
# Get the default class path of the appropriate size
self._classpath = self._setup_default_classpath(0)
# check remaining args for class paths, and strip file extension
i = 0
while i < len(remaining_args):
split = self._get_path_class_ext(remaining_args[i])
if split[0] != "": # there was a path
self._classpath.insert(0, split[0])
remaining_args[i] = split[1]
i += 1
return remaining_args
def _setup_classpath(self, cp):
self._classpath = cp.split(os.pathsep)
# take argument of the form "../foo/Test.som" and return
# "../foo", "Test", "som"
def _get_path_class_ext(self, path):
(path, file_name) = os.path.split(path)
(file_name, ext) = os.path.splitext(file_name)
return (path, file_name, ext[1:])
def initialize(self, arguments):
# Allocate the nil object
self._nilObject = Object(None)
# Allocate the Metaclass classes
self._metaclassClass = self.new_metaclass_class()
# Allocate the rest of the system classes
self._objectClass = self.new_system_class()
self._nilClass = self.new_system_class()
self._classClass = self.new_system_class()
self._arrayClass = self.new_system_class()
self._symbolClass = self.new_system_class()
self._methodClass = self.new_system_class()
self._integerClass = self.new_system_class()
self._bigintegerClass = self.new_system_class()
self._frameClass = self.new_system_class()
self._primitiveClass = self.new_system_class()
self._stringClass = self.new_system_class()
self._doubleClass = self.new_system_class()
# Setup the class reference for the nil object
# Initialize the system classes
self._initialize_system_class(self._objectClass, None, "Object")
self._initialize_system_class(self._classClass, self._objectClass, "Class")
self._initialize_system_class(self._metaclassClass, self._classClass, "Metaclass")
self._initialize_system_class(self._nilClass, self._objectClass, "Nil")
self._initialize_system_class(self._arrayClass, self._objectClass, "Array")
self._initialize_system_class(self._methodClass, self._arrayClass, "Method")
self._initialize_system_class(self._symbolClass, self._objectClass, "Symbol")
self._initialize_system_class(self._integerClass, self._objectClass, "Integer")
self._initialize_system_class(self._bigintegerClass, self._objectClass, "BigInteger")
self._initialize_system_class(self._frameClass, self._arrayClass, "Frame")
self._initialize_system_class(self._primitiveClass, self._objectClass, "Primitive")
self._initialize_system_class(self._stringClass, self._objectClass, "String")
self._initialize_system_class(self._doubleClass, self._objectClass, "Double")
# Load methods and fields into the system classes
# Load the generic block class
self._blockClass = self._load_class(self._symbol_for("Block"))
# Setup the true and false objects
self._trueObject = self._new_instance(self._load_class(self.symbol_for("True")))
self._falseObject = self._new_instance(self._load_class(self.symbol_for("False")))
# Load the system class and create an instance of it
self._systemClass = self._load_class(self.symbol_for("System"))
system_object = self._new_instance(self._systemClass)
# Put special objects and classes into the dictionary of globals
self.setGlobal(self.symbol_for("nil"), self._nilObject)
self.setGlobal(self.symbol_for("true"), self._trueObject)
self.setGlobal(self.symbol_for("false"), self._falseObject)
self.setGlobal(self.symbol_for("system"), self._systemObject)
self.setGlobal(self.symbol_for("System"), self._systemClass)
self.setGlobal(self.symbol_for("Block"), self._blockClass)
\ No newline at end of file
class Object(object):
def __init__(self, nilObject):
\ No newline at end of file
import unittest
from parameterized import parameterized
from som.vm.universe import Universe
class SomTest(unittest.TestCase):
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment