Esempio n. 1
0
 def get_attr(self, frame, anchor, name, write=False):
     from pyntch.aggregate_types import ListType
     if write: raise NodeAssignError(name)
     if name == 'close':
         return BuiltinConstMethod('file.close', NoneType.get_object())
     elif name == 'closed':
         return BoolType.get_object()
     elif name == 'encoding':
         return StrType.get_object()
     elif name == 'fileno':
         return BuiltinConstMethod('file.fileno', IntType.get_object())
     elif name == 'flush':
         return BuiltinConstMethod('file.flush', NoneType.get_object())
     elif name == 'isatty':
         return BuiltinConstMethod('file.isatty', BoolType.get_object())
     elif name == 'mode':
         return StrType.get_object()
     elif name == 'name':
         return StrType.get_object()
     elif name == 'newlines':
         return NoneType.get_object()
     elif name == 'next':
         return BuiltinConstMethod('file.next', StrType.get_object())
     elif name == 'read':
         return BuiltinConstMethod('file.read', StrType.get_object(), [],
                                   [IntType], [ErrorConfig.MaybeEOFError()])
     elif name == 'readline':
         return BuiltinConstMethod('file.readline', StrType.get_object(),
                                   [], [IntType],
                                   [ErrorConfig.MaybeEOFError()])
     elif name == 'readlines':
         return BuiltinConstMethod(
             'file.readlines', ListType.create_list(StrType.get_object()),
             [], [IntType], [ErrorConfig.MaybeEOFError()])
     elif name == 'seek':
         return BuiltinConstMethod('file.seek', NoneType.get_object(),
                                   [IntType], [IntType],
                                   [ErrorConfig.MaybeEOFError()])
     elif name == 'softspace':
         return IntType.get_object()
     elif name == 'tell':
         return BuiltinConstMethod(
             'file.tell',
             IntType.get_object(),
             expts=[ErrorConfig.MaybeFileIllegalSeek()])
     elif name == 'truncate':
         return BuiltinConstMethod('file.truncate', NoneType.get_object(),
                                   [], [IntType])
     elif name == 'write':
         return BuiltinConstMethod('file.write', NoneType.get_object(),
                                   [BaseStringType])
     elif name == 'writelines':
         return BuiltinConstMethod('file.writestrings',
                                   NoneType.get_object(),
                                   [[BaseStringType]])
     elif name == 'xreadlines':
         return self
     raise NodeAttrError(name)
Esempio n. 2
0
 def __init__(self, frame, anchor, func, objs):
   self.frame = frame
   self.anchor = anchor
   self.received = set()
   self.args = tuple( IterElement(frame, anchor, obj) for obj in objs )
   self.listobj = ListType.create_list()
   CompoundTypeNode.__init__(self, [self.listobj])
   func.connect(self.recv_func)
   return
Esempio n. 3
0
 def __init__(self, frame, anchor, func, objs):
     self.frame = frame
     self.anchor = anchor
     self.received = set()
     self.args = tuple(IterElement(frame, anchor, obj) for obj in objs)
     self.listobj = ListType.create_list()
     CompoundTypeNode.__init__(self, [self.listobj])
     func.connect(self.recv_func)
     return
