def recv(self, src): for obj in src: if obj.is_type(TupleType.get_typeobj()): obj.connect(self.tuplechecker.recv) else: obj.connect(self.checker.recv) return
def recv_expt(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received: continue self.received.add(obj) if obj.is_type(TupleType.get_typeobj()): obj.elemall.connect(self.expt.recv) else: obj.connect(self.expt.recv) return
def recv_tuple(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received_tuple: continue self.received_tuple.add(obj) if obj.is_type(TupleType.get_typeobj()): if obj.elements: self.varargs.add(tuple(obj.elements)) else: self.varargs.add((obj.elemall, )) else: self.varargs.add((IterElement(self.frame, self.anchor, obj), )) self.recv_func(None) return
def recv_tuple(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received_tuple: continue self.received_tuple.add(obj) if obj.is_type(TupleType.get_typeobj()): if obj.elements: self.varargs.add(tuple(obj.elements)) else: self.varargs.add((obj.elemall,)) else: self.varargs.add((IterElement(self.frame, self.anchor, obj),)) self.recv_func(None) return
def recv_tupobj(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received: continue self.received.add(obj) if obj.is_type(TupleType.get_typeobj()) and obj.elements != None: # Unpack a fixed-length tuple. if (self.strict and len(obj.elements) != len(self.elements)) or len(obj.elements) < len(self.elements): self.raise_expt(ErrorConfig.NotUnpackable(obj)) else: for (src,dest) in zip(obj.elements, self.elements): src.connect(dest.recv) else: # Unpack a variable-length tuple or other iterable. elemall = IterElement(self.frame, self.anchor, obj) for dest in self.elements: elemall.connect(dest.recv) return
def recv_tupobj(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received: continue self.received.add(obj) if obj.is_type(TupleType.get_typeobj()) and obj.elements != None: # Unpack a fixed-length tuple. if (self.strict and len(obj.elements) != len(self.elements) ) or len(obj.elements) < len(self.elements): self.raise_expt(ErrorConfig.NotUnpackable(obj)) else: for (src, dest) in zip(obj.elements, self.elements): src.connect(dest.recv) else: # Unpack a variable-length tuple or other iterable. elemall = IterElement(self.frame, self.anchor, obj) for dest in self.elements: elemall.connect(dest.recv) return
def recv_tupobj(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received: continue self.received.add(obj) if obj.is_type(TupleType.get_typeobj()) and obj.elements != None: # Unpack a fixed-length tuple. if self.length: if self.length != len(obj.elements): self.raise_expt(ErrorConfig.NotUnpackable(obj)) else: for i in xrange(self.length): obj.elements[self.start + i].connect(self.recv) else: for i in xrange(self.start, len(obj.elements)): obj.elements[i].connect(self.recv) else: # Unpack a variable-length tuple or other iterable. IterElement(self.frame, self.anchor, obj).connect(self.recv) return
def recv_tupobj(self, src): from pyntch.aggregate_types import TupleType for obj in src: if obj in self.received: continue self.received.add(obj) if obj.is_type(TupleType.get_typeobj()) and obj.elements != None: # Unpack a fixed-length tuple. if self.length: if self.length != len(obj.elements): self.raise_expt(ErrorConfig.NotUnpackable(obj)) else: for i in xrange(self.length): obj.elements[self.start+i].connect(self.recv) else: for i in xrange(self.start, len(obj.elements)): obj.elements[i].connect(self.recv) else: # Unpack a variable-length tuple or other iterable. IterElement(self.frame, self.anchor, obj).connect(self.recv) return
def update_op(self, lobj, robj): from pyntch.basic_types import NumberType, IntType, BaseStringType, BUILTIN_OBJECT from pyntch.aggregate_types import ListType, ListObject, TupleType from pyntch.klass import InstanceObject if (lobj, robj) in self.received: return self.received.add((lobj, robj)) # special handling for a formatting (%) operator ltype = lobj.get_type() rtype = robj.get_type() if (lobj.is_type(BaseStringType.get_typeobj()) and self.op == 'Mod'): self.computed.add((lobj, robj)) lobj.connect(self.recv) return # for numeric operation, the one with a higher rank is chosen. if (lobj.is_type(NumberType.get_typeobj()) and robj.is_type(NumberType.get_typeobj()) and self.op in ('Add', 'Sub', 'Mul', 'Div', 'Mod', 'FloorDiv', 'Power', 'LeftShift', 'RightShift')): self.computed.add((lobj, robj)) if ltype.get_rank() < rtype.get_rank(): robj.connect(self.recv) else: lobj.connect(self.recv) return if (lobj.is_type(IntType.get_typeobj()) and robj.is_type(IntType.get_typeobj()) and self.op in ('Bitand', 'Bitor', 'Bitxor')): self.computed.add((lobj, robj)) robj.connect(self.recv) return # for string operation, only Add is supported. if (lobj.is_type(BaseStringType.get_typeobj()) and robj.is_type(BaseStringType.get_typeobj()) and self.op == 'Add'): self.computed.add((lobj, robj)) robj.connect(self.recv) return # adding lists. if (self.op == 'Add' and (lobj.is_type(ListType.get_typeobj()) and robj.is_type(ListType.get_typeobj()))): if not self.listobj: self.listobj = ListType.create_list() self.listobj.connect(self.recv) self.computed.add((lobj, robj)) lobj.connect_element(self.listobj) robj.connect_element(self.listobj) return # multiplying a list by an integer. if self.op == 'Mul': if lobj.is_type(ListType.get_typeobj()) and robj.is_type( IntType.get_typeobj()): self.computed.add((lobj, robj)) lobj.connect(self.recv) return elif lobj.is_type(IntType.get_typeobj()) and robj.is_type( ListType.get_typeobj()): self.computed.add((lobj, robj)) robj.connect(self.recv) return # adding tuples. if (self.op == 'Add' and (lobj.is_type(TupleType.get_typeobj()) and robj.is_type(TupleType.get_typeobj()))): if not self.tupleobj: self.tupleobj = TupleType.create_tuple() self.tupleobj.connect(self.recv) self.computed.add((lobj, robj)) lobj.connect_element(self.tupleobj) robj.connect_element(self.tupleobj) return # multiplying a tuple by an integer. if self.op == 'Mul': if lobj.is_type(TupleType.get_typeobj()) and robj.is_type( IntType.get_typeobj()): self.computed.add((lobj, robj)) lobj.connect(self.recv) return elif lobj.is_type(IntType.get_typeobj()) and robj.is_type( TupleType.get_typeobj()): self.computed.add((lobj, robj)) robj.connect(self.recv) return # other valid operations. k = (ltype.typename(), self.op, rtype.typename()) if k in self.VALID_TYPES: self.computed.add((lobj, robj)) BUILTIN_OBJECT[self.VALID_TYPES[k]].connect(self.recv) return # Handle optional methods. if isinstance(lobj, InstanceObject): result = OptMethodCall(self.frame, self.anchor, lobj, self.LMETHOD[self.op], [robj]) result.connect(lambda src: self.recv_result(src, (lobj, robj))) if isinstance(robj, InstanceObject): result = OptMethodCall(self.frame, self.anchor, robj, self.RMETHOD[self.op], [lobj]) result.connect(lambda src: self.recv_result(src, (lobj, robj))) return
def update_op(self, lobj, robj): from pyntch.basic_types import NumberType, IntType, BaseStringType, BUILTIN_OBJECT from pyntch.aggregate_types import ListType, ListObject, TupleType from pyntch.klass import InstanceObject if (lobj,robj) in self.received: return self.received.add((lobj,robj)) # special handling for a formatting (%) operator ltype = lobj.get_type() rtype = robj.get_type() if (lobj.is_type(BaseStringType.get_typeobj()) and self.op == 'Mod'): self.computed.add((lobj,robj)) lobj.connect(self.recv) return # for numeric operation, the one with a higher rank is chosen. if (lobj.is_type(NumberType.get_typeobj()) and robj.is_type(NumberType.get_typeobj()) and self.op in ('Add','Sub','Mul','Div','Mod','FloorDiv','Power','LeftShift','RightShift')): self.computed.add((lobj,robj)) if ltype.get_rank() < rtype.get_rank(): robj.connect(self.recv) else: lobj.connect(self.recv) return if (lobj.is_type(IntType.get_typeobj()) and robj.is_type(IntType.get_typeobj()) and self.op in ('Bitand','Bitor','Bitxor')): self.computed.add((lobj,robj)) robj.connect(self.recv) return # for string operation, only Add is supported. if (lobj.is_type(BaseStringType.get_typeobj()) and robj.is_type(BaseStringType.get_typeobj()) and self.op == 'Add'): self.computed.add((lobj,robj)) robj.connect(self.recv) return # adding lists. if (self.op == 'Add' and (lobj.is_type(ListType.get_typeobj()) and robj.is_type(ListType.get_typeobj()))): if not self.listobj: self.listobj = ListType.create_list() self.listobj.connect(self.recv) self.computed.add((lobj,robj)) lobj.connect_element(self.listobj) robj.connect_element(self.listobj) return # multiplying a list by an integer. if self.op == 'Mul': if lobj.is_type(ListType.get_typeobj()) and robj.is_type(IntType.get_typeobj()): self.computed.add((lobj,robj)) lobj.connect(self.recv) return elif lobj.is_type(IntType.get_typeobj()) and robj.is_type(ListType.get_typeobj()): self.computed.add((lobj,robj)) robj.connect(self.recv) return # adding tuples. if (self.op == 'Add' and (lobj.is_type(TupleType.get_typeobj()) and robj.is_type(TupleType.get_typeobj()))): if not self.tupleobj: self.tupleobj = TupleType.create_tuple() self.tupleobj.connect(self.recv) self.computed.add((lobj,robj)) lobj.connect_element(self.tupleobj) robj.connect_element(self.tupleobj) return # multiplying a tuple by an integer. if self.op == 'Mul': if lobj.is_type(TupleType.get_typeobj()) and robj.is_type(IntType.get_typeobj()): self.computed.add((lobj,robj)) lobj.connect(self.recv) return elif lobj.is_type(IntType.get_typeobj()) and robj.is_type(TupleType.get_typeobj()): self.computed.add((lobj,robj)) robj.connect(self.recv) return # other valid operations. k = (ltype.typename(), self.op, rtype.typename()) if k in self.VALID_TYPES: self.computed.add((lobj,robj)) BUILTIN_OBJECT[self.VALID_TYPES[k]].connect(self.recv) return # Handle optional methods. if isinstance(lobj, InstanceObject): result = OptMethodCall(self.frame, self.anchor, lobj, self.LMETHOD[self.op], [robj]) result.connect(lambda src: self.recv_result(src, (lobj, robj))) if isinstance(robj, InstanceObject): result = OptMethodCall(self.frame, self.anchor, robj, self.RMETHOD[self.op], [lobj]) result.connect(lambda src: self.recv_result(src, (lobj, robj))) return