def graph_call(self, graph, fixed, args_hs, tsgraph_accum=None, hs_callable=None): input_args_hs = list(args_hs) graph = self.get_graph_for_call(graph, fixed, input_args_hs) if tsgraph_accum is not None: tsgraph_accum.append(graph) # save this if the caller cares # propagate fixing of arguments in the function to the caller for inp_arg_hs, arg_hs in zip(input_args_hs, args_hs): if isinstance(arg_hs, hintmodel.SomeLLAbstractConstant): assert len(inp_arg_hs.origins) == 1 [o] = inp_arg_hs.origins.keys() if o.read_fixed(): for o in arg_hs.origins: o.set_fixed() hs_res = self.annotator.recursivecall(graph, self.position_key, input_args_hs) # look on which input args the hs_res result depends on if isinstance(hs_res, hintmodel.SomeLLAbstractConstant): if (hs_callable is not None and not isinstance(hs_callable, hintmodel.SomeLLAbstractConstant)): hs_res = hintmodel.variableoftype(hs_res.concretetype, hs_res.deepfrozen) else: deps_hs = [] for hs_inputarg, hs_arg in zip(input_args_hs, args_hs): if isinstance(hs_inputarg, hintmodel.SomeLLAbstractConstant): assert len(hs_inputarg.origins) == 1 [o] = hs_inputarg.origins.keys() if o in hs_res.origins: deps_hs.append(hs_arg) if fixed: deps_hs.append(hs_res) hs_res = hintmodel.reorigin(hs_res, hs_callable, *deps_hs) return hs_res
def oop_pop(self, hs_index=None): assert hs_index is None or hs_index.concretetype == lltype.Signed hs_res = self.read_item() return reorigin(hs_res, hs_res, hs_index)
def oop_getitem(self, hs_index): assert hs_index.concretetype == lltype.Signed hs_res = self.read_item() return reorigin(hs_res, hs_res, hs_index)