Esempio n. 4
0
 def get_attr(self, frame, anchor, name, write=False):
   from pyntch.aggregate_types import ListType
   if write: raise NodeAssignError(name)
   if name == 'close':
     return BuiltinConstMethod('file.close', NoneType.get_object())
   elif name == 'closed':
     return BoolType.get_object()
   elif name == 'encoding':
     return StrType.get_object()
   elif name == 'fileno':
     return BuiltinConstMethod('file.fileno', IntType.get_object())
   elif name == 'flush':
     return BuiltinConstMethod('file.flush', NoneType.get_object())
   elif name == 'isatty':
     return BuiltinConstMethod('file.isatty', BoolType.get_object())
   elif name == 'mode':
     return StrType.get_object()
   elif name == 'name':
     return StrType.get_object()
   elif name == 'newlines':
     return NoneType.get_object()
   elif name == 'next':
     return BuiltinConstMethod('file.next', StrType.get_object())
   elif name == 'read':
     return BuiltinConstMethod('file.read', StrType.get_object(),
                               [], [IntType],
                               [ErrorConfig.MaybeEOFError()])
   elif name == 'readline':
     return BuiltinConstMethod('file.readline', StrType.get_object(),
                               [], [IntType],
                               [ErrorConfig.MaybeEOFError()])
   elif name == 'readlines':
     return BuiltinConstMethod('file.readlines', ListType.create_list(StrType.get_object()),
                               [], [IntType],
                               [ErrorConfig.MaybeEOFError()])
   elif name == 'seek':
     return BuiltinConstMethod('file.seek', NoneType.get_object(),
                               [IntType], [IntType],
                               [ErrorConfig.MaybeEOFError()])
   elif name == 'softspace':
     return IntType.get_object()
   elif name == 'tell':
     return BuiltinConstMethod('file.tell', IntType.get_object(),
                               expts=[ErrorConfig.MaybeFileIllegalSeek()])
   elif name == 'truncate':
     return BuiltinConstMethod('file.truncate', NoneType.get_object(),
                               [], [IntType])
   elif name == 'write':
     return BuiltinConstMethod('file.write', NoneType.get_object(),
                               [BaseStringType])
   elif name == 'writelines':
     return BuiltinConstMethod('file.writestrings', NoneType.get_object(),
                               [[BaseStringType]])
   elif name == 'xreadlines':
     return self
   raise NodeAttrError(name)
Esempio n. 5
0
 def call(self, frame, anchor, args, kwargs):
     if kwargs:
         frame.raise_expt(ErrorConfig.NoKeywordArgs())
         return UndefinedTypeNode.get_object()
     elems = [CompoundTypeNode() for arg1 in args]
     zipelem = TupleType.create_tuple(elements=elems)
     seq = ListType.create_list(elemall=zipelem)
     for (i, arg1) in enumerate(args):
         IterElement(frame, anchor, arg1).connect(elems[i].recv)
     return seq
Esempio n. 6
0
 def call(self, frame, anchor, args, kwargs):
   if kwargs:
     frame.raise_expt(ErrorConfig.NoKeywordArgs())
     return UndefinedTypeNode.get_object()
   elems = [ CompoundTypeNode() for arg1 in args ]
   zipelem = TupleType.create_tuple(elements=elems)
   seq = ListType.create_list(elemall=zipelem)
   for (i,arg1) in enumerate(args):
     IterElement(frame, anchor, arg1).connect(elems[i].recv)
   return seq
Esempio n. 7
0
 def __init__(self):
   BuiltinConstFunc.__init__(self, 'range', ListType.create_list(IntType.get_object()), 
                             [IntType],
                             [IntType, IntType])
   return
Esempio n. 8
0
 def __init__(self):
   BuiltinConstFunc.__init__(self, 'dir', ListType.create_list(StrType.get_object()), [], [ANY])
   return
