def make_instance_node(self): instnode = InstanceNode() instnode.knownclsbox = self.known_class instnode.curfields = av_newdict() for ofs, subspecnode in self.fields: instnode.curfields[ofs] = subspecnode.make_instance_node() return instnode
def compute_common_fields(self, orig, d): fields = [] if orig is not None: if d is not None: d = d.copy() else: d = av_newdict() for ofs in orig: d.setdefault(ofs, self.node_escaped) if d is not None: lst = d.keys() sort_descrs(lst) for ofs in lst: try: if orig is None: raise KeyError node = orig[ofs] except KeyError: # field stored at exit, but not read at input. Must # still be allocated, otherwise it will be incorrectly # uninitialized after a guard failure. node = self.node_fromstart specnode = self.intersect(node, d[ofs]) fields.append((ofs, specnode)) return fields
def find_nodes_SETFIELD_GC(self, op): instnode = self.getnode(op.args[0]) fieldnode = self.getnode(op.args[1]) if instnode.escaped: fieldnode.mark_escaped() return # nothing to be gained from tracking the field field = op.descr assert isinstance(field, AbstractValue) if instnode.curfields is None: instnode.curfields = av_newdict() instnode.curfields[field] = fieldnode instnode.add_escape_dependency(fieldnode)
def find_nodes_GETFIELD_GC(self, op): instnode = self.getnode(op.args[0]) if instnode.escaped: return # nothing to be gained from tracking the field field = op.descr assert isinstance(field, AbstractValue) if instnode.curfields is not None and field in instnode.curfields: fieldnode = instnode.curfields[field] elif instnode.origfields is not None and field in instnode.origfields: fieldnode = instnode.origfields[field] elif instnode.fromstart: fieldnode = InstanceNode(fromstart=True) instnode.add_escape_dependency(fieldnode) if instnode.origfields is None: instnode.origfields = av_newdict() instnode.origfields[field] = fieldnode else: return # nothing to be gained from tracking the field self.nodes[op.result] = fieldnode