@@ -220,7 +220,13 @@ def visit_ADDRESS(self, node):
220220 yield node
221221
222222 def visit_BINARY (self , node : symbols .BINARY ):
223+ node = yield self .generic_visit (node ) # This might convert consts to numbers if possible
224+
223225 if self .O_LEVEL > 1 and node .operator in ("PLUS" , "MUL" ):
226+ if chk .is_number (node .left ) and not chk .is_number (node .right ):
227+ node .left , node .right = node .right , node .left
228+ node = yield self .generic_visit (node )
229+
224230 if node .left .token == "BINARY" and node .left .operator == node .operator and chk .is_number (node .right ):
225231 left = ll = None
226232 if chk .is_number (node .left .right ):
@@ -240,27 +246,31 @@ def visit_BINARY(self, node: symbols.BINARY):
240246 )
241247 node .left = left
242248 node .right = right
243- elif node .right .token == "BINARY" and node .right .operator == node .operator and chk .is_number (node .left ):
244- right = rr = None
245- if chk .is_number (node .right .left ):
246- right = node .right .right
247- rr = node .right .left
248- elif chk .is_number (node .right .right ):
249- right = node .right .left
250- rr = node .right .right
251-
252- if right is not None :
253- left = yield symbols .BINARY .make_node (
254- operator = node .operator ,
255- left = node .left ,
256- right = rr ,
257- lineno = node .lineno ,
258- func = node .func ,
259- )
260- node .left = left
261- node .right = right
262249
263- node = yield self .generic_visit (node ) # This might convert consts to numbers if possible
250+ if (
251+ node .left .token == node .right .token == "BINARY"
252+ and node .operator == node .left .operator == node .right .operator
253+ and chk .is_number (node .left .right , node .right .right )
254+ ):
255+ left = yield symbols .BINARY .make_node (
256+ operator = node .operator ,
257+ left = node .left .left ,
258+ right = node .right .left ,
259+ func = node .left .func ,
260+ lineno = node .left .lineno ,
261+ )
262+ right = yield symbols .BINARY .make_node (
263+ operator = node .operator ,
264+ left = node .left .right ,
265+ right = node .right .right ,
266+ func = node .right .func ,
267+ lineno = node .right .lineno ,
268+ )
269+
270+ node = yield symbols .BINARY .make_node (
271+ operator = node .operator , left = left , right = right , func = node .func , lineno = node .lineno
272+ )
273+
264274 # Retry folding
265275 yield symbols .BINARY .make_node (node .operator , node .left , node .right , node .lineno , node .func , node .type_ )
266276
0 commit comments