Ejemplo n.º 1
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
Ejemplo n.º 2
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
Ejemplo n.º 3
0
def test_meta_add_parent_cloned_objects_use_same_map():
    o = Object()
    o.meta_add_parent("a", PrimitiveStrObject("value"))
    x = o.clone()

    assert "a" in o.parent_slot_keys

    assert o.map == x.map
Ejemplo n.º 4
0
def test_meta_add_parent():
    val = Object()

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

    assert "p*" in o.map._parent_slots
    assert val in o._parent_slot_values
Ejemplo n.º 5
0
def test_meta_add_parent_structural_change_creates_new_map_add():
    o = Object()
    o.meta_add_parent("a", PrimitiveStrObject("value"))
    x = o.clone()

    assert o.map == x.map

    x.meta_add_parent("*", PrimitiveStrObject("another"))
    assert o.map != x.map
    assert o != x
Ejemplo n.º 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
Ejemplo n.º 7
0
def test_meta_add_parent_cloned_objects_dont_change_when_parent_is_changed():
    o = Object()
    o.meta_add_parent("a", PrimitiveStrObject("value"))
    x = o.clone()

    assert o.map == x.map

    x.meta_add_parent("a", PrimitiveStrObject("another"))

    assert o.map == x.map
    assert o != x
Ejemplo n.º 8
0
def test_meta_add_parent_structural_change_creates_new_map_remove():
    o = Object()
    o.meta_add_parent("a", PrimitiveStrObject("value"))
    x = o.clone()

    assert o.map == x.map

    x.meta_remove_parent("a")

    assert o.map != x.map
    assert o != x
    assert "a" in o.parent_slot_keys
Ejemplo n.º 9
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
Ejemplo n.º 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
Ejemplo n.º 11
0
def test_meta_remove_parent():
    a_slot = PrimitiveStrObject("value a")
    b_slot = PrimitiveStrObject("value b")

    o = Object()
    o.meta_add_parent("a", a_slot)
    o.meta_add_parent("b", b_slot)

    assert "a" in o.parent_slot_keys
    assert "b" in o.parent_slot_keys

    assert o.meta_get_parent("a") is a_slot
    assert o.meta_get_parent("b") is b_slot

    o.meta_remove_parent("a")

    assert o.meta_get_parent("b") is b_slot
    assert len(o._parent_slot_values) == 1