def setbinding(self, arg, s_value, called_from_graph=None, where=None): if arg in self.bindings: assert s_value.contains(self.bindings[arg]) # for debugging purposes, record the history of bindings that # have been given to this variable if annmodel.DEBUG: history = self.bindingshistory.setdefault(arg, []) history.append(self.bindings[arg]) cause_history = self.binding_cause_history.setdefault(arg, []) cause_history.append(self.binding_caused_by[arg]) degenerated = annmodel.isdegenerated(s_value) if degenerated: self.ondegenerated(arg, s_value, where=where, called_from_graph=called_from_graph) self.bindings[arg] = s_value if annmodel.DEBUG: if arg in self.return_bindings: log.event("%s -> %s" % (self.whereami( (self.return_bindings[arg], None, None)), s_value)) if arg in self.return_bindings and degenerated: self.warning("result degenerated to SomeObject", (self.return_bindings[arg], None, None)) self.binding_caused_by[arg] = called_from_graph
def compute_result_annotation(self, **kwds_s): from pypy.annotation import model as annmodel driver = self.instance.im_self keys = kwds_s.keys() keys.sort() expected = ['s_' + name for name in driver.greens + driver.reds] expected.sort() if keys != expected: raise JitHintError("%s expects the following keyword " "arguments: %s" % (self.instance, expected)) try: cache = self.bookkeeper._jit_annotation_cache[driver] except AttributeError: cache = {} self.bookkeeper._jit_annotation_cache = {driver: cache} except KeyError: cache = {} self.bookkeeper._jit_annotation_cache[driver] = cache for key, s_value in kwds_s.items(): s_previous = cache.get(key, annmodel.s_ImpossibleValue) s_value = annmodel.unionof(s_previous, s_value) if annmodel.isdegenerated(s_value): raise JitHintError("mixing incompatible types in argument %s" " of jit_merge_point/can_enter_jit" % key[2:]) cache[key] = s_value if self.instance.__name__ == 'jit_merge_point': self.annotate_hooks(**kwds_s) return annmodel.s_None
def setbinding(self, arg, s_value, called_from_graph=None, where=None): if arg in self.bindings: assert s_value.contains(self.bindings[arg]) # for debugging purposes, record the history of bindings that # have been given to this variable if annmodel.DEBUG: history = self.bindingshistory.setdefault(arg, []) history.append(self.bindings[arg]) cause_history = self.binding_cause_history.setdefault(arg, []) cause_history.append(self.binding_caused_by[arg]) degenerated = annmodel.isdegenerated(s_value) if degenerated: self.ondegenerated(arg, s_value, where=where, called_from_graph=called_from_graph) self.bindings[arg] = s_value if annmodel.DEBUG: if arg in self.return_bindings: log.event("%s -> %s" % (self.whereami((self.return_bindings[arg], None, None)), s_value)) if arg in self.return_bindings and degenerated: self.warning("result degenerated to SomeObject", (self.return_bindings[arg],None, None)) self.binding_caused_by[arg] = called_from_graph
def compute_result_annotation(self, **kwds_s): from pypy.annotation import model as annmodel if self.instance.__name__ == 'jit_merge_point': self.annotate_hooks(**kwds_s) driver = self.instance.im_self keys = kwds_s.keys() keys.sort() expected = ['s_' + name for name in driver.greens + driver.reds if '.' not in name] expected.sort() if keys != expected: raise JitHintError("%s expects the following keyword " "arguments: %s" % (self.instance, expected)) try: cache = self.bookkeeper._jit_annotation_cache[driver] except AttributeError: cache = {} self.bookkeeper._jit_annotation_cache = {driver: cache} except KeyError: cache = {} self.bookkeeper._jit_annotation_cache[driver] = cache for key, s_value in kwds_s.items(): s_previous = cache.get(key, annmodel.s_ImpossibleValue) s_value = annmodel.unionof(s_previous, s_value) if annmodel.isdegenerated(s_value): raise JitHintError("mixing incompatible types in argument %s" " of jit_merge_point/can_enter_jit" % key[2:]) cache[key] = s_value return annmodel.s_None
def unioncheck(*somevalues): s_value = unionof(*somevalues) if isdegenerated(s_value): if not getattr(TLS, 'no_side_effects_in_union', 0): bookkeeper = getbookkeeper() if bookkeeper is not None: bookkeeper.ondegenerated('union', s_value) return s_value
def add_constant_source(self, classdef, source): s_value = source.s_get_value(classdef, self.name) if source.instance_level: # a prebuilt instance source forces readonly=False, see above self.modified(classdef) s_new_value = unionof(self.s_value, s_value) if isdegenerated(s_new_value): self.bookkeeper.ondegenerated("source %r attr %s" % (source, self.name), s_new_value) self.s_value = s_new_value
def merge(self, other, classdef='?'): assert self.name == other.name s_new_value = unionof(self.s_value, other.s_value) if isdegenerated(s_new_value): what = "%s attr %s" % (classdef, self.name) self.bookkeeper.ondegenerated(what, s_new_value) self.s_value = s_new_value if not other.readonly: self.modified(classdef) self.read_locations.update(other.read_locations)
def merge(self, other): if self is not other: if getattr(TLS, 'no_side_effects_in_union', 0): raise UnionError("merging list/dict items") if other.dont_change_any_more: if self.dont_change_any_more: raise TooLateForChange else: # lists using 'other' don't expect it to change any more, # so we try merging into 'other', which will give # TooLateForChange if it actually tries to make # things more general self, other = other, self self.immutable &= other.immutable if other.must_not_resize: if self.resized: raise ListChangeUnallowed("list merge with a resized") self.must_not_resize = True if other.mutated: self.mutate() if other.resized: self.resize() if other.range_step != self.range_step: self.setrangestep(self._step_map[type(self.range_step), type(other.range_step)]) self.itemof.update(other.itemof) read_locations = self.read_locations.copy() other_read_locations = other.read_locations.copy() self.read_locations.update(other.read_locations) s_value = self.s_value s_other_value = other.s_value s_new_value = unionof(s_value, s_other_value) if s_new_value != s_value: if self.dont_change_any_more: raise TooLateForChange if isdegenerated(s_new_value): if self.bookkeeper: self.bookkeeper.ondegenerated(self, s_new_value) elif other.bookkeeper: other.bookkeeper.ondegenerated(other, s_new_value) self.patch() # which should patch all refs to 'other' if s_new_value != s_value: self.s_value = s_new_value # reflow from reading points for position_key in read_locations: self.bookkeeper.annotator.reflowfromposition(position_key) if s_new_value != s_other_value: # reflow from reading points for position_key in other_read_locations: other.bookkeeper.annotator.reflowfromposition(position_key)
def generalize(self, s_other_value): s_new_value = unionof(self.s_value, s_other_value) if isdegenerated(s_new_value) and self.bookkeeper: self.bookkeeper.ondegenerated(self, s_new_value) updated = s_new_value != self.s_value if updated: if self.dont_change_any_more: raise TooLateForChange self.s_value = s_new_value # reflow from all reading points for position_key in self.read_locations: self.bookkeeper.annotator.reflowfromposition(position_key) return updated
def compute_result_annotation(self, **kwds_s): from pypy.annotation import model as annmodel if self.instance.__name__ == "jit_merge_point": self.annotate_hooks(**kwds_s) driver = self.instance.im_self keys = kwds_s.keys() keys.sort() expected = ["s_" + name for name in driver.greens + driver.reds if "." not in name] expected.sort() if keys != expected: raise JitHintError("%s expects the following keyword " "arguments: %s" % (self.instance, expected)) try: cache = self.bookkeeper._jit_annotation_cache[driver] except AttributeError: cache = {} self.bookkeeper._jit_annotation_cache = {driver: cache} except KeyError: cache = {} self.bookkeeper._jit_annotation_cache[driver] = cache for key, s_value in kwds_s.items(): s_previous = cache.get(key, annmodel.s_ImpossibleValue) s_value = annmodel.unionof(s_previous, s_value) if annmodel.isdegenerated(s_value): raise JitHintError( "mixing incompatible types in argument %s" " of jit_merge_point/can_enter_jit" % key[2:] ) cache[key] = s_value # add the attribute _dont_reach_me_in_del_ (see pypy.rpython.rclass) try: graph = self.bookkeeper.position_key[0] graph.func._dont_reach_me_in_del_ = True except (TypeError, AttributeError): pass return annmodel.s_None