示例#1
0
文件: journal.py 项目: f3at/feat
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
示例#2
0
 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)