Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
 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)
Пример #6
0
 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)
Пример #7
0
 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
Пример #8
0
 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