Beispiel #1
0
    def test_loop(self):
        source = """
(|
    benchmark = (| i <- 0. |
        [i < 1000] whileTrue: [
            i: i + 1.
        ].
    ).
|) benchmark.
"""
        universe = Object()
        universe.meta_add_slot("primitives", get_primitives())

        interpreter = Interpreter(universe)
        run_stdlib(interpreter, stdlib_source)

        ast = lex_and_parse_as_root(source)
        if not ast:
            return None, interpreter

        code = ast.compile(CodeContext())
        interpreter.add_process(code.finalize())

        def f():
            interpreter.interpret()
            return 0

        #res = f()
        #assert res == 0
        res = self.meta_interp(f, [],
                               listops=True,
                               listcomp=True,
                               backendopt=True)
        assert res == 0
Beispiel #2
0
def test_parallelism():
    one_plus_one_ast = lex_and_parse("""(|
        add = (|| 1 + 1)
    |) add""")
    two_plus_two_ast = lex_and_parse("""(|
        add = (|| 2 + 2)
    |) add""")

    one_plus_one_ctx = one_plus_one_ast[0].compile(CodeContext())
    two_plus_two_ctx = two_plus_two_ast[0].compile(CodeContext())

    interpreter = Interpreter(universe=get_primitives())
    one_plus_one_process = interpreter.add_process(one_plus_one_ctx)
    two_plus_two_process = interpreter.add_process(two_plus_two_ctx)

    assert not one_plus_one_process.finished
    assert not one_plus_one_process.result
    assert not two_plus_two_process.finished
    assert not two_plus_two_process.result

    interpreter.interpret()

    assert one_plus_one_process.finished
    assert one_plus_one_process.result == PrimitiveIntObject(2)
    assert two_plus_two_process.finished
    assert two_plus_two_process.result == PrimitiveIntObject(4)
Beispiel #3
0
def test_running_self_unittest_file():
    universe = Object()
    universe.meta_add_slot("primitives", get_primitives())

    dirname = os.path.dirname(__file__)
    source_file_path = os.path.join(dirname, "..", "scripts", "unittest.self")
    with open(source_file_path) as source_file:
        ast = lex_and_parse(source_file.read())

    interpreter = Interpreter(universe)
    for item in ast:
        process = interpreter.add_process(item.compile(CodeContext()))
        interpreter.interpret()

        assert process.finished
        assert not process.finished_with_error
Beispiel #4
0
def virtual_machine(source, stdlib_source=""):
    universe = Object()
    universe.meta_add_slot("primitives", get_primitives())

    interpreter = Interpreter(universe)

    if stdlib_source:
        if not run_stdlib(interpreter, stdlib_source):
            return None, interpreter

    ast = lex_and_parse_as_root(source)
    if not ast:
        return None, interpreter

    code = ast.compile(CodeContext())
    process = interpreter.add_process(code.finalize())
    interpreter.interpret()

    return process, interpreter