示例#1
0
 def recv_target(self, src):
   for obj in src:
     if obj in self.received: continue
     self.received.add(obj)
     try:
       iterobj = obj.get_reversed(self.frame, self.anchor)
       frame1 = ExceptionCatcher(self.frame)
       frame1.add_handler(StopIterationType.get_typeobj())
       MethodCall(frame1, self.anchor, iterobj, 'next').connect(self.recv)
     except NodeTypeError:
       self.frame.raise_expt(ErrorConfig.NotIterable(obj))
   return
 def recv_target(self, src):
     for obj in src:
         if obj in self.received: continue
         self.received.add(obj)
         try:
             iterobj = obj.get_reversed(self.frame, self.anchor)
             frame1 = ExceptionCatcher(self.frame)
             frame1.add_handler(StopIterationType.get_typeobj())
             MethodCall(frame1, self.anchor, iterobj,
                        'next').connect(self.recv)
         except NodeTypeError:
             self.frame.raise_expt(ErrorConfig.NotIterable(obj))
     return
示例#3
0
文件: syntax.py 项目: euske/pyntch
def build_stmt(reporter, frame, space, tree, evals, isfuncdef=False, parent_space=None):
  from pyntch.basic_types import NoneType, StrType
  from pyntch.module import ModuleNotFound
  from pyntch.config import ErrorConfig
  assert isinstance(frame, ExecutionFrame)

  if isinstance(tree, ast.Module):
    build_stmt(reporter, frame, space, tree.node, evals)
  
  # def
  elif isinstance(tree, ast.Function):
    name = tree.name
    defaults = [ build_expr(reporter, frame, space, value, evals) for value in tree.defaults ]
    parent_space = parent_space or space # class definition
    func = FuncType(reporter, frame, parent_space, tree, name, tree.argnames,
                    defaults, tree.varargs, tree.kwargs, tree)
    if tree.decorators:
      for node in tree.decorators:
        decor = build_expr(reporter, frame, space, node, evals)
        func = FunCall(ExecutionFrame(frame, node), node, decor, (func,))
    space[name].bind(func)

  # class
  elif isinstance(tree, ast.Class):
    name = tree.name
    bases = [ build_expr(reporter, frame, space, base, evals) for base in tree.bases ]
    klass = PythonClassType(reporter, frame, space, tree, name, bases, evals, tree)
    space[name].bind(klass)

  # assign
  elif isinstance(tree, ast.Assign):
    for n in tree.nodes:
      value = build_expr(reporter, frame, space, tree.expr, evals)
      build_assign(reporter, frame, space, n, value, evals)

  # augassign
  elif isinstance(tree, ast.AugAssign):
    left = build_expr(reporter, frame, space, tree.node, evals)
    if isinstance(left, UndefinedTypeNode):
      # ignore an undefined variable.
      pass
    else:
      right = build_expr(reporter, frame, space, tree.expr, evals)
      value = AssignOp(ExecutionFrame(frame, tree), tree, tree.op, left, right)
      build_assign(reporter, frame, space, tree.node, value, evals)

  # return
  elif isinstance(tree, ast.Return):
    value = build_expr(reporter, frame, space, tree.value, evals)
    evals.append(('r', value))
    return True

  # yield (for python 2.4)
  elif isinstance(tree, ast.Yield):
    value = build_expr(reporter, frame, space, tree.value, evals)
    evals.append(('y', value))
    return True

  # (mutliple statements)
  elif isinstance(tree, ast.Stmt):
    stmt = None
    exit = False
    for stmt in tree.nodes:
      exit = build_stmt(reporter, frame, space, stmt, evals, parent_space=parent_space)
    if isfuncdef and not exit:
      # if the last statement is not a Return or Raise
      value = NoneType.get_object()
      evals.append(('r', value))
    return exit

  # if, elif, else
  elif isinstance(tree, ast.If):
    for (expr,stmt) in tree.tests:
      value = build_expr(reporter, frame, space, expr, evals)
      exit = build_stmt(reporter, frame, space, stmt, evals)
    if tree.else_:
      exit = build_stmt(reporter, frame, space, tree.else_, evals) and exit
    else:
      exit = False
    return exit

  # for
  elif isinstance(tree, ast.For):
    seq = build_expr(reporter, frame, space, tree.list, evals)
    elem = IterElement(ExecutionFrame(frame, tree.list), tree.list, seq)
    build_assign(reporter, frame, space, tree.assign, elem, evals)
    exit = build_stmt(reporter, frame, space, tree.body, evals)
    if tree.else_:
      exit = build_stmt(reporter, frame, space, tree.else_, evals) and exit
    return exit

  # while
  elif isinstance(tree, ast.While):
    value = build_expr(reporter, frame, space, tree.test, evals)
    exit = build_stmt(reporter, frame, space, tree.body, evals)
    if tree.else_:
      exit = build_stmt(reporter, frame, space, tree.else_, evals) and exit
    return exit

  # try ... except
  elif isinstance(tree, ast.TryExcept):
    catcher = ExceptionCatcher(frame)
    for (expr,e,stmt) in tree.handlers:
      if expr:
        expts = build_expr(reporter, frame, space, expr, evals)
        handler = catcher.add_handler(expts)
        if e:
          build_assign(reporter, handler, space, e, handler.var, evals)
      else:
        handler = catcher.add_handler(None)
      exit = build_stmt(reporter, handler, space, stmt, evals)
    exit = build_stmt(reporter, catcher, space, tree.body, evals) and exit
    if tree.else_:
      exit = build_stmt(reporter, frame, space, tree.else_, evals) and exit
    return exit

  # try ... finally
  elif isinstance(tree, ast.TryFinally):
    exit = build_stmt(reporter, frame, space, tree.body, evals)
    exit = build_stmt(reporter, frame, space, tree.final, evals) and exit
    return exit

  # raise
  elif isinstance(tree, ast.Raise):
    # XXX ignoring tree.expr3 (what is this for anyway?)
    if tree.expr2:
      expttype = build_expr(reporter, frame, space, tree.expr1, evals)
      exptarg = build_expr(reporter, frame, space, tree.expr2, evals)
      ExceptionMaker(ExecutionFrame(frame, tree), tree, expttype, (exptarg,))
    elif tree.expr1:
      expttype = build_expr(reporter, frame, space, tree.expr1, evals)
      ExceptionMaker(ExecutionFrame(frame, tree), tree, expttype, ())
    else:
      # re-raise
      frame.set_reraise()
    return True

  # printnl
  elif isinstance(tree, (ast.Print, ast.Printnl)):
    for node in tree.nodes:
      value = build_expr(reporter, frame, space, node, evals)
      StrType.StrConverter(ExecutionFrame(frame, node), tree, value)

  # discard
  elif isinstance(tree, ast.Discard):
    value = build_expr(reporter, frame, space, tree.expr, evals)

  # pass, break, continue
  elif isinstance(tree, (ast.Pass, ast.Break, ast.Continue)):
    pass

  # import
  elif isinstance(tree, ast.Import):
    for (name,asname) in tree.names:
      try:
        modules = tree._module.load_module(name)
        if asname:
          space[asname].bind(modules[-1])
        else:
          asname = name.split('.')[0]
          space[asname].bind(modules[0])
      except ModuleNotFound, e:
        ErrorConfig.module_not_found(e.name)
示例#4
0
def IterElement(frame0, anchor, target):
    frame1 = ExceptionCatcher(frame0)
    frame1.add_handler(StopIterationType.get_typeobj())
    return MethodCall(frame1, anchor, IterRef(frame0, anchor, target), 'next')
示例#5
0
def IterElement(frame0, anchor, target):
  frame1 = ExceptionCatcher(frame0)
  frame1.add_handler(StopIterationType.get_typeobj())
  return MethodCall(frame1, anchor, IterRef(frame0, anchor, target), 'next')