@@ -47,6 +47,7 @@ typedef enum {
4747 PN_maximum_number_of ,
4848 PN_string , // special node for non-interned string
4949 PN_bytes , // special node for non-interned bytes
50+ PN_const_object , // special node for a constant, generic Python object
5051} pn_kind_t ;
5152
5253#define EMIT (fun ) (comp->emit_method_table->fun(comp->emit))
@@ -174,6 +175,7 @@ STATIC mp_parse_node_t fold_constants(compiler_t *comp, mp_parse_node_t pn, mp_m
174175#endif
175176 case PN_string :
176177 case PN_bytes :
178+ case PN_const_object :
177179 return pn ;
178180 }
179181
@@ -432,6 +434,9 @@ STATIC bool cpython_c_tuple_is_const(mp_parse_node_t pn) {
432434 if (MP_PARSE_NODE_IS_STRUCT_KIND (pn , PN_bytes )) {
433435 return true;
434436 }
437+ if (MP_PARSE_NODE_IS_STRUCT_KIND (pn , PN_const_object )) {
438+ return true;
439+ }
435440 if (!MP_PARSE_NODE_IS_LEAF (pn )) {
436441 return false;
437442 }
@@ -486,6 +491,12 @@ STATIC void cpython_c_tuple_emit_const(compiler_t *comp, mp_parse_node_t pn, vst
486491 return ;
487492 }
488493
494+ if (MP_PARSE_NODE_IS_STRUCT_KIND (pn , PN_const_object )) {
495+ mp_parse_node_struct_t * pns = (mp_parse_node_struct_t * )pn ;
496+ mp_obj_print ((mp_obj_t )pns -> nodes [0 ], PRINT_REPR );
497+ return ;
498+ }
499+
489500 assert (MP_PARSE_NODE_IS_LEAF (pn ));
490501 if (MP_PARSE_NODE_IS_SMALL_INT (pn )) {
491502 vstr_printf (vstr , INT_FMT , MP_PARSE_NODE_LEAF_SMALL_INT (pn ));
@@ -495,8 +506,6 @@ STATIC void cpython_c_tuple_emit_const(compiler_t *comp, mp_parse_node_t pn, vst
495506 mp_uint_t arg = MP_PARSE_NODE_LEAF_ARG (pn );
496507 switch (MP_PARSE_NODE_LEAF_KIND (pn )) {
497508 case MP_PARSE_NODE_ID : assert (0 );
498- case MP_PARSE_NODE_INTEGER : vstr_printf (vstr , "%s" , qstr_str (arg )); break ;
499- case MP_PARSE_NODE_DECIMAL : vstr_printf (vstr , "%s" , qstr_str (arg )); break ;
500509 case MP_PARSE_NODE_STRING :
501510 case MP_PARSE_NODE_BYTES : {
502511 mp_uint_t len ;
@@ -2159,7 +2168,8 @@ STATIC void compile_expr_stmt(compiler_t *comp, mp_parse_node_struct_t *pns) {
21592168 // for non-REPL, evaluate then discard the expression
21602169 if ((MP_PARSE_NODE_IS_LEAF (pns -> nodes [0 ]) && !MP_PARSE_NODE_IS_ID (pns -> nodes [0 ]))
21612170 || MP_PARSE_NODE_IS_STRUCT_KIND (pns -> nodes [0 ], PN_string )
2162- || MP_PARSE_NODE_IS_STRUCT_KIND (pns -> nodes [0 ], PN_bytes )) {
2171+ || MP_PARSE_NODE_IS_STRUCT_KIND (pns -> nodes [0 ], PN_bytes )
2172+ || MP_PARSE_NODE_IS_STRUCT_KIND (pns -> nodes [0 ], PN_const_object )) {
21632173 // do nothing with a lonely constant
21642174 } else {
21652175 compile_node (comp , pns -> nodes [0 ]); // just an expression
@@ -2954,6 +2964,10 @@ STATIC void compile_bytes(compiler_t *comp, mp_parse_node_struct_t *pns) {
29542964 }
29552965}
29562966
2967+ STATIC void compile_const_object (compiler_t * comp , mp_parse_node_struct_t * pns ) {
2968+ EMIT_ARG (load_const_obj , (mp_obj_t )pns -> nodes [0 ]);
2969+ }
2970+
29572971typedef void (* compile_function_t )(compiler_t * , mp_parse_node_struct_t * );
29582972STATIC compile_function_t compile_function [] = {
29592973#define nc NULL
@@ -2966,6 +2980,7 @@ STATIC compile_function_t compile_function[] = {
29662980 NULL ,
29672981 compile_string ,
29682982 compile_bytes ,
2983+ compile_const_object ,
29692984};
29702985
29712986STATIC void compile_node (compiler_t * comp , mp_parse_node_t pn ) {
@@ -2978,8 +2993,6 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) {
29782993 mp_uint_t arg = MP_PARSE_NODE_LEAF_ARG (pn );
29792994 switch (MP_PARSE_NODE_LEAF_KIND (pn )) {
29802995 case MP_PARSE_NODE_ID : EMIT_ARG (load_id , arg ); break ;
2981- case MP_PARSE_NODE_INTEGER : EMIT_ARG (load_const_int , arg ); break ;
2982- case MP_PARSE_NODE_DECIMAL : EMIT_ARG (load_const_dec , arg ); break ;
29832996 case MP_PARSE_NODE_STRING : EMIT_ARG (load_const_str , arg , false); break ;
29842997 case MP_PARSE_NODE_BYTES : EMIT_ARG (load_const_str , arg , true); break ;
29852998 case MP_PARSE_NODE_TOKEN : default :
0 commit comments