def _side_effect_wrapper(callable, args, kwargs, name): section_state = fiber.get_state() if section_state is not None: # We are in a woven section entry = section_state.get(JOURNAL_ENTRY_TAG, None) if entry is not None: # We are in a replayable section mode = section_state.get(RECMODE_TAG, None) if mode == JournalMode.replay: return entry.next_side_effect(name, *args, **kwargs) # Create a side-effect entry effect = entry.new_side_effect(name, *args, **kwargs) # Keep it in the replayable section state section_state[SIDE_EFFECT_TAG] = effect # Break the fiber to allow new replayable sections fiber.break_fiber() # Keep the side-effect entry to detect we are in one fiber.set_stack_var(SIDE_EFFECT_TAG, effect) try: result = callable(*args, **kwargs) result = _check_side_effet_result(result, name) effect.set_result(result) effect.commit() return result except Exception, e: # FIXME: handle exceptions in side effects properly error.handle_exception(None, e, "Exception raised by side-effect %s", reflect.canonical_name(callable)) raise
def level3(): self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME1, VALUE1) self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) level4() self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None)
def level4(): self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME3, VALUE3) fiber.set_stack_var(NAME2, VALUE2) self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3) fiber.break_fiber() self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME3, VALUE3) self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3) level5() self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3)
def testStackVars(self): NAME1 = "__test__" VALUE1 = 42 NAME2 = "__test2__" VALUE2 = 66 NAME3 = "__test3__" VALUE3 = 18 def level1(): self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None) level2() self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None) def level2(): self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.break_fiber() self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME2, VALUE2) self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) level3() self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) def level3(): self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME1, VALUE1) self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) level4() self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) def level4(): self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME3, VALUE3) fiber.set_stack_var(NAME2, VALUE2) self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), VALUE2) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3) fiber.break_fiber() self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None) fiber.set_stack_var(NAME3, VALUE3) self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3) level5() self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3) def level5(): self.assertEqual(fiber.get_stack_var(NAME1), None) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), VALUE3) fiber.set_stack_var(NAME1, VALUE1) self.assertEqual(fiber.get_stack_var(NAME1), VALUE1) self.assertEqual(fiber.get_stack_var(NAME2), None) self.assertEqual(fiber.get_stack_var(NAME3), None)