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]))
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
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)])
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