Esempio n. 9
0
def build_expr(reporter, frame, space, tree, evals):
  from pyntch.basic_types import BUILTIN_OBJECT, IntType
  from pyntch.aggregate_types import IterType, GeneratorType, ListType, SetType, DictType, TupleType

  if isinstance(tree, ast.Const):
    typename = type(tree.value).__name__
    expr = BUILTIN_OBJECT[typename]

  elif isinstance(tree, ast.Name):
    try:
      expr = space[tree.name]
    except KeyError:
      ExecutionFrame(frame, tree).raise_expt(ErrorConfig.NameUndefined(tree.name))
      expr = UndefinedTypeNode(tree.name)

  elif isinstance(tree, ast.CallFunc):
    func = build_expr(reporter, frame, space, tree.node, evals)
    args = tuple( build_expr(reporter, frame, space, arg1, evals)
                  for arg1 in tree.args if not isinstance(arg1, ast.Keyword) )
    kwargs = dict( (arg1.name, build_expr(reporter, frame, space, arg1.expr, evals))
                   for arg1 in tree.args if isinstance(arg1, ast.Keyword) )
    star = dstar = None
    if tree.star_args:
      star = build_expr(reporter, frame, space, tree.star_args, evals)
    if tree.dstar_args:
      dstar = build_expr(reporter, frame, space, tree.dstar_args, evals)
    expr = FunCall(ExecutionFrame(frame, tree), tree, func, args, kwargs, star, dstar)

  elif isinstance(tree, ast.Getattr):
    obj = build_expr(reporter, frame, space, tree.expr, evals)
    expr = AttrRef(ExecutionFrame(frame, tree), tree, obj, tree.attrname)

  elif isinstance(tree, ast.Subscript):
    obj = build_expr(reporter, frame, space, tree.expr, evals)
    subs = [ build_expr(reporter, frame, space, sub, evals) for sub in tree.subs ]
    if len(subs) == 1:
      expr = SubRef(ExecutionFrame(frame, tree), tree, obj, subs[0])
    else:
      expr = SliceRef(ExecutionFrame(frame, tree), tree, obj, subs)
      
  elif isinstance(tree, ast.Slice):
    obj = build_expr(reporter, frame, space, tree.expr, evals)
    lower = upper = IntType.get_object() # maxint is given when omitted.
    if tree.lower:
      lower = build_expr(reporter, frame, space, tree.lower, evals)
    if tree.upper:
      upper = build_expr(reporter, frame, space, tree.upper, evals)
    assert lower != None and upper != None
    expr = SliceRef(ExecutionFrame(frame, tree), tree, obj, [lower, upper])

  elif isinstance(tree, ast.Sliceobj):
    elements = [ build_expr(reporter, frame, space, node, evals) for node in tree.nodes ]
    expr = SliceObject(ExecutionFrame(frame, tree), tree, elements)
    
  elif isinstance(tree, ast.Tuple):
    elements = [ build_expr(reporter, frame, space, node, evals) for node in tree.nodes ]
    expr = TupleType.create_tuple(elements)

  elif isinstance(tree, ast.List):
    elements = [ build_expr(reporter, frame, space, node, evals) for node in tree.nodes ]
    expr = ListType.create_list(CompoundTypeNode(elements))

  elif isinstance(tree, ast.Set):
    elements = [ build_expr(reporter, frame, space, node, evals) for node in tree.nodes ]
    expr = SetType.create_set(CompoundTypeNode(elements))

  elif isinstance(tree, ast.Dict):
    items = [ (build_expr(reporter, frame, space, k, evals),
               build_expr(reporter, frame, space, v, evals))
              for (k,v) in tree.items ]
    expr = DictType.create_dict(items)

  # +, -, *, /, %, //, **, <<, >>
  elif isinstance(tree, (ast.Add, ast.Sub, ast.Mul, ast.Div,
                         ast.Mod, ast.FloorDiv, ast.Power,
                         ast.LeftShift, ast.RightShift)):
    op = tree.__class__.__name__
    left = build_expr(reporter, frame, space, tree.left, evals)
    right = build_expr(reporter, frame, space, tree.right, evals)
    expr = BinaryOp(ExecutionFrame(frame, tree), tree, op, left, right)
    
  # &, |, ^
  elif isinstance(tree, (ast.Bitand, ast.Bitor, ast.Bitxor)):
    op = tree.__class__.__name__
    nodes = [ build_expr(reporter, frame, space, node, evals) for node in tree.nodes ]
    expr = nodes.pop(0)
    for right in nodes:
      expr = BinaryOp(ExecutionFrame(frame, tree), tree, op, expr, right)
  
  # ==, !=, <=, >=, <, >, in, not in, is, is not
  elif isinstance(tree, ast.Compare):
    left = build_expr(reporter, frame, space, tree.expr, evals)
    for (op,node) in tree.ops:
      right = build_expr(reporter, frame, space, node, evals)
      expr = CompareOp(ExecutionFrame(frame, tree), tree, op, left, right)
      left = right

  # +,-,~
  elif isinstance(tree, (ast.UnaryAdd, ast.UnarySub, ast.Invert)):
    op = tree.__class__.__name__
    value = build_expr(reporter, frame, space, tree.expr, evals)
    expr = UnaryOp(ExecutionFrame(frame, tree), tree, op, value)

  # and, or
  elif isinstance(tree, (ast.And, ast.Or)):
    op = tree.__class__.__name__
    nodes = [ build_expr(reporter, frame, space, node, evals) for node in tree.nodes ]
    expr = BooleanOp(ExecutionFrame(frame, tree), tree, op, nodes)

  # not
  elif isinstance(tree, ast.Not):
    value = build_expr(reporter, frame, space, tree.expr, evals)
    expr = NotOp(ExecutionFrame(frame, tree), tree, value)

  # lambda
  elif isinstance(tree, ast.Lambda):
    defaults = [ build_expr(reporter, frame, space, value, evals) for value in tree.defaults ]
    expr = LambdaFuncType(reporter, frame, space, tree, tree.argnames,
                          defaults, tree.varargs, tree.kwargs, tree)

  # list comprehension
  elif isinstance(tree, ast.ListComp):
    elements = [ build_expr(reporter, frame, space, tree.expr, evals) ]
    expr = ListType.create_list(CompoundTypeNode(elements))
    for qual in tree.quals:
      seq = build_expr(reporter, frame, space, qual.list, evals)
      elem = IterElement(ExecutionFrame(frame, qual.list), qual.list, seq)
      build_assign(reporter, frame, space, qual.assign, elem, evals)
      for qif in qual.ifs:
        build_expr(reporter, frame, space, qif.test, evals)

  # generator expression
  elif isinstance(tree, ast.GenExpr):
    gen = tree.code
    elements = [ build_expr(reporter, frame, space, gen.expr, evals) ]
    expr = IterType.create_iter(CompoundTypeNode(elements))
    for qual in gen.quals:
      seq = build_expr(reporter, frame, space, qual.iter, evals)
      elem = IterElement(ExecutionFrame(frame, qual.iter), qual.iter, seq)
      build_assign(reporter, frame, space, qual.assign, elem, evals)
      for qif in qual.ifs:
        build_expr(reporter, frame, space, qif.test, evals)

  # yield (for python 2.5)
  elif isinstance(tree, ast.Yield):
    value = build_expr(reporter, frame, space, tree.value, evals)
    slot = GeneratorType.create_slot(value)
    evals.append(('y', slot))
    expr = slot.received

  # ifexp
  elif isinstance(tree, ast.IfExp):
    test = build_expr(reporter, frame, space, tree.test, evals)
    then = build_expr(reporter, frame, space, tree.then, evals)
    else_ = build_expr(reporter, frame, space, tree.else_, evals)
    expr = IfExpOp(ExecutionFrame(frame, tree), tree, test, then, else_)

  # Backquote (unsupported)
  elif isinstance(tree, ast.Backquote):
    ExecutionFrame(frame, tree).raise_expt(ErrorConfig.NotSupported('backquote notation'))
    expr = UndefinedTypeNode('backquote')

  # Ellipsis
  elif isinstance(tree, ast.Ellipsis):
    ExecutionFrame(frame, tree).raise_expt(ErrorConfig.NotSupported('ellipsis'))
    expr = UndefinedTypeNode('ellipsis')
  
  else:
    # unsupported AST.
    raise SyntaxError('unsupported syntax: %r (%s:%r)' % (tree, tree._module.get_path(), tree.lineno))

  assert isinstance(expr, (TypeNode, tuple)), expr
  evals.append((None, expr))
  return expr
