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
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
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
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
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
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
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
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
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
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
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