@@ -86,8 +86,8 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
8686 switch (MP_PARSE_NODE_STRUCT_KIND (pns )) {
8787 case PN_shift_expr :
8888 if (n == 3 && MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [0 ]) && MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [2 ])) {
89- int arg0 = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [0 ]);
90- int arg1 = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [2 ]);
89+ int arg0 = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [0 ]);
90+ int arg1 = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [2 ]);
9191 if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [1 ], MP_TOKEN_OP_DBL_LESS )) {
9292#if MICROPY_EMIT_CPYTHON
9393 // can overflow; enabled only to compare with CPython
@@ -105,8 +105,8 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
105105 case PN_arith_expr :
106106 // overflow checking here relies on SMALL_INT being strictly smaller than machine_int_t
107107 if (n == 3 && MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [0 ]) && MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [2 ])) {
108- machine_int_t arg0 = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [0 ]);
109- machine_int_t arg1 = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [2 ]);
108+ machine_int_t arg0 = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [0 ]);
109+ machine_int_t arg1 = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [2 ]);
110110 machine_int_t res ;
111111 if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [1 ], MP_TOKEN_OP_PLUS )) {
112112 res = arg0 + arg1 ;
@@ -125,8 +125,8 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
125125
126126 case PN_term :
127127 if (n == 3 && MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [0 ]) && MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [2 ])) {
128- int arg0 = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [0 ]);
129- int arg1 = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [2 ]);
128+ int arg0 = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [0 ]);
129+ int arg1 = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [2 ]);
130130 if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [1 ], MP_TOKEN_OP_STAR )) {
131131#if MICROPY_EMIT_CPYTHON
132132 // can overflow; enabled only to compare with CPython
@@ -149,7 +149,7 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
149149
150150 case PN_factor_2 :
151151 if (MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [1 ])) {
152- machine_int_t arg = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [1 ]);
152+ machine_int_t arg = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [1 ]);
153153 if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [0 ], MP_TOKEN_OP_PLUS )) {
154154 pn = mp_parse_node_new_leaf (MP_PARSE_NODE_SMALL_INT , arg );
155155 } else if (MP_PARSE_NODE_IS_TOKEN_KIND (pns -> nodes [0 ], MP_TOKEN_OP_MINUS )) {
@@ -169,10 +169,10 @@ mp_parse_node_t fold_constants(mp_parse_node_t pn) {
169169 if (MP_PARSE_NODE_IS_SMALL_INT (pns -> nodes [0 ]) && MP_PARSE_NODE_IS_NULL (pns -> nodes [1 ]) && !MP_PARSE_NODE_IS_NULL (pns -> nodes [2 ])) {
170170 mp_parse_node_struct_t * pns2 = (mp_parse_node_struct_t * )pns -> nodes [2 ];
171171 if (MP_PARSE_NODE_IS_SMALL_INT (pns2 -> nodes [0 ])) {
172- int power = MP_PARSE_NODE_LEAF_ARG (pns2 -> nodes [0 ]);
172+ int power = MP_PARSE_NODE_LEAF_SMALL_INT (pns2 -> nodes [0 ]);
173173 if (power >= 0 ) {
174174 int ans = 1 ;
175- int base = MP_PARSE_NODE_LEAF_ARG (pns -> nodes [0 ]);
175+ int base = MP_PARSE_NODE_LEAF_SMALL_INT (pns -> nodes [0 ]);
176176 for (; power > 0 ; power -- ) {
177177 ans *= base ;
178178 }
@@ -320,10 +320,14 @@ STATIC void cpython_c_print_quoted_str(vstr_t *vstr, qstr qstr, bool bytes) {
320320
321321STATIC void cpython_c_tuple_emit_const (compiler_t * comp , mp_parse_node_t pn , vstr_t * vstr ) {
322322 assert (MP_PARSE_NODE_IS_LEAF (pn ));
323+ if (MP_PARSE_NODE_IS_SMALL_INT (pn )) {
324+ vstr_printf (vstr , INT_FMT , MP_PARSE_NODE_LEAF_SMALL_INT (pn ));
325+ return ;
326+ }
327+
323328 int arg = MP_PARSE_NODE_LEAF_ARG (pn );
324329 switch (MP_PARSE_NODE_LEAF_KIND (pn )) {
325330 case MP_PARSE_NODE_ID : assert (0 );
326- case MP_PARSE_NODE_SMALL_INT : vstr_printf (vstr , "%d" , arg ); break ;
327331 case MP_PARSE_NODE_INTEGER : vstr_printf (vstr , "%s" , qstr_str (arg )); break ;
328332 case MP_PARSE_NODE_DECIMAL : vstr_printf (vstr , "%s" , qstr_str (arg )); break ;
329333 case MP_PARSE_NODE_STRING : cpython_c_print_quoted_str (vstr , arg , false); break ;
@@ -421,11 +425,11 @@ void compile_generic_tuple(compiler_t *comp, mp_parse_node_struct_t *pns) {
421425
422426STATIC bool node_is_const_false (mp_parse_node_t pn ) {
423427 return MP_PARSE_NODE_IS_TOKEN_KIND (pn , MP_TOKEN_KW_FALSE );
424- // untested: || (MP_PARSE_NODE_IS_SMALL_INT(pn) && MP_PARSE_NODE_LEAF_ARG (pn) == 1 );
428+ // untested: || (MP_PARSE_NODE_IS_SMALL_INT(pn) && MP_PARSE_NODE_LEAF_SMALL_INT (pn) == 0 );
425429}
426430
427431STATIC bool node_is_const_true (mp_parse_node_t pn ) {
428- return MP_PARSE_NODE_IS_TOKEN_KIND (pn , MP_TOKEN_KW_TRUE ) || (MP_PARSE_NODE_IS_SMALL_INT (pn ) && MP_PARSE_NODE_LEAF_ARG (pn ) == 1 );
432+ return MP_PARSE_NODE_IS_TOKEN_KIND (pn , MP_TOKEN_KW_TRUE ) || (MP_PARSE_NODE_IS_SMALL_INT (pn ) && MP_PARSE_NODE_LEAF_SMALL_INT (pn ) == 1 );
429433}
430434
431435#if MICROPY_EMIT_CPYTHON
@@ -1464,7 +1468,8 @@ void compile_for_stmt_optimised_range(compiler_t *comp, mp_parse_node_t pn_var,
14641468 // compile: if var <cond> end: goto top
14651469 compile_node (comp , pn_var );
14661470 compile_node (comp , pn_end );
1467- if (MP_PARSE_NODE_LEAF_ARG (pn_step ) >= 0 ) {
1471+ assert (MP_PARSE_NODE_IS_SMALL_INT (pn_step ));
1472+ if (MP_PARSE_NODE_LEAF_SMALL_INT (pn_step ) >= 0 ) {
14681473 EMIT_ARG (binary_op , RT_BINARY_OP_LESS );
14691474 } else {
14701475 EMIT_ARG (binary_op , RT_BINARY_OP_MORE );
@@ -2514,11 +2519,13 @@ STATIC compile_function_t compile_function[] = {
25142519void compile_node (compiler_t * comp , mp_parse_node_t pn ) {
25152520 if (MP_PARSE_NODE_IS_NULL (pn )) {
25162521 // pass
2522+ } else if (MP_PARSE_NODE_IS_SMALL_INT (pn )) {
2523+ machine_int_t arg = MP_PARSE_NODE_LEAF_SMALL_INT (pn );
2524+ EMIT_ARG (load_const_small_int , arg );
25172525 } else if (MP_PARSE_NODE_IS_LEAF (pn )) {
2518- machine_int_t arg = MP_PARSE_NODE_LEAF_ARG (pn );
2526+ machine_uint_t arg = MP_PARSE_NODE_LEAF_ARG (pn );
25192527 switch (MP_PARSE_NODE_LEAF_KIND (pn )) {
25202528 case MP_PARSE_NODE_ID : EMIT_ARG (load_id , arg ); break ;
2521- case MP_PARSE_NODE_SMALL_INT : EMIT_ARG (load_const_small_int , arg ); break ;
25222529 case MP_PARSE_NODE_INTEGER : EMIT_ARG (load_const_int , arg ); break ;
25232530 case MP_PARSE_NODE_DECIMAL : EMIT_ARG (load_const_dec , arg ); break ;
25242531 case MP_PARSE_NODE_STRING : EMIT_ARG (load_const_str , arg , false); break ;
0 commit comments