Esempio n. 10
0
 def process_args(self, frame, anchor, args, kwargs):
     seq = ListType.create_list(elemall=IterElement(frame, anchor, args[0]))
     ListObject.SortMethod('sorted',
                           seq).process_args(frame, anchor, args[1:],
                                             kwargs)
     return seq
Esempio n. 11
0
 def get_attr(self, frame, anchor, name, write=False):
     from pyntch.aggregate_types import TupleType, ListType
     if write: raise NodeAssignError(name)
     if name == 'capitalize':
         return BuiltinConstMethod('str.capitalize', self.get_object())
     elif name == 'center':
         return BuiltinConstMethod('str.center', self.get_object(),
                                   [IntType], [BaseStringType])
     elif name == 'count':
         return BuiltinConstMethod('str.count', IntType.get_object(),
                                   [BaseStringType], [IntType, IntType])
     elif name == 'decode':
         return BuiltinConstMethod('str.decode', UnicodeType.get_object(),
                                   [], [BaseStringType, BaseStringType],
                                   [ErrorConfig.MaybeNotDecodable()])
     elif name == 'encode':
         return BuiltinConstMethod('str.encode', StrType.get_object(), [],
                                   [BaseStringType, BaseStringType],
                                   [ErrorConfig.MaybeNotEncodable()])
     elif name == 'endswith':
         return BuiltinConstMethod('str.endswith', BoolType.get_object(),
                                   [BaseStringType], [IntType, IntType])
     elif name == 'expandtabs':
         return BuiltinConstMethod('str.expandtabs', self.get_object(), [],
                                   [IntType])
     elif name == 'find':
         return BuiltinConstMethod('str.find', IntType.get_object(),
                                   [BaseStringType], [IntType, IntType])
     elif name == 'index':
         return BuiltinConstMethod('str.index', IntType.get_object(),
                                   [BaseStringType], [IntType, IntType],
                                   [ErrorConfig.MaybeSubstringNotFound()])
     elif name == 'isalnum':
         return BuiltinConstMethod('str.isalnum', BoolType.get_object())
     elif name == 'isalpha':
         return BuiltinConstMethod('str.isalpha', BoolType.get_object())
     elif name == 'isdigit':
         return BuiltinConstMethod('str.isdigit', BoolType.get_object())
     elif name == 'islower':
         return BuiltinConstMethod('str.islower', BoolType.get_object())
     elif name == 'isspace':
         return BuiltinConstMethod('str.isspace', BoolType.get_object())
     elif name == 'istitle':
         return BuiltinConstMethod('str.istitle', BoolType.get_object())
     elif name == 'isupper':
         return BuiltinConstMethod('str.isupper', BoolType.get_object())
     elif name == 'join':
         return BuiltinConstMethod('str.join', self.get_object(),
                                   [[BaseStringType]])
     elif name == 'ljust':
         return BuiltinConstMethod('str.ljust', self.get_object(),
                                   [IntType], [BaseStringType])
     elif name == 'lower':
         return BuiltinConstMethod('str.lower', self.get_object())
     elif name == 'lstrip':
         return BuiltinConstMethod('str.lstrip', self.get_object(), [],
                                   [BaseStringType])
     elif name == 'partition':
         return BuiltinConstMethod(
             'str.partiion',
             TupleType.create_tuple(
                 [self.get_object(),
                  self.get_object(),
                  self.get_object()]), [BaseStringType])
     elif name == 'replace':
         return BuiltinConstMethod('str.replace', self.get_object(),
                                   [BaseStringType, BaseStringType],
                                   [IntType])
     elif name == 'rfind':
         return BuiltinConstMethod('str.rfind', IntType.get_object(),
                                   [BaseStringType], [IntType, IntType])
     elif name == 'rindex':
         return BuiltinConstMethod('str.rindex', IntType.get_object(),
                                   [BaseStringType], [IntType, IntType],
                                   [ErrorConfig.MaybeSubstringNotFound()])
     elif name == 'rjust':
         return BuiltinConstMethod('str.rjust', self.get_object(),
                                   [IntType], [BaseStringType])
     elif name == 'rpartition':
         return BuiltinConstMethod(
             'str.rpartiion',
             TupleType.create_tuple(
                 [self.get_object(),
                  self.get_object(),
                  self.get_object()]), [BaseStringType])
     elif name == 'rsplit':
         return BuiltinConstMethod('str.rsplit',
                                   ListType.create_list(self.get_object()),
                                   [], [BaseStringType, IntType])
     elif name == 'rstrip':
         return BuiltinConstMethod('str.rstrip', self.get_object(), [],
                                   [BaseStringType])
     elif name == 'split':
         return BuiltinConstMethod('str.split',
                                   ListType.create_list(self.get_object()),
                                   [], [BaseStringType, IntType])
     elif name == 'splitlines':
         return BuiltinConstMethod('str.splitlines',
                                   ListType.create_list(self.get_object()),
                                   [], [ANY])
     elif name == 'startswith':
         return BuiltinConstMethod('str.startswith', BoolType.get_object(),
                                   [BaseStringType], [IntType, IntType])
     elif name == 'strip':
         return BuiltinConstMethod('str.strip', self.get_object(), [],
                                   [BaseStringType])
     elif name == 'swapcase':
         return BuiltinConstMethod('str.swapcase', self.get_object())
     elif name == 'title':
         return BuiltinConstMethod('str.title', self.get_object())
     elif name == 'upper':
         return BuiltinConstMethod('str.upper', self.get_object())
     elif name == 'zfill':
         return BuiltinConstMethod('str.zfill', self.get_object(),
                                   [IntType])
     raise NodeAttrError(name)
