def resume(self, requires: Dict[object, object], resolver: Resolver, queue: QueueScheduler, target: ResultVariable) -> None: result = self.children[0].execute(requires, resolver, queue) self._validate_value(result, 0) assert isinstance(result, bool) if self._is_final(result): target.set_value(result, self.location) else: ExecutionUnit( queue, resolver, target, self.children[1].requires_emit(resolver, queue), self.children[1], owner=self )
def requires_emit(self, resolver: Resolver, queue: QueueScheduler) -> Dict[object, ResultVariable]: # pass context! helper = GradualFor(self, resolver, queue) helperwrapped = ResultVariable() helperwrapped.set_value(helper, self.location) basereq = self.base.requires_emit_gradual(resolver, queue, helper) basereq[self] = helperwrapped return basereq
def requires_emit(self, resolver: Resolver, queue: QueueScheduler) -> Dict[object, ResultVariable]: """Not an actual expression, but following the pattern""" # pass context via requires! helper = GradualFor(self, resolver, queue) helperwrapped = ResultVariable() helperwrapped.set_value(helper, self.location) basereq = self.base.requires_emit_gradual(resolver, queue, helper) basereq[self] = helperwrapped return basereq
def call_in_context( self, args: List[object], kwargs: Dict[str, object], resolver: Resolver, queue: QueueScheduler, result: ResultVariable ) -> None: no_unknows = self.plugin.check_args(args, kwargs) if not no_unknows and not self.plugin.opts["allow_unknown"]: result.set_value(Unknown(self), self.ast_node.location) return if self.plugin._context != -1: args.insert(self.plugin._context, plugins.Context(resolver, queue, self.ast_node, self.plugin, result)) if self.plugin.opts["emits_statements"]: self.plugin(*args, **kwargs) else: try: value = self.plugin(*args, **kwargs) result.set_value(value if value is not None else NoneValue(), self.ast_node.location) except UnknownException as e: result.set_value(e.unknown, self.ast_node.location) except UnsetException as e: call: str = str(self.plugin) location: str = str(self.ast_node.location) LOGGER.debug( "Unset value in python code in plugin at call: %s (%s) (Will be rescheduled by compiler)", call, location ) # Don't handle it here! # This exception is used by the scheduler to re-queue the unit # If it is handled here, the re-queueing can not be done, # leading to very subtle errors such as #2787 raise e except RuntimeException as e: raise WrappingRuntimeException(self.ast_node, "Exception in plugin %s" % self.ast_node.name, e) except plugins.PluginException as e: raise ExplicitPluginException(self.ast_node, "PluginException in plugin %s" % self.ast_node.name, e) except Exception as e: raise ExternalException(self.ast_node, "Exception in plugin %s" % self.ast_node.name, e)
def call_in_context( self, args: List[object], kwargs: Dict[str, object], resolver: Resolver, queue: QueueScheduler, result: ResultVariable ) -> None: result.set_value(self.call_direct(args, kwargs), self.ast_node.location)