Exemple #1
0
def test_parent_lookup_from_parent_tree():
    """
    Based on real case.
    """
    value = PrimitiveStrObject("value")

    o1 = Object()
    o2 = Object()
    o3 = o2.clone()
    o4 = Object()
    o5 = Object()

    o1.scope_parent = o2

    o2.scope_parent = o3
    o2.meta_add_parent("*", o5)

    o3.scope_parent = o4
    o3.meta_add_parent("*", o5)

    o4.scope_parent = o5
    o4.meta_add_slot("value", value)

    assert o1.get_slot("value") is None
    assert o1.parent_lookup("value") is value
Exemple #2
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
Exemple #3
0
def test_meta_add_slot():
    val = PrimitiveStrObject("xe")

    o = Object()
    assert not o._slot_values

    o.meta_add_slot("test", val)
    assert o._slot_values[0] == val
Exemple #4
0
def test_slot_lookup_from_scope_parent():
    p = Object()
    val = PrimitiveStrObject("it is xex!")
    p.meta_add_slot("xex", val)

    o = Object()
    o.scope_parent = p

    assert o.get_slot("xex") is None
    assert o.slot_lookup("xex") is val
Exemple #5
0
def test_meta_remove_slot():
    o = Object()
    assert not o._slot_values

    o.meta_add_slot("test", Object())
    assert o._slot_values
    assert "test" in o.map._slots

    o.meta_remove_slot("test")
    assert not o._slot_values
    assert "test" not in o.map._slots
Exemple #6
0
def test_get_slot_from_one_parent():
    val = PrimitiveStrObject("it is xex!")

    p = Object()
    p.meta_add_slot("xex", val)

    o = Object()
    o.meta_add_parent("p", p)

    assert o.get_slot("xex") is None
    assert o.parent_lookup("xex") is val
Exemple #7
0
def test_slot_lookup_from_scope_parent_and_then_parents():
    p = Object()
    val = PrimitiveStrObject("it is xex!")
    p.meta_add_slot("a", val)

    interobj = Object()
    interobj.scope_parent = p

    o = Object()
    o.scope_parent = Object()
    o.scope_parent.meta_add_parent("*", interobj)

    assert o.slot_lookup("a") is val
Exemple #8
0
    def _add_reflection_to_universe(self):
        self.universe.meta_add_slot("universe", self.universe)

        primitives = self.universe.get_slot("primitives")
        if primitives is None:
            primitives = Object()
            self.universe.meta_add_slot("primitives", primitives)

        # transport values from primitives to global level
        for slot in primitives.slot_keys:
            self.universe.meta_add_slot(slot, primitives.get_slot(slot))

        primitives.meta_add_slot("interpreter", gen_interpreter_primitives(self))
Exemple #9
0
def test_meta_add_slot_do_check_duplicates():
    xx = PrimitiveStrObject("xx")
    zz = PrimitiveStrObject("zz")

    o = Object()
    assert not o._slot_values

    o.meta_add_slot("xx", xx)
    o.meta_add_slot("zz", zz)
    assert len(o._slot_values) == 2

    o.meta_add_slot("xx2", xx, check_duplicates=True)
    assert len(o._slot_values) == 2
Exemple #10
0
def slot_lookup():
    val = PrimitiveStrObject("it is xex!")
    flat = PrimitiveStrObject("it is flat")

    p = Object()
    p.meta_add_slot("xex", val)

    o = Object()
    o.meta_add_parent("p", p)
    o.meta_add_parent("p", flat)

    assert o.get_slot("xex") is None
    assert o.slot_lookup("xex") is val
    assert o.slot_lookup("flat") is flat
Exemple #11
0
def test_get_slot_from_several_parents():
    """
    o.parents
    |
    |-- p <-- cycle, yay --,
    |   |-- x -> Object()  |
    |   |-- y -> Object()  |
    |   `-- z -> p --------'
    |
    `-- p3
        `-- x -> p2
                 |
                 `-- xex
    """
    val = PrimitiveStrObject("it is xex!")

    p = Object()
    p.meta_add_slot("x", Object())
    p.meta_add_slot("y", Object())
    p.meta_add_slot("z", p)  # cycle, yay!

    p2 = Object()
    p.meta_add_slot("xex", val)

    p3 = Object()
    p.meta_add_slot("x", p2)

    o = Object()
    o.meta_add_parent("p", p)
    o.meta_add_parent("p3", p3)

    assert o.get_slot("xex") is None
    assert o.parent_lookup("xex") is val
Exemple #12
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
Exemple #13
0
def _create_block_trait_prototype():
    obj = Object()

    placer = PrimitiveNilObject()

    obj.meta_add_slot("value", placer, check_duplicates=True)
    obj.meta_add_slot("with:", placer, check_duplicates=True)
    obj.meta_add_slot("with:With:", placer, check_duplicates=True)
    obj.meta_add_slot("with:With:With:", placer, check_duplicates=True)
    obj.meta_add_slot("with:With:With:With:", placer, check_duplicates=True)
    obj.meta_add_slot("withAll:", placer, check_duplicates=True)

    add_primitive_fn(obj, "asString", _print_block_source, [])
    add_primitive_fn(obj, "getLineNumber", _get_lineno, [])

    obj.scope_parent = _USER_EDITABLE_BLOCK_TRAIT

    return obj
