]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-81057: Move the Cached Parser Dummy Name to _PyRuntimeState (#100277)
authorEric Snow <ericsnowcurrently@gmail.com>
Fri, 16 Dec 2022 13:48:03 +0000 (06:48 -0700)
committerGitHub <noreply@github.com>
Fri, 16 Dec 2022 13:48:03 +0000 (13:48 +0000)
Include/internal/pycore_parser.h
Include/internal/pycore_runtime_init.h
Parser/action_helpers.c
Tools/c-analyzer/cpython/ignored.tsv

index 2d2b56bd824cb44df56df9e4bde9fd9db4a2c772..dd51b92801aebfbb383c200725c6a6e706ce67d8 100644 (file)
@@ -9,6 +9,8 @@ extern "C" {
 #endif
 
 
+#include "pycore_ast.h"             // struct _expr
+#include "pycore_global_strings.h"  // _Py_DECLARE_STR()
 #include "pycore_pyarena.h"         // PyArena
 
 
@@ -22,9 +24,22 @@ struct _parser_runtime_state {
 #else
     int _not_used;
 #endif
+    struct _expr dummy_name;
 };
 
-
+_Py_DECLARE_STR(empty, "")
+#define _parser_runtime_state_INIT \
+    { \
+        .dummy_name = { \
+            .kind = Name_kind, \
+            .v.Name.id = &_Py_STR(empty), \
+            .v.Name.ctx = Load, \
+            .lineno = 1, \
+            .col_offset = 0, \
+            .end_lineno = 1, \
+            .end_col_offset = 0, \
+        }, \
+    }
 
 extern struct _mod* _PyParser_ASTFromString(
     const char *str,
index 6342a28f4df911c6a689b1233b80abf0243c25a1..cb3fce3732c79b636db308471dfc17ca3cc77c9e 100644 (file)
@@ -9,6 +9,7 @@ extern "C" {
 #endif
 
 #include "pycore_object.h"
+#include "pycore_parser.h"
 #include "pycore_pymem_init.h"
 #include "pycore_obmalloc_init.h"
 
@@ -32,6 +33,7 @@ extern "C" {
               until _PyInterpreterState_Enable() is called. */ \
             .next_id = -1, \
         }, \
+        .parser = _parser_runtime_state_INIT, \
         .imports = { \
             .lock = { \
                 .mutex = NULL, \
index f12dad095acaa84702f9d6d12a1c72f569384b23..46390966892d168b08077e3f6d019e651d1d5f67 100644 (file)
@@ -2,30 +2,12 @@
 
 #include "pegen.h"
 #include "string_parser.h"
-
-static PyObject *
-_create_dummy_identifier(Parser *p)
-{
-    return _PyPegen_new_identifier(p, "");
-}
+#include "pycore_runtime.h"         // _PyRuntime
 
 void *
 _PyPegen_dummy_name(Parser *p, ...)
 {
-    // XXX This leaks memory from the initial arena.
-    // Use a statically allocated variable instead of a pointer?
-    static void *cache = NULL;
-
-    if (cache != NULL) {
-        return cache;
-    }
-
-    PyObject *id = _create_dummy_identifier(p);
-    if (!id) {
-        return NULL;
-    }
-    cache = _PyAST_Name(id, Load, 1, 0, 1, 0, p->arena);
-    return cache;
+    return &_PyRuntime.parser.dummy_name;
 }
 
 /* Creates a single-element asdl_seq* that contains a */
index c71fc0d958216c7e079b45b71b47fe9aecee6825..02531692a884472ee68c1e45c3651fe4bd87fbc2 100644 (file)
@@ -50,10 +50,6 @@ Python/getversion.c  -       version -
 Python/bootstrap_hash.c        -       _Py_HashSecret_Initialized      -
 Python/pyhash.c        -       _Py_HashSecret  -
 
-## internal state - set lazily (*after* first init)
-# XXX Move to _PyRuntimeState (i.e. tie to init/fini cycle)?
-Parser/action_helpers.c        _PyPegen_dummy_name     cache   -
-
 
 ##################################
 ## state tied to Py_Main()