mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-46765: Replace Locally Cached Strings with Statically Initialized Objects (gh-31366)
https://bugs.python.org/issue46765
This commit is contained in:
		
							parent
							
								
									cff4d5c5d2
								
							
						
					
					
						commit
						1f455361ec
					
				
					 22 changed files with 192 additions and 526 deletions
				
			
		|  | @ -230,13 +230,6 @@ static int symtable_raise_if_annotation_block(struct symtable *st, const char *, | |||
| static int symtable_raise_if_comprehension_block(struct symtable *st, expr_ty); | ||||
| 
 | ||||
| 
 | ||||
| static identifier top = NULL, lambda = NULL, genexpr = NULL, | ||||
|     listcomp = NULL, setcomp = NULL, dictcomp = NULL, | ||||
|     __class__ = NULL, _annotation = NULL; | ||||
| 
 | ||||
| #define GET_IDENTIFIER(VAR) \ | ||||
|     ((VAR) ? (VAR) : ((VAR) = PyUnicode_InternFromString(# VAR))) | ||||
| 
 | ||||
| #define DUPLICATE_ARGUMENT \ | ||||
| "duplicate argument '%U' in function definition" | ||||
| 
 | ||||
|  | @ -313,8 +306,7 @@ _PySymtable_Build(mod_ty mod, PyObject *filename, PyFutureFeatures *future) | |||
|         recursion_limit * COMPILER_STACK_FRAME_SCALE : recursion_limit; | ||||
| 
 | ||||
|     /* Make the initial symbol information gathering pass */ | ||||
|     if (!GET_IDENTIFIER(top) || | ||||
|         !symtable_enter_block(st, top, ModuleBlock, (void *)mod, 0, 0, 0, 0)) { | ||||
|     if (!symtable_enter_block(st, &_Py_ID(top), ModuleBlock, (void *)mod, 0, 0, 0, 0)) { | ||||
|         _PySymtable_Free(st); | ||||
|         return NULL; | ||||
|     } | ||||
|  | @ -619,9 +611,7 @@ static int | |||
| drop_class_free(PySTEntryObject *ste, PyObject *free) | ||||
| { | ||||
|     int res; | ||||
|     if (!GET_IDENTIFIER(__class__)) | ||||
|         return 0; | ||||
|     res = PySet_Discard(free, __class__); | ||||
|     res = PySet_Discard(free, &_Py_ID(__class__)); | ||||
|     if (res < 0) | ||||
|         return 0; | ||||
|     if (res) | ||||
|  | @ -834,9 +824,7 @@ analyze_block(PySTEntryObject *ste, PyObject *bound, PyObject *free, | |||
|     } | ||||
|     else { | ||||
|         /* Special-case __class__ */ | ||||
|         if (!GET_IDENTIFIER(__class__)) | ||||
|             goto error; | ||||
|         if (PySet_Add(newbound, __class__) < 0) | ||||
|         if (PySet_Add(newbound, &_Py_ID(__class__)) < 0) | ||||
|             goto error; | ||||
|     } | ||||
| 
 | ||||
|  | @ -1610,13 +1598,11 @@ symtable_visit_expr(struct symtable *st, expr_ty e) | |||
|         VISIT(st, expr, e->v.UnaryOp.operand); | ||||
|         break; | ||||
|     case Lambda_kind: { | ||||
|         if (!GET_IDENTIFIER(lambda)) | ||||
|             VISIT_QUIT(st, 0); | ||||
|         if (e->v.Lambda.args->defaults) | ||||
|             VISIT_SEQ(st, expr, e->v.Lambda.args->defaults); | ||||
|         if (e->v.Lambda.args->kw_defaults) | ||||
|             VISIT_SEQ_WITH_NULL(st, expr, e->v.Lambda.args->kw_defaults); | ||||
|         if (!symtable_enter_block(st, lambda, | ||||
|         if (!symtable_enter_block(st, &_Py_ID(lambda), | ||||
|                                   FunctionBlock, (void *)e, | ||||
|                                   e->lineno, e->col_offset, | ||||
|                                   e->end_lineno, e->end_col_offset)) | ||||
|  | @ -1730,8 +1716,7 @@ symtable_visit_expr(struct symtable *st, expr_ty e) | |||
|         if (e->v.Name.ctx == Load && | ||||
|             st->st_cur->ste_type == FunctionBlock && | ||||
|             _PyUnicode_EqualToASCIIString(e->v.Name.id, "super")) { | ||||
|             if (!GET_IDENTIFIER(__class__) || | ||||
|                 !symtable_add_def(st, __class__, USE, LOCATION(e))) | ||||
|             if (!symtable_add_def(st, &_Py_ID(__class__), USE, LOCATION(e))) | ||||
|                 VISIT_QUIT(st, 0); | ||||
|         } | ||||
|         break; | ||||
|  | @ -1832,7 +1817,7 @@ symtable_visit_annotation(struct symtable *st, expr_ty annotation) | |||
| { | ||||
|     int future_annotations = st->st_future->ff_features & CO_FUTURE_ANNOTATIONS; | ||||
|     if (future_annotations && | ||||
|         !symtable_enter_block(st, GET_IDENTIFIER(_annotation), AnnotationBlock, | ||||
|         !symtable_enter_block(st, &_Py_ID(_annotation), AnnotationBlock, | ||||
|                               (void *)annotation, annotation->lineno, | ||||
|                               annotation->col_offset, annotation->end_lineno, | ||||
|                               annotation->end_col_offset)) { | ||||
|  | @ -1867,7 +1852,7 @@ symtable_visit_annotations(struct symtable *st, stmt_ty o, arguments_ty a, expr_ | |||
| { | ||||
|     int future_annotations = st->st_future->ff_features & CO_FUTURE_ANNOTATIONS; | ||||
|     if (future_annotations && | ||||
|         !symtable_enter_block(st, GET_IDENTIFIER(_annotation), AnnotationBlock, | ||||
|         !symtable_enter_block(st, &_Py_ID(_annotation), AnnotationBlock, | ||||
|                               (void *)o, o->lineno, o->col_offset, o->end_lineno, | ||||
|                               o->end_col_offset)) { | ||||
|         VISIT_QUIT(st, 0); | ||||
|  | @ -2085,7 +2070,7 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e, | |||
| static int | ||||
| symtable_visit_genexp(struct symtable *st, expr_ty e) | ||||
| { | ||||
|     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(genexpr), | ||||
|     return symtable_handle_comprehension(st, e, &_Py_ID(genexpr), | ||||
|                                          e->v.GeneratorExp.generators, | ||||
|                                          e->v.GeneratorExp.elt, NULL); | ||||
| } | ||||
|  | @ -2093,7 +2078,7 @@ symtable_visit_genexp(struct symtable *st, expr_ty e) | |||
| static int | ||||
| symtable_visit_listcomp(struct symtable *st, expr_ty e) | ||||
| { | ||||
|     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(listcomp), | ||||
|     return symtable_handle_comprehension(st, e, &_Py_ID(listcomp), | ||||
|                                          e->v.ListComp.generators, | ||||
|                                          e->v.ListComp.elt, NULL); | ||||
| } | ||||
|  | @ -2101,7 +2086,7 @@ symtable_visit_listcomp(struct symtable *st, expr_ty e) | |||
| static int | ||||
| symtable_visit_setcomp(struct symtable *st, expr_ty e) | ||||
| { | ||||
|     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(setcomp), | ||||
|     return symtable_handle_comprehension(st, e, &_Py_ID(setcomp), | ||||
|                                          e->v.SetComp.generators, | ||||
|                                          e->v.SetComp.elt, NULL); | ||||
| } | ||||
|  | @ -2109,7 +2094,7 @@ symtable_visit_setcomp(struct symtable *st, expr_ty e) | |||
| static int | ||||
| symtable_visit_dictcomp(struct symtable *st, expr_ty e) | ||||
| { | ||||
|     return symtable_handle_comprehension(st, e, GET_IDENTIFIER(dictcomp), | ||||
|     return symtable_handle_comprehension(st, e, &_Py_ID(dictcomp), | ||||
|                                          e->v.DictComp.generators, | ||||
|                                          e->v.DictComp.key, | ||||
|                                          e->v.DictComp.value); | ||||
|  | @ -2173,16 +2158,3 @@ _Py_SymtableStringObjectFlags(const char *str, PyObject *filename, | |||
|     _PyArena_Free(arena); | ||||
|     return st; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| _PySymtable_Fini(void) | ||||
| { | ||||
|     Py_CLEAR(top); | ||||
|     Py_CLEAR(lambda); | ||||
|     Py_CLEAR(genexpr); | ||||
|     Py_CLEAR(listcomp); | ||||
|     Py_CLEAR(setcomp); | ||||
|     Py_CLEAR(dictcomp); | ||||
|     Py_CLEAR(__class__); | ||||
|     Py_CLEAR(_annotation); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Eric Snow
						Eric Snow