[Python-checkins] cpython: Make PyCodeObject.co_extra even more private to force users through the proper

brett.cannon python-checkins at python.org
Wed Sep 7 17:32:06 EDT 2016


https://hg.python.org/cpython/rev/33150309db74
changeset: 103248:33150309db74
user: Brett Cannon <brett at python.org>
date: Wed Sep 07 14:30:39 2016 -0700
summary:
 Make PyCodeObject.co_extra even more private to force users through the proper API.
files:
 Include/code.h | 14 ++-----
 Objects/codeobject.c | 54 ++++++++++++++++++-------------
 2 files changed, 35 insertions(+), 33 deletions(-)
diff --git a/Include/code.h b/Include/code.h
--- a/Include/code.h
+++ b/Include/code.h
@@ -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 @@
 				 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 */
diff --git a/Objects/codeobject.c b/Objects/codeobject.c
--- a/Objects/codeobject.c
+++ b/Objects/codeobject.c
@@ -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 @@
 {
 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 @@
 int
 _PyCode_GetExtra(PyObject *code, Py_ssize_t index, void **extra)
 {
- PyCodeObject *o;
-
 assert(*extra == NULL);
 
 if (!PyCode_Check(code)) {
@@ -783,13 +788,15 @@
 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 @@
 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 @@
 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;
 }
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /