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
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)
def IterElement(frame0, anchor, target): frame1 = ExceptionCatcher(frame0) frame1.add_handler(StopIterationType.get_typeobj()) return MethodCall(frame1, anchor, IterRef(frame0, anchor, target), 'next')
def IterElement(frame0, anchor, target): frame1 = ExceptionCatcher(frame0) frame1.add_handler(StopIterationType.get_typeobj()) return MethodCall(frame1, anchor, IterRef(frame0, anchor, target), 'next')