1 import sys
2 import inspect
3 import compiler
4 from urllib import quote
5
6 from dap.lib import encode_atom
7
8
16
18
19 if self.eval(node.iter) == self.seq:
20
21 self.scope[node.assign.name] = self.seq
22
23
24 self.visit(node.assign)
25 self.visit(node.iter)
26 for if_ in node.ifs:
27 self.visit(if_)
28
30
31 if self.eval(node.list) == self.seq:
32
33 self.scope[node.assign.name] = self.seq
34
35
36 self.visit(node.assign)
37 self.visit(node.list)
38 for if_ in node.ifs:
39 self.visit(if_)
40
42
43
44 if len(node.ops) > 1:
45 left = node.expr
46 out = []
47 for op in node.ops:
48 out.append(compiler.ast.Compare(left, [op]))
49 left = op[1]
50 new_node = compiler.ast.And(out)
51 self.visit(new_node)
52
53 else:
54
55 a, op, b = node.getChildren()
56 ops = ['<', '>', '==', '!=', '<=', '>=']
57 if op in ops:
58 a = self.eval(a)
59 b = self.eval(b)
60
61
62
63 if hasattr(a, 'id'): a = a.id
64 else: a = quote(encode_atom(a))
65
66 if hasattr(b, 'id'): b = b.id
67 else: b = quote(encode_atom(b))
68
69
70 if op == '==': op = '='
71 filter_ = '%s%s%s' % (a, op, b)
72 self.filters.append(filter_)
73
75 raise Exception('OR not supported by the DAP spec!')
76
77 - def eval(self, node):
78 """
79 Eval node.
80
81 This is done by converting the node to bytecode and
82 eval()ing the bytecode in the instance scope.
83 """
84 ast = compiler.ast.Expression(node)
85 ast.filename = 'dummy'
86 c = compiler.pycodegen.ExpressionCodeGenerator(ast)
87 obj = eval(c.getCode(), self.scope)
88
89 return obj
90
91
93
94
95
96 frame = sys._getframe(2)
97
98
99 fname, lineno, func, src, index = inspect.getframeinfo(frame)
100 scope = frame.f_globals
101
102
103 if src:
104 src = src[0].strip()
105 if src.endswith(':'): src = '%s pass' % src
106
107
108 visitor = ASTVisitor(scope, seq)
109 try:
110 ast = compiler.parse(src)
111 compiler.walk(ast, visitor)
112 except:
113 pass
114
115 return visitor.filters
116