1.1 --- a/simplify.py Sat Sep 02 23:43:46 2006 +0200
1.2 +++ b/simplify.py Sat Sep 30 18:54:06 2006 +0200
1.3 @@ -123,17 +123,23 @@
1.4 return self.result
1.5
1.6 def visitGetattr(self, getattr):
1.7 - result = LoadAttr(getattr, name=getattr.attrname)
1.8 - result.expr = self.dispatch(getattr.expr)
1.9 + result = LoadAttr(getattr,
1.10 + name=getattr.attrname,
1.11 + expr=self.dispatch(getattr.expr)
1.12 + )
1.13 return result
1.14
1.15 def visitKeyword(self, keyword):
1.16 - result = Keyword(keyword, name=keyword.name)
1.17 - result.expr = self.dispatch(keyword.expr)
1.18 + result = Keyword(keyword,
1.19 + name=keyword.name,
1.20 + expr=self.dispatch(keyword.expr)
1.21 + )
1.22 return result
1.23
1.24 def visitGlobal(self, global_):
1.25 - result = Global(global_, names=global_.names)
1.26 + result = Global(global_,
1.27 + names=global_.names
1.28 + )
1.29 return result
1.30
1.31 def visitImport(self, import_):
1.32 @@ -166,8 +172,9 @@
1.33 return result
1.34
1.35 def visitReturn(self, return_):
1.36 - result = Return(return_)
1.37 - result.expr = self.dispatch(return_.value)
1.38 + result = Return(return_,
1.39 + expr=self.dispatch(return_.value)
1.40 + )
1.41 return result
1.42
1.43 def visitBreak(self, break_):
1.44 @@ -175,8 +182,11 @@
1.45 return result
1.46
1.47 def visitContinue(self, continue_):
1.48 - result = Invoke(continue_, same_frame=1, produces_result=0, star=None, dstar=None, args=[])
1.49 - result.expr = LoadRef(ref=self.current_subprograms[-1])
1.50 + result = Invoke(continue_,
1.51 + same_frame=1, produces_result=0,
1.52 + star=None, dstar=None, args=[],
1.53 + expr=LoadRef(ref=self.current_subprograms[-1])
1.54 + )
1.55 return result
1.56
1.57 def visitRaise(self, raise_):
1.58 @@ -266,7 +276,9 @@
1.59 Try (body)
1.60 (else)
1.61 (handler) -> Conditional (test) -> (stmt)
1.62 + (body) -> ...
1.63 (else) -> Conditional (test) -> (stmt)
1.64 + (body) -> ...
1.65 (else) -> ...
1.66 """
1.67
1.68 @@ -526,13 +538,33 @@
1.69
1.70 def visitAdd(self, add):
1.71
1.72 - # NOTE: Strictly one of the choices must be evaluated, never more than one.
1.73 + """
1.74 + Emulate the current mechanisms by producing nodes as follows:
1.75 +
1.76 + Try (body) -> x.__add__(y)
1.77 + (else)
1.78 + (handler) -> Conditional (test) -> isinstance(exc, TypeError)
1.79 + (body) -> y.__radd__(x)
1.80 + (else)
1.81 + """
1.82
1.83 - result = Choice(add)
1.84 - result.choices = [
1.85 - Invoke(expr=LoadAttr(expr=self.dispatch(add.left), name="__add__"), args=[self.dispatch(add.right)], star=None, dstar=None),
1.86 - Invoke(expr=LoadAttr(expr=self.dispatch(add.right), name="__radd__"), args=[self.dispatch(add.left)], star=None, dstar=None)
1.87 - ]
1.88 + result = Try(add,
1.89 + body=[
1.90 + Invoke(expr=LoadAttr(expr=self.dispatch(add.left), name="__add__"), args=[self.dispatch(add.right)], star=None, dstar=None)
1.91 + ],
1.92 + else_=[],
1.93 + finally_=[],
1.94 + handler=[
1.95 + Conditional(
1.96 + test=Invoke(expr=LoadName(name="isinstance"), args=[LoadExc(), LoadName(name="TypeError")], star=None, dstar=None),
1.97 + body=[
1.98 + Invoke(expr=LoadAttr(expr=self.dispatch(add.right), name="__radd__"), args=[self.dispatch(add.left)], star=None, dstar=None)
1.99 + ],
1.100 + else_=[]
1.101 + )
1.102 + ]
1.103 + )
1.104 +
1.105 return result
1.106
1.107 # Assignments.
1.108 @@ -550,13 +582,21 @@
1.109 # Simple augmented assignment: name += expr
1.110
1.111 if isinstance(augassign.node, compiler.ast.Name):
1.112 - name = augassign.node
1.113 - node = self.dispatch(name)
1.114 - get_incremented = StoreTemp(
1.115 - expr=Invoke(expr=LoadAttr(expr=node, name=self.augassign_methods[augassign.op]), args=[expr], star=None, dstar=None)
1.116 - )
1.117 - store = StoreName(expr=LoadTemp(), name=name.name)
1.118 - result.code = [get_incremented, store, ReleaseTemp()]
1.119 + result.code = [
1.120 + StoreTemp(
1.121 + expr=Invoke(
1.122 + args=[expr], star=None, dstar=None,
1.123 + expr=LoadAttr(
1.124 + expr=self.dispatch(augassign.node),
1.125 + name=self.augassign_methods[augassign.op]
1.126 + )
1.127 + )
1.128 + ),
1.129 + StoreName(
1.130 + expr=LoadTemp(),
1.131 + name=augassign.node.name),
1.132 + ReleaseTemp()
1.133 + ]
1.134
1.135 # Complicated augmented assignment: lvalue.attr += expr
1.136
1.137 @@ -564,14 +604,31 @@
1.138
1.139 # <lvalue> -> setattr(<lvalue>, getattr(<lvalue>, "attr").__xxx__(expr))
1.140
1.141 - getattr = augassign.node
1.142 - store_expr = StoreTemp(index="expr", expr=self.dispatch(getattr.expr))
1.143 - node_attr = LoadAttr(expr=LoadTemp(index="expr"), name=getattr.attrname)
1.144 - get_incremented = StoreTemp(
1.145 - expr=Invoke(expr=LoadAttr(expr=node_attr, name=self.augassign_methods[augassign.op]), args=[expr], star=None, dstar=None)
1.146 - )
1.147 - store = StoreAttr(expr=LoadTemp(), lvalue=LoadTemp(index="expr"), name=getattr.attrname)
1.148 - result.code = [store_expr, get_incremented, store, ReleaseTemp(index="expr"), ReleaseTemp()]
1.149 + result.code = [
1.150 + StoreTemp(
1.151 + index="expr",
1.152 + expr=self.dispatch(augassign.node.expr)
1.153 + ),
1.154 + StoreTemp(
1.155 + expr=Invoke(
1.156 + args=[expr], star=None, dstar=None,
1.157 + expr=LoadAttr(
1.158 + expr=LoadAttr(
1.159 + expr=LoadTemp(index="expr"),
1.160 + name=augassign.node.attrname
1.161 + ),
1.162 + name=self.augassign_methods[augassign.op]
1.163 + )
1.164 + )
1.165 + ),
1.166 + StoreAttr(
1.167 + expr=LoadTemp(),
1.168 + lvalue=LoadTemp(index="expr"),
1.169 + name=augassign.node.attrname
1.170 + ),
1.171 + ReleaseTemp(index="expr"),
1.172 + ReleaseTemp()
1.173 + ]
1.174
1.175 # Complicated augassign using slices: lvalue[lower:upper] += expr
1.176
1.177 @@ -579,17 +636,34 @@
1.178
1.179 # <lvalue>, <lower>, <upper> -> <lvalue>.__setslice__(<lower>, <upper>, <lvalue>.__getslice__(<lower>, <upper>).__xxx__(expr))
1.180
1.181 - slice = augassign.node
1.182 - store_expr = StoreTemp(index="expr", expr=self.dispatch(slice.expr))
1.183 - store_lower = StoreTemp(index="lower", expr=self.dispatch_or_none(slice.lower))
1.184 - store_upper = StoreTemp(index="upper", expr=self.dispatch_or_none(slice.upper))
1.185 - node_slice = self._visitSlice(slice, LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_APPLY")
1.186 - get_incremented = StoreTemp(
1.187 - expr=Invoke(expr=LoadAttr(expr=node_slice, name=self.augassign_methods[augassign.op]), args=[expr], star=None, dstar=None)
1.188 - )
1.189 - store = self._visitSlice(slice, LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_ASSIGN", LoadTemp())
1.190 - result.code = [store_expr, store_lower, store_upper, get_incremented, store,
1.191 - ReleaseTemp(index="expr"), ReleaseTemp(index="lower"), ReleaseTemp(index="upper"), ReleaseTemp()]
1.192 + result.code = [
1.193 + StoreTemp(
1.194 + index="expr",
1.195 + expr=self.dispatch(augassign.node.expr)
1.196 + ),
1.197 + StoreTemp(
1.198 + index="lower",
1.199 + expr=self.dispatch_or_none(augassign.node.lower)
1.200 + ),
1.201 + StoreTemp(
1.202 + index="upper",
1.203 + expr=self.dispatch_or_none(augassign.node.upper)
1.204 + ),
1.205 + StoreTemp(
1.206 + expr=Invoke(
1.207 + args=[expr], star=None, dstar=None,
1.208 + expr=LoadAttr(
1.209 + expr=self._visitSlice(augassign.node, LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_APPLY"),
1.210 + name=self.augassign_methods[augassign.op]
1.211 + )
1.212 + )
1.213 + ),
1.214 + self._visitSlice(augassign.node, LoadTemp(index="expr"), LoadTemp(index="lower"), LoadTemp(index="upper"), "OP_ASSIGN", LoadTemp()),
1.215 + ReleaseTemp(index="expr"),
1.216 + ReleaseTemp(index="lower"),
1.217 + ReleaseTemp(index="upper"),
1.218 + ReleaseTemp()
1.219 + ]
1.220
1.221 # Complicated augassign using subscripts: lvalue[subs] += expr
1.222
1.223 @@ -597,16 +671,23 @@
1.224
1.225 # <lvalue>, <subs> -> <lvalue>.__setitem__(<subs>, <lvalue>.__getitem__(<subs>).__xxx__(expr))
1.226
1.227 - subscript = augassign.node
1.228 - store_expr = StoreTemp(index="expr", expr=self.dispatch(subscript.expr))
1.229 - subs = self._visitSubscriptSubs(subscript.subs)
1.230 - store_subs = StoreTemp(index="subs", expr=subs)
1.231 - node_subscript = self._visitSubscript(subscript, LoadTemp(index="expr"), LoadTemp(index="subs"), "OP_APPLY")
1.232 - get_incremented = StoreTemp(
1.233 - expr=Invoke(expr=LoadAttr(expr=node_subscript, name=self.augassign_methods[augassign.op]), args=[expr], star=None, dstar=None)
1.234 - )
1.235 - store = self._visitSubscript(subscript, LoadTemp(index="expr"), LoadTemp(index="subs"), "OP_ASSIGN", LoadTemp())
1.236 - result.code = [store_expr, store_subs, get_incremented, store, ReleaseTemp(index="expr"), ReleaseTemp(index="subs"), ReleaseTemp()]
1.237 + result.code = [
1.238 + StoreTemp(index="expr", expr=self.dispatch(augassign.node.expr)),
1.239 + StoreTemp(index="subs", expr=self._visitSubscriptSubs(augassign.node.subs)),
1.240 + StoreTemp(
1.241 + expr=Invoke(
1.242 + args=[expr], star=None, dstar=None,
1.243 + expr=LoadAttr(
1.244 + expr=self._visitSubscript(augassign.node, LoadTemp(index="expr"), LoadTemp(index="subs"), "OP_APPLY"),
1.245 + name=self.augassign_methods[augassign.op]
1.246 + )
1.247 + )
1.248 + ),
1.249 + self._visitSubscript(augassign.node, LoadTemp(index="expr"), LoadTemp(index="subs"), "OP_ASSIGN", LoadTemp()),
1.250 + ReleaseTemp(index="expr"),
1.251 + ReleaseTemp(index="subs"),
1.252 + ReleaseTemp()
1.253 + ]
1.254
1.255 else:
1.256 raise NotImplementedError, augassign.node.__class__
1.257 @@ -673,9 +754,8 @@
1.258 return result
1.259
1.260 def visitSlice(self, slice, in_sequence=0):
1.261 - value = self._visitAssNameOrAttr(slice, in_sequence)
1.262 return self._visitSlice(slice, self.dispatch(slice.expr), self.dispatch_or_none(slice.lower),
1.263 - self.dispatch_or_none(slice.upper), slice.flags, value)
1.264 + self.dispatch_or_none(slice.upper), slice.flags, self._visitAssNameOrAttr(slice, in_sequence))
1.265
1.266 def _visitSubscript(self, subscript, expr, subs, flags, value=None):
1.267 if flags == "OP_ASSIGN":
1.268 @@ -705,9 +785,10 @@
1.269 return Invoke(expr=LoadName(name="tuple"), args=self.dispatches(subs), star=None, dstar=None)
1.270
1.271 def visitSubscript(self, subscript, in_sequence=0):
1.272 - value = self._visitAssNameOrAttr(subscript, in_sequence)
1.273 - subs = self._visitSubscriptSubs(subscript.subs)
1.274 - return self._visitSubscript(subscript, self.dispatch(subscript.expr), subs, subscript.flags, value)
1.275 + return self._visitSubscript(
1.276 + subscript, self.dispatch(subscript.expr), self._visitSubscriptSubs(subscript.subs), subscript.flags,
1.277 + self._visitAssNameOrAttr(subscript, in_sequence)
1.278 + )
1.279
1.280 # Invocation and subprogram transformations.
1.281
1.282 @@ -729,10 +810,18 @@
1.283
1.284 # Make a definition of the class associating it with a name.
1.285
1.286 - result = Assign(class_)
1.287 - store = StoreName(name=class_.name, expr=LoadRef(ref=structure))
1.288 - init = Invoke(expr=LoadRef(ref=subprogram), args=[], star=None, dstar=None)
1.289 - result.code = [store, init]
1.290 + result = Assign(class_,
1.291 + code=[
1.292 + StoreName(
1.293 + name=class_.name,
1.294 + expr=LoadRef(ref=structure)
1.295 + ),
1.296 + Invoke(
1.297 + args=[], star=None, dstar=None,
1.298 + expr=LoadRef(ref=subprogram)
1.299 + )
1.300 + ]
1.301 + )
1.302 return result
1.303
1.304 def _visitFunction(self, function, subprogram):