132 """Recursive function transforming a @body to a block expression
134 - AST to append to body (real python statements)
135 - a list of blocks, ie list of affblock, ie list of ExprAff (AST)"""
143 for statement
in body:
145 if isinstance(statement, ast.Assign):
146 src = self.transformer.visit(statement.value)
147 dst = self.transformer.visit(statement.targets[0])
149 if (isinstance(dst, ast.Name)
and
150 dst.id
not in argument_names
and
151 dst.id
not in self.
_ctx):
154 statement.value = src
155 real_body.append(statement)
160 res = ast.Call(func=ast.Name(id=
'ExprAff',
167 blocks[-1][-1].append(res)
169 elif (isinstance(statement, ast.Expr)
and
170 isinstance(statement.value, ast.Str)):
172 real_body.append(statement)
174 elif (isinstance(statement, ast.If)
and
175 not statement.orelse):
177 cond = statement.test
180 lbl_end = ast.Name(id=
'lbl_end', ctx=ast.Load())
181 lbl_if = ast.Name(id=
'lbl_if', ctx=ast.Load())
182 dst = ast.Call(func=ast.Name(id=
'ExprCond',
191 if (isinstance(cond, ast.UnaryOp)
and
192 isinstance(cond.op, ast.Not)):
194 dst.args[1:] = dst.args[1:][::-1]
195 dst.args[0] = cond.operand
197 IRDst = ast.Attribute(value=ast.Name(id=
'ir',
199 attr=
'IRDst', ctx=ast.Load())
200 blocks[-1][-1].append(ast.Call(func=ast.Name(id=
'ExprAff',
208 sub_blocks, sub_body = self.
_parse_body(statement.body,
210 if len(sub_blocks) > 1:
211 raise RuntimeError(
"Imbricated if unimplemented")
214 jmp_end = ast.Call(func=ast.Name(id=
'ExprAff',
216 args=[IRDst, lbl_end],
220 sub_blocks[-1][-1].append(jmp_end)
221 sub_blocks[-1][-1] = ast.List(elts=sub_blocks[-1][-1],
223 sub_blocks[-1] = ast.List(elts=sub_blocks[-1],
227 lbl_if_name = ast.Attribute(value=ast.Name(id=
'lbl_if',
229 attr=
'name', ctx=ast.Load())
231 sub_blocks[-1] = ast.Call(func=ast.Name(id=
'irbloc',
239 real_body += sub_body
246 raise RuntimeError(
"Unimplemented %s" % statement)
248 return blocks, real_body