[Python-checkins] gh-87092: do not allocate PyFutureFeatures dynamically (GH-98913)

iritkatriel webhook-mailer at python.org
Wed Nov 2 11:13:15 EDT 2022


https://github.com/python/cpython/commit/6d683d85252df3c8dba7c33f7db87cdc1bcb0bf0
commit: 6d683d85252df3c8dba7c33f7db87cdc1bcb0bf0
branch: main
author: Irit Katriel <1055913+iritkatriel at users.noreply.github.com>
committer: iritkatriel <1055913+iritkatriel at users.noreply.github.com>
date: 2022-11-02T15:13:07Z
summary:

gh-87092: do not allocate PyFutureFeatures dynamically (GH-98913)

files:
M Include/internal/pycore_compile.h
M Python/compile.c
M Python/future.c
M Python/symtable.c

diff --git a/Include/internal/pycore_compile.h b/Include/internal/pycore_compile.h
index 1a628a08ca4e..cb490abe77a5 100644
--- a/Include/internal/pycore_compile.h
+++ b/Include/internal/pycore_compile.h
@@ -18,10 +18,11 @@ PyAPI_FUNC(PyCodeObject*) _PyAST_Compile(
     PyCompilerFlags *flags,
     int optimize,
     struct _arena *arena);
-extern PyFutureFeatures* _PyFuture_FromAST(
+
+int _PyFuture_FromAST(
     struct _mod * mod,
-    PyObject *filename
-    );
+    PyObject *filename,
+    PyFutureFeatures* futures);
 
 extern PyObject* _Py_Mangle(PyObject *p, PyObject *name);
 
diff --git a/Python/compile.c b/Python/compile.c
index f8924789f4e9..2ab20a813d2a 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -417,7 +417,7 @@ handled by the symbol analysis pass.
 struct compiler {
     PyObject *c_filename;
     struct symtable *c_st;
-    PyFutureFeatures *c_future; /* pointer to module's __future__ */
+    PyFutureFeatures c_future;   /* module's __future__ */
     PyCompilerFlags *c_flags;
 
     int c_optimize;              /* optimization level */
@@ -619,14 +619,14 @@ _PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
     Py_INCREF(filename);
     c.c_filename = filename;
     c.c_arena = arena;
-    c.c_future = _PyFuture_FromAST(mod, filename);
-    if (c.c_future == NULL)
+    if (!_PyFuture_FromAST(mod, filename, &c.c_future)) {
         goto finally;
+    }
     if (!flags) {
         flags = &local_flags;
     }
-    merged = c.c_future->ff_features | flags->cf_flags;
-    c.c_future->ff_features = merged;
+    merged = c.c_future.ff_features | flags->cf_flags;
+    c.c_future.ff_features = merged;
     flags->cf_flags = merged;
     c.c_flags = flags;
     c.c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
@@ -640,7 +640,7 @@ _PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *flags,
         goto finally;
     }
 
-    c.c_st = _PySymtable_Build(mod, filename, c.c_future);
+    c.c_st = _PySymtable_Build(mod, filename, &c.c_future);
     if (c.c_st == NULL) {
         if (!PyErr_Occurred())
             PyErr_SetString(PyExc_SystemError, "no symtable");
@@ -660,8 +660,6 @@ compiler_free(struct compiler *c)
 {
     if (c->c_st)
         _PySymtable_Free(c->c_st);
-    if (c->c_future)
-        PyObject_Free(c->c_future);
     Py_XDECREF(c->c_filename);
     Py_DECREF(c->c_const_cache);
     Py_DECREF(c->c_stack);
@@ -2404,7 +2402,7 @@ compiler_visit_argannotation(struct compiler *c, identifier id,
     ADDOP_LOAD_CONST(c, loc, mangled);
     Py_DECREF(mangled);
 
-    if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
+    if (c->c_future.ff_features & CO_FUTURE_ANNOTATIONS) {
         VISIT(c, annexpr, annotation);
     }
     else {
@@ -3927,7 +3925,7 @@ compiler_from_import(struct compiler *c, stmt_ty s)
         PyTuple_SET_ITEM(names, i, alias->name);
     }
 
-    if (location_is_after(LOC(s), c->c_future->ff_location) &&
+    if (location_is_after(LOC(s), c->c_future.ff_location) &&
         s->v.ImportFrom.module &&
         _PyUnicode_EqualToASCIIString(s->v.ImportFrom.module, "__future__"))
     {
@@ -6056,7 +6054,7 @@ check_annotation(struct compiler *c, stmt_ty s)
 {
     /* Annotations of complex targets does not produce anything
        under annotations future */
-    if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
+    if (c->c_future.ff_features & CO_FUTURE_ANNOTATIONS) {
         return 1;
     }
 
@@ -6122,7 +6120,7 @@ compiler_annassign(struct compiler *c, stmt_ty s)
         if (s->v.AnnAssign.simple &&
             (c->u->u_scope_type == COMPILER_SCOPE_MODULE ||
              c->u->u_scope_type == COMPILER_SCOPE_CLASS)) {
-            if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
+            if (c->c_future.ff_features & CO_FUTURE_ANNOTATIONS) {
                 VISIT(c, annexpr, s->v.AnnAssign.annotation)
             }
             else {
diff --git a/Python/future.c b/Python/future.c
index 2a45d2ebeab9..d56f73309646 100644
--- a/Python/future.c
+++ b/Python/future.c
@@ -96,22 +96,14 @@ future_parse(PyFutureFeatures *ff, mod_ty mod, PyObject *filename)
 }
 
 
-PyFutureFeatures *
-_PyFuture_FromAST(mod_ty mod, PyObject *filename)
+int
+_PyFuture_FromAST(mod_ty mod, PyObject *filename, PyFutureFeatures *ff)
 {
-    PyFutureFeatures *ff;
-
-    ff = (PyFutureFeatures *)PyObject_Malloc(sizeof(PyFutureFeatures));
-    if (ff == NULL) {
-        PyErr_NoMemory();
-        return NULL;
-    }
     ff->ff_features = 0;
     ff->ff_location = (_PyCompilerSrcLocation){-1, -1, -1, -1};
 
     if (!future_parse(ff, mod, filename)) {
-        PyObject_Free(ff);
-        return NULL;
+        return 0;
     }
-    return ff;
+    return 1;
 }
diff --git a/Python/symtable.c b/Python/symtable.c
index 342f5a080d3d..ea195bc155f1 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -2144,14 +2144,13 @@ _Py_SymtableStringObjectFlags(const char *str, PyObject *filename,
         _PyArena_Free(arena);
         return NULL;
     }
-    PyFutureFeatures *future = _PyFuture_FromAST(mod, filename);
-    if (future == NULL) {
+    PyFutureFeatures future;
+    if (!_PyFuture_FromAST(mod, filename, &future)) {
         _PyArena_Free(arena);
         return NULL;
     }
-    future->ff_features |= flags->cf_flags;
-    st = _PySymtable_Build(mod, filename, future);
-    PyObject_Free((void *)future);
+    future.ff_features |= flags->cf_flags;
+    st = _PySymtable_Build(mod, filename, &future);
     _PyArena_Free(arena);
     return st;
 }



More information about the Python-checkins mailing list