def Compare(self, initExpr, xxx_todo_changeme1): ((op, other), ) = xxx_todo_changeme1 left = build(self.expr_builder, initExpr) right = build(self.expr_builder, other) if isinstance(left, Const) and op in self._mirror_ops: left, right, op = right, left, self._mirror_ops[op] if isinstance(right, Const): if not self.mode.truth: op = self._rev_ops[op] if op == 'in' or op == 'not in': cond = compileIn(left, right.value, op == 'in') if cond is not None: return cond else: if op == 'is' or op == 'is not': if right.value is None: right = ICriterion(NoneType) else: right = ICriterion(Pointer(right.value)) if op == 'is not': right = ~right else: right = Inequality(op, right.value) return Signature([(left, right)]) # Both sides involve variables or an un-optimizable constant, # so it's a generic boolean criterion :( return expressionSignature( self.expr_builder.Compare(initExpr, ((op, other), )), self.mode)
def Compare(self,initExpr, xxx_todo_changeme1): ((op,other),) = xxx_todo_changeme1 left = build(self.expr_builder,initExpr) right = build(self.expr_builder,other) if isinstance(left,Const) and op in self._mirror_ops: left,right,op = right,left,self._mirror_ops[op] if isinstance(right,Const): if not self.mode.truth: op = self._rev_ops[op] if op=='in' or op=='not in': cond = compileIn(left,right.value,op=='in') if cond is not None: return cond else: if op=='is' or op=='is not': if right.value is None: right = ICriterion(NoneType) else: right = ICriterion(Pointer(right.value)) if op=='is not': right = ~right else: right = Inequality(op,right.value) return Signature([(left, right)]) # Both sides involve variables or an un-optimizable constant, # so it's a generic boolean criterion :( return expressionSignature( self.expr_builder.Compare(initExpr,((op,other),)), self.mode )
def CallFunc(self,funcExpr,args,kw,star,dstar): func = build(self,funcExpr) if isinstance(func,Const) and not kw and not star and not dstar: return Call(func.value, *[build(self,arg) for arg in args]) elif kw or dstar or args or star: if args: args = Tuple(tuple,*[build(self,arg) for arg in args]) if star: args = Call( operator.add, args, Call(tuple,build(self,star)) ) elif star: args = build(self,star) if kw or dstar: args = args or Const(()) if kw: kw = self.Dict(kw) if dstar: kw = Call(add_dict, kw, build(self,dstar)) elif dstar: kw = build(self,dstar) return Call(apply, func, args, kw) else: return Call(apply, func, args) else: return Call(apply,func)
def CallFunc(self, funcExpr, args, kw, star, dstar): func = build(self, funcExpr) if isinstance(func, Const) and not kw and not star and not dstar: return Call(func.value, *[build(self, arg) for arg in args]) elif kw or dstar or args or star: if args: args = Tuple(tuple, *[build(self, arg) for arg in args]) if star: args = Call(operator.add, args, Call(tuple, build(self, star))) elif star: args = build(self, star) if kw or dstar: args = args or Const(()) if kw: kw = self.Dict(kw) if dstar: kw = Call(add_dict, kw, build(self, dstar)) elif dstar: kw = build(self, dstar) return Call(apply, func, args, kw) else: return Call(apply, func, args) else: return Call(apply, func)
def method(self,left,right): return Call(op, build(self,left), build(self,right))
def Dict(self, items): keys = Tuple(tuple, *[build(self, k) for k, v in items]) vals = Tuple(tuple, *[build(self, v) for k, v in items]) return Call(dict, Call(zip, keys, vals))
def Or(self,items): return OrExpr(*[build(self,expr) for expr in items])
def Getattr(self,expr,attr): expr = build(self,expr) if isinstance(expr,Const): return Const(getattr(expr.value,attr)) return Getattr(expr,attr)
def Slice(self,start,stop): return build(self,start), build(self,stop)
def Dict(self, items): keys = Tuple(tuple, *[build(self,k) for k,v in items]) vals = Tuple(tuple, *[build(self,v) for k,v in items]) return Call(dict, Call(zip, keys, vals))
def method(self,expr): return Call(op, build(self,expr))
def Or(self, items): return OrExpr(*[build(self, expr) for expr in items])
def And(self, items): return AndExpr(*[build(self, expr) for expr in items])
def Getattr(self, expr, attr): expr = build(self, expr) if isinstance(expr, Const): return Const(getattr(expr.value, attr)) return Getattr(expr, attr)
def Sliceobj(self, *args): return Call(slice, *[build(self, arg) for arg in args])
def Slice(self, start, stop): return build(self, start), build(self, stop)
def Subscript(self, left, right): left, right = build(self, left), build(self, right) if isinstance(right, tuple): return Call(operator.getslice, left, *right) else: return Call(operator.getitem, left, right)
def method(self, items): result = build(self, items[0]) for item in items[1:]: result = Call(op, result, build(self, item)) return result
def Compare(self,initExpr, xxx_todo_changeme): ((op,other),) = xxx_todo_changeme return Call( self._cmp_ops[op], build(self,initExpr), build(self,other) )
def method(self, expr): return Call(op, build(self, expr))
def method(self,items): return Tuple(op,*[build(self,item) for item in items])
def And(self, items): return reduce(operator.and_, [build(self, expr) for expr in items])
def Subscript(self,left,right): left, right = build(self,left), build(self,right) if isinstance(right,tuple): return Call(operator.getslice,left,*right) else: return Call(operator.getitem,left,right)
def Or(self, items): return reduce(operator.or_, [build(self, expr) for expr in items])
def Sliceobj(self,*args): return Call(slice,*[build(self,arg) for arg in args])
def And(self,items): return reduce(operator.and_,[build(self,expr) for expr in items])
def And(self,items): return AndExpr(*[build(self,expr) for expr in items])
def Not(self,expr): try: self.__class__ = CriteriaBuilder return build(self,expr) finally: self.__class__ = NotBuilder
def Not(self, expr): try: self.__class__ = CriteriaBuilder return build(self, expr) finally: self.__class__ = NotBuilder
def method(self, items): return Tuple(op, *[build(self, item) for item in items])
def Or(self,items): return reduce(operator.or_,[build(self,expr) for expr in items])
def Compare(self, initExpr, xxx_todo_changeme): ((op, other), ) = xxx_todo_changeme return Call(self._cmp_ops[op], build(self, initExpr), build(self, other))
def IfElse(self, tval, cond, fval): return IfElse(build(self,tval), build(self,cond), build(self,fval))
def IfElse(self, tval, cond, fval): return IfElse(build(self, tval), build(self, cond), build(self, fval))
def method(self,items): result = build(self,items[0]) for item in items[1:]: result = Call(op, result, build(self,item)) return result
def method(self, left, right): return Call(op, build(self, left), build(self, right))