@@ -1343,13 +1343,15 @@ is_const(expr_ty e)
13431343 case Ellipsis_kind :
13441344 case NameConstant_kind :
13451345 return 1 ;
1346+ case Name_kind :
1347+ return _PyUnicode_EqualToASCIIString (e -> v .Name .id , "__debug__" );
13461348 default :
13471349 return 0 ;
13481350 }
13491351}
13501352
13511353static PyObject *
1352- get_const_value (expr_ty e )
1354+ get_const_value (struct compiler * c , expr_ty e )
13531355{
13541356 switch (e -> kind ) {
13551357 case Constant_kind :
@@ -1364,6 +1366,9 @@ get_const_value(expr_ty e)
13641366 return Py_Ellipsis ;
13651367 case NameConstant_kind :
13661368 return e -> v .NameConstant .value ;
1369+ case Name_kind :
1370+ assert (_PyUnicode_EqualToASCIIString (e -> v .Name .id , "__debug__" ));
1371+ return c -> c_optimize ? Py_False : Py_True ;
13671372 default :
13681373 assert (!is_const (e ));
13691374 return NULL ;
@@ -3035,6 +3040,11 @@ compiler_nameop(struct compiler *c, identifier name, expr_context_ty ctx)
30353040 !_PyUnicode_EqualToASCIIString (name , "True" ) &&
30363041 !_PyUnicode_EqualToASCIIString (name , "False" ));
30373042
3043+ if (ctx == Load && _PyUnicode_EqualToASCIIString (name , "__debug__" )) {
3044+ ADDOP_O (c , LOAD_CONST , c -> c_optimize ? Py_False : Py_True , consts );
3045+ return 1 ;
3046+ }
3047+
30383048 op = 0 ;
30393049 optype = OP_NAME ;
30403050 scope = PyST_GetScope (c -> u -> u_ste , mangled );
@@ -3298,7 +3308,7 @@ compiler_subdict(struct compiler *c, expr_ty e, Py_ssize_t begin, Py_ssize_t end
32983308 return 0 ;
32993309 }
33003310 for (i = begin ; i < end ; i ++ ) {
3301- key = get_const_value ((expr_ty )asdl_seq_GET (e -> v .Dict .keys , i ));
3311+ key = get_const_value (c , (expr_ty )asdl_seq_GET (e -> v .Dict .keys , i ));
33023312 Py_INCREF (key );
33033313 PyTuple_SET_ITEM (keys , i - begin , key );
33043314 }
@@ -4044,35 +4054,10 @@ compiler_visit_keyword(struct compiler *c, keyword_ty k)
40444054static int
40454055expr_constant (struct compiler * c , expr_ty e )
40464056{
4047- char * id ;
4048- switch (e -> kind ) {
4049- case Ellipsis_kind :
4050- return 1 ;
4051- case Constant_kind :
4052- return PyObject_IsTrue (e -> v .Constant .value );
4053- case Num_kind :
4054- return PyObject_IsTrue (e -> v .Num .n );
4055- case Str_kind :
4056- return PyObject_IsTrue (e -> v .Str .s );
4057- case Name_kind :
4058- /* optimize away names that can't be reassigned */
4059- id = PyUnicode_AsUTF8 (e -> v .Name .id );
4060- if (id && strcmp (id , "__debug__" ) == 0 )
4061- return !c -> c_optimize ;
4062- return -1 ;
4063- case NameConstant_kind : {
4064- PyObject * o = e -> v .NameConstant .value ;
4065- if (o == Py_None )
4066- return 0 ;
4067- else if (o == Py_True )
4068- return 1 ;
4069- else if (o == Py_False )
4070- return 0 ;
4071- }
4072- /* fall through */
4073- default :
4074- return -1 ;
4057+ if (is_const (e )) {
4058+ return PyObject_IsTrue (get_const_value (c , e ));
40754059 }
4060+ return -1 ;
40764061}
40774062
40784063
0 commit comments