Exemple #14
0
def test_clone():
    o = Object()
    o.meta_add_slot("test", Object())

    # clones share same map
    clone = o.clone()
    assert clone.map is o.map
    assert clone._slot_values == o._slot_values

    # clones with updated slot value share same map
    clone.set_slot("test", Object())
    assert clone.map is o.map
    assert clone._slot_values != o._slot_values

    # clones with different structure don't share maps
    clone.meta_add_slot("another", Object())
    assert clone.map is not o.map
    assert clone._slot_values != o._slot_values
Exemple #15
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
Exemple #16
0
def test_meta_insert_slot():
    first = PrimitiveStrObject("first")
    second = PrimitiveStrObject("second")
    third = PrimitiveStrObject("third")

    o = Object()
    assert not o._slot_values

    o.meta_add_slot("first", first)
    o.meta_add_slot("third", third)

    assert o.get_slot("first") is first
    assert o.get_slot("third") is third

    o.meta_insert_slot(1, "second", second)
    assert o.map._slots.keys() == ["first", "second", "third"]

    # make sure that objects didn't shifted
    assert o.get_slot("first") is first
    assert o.get_slot("second") is second
    assert o.get_slot("third") is third
Exemple #17
0
def test_meta_remove_slot_shift_map_pointers():
    first = PrimitiveStrObject("first")
    second = PrimitiveStrObject("second")
    third = PrimitiveStrObject("third")

    o = Object()
    assert not o._slot_values

    o.meta_add_slot("first", first)
    o.meta_add_slot("second", second)
    o.meta_add_slot("third", third)

    assert o.get_slot("first") is first
    assert o.get_slot("second") is second
    assert o.get_slot("third") is third

    o.meta_remove_slot("first")

    assert len(o._slot_values) == 2
    assert len(o.map._slots) == 2
    assert o.map._slots["second"] == 0
    assert o.map._slots["third"] == 1

    assert o.get_slot("first") is None
    assert o.get_slot("second") == second
    assert o.get_slot("third") == third
Exemple #18
0
def get_primitives():
    """
    Return object with primitive functions mapped to its slots.

    Returns:
        obj: Instance of tinySelf's Object.
    """

    primitives = Object()

    # add_primitive_fn(primitives, "primitiveInt", lambda x: PrimitiveIntObject(x), ["literal"])
    # add_primitive_fn(primitives, "primitiveStr", lambda x: PrimitiveStrObject(x), ["literal"])

    primitives.meta_add_slot("nil", PrimitiveNilObject())
    primitives.meta_add_slot("true", PrimitiveTrueObject())
    primitives.meta_add_slot("false", PrimitiveFalseObject())
    primitives.meta_add_slot("block_traits", _USER_EDITABLE_BLOCK_TRAIT)

    primitives.meta_add_slot("time", get_primitive_time_object())

    add_primitive_fn(primitives, "mirrorOn:", _create_mirror, ["obj"])

    return primitives
Exemple #19
0
    def _create_intermediate_params_obj(self, scope_parent, method_obj,
                                        parameters, prev_scope_parent=None):
        # do not create empty intermediate objects
        if not method_obj.parameters:
            # this is used to remember in what context is the block executed,
            # so in case of indirect return, it is possible to return from
            # this context and not just block
            if prev_scope_parent:
                method_obj.meta_add_parent("*", prev_scope_parent)

                if not method_obj.is_block and method_obj.has_code:
                    return scope_parent

                return prev_scope_parent

            return scope_parent

        if method_obj.code_context._params_cache is None:
            intermediate_obj = Object()
            intermediate_obj.meta_add_slot("ThisIsIntermediateObj", intermediate_obj)
        else:
            intermediate_obj = method_obj.code_context._params_cache.clone()

        if scope_parent.has_parents or scope_parent.scope_parent or scope_parent.has_slots:
            intermediate_obj.scope_parent = None if scope_parent == method_obj else scope_parent

        if prev_scope_parent is not None:
            prev_scope_parents_parent = prev_scope_parent.meta_get_parent("*", None)
            if prev_scope_parents_parent and \
               prev_scope_parent.scope_parent == prev_scope_parents_parent.scope_parent:
                parent = prev_scope_parents_parent
            else:
                parent = prev_scope_parent

            intermediate_obj.meta_add_parent("*", parent)

        parameter_pairs = self._put_together_parameters(
            parameter_names=method_obj.parameters,
            parameters=parameters
        )
        for name, value in parameter_pairs:
            intermediate_obj.meta_add_slot(name, value)
            intermediate_obj.meta_add_slot(
                name + ":",
                AssignmentPrimitive(intermediate_obj)
            )

        if method_obj.code_context._params_cache is None:
            method_obj.code_context._params_cache = intermediate_obj

        return intermediate_obj
Exemple #20
0
def test_set_slot():
    o = Object()

    o.meta_add_slot("test", PrimitiveStrObject("xe"))
    assert o.set_slot("test", PrimitiveStrObject("xax"))
    assert not o.set_slot("bad_slot", PrimitiveStrObject("x"))
Exemple #21
0
def test_get_slot():
    o = Object()

    val = PrimitiveStrObject("xe")
    o.meta_add_slot("test", val)
    assert o.get_slot("test") is val
Exemple #22
0
def test_meta_remove_missing_slot():
    o = Object()

    o.meta_add_slot("test", Object())
    assert not o.meta_remove_slot("x")