示例#1
0
文件: pair.py 项目: sadboy/AsdlPy
 def visit_SetUpdate(self, node):
     if isinstance(node.target, MSymbol):
         return
     if dha.isfixset(node.target):
         return
     
     op = dha.UpAdd() if dha.isAddUpdate(node) else dha.UpRemove()
     cont = dha.Name(node.target)
     elem = self.visit(node.value)
     return dha.SetUpdate(self.getMemSym(elem._t),
                          op, dha.Tuple([cont, elem]))
示例#2
0
文件: pair.py 项目: sadboy/AsdlPy
 def visit_SetUpdate(self, node):
     self.generic_visit(node)
     
     ssym = node.target
     if isfield(ssym):
         attr = ssym.attr
         
         cont, val = matchpair(dka.copy(node.value))
         dka.assertnodetype(cont, {dha.Name, dha.PatVar})
         
         if dha.isAddUpdate(node):
             newnode = dha.AttrUpdate(cont.id, attr, val)
         else:
             newnode = dha.DelAttr(cont.id, attr)
         
         return [newnode, node]
     
     return node
示例#3
0
 def visit_SetUpdate(self, node):
     isaddup = dha.isAddUpdate(node)
     
     if node.op.mod is not dha.UP_NONSTRICT:
         return
     
     has = dha.Match(dha.PatMatch(dha.valueToPattern(dka.copy(node.value)),
                                  dha.Name(node.target)),
                     dka.Symtab())
     if isaddup:
         test = dha.UnaryOp(dha.Not(), has)
     else:
         test = has
     
     newupdate = dka.copy(node)
     newupdate.op.mod = dha.UP_STRICT
     
     blk = dha.Block([newupdate])
     return dha.If([dha.CondCase(test, blk)])
示例#4
0
    def visit_SetUpdate(self, node):
        sym = node.target
        if hasattr(sym, 'needsmulti') and sym.needsmulti:
            self.multisyms.add(sym)
        else:
            return
        
        isaddup = dha.isAddUpdate(node)
        has = dha.Match(dha.PatMatchName(dha.valueToPattern(dka.copy(node.value)),
                                         node.target),
                        dka.Symtab())
        
        if isaddup:
            test1 = dha.UnaryOp(dha.Not(), has)
            inc1 = dha.RefUpdate(node.target, dka.copy(node.op), dka.copy(node.value))
            inc2 = dka.copy(inc1)
            
            body = dha.Block([dka.copy(node),
                              inc1])
            orelse = dha.Block([inc2])
            
            code = dha.If([dha.CondCase(test1, body)], orelse)
        
        else:
            test1 = has
            test2 = dha.BinOp(dha.GetRefCount(node.target, dka.copy(node.value)),
                              dha.Eq(),
                              dha.Num(0))
            body2 = dha.Block([dka.copy(node)])
            remif = dha.If([dha.CondCase(test2, body2)])
            body1 = [dha.RefUpdate(node.target, dka.copy(node.op), dka.copy(node.value)),
                     remif]
#            code = dha.If([dha.CondCase(test1, body1)])
            code = body1
        
        return code