]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Make PyCodeObject.co_extra even more private to force users through the proper API.
authorBrett Cannon <brett@python.org>
Wed, 7 Sep 2016 21:30:39 +0000 (14:30 -0700)
committerBrett Cannon <brett@python.org>
Wed, 7 Sep 2016 21:30:39 +0000 (14:30 -0700)
Include/code.h
Objects/codeobject.c

index a054a9226179db2cec9366e6ce2465de32a1323d..b39d6bd511df20dc2cee40f77437b83671730cb7 100644 (file)
@@ -7,14 +7,6 @@
 extern "C" {
 #endif
 
-
-/* Holder for co_extra information */
-typedef struct {
-    Py_ssize_t ce_size;
-    void **ce_extras;
-} _PyCodeObjectExtra;
-
-
 /* Bytecode object */
 typedef struct {
     PyObject_HEAD
@@ -43,8 +35,10 @@ typedef struct {
                                   Objects/lnotab_notes.txt for details. */
     void *co_zombieframe;     /* for optimization only (see frameobject.c) */
     PyObject *co_weakreflist;   /* to support weakrefs to code objects */
-    /* Scratch space for extra data relating to the code object */
-    _PyCodeObjectExtra *co_extra;
+    /* Scratch space for extra data relating to the code object.__icc_nan
+       Type is a void* to keep the format private in codeobject.c to force
+       people to go through the proper APIs. */
+    void *co_extra;
 } PyCodeObject;
 
 /* Masks for co_flags above */
index 5da2e93ab265a05d1bd1524f3d72bfd237d595ae..d514ec1590485f9ee3369fc68b9ee50bb8f7e622 100644 (file)
@@ -7,6 +7,12 @@
 #define NAME_CHARS \
     "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
 
+/* Holder for co_extra information */
+typedef struct {
+    Py_ssize_t ce_size;
+    void **ce_extras;
+} _PyCodeObjectExtra;
+
 /* all_name_chars(s): true iff all chars in s are valid NAME_CHARS */
 
 static int
@@ -366,12 +372,13 @@ code_dealloc(PyCodeObject *co)
 {
     if (co->co_extra != NULL) {
         PyThreadState *tstate = PyThreadState_Get();
+        _PyCodeObjectExtra *co_extra = co->co_extra;
 
-        for (Py_ssize_t i = 0; i < co->co_extra->ce_size; i++) {
+        for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) {
             freefunc free_extra = tstate->co_extra_freefuncs[i];
 
             if (free_extra != NULL) {
-                free_extra(co->co_extra->ce_extras[i]);
+                free_extra(co_extra->ce_extras[i]);
             }
         }
 
@@ -774,8 +781,6 @@ _PyCode_CheckLineNumber(PyCodeObject* co, int lasti, PyAddrPair *bounds)
 int
 _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra)
 {
-    PyCodeObject *o;
-
     assert(*extra == NULL);
 
     if (!PyCode_Check(code)) {
@@ -783,13 +788,15 @@ _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra)
         return -1;
     }
 
-    o = (PyCodeObject*) code;
+    PyCodeObject *o = (PyCodeObject*) code;
+    _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra*) o->co_extra;
+
 
-    if (o->co_extra == NULL || o->co_extra->ce_size <= index) {
+    if (co_extra == NULL || co_extra->ce_size <= index) {
         return 0;
     }
 
-    *extra = o->co_extra->ce_extras[index];
+    *extra = co_extra->ce_extras[index];
     return 0;
 }
 
@@ -797,7 +804,6 @@ _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra)
 int
 _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra)
 {
-    PyCodeObject *o;
     PyThreadState *tstate = PyThreadState_Get();
 
     if (!PyCode_Check(code) || index < 0 ||
@@ -806,42 +812,44 @@ _PyCode_SetExtra(PyObject *code, Py_ssize_t index, void *extra)
         return -1;
     }
 
-    o = (PyCodeObject*) code;
+    PyCodeObject *o = (PyCodeObject*) code;
+    _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra *) o->co_extra;
 
-    if (o->co_extra == NULL) {
+    if (co_extra == NULL) {
         o->co_extra = (_PyCodeObjectExtra*) PyMem_Malloc(
             sizeof(_PyCodeObjectExtra));
         if (o->co_extra == NULL) {
             return -1;
         }
+        co_extra = (_PyCodeObjectExtra *) o->co_extra;
 
-        o->co_extra->ce_extras = PyMem_Malloc(
+        co_extra->ce_extras = PyMem_Malloc(
             tstate->co_extra_user_count * sizeof(void*));
-        if (o->co_extra->ce_extras == NULL) {
+        if (co_extra->ce_extras == NULL) {
             return -1;
         }
 
-        o->co_extra->ce_size = tstate->co_extra_user_count;
+        co_extra->ce_size = tstate->co_extra_user_count;
 
-        for (Py_ssize_t i = 0; i < o->co_extra->ce_size; i++) {
-            o->co_extra->ce_extras[i] = NULL;
+        for (Py_ssize_t i = 0; i < co_extra->ce_size; i++) {
+            co_extra->ce_extras[i] = NULL;
         }
     }
-    else if (o->co_extra->ce_size <= index) {
-        o->co_extra->ce_extras = PyMem_Realloc(
-            o->co_extra->ce_extras, tstate->co_extra_user_count * sizeof(void*));
+    else if (co_extra->ce_size <= index) {
+        co_extra->ce_extras = PyMem_Realloc(
+            co_extra->ce_extras, tstate->co_extra_user_count * sizeof(void*));
 
-        if (o->co_extra->ce_extras == NULL) {
+        if (co_extra->ce_extras == NULL) {
             return -1;
         }
 
-        o->co_extra->ce_size = tstate->co_extra_user_count;
+        co_extra->ce_size = tstate->co_extra_user_count;
 
-        for (Py_ssize_t i = o->co_extra->ce_size; i < o->co_extra->ce_size; i++) {
-            o->co_extra->ce_extras[i] = NULL;
+        for (Py_ssize_t i = co_extra->ce_size; i < co_extra->ce_size; i++) {
+            co_extra->ce_extras[i] = NULL;
         }
     }
 
-    o->co_extra->ce_extras[index] = extra;
+    co_extra->ce_extras[index] = extra;
     return 0;
 }