Esempio n. 12
0
 def __init__(self):
     BuiltinConstFunc.__init__(self, 'dir',
                               ListType.create_list(StrType.get_object()),
                               [], [ANY])
     return
Esempio n. 13
0
 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
Esempio n. 14
0
 def get_attr(self, frame, anchor, name, write=False):
   from pyntch.aggregate_types import TupleType, ListType
   if write: raise NodeAssignError(name)
   if name == 'capitalize':
     return BuiltinConstMethod('str.capitalize', self.get_object())
   elif name == 'center':
     return BuiltinConstMethod('str.center', self.get_object(),
                               [IntType], [BaseStringType])
   elif name == 'count':
     return BuiltinConstMethod('str.count', IntType.get_object(),
                               [BaseStringType], [IntType, IntType])
   elif name == 'decode':
     return BuiltinConstMethod('str.decode', UnicodeType.get_object(),
                               [], [BaseStringType, BaseStringType],
                               [ErrorConfig.MaybeNotDecodable()])
   elif name == 'encode':
     return BuiltinConstMethod('str.encode', StrType.get_object(),
                               [], [BaseStringType, BaseStringType],
                               [ErrorConfig.MaybeNotEncodable()])
   elif name == 'endswith':
     return BuiltinConstMethod('str.endswith', BoolType.get_object(),
                               [BaseStringType], [IntType, IntType])
   elif name == 'expandtabs':
     return BuiltinConstMethod('str.expandtabs', self.get_object(),
                               [], [IntType])
   elif name == 'find':
     return BuiltinConstMethod('str.find', IntType.get_object(),
                               [BaseStringType], [IntType, IntType])
   elif name == 'index':
     return BuiltinConstMethod('str.index', IntType.get_object(),
                               [BaseStringType], [IntType, IntType],
                               [ErrorConfig.MaybeSubstringNotFound()])
   elif name == 'isalnum':
     return BuiltinConstMethod('str.isalnum', BoolType.get_object())
   elif name == 'isalpha':
     return BuiltinConstMethod('str.isalpha', BoolType.get_object())
   elif name == 'isdigit':
     return BuiltinConstMethod('str.isdigit', BoolType.get_object())
   elif name == 'islower':
     return BuiltinConstMethod('str.islower', BoolType.get_object())
   elif name == 'isspace':
     return BuiltinConstMethod('str.isspace', BoolType.get_object())
   elif name == 'istitle':
     return BuiltinConstMethod('str.istitle', BoolType.get_object())
   elif name == 'isupper':
     return BuiltinConstMethod('str.isupper', BoolType.get_object())
   elif name == 'join':
     return BuiltinConstMethod('str.join', self.get_object(),
                               [[BaseStringType]])
   elif name == 'ljust':
     return BuiltinConstMethod('str.ljust', self.get_object(),
                               [IntType], [BaseStringType])
   elif name == 'lower':
     return BuiltinConstMethod('str.lower', self.get_object())
   elif name == 'lstrip':
     return BuiltinConstMethod('str.lstrip', self.get_object(),
                               [], [BaseStringType])
   elif name == 'partition':
     return BuiltinConstMethod('str.partiion',
                               TupleType.create_tuple([self.get_object(), self.get_object(), self.get_object()]),
                               [BaseStringType])
   elif name == 'replace':
     return BuiltinConstMethod('str.replace', self.get_object(),
                               [BaseStringType, BaseStringType], [IntType])
   elif name == 'rfind':
     return BuiltinConstMethod('str.rfind', IntType.get_object(),
                               [BaseStringType], [IntType, IntType])
   elif name == 'rindex':
     return BuiltinConstMethod('str.rindex', IntType.get_object(),
                               [BaseStringType], [IntType, IntType],
                               [ErrorConfig.MaybeSubstringNotFound()])
   elif name == 'rjust':
     return BuiltinConstMethod('str.rjust', self.get_object(),
                               [IntType], [BaseStringType])
   elif name == 'rpartition':
     return BuiltinConstMethod('str.rpartiion',
                               TupleType.create_tuple([self.get_object(), self.get_object(), self.get_object()]),
                               [BaseStringType])
   elif name == 'rsplit':
     return BuiltinConstMethod('str.rsplit', ListType.create_list(self.get_object()),
                               [], [BaseStringType, IntType])
   elif name == 'rstrip':
     return BuiltinConstMethod('str.rstrip', self.get_object(),
                               [], [BaseStringType])
   elif name == 'split':
     return BuiltinConstMethod('str.split', ListType.create_list(self.get_object()),
                               [], [BaseStringType, IntType])
   elif name == 'splitlines':
     return BuiltinConstMethod('str.splitlines', ListType.create_list(self.get_object()),
                               [], [ANY])
   elif name == 'startswith':
     return BuiltinConstMethod('str.startswith', BoolType.get_object(),
                               [BaseStringType], [IntType, IntType])
   elif name == 'strip':
     return BuiltinConstMethod('str.strip', self.get_object(),
                               [], [BaseStringType])
   elif name == 'swapcase':
     return BuiltinConstMethod('str.swapcase', self.get_object())
   elif name == 'title':
     return BuiltinConstMethod('str.title', self.get_object())
   elif name == 'upper':
     return BuiltinConstMethod('str.upper', self.get_object())
   elif name == 'zfill':
     return BuiltinConstMethod('str.zfill', self.get_object(),
                               [IntType])
   raise NodeAttrError(name)
Esempio n. 15
0
 def process_args(self, frame, anchor, args, kwargs):
   seq = ListType.create_list(elemall=IterElement(frame, anchor, args[0]))
   ListObject.SortMethod('sorted', seq).process_args(frame, anchor, args[1:], kwargs)
   return seq
Esempio n. 16
0
 def __init__(self):
     BuiltinConstFunc.__init__(self, 'range',
                               ListType.create_list(IntType.get_object()),
                               [IntType], [IntType, IntType])
     return
Esempio n. 17
0
 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