summaryrefslogtreecommitdiffstats
path: root/Include/internal
diff options
context:
space:
mode:
Diffstat (limited to 'Include/internal')
-rw-r--r--Include/internal/pycore_code.h39
1 files changed, 17 insertions, 22 deletions
diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h
index 1e78b92..78969df 100644
--- a/Include/internal/pycore_code.h
+++ b/Include/internal/pycore_code.h
@@ -180,39 +180,34 @@ extern Py_ssize_t _Py_QuickenedCount;
* "free" kind is mutually exclusive with both.
*/
-// For now _PyLocalsPlusKind and _PyLocalsPlusKinds are defined
-// in Include/cpython/code.h.
-/* Note that these all fit within _PyLocalsPlusKind, as do combinations. */
+// Note that these all fit within a byte, as do combinations.
// Later, we will use the smaller numbers to differentiate the different
// kinds of locals (e.g. pos-only arg, varkwargs, local-only).
#define CO_FAST_LOCAL 0x20
#define CO_FAST_CELL 0x40
#define CO_FAST_FREE 0x80
-static inline int
-_PyCode_InitLocalsPlusKinds(int num, _PyLocalsPlusKinds *pkinds)
+typedef unsigned char _PyLocals_Kind;
+
+static inline _PyLocals_Kind
+_PyLocals_GetKind(PyObject *kinds, int i)
{
- if (num == 0) {
- *pkinds = NULL;
- return 0;
- }
- _PyLocalsPlusKinds kinds = PyMem_NEW(_PyLocalsPlusKind, num);
- if (kinds == NULL) {
- PyErr_NoMemory();
- return -1;
- }
- *pkinds = kinds;
- return 0;
+ assert(PyBytes_Check(kinds));
+ assert(0 <= i && i < PyBytes_GET_SIZE(kinds));
+ char *ptr = PyBytes_AS_STRING(kinds);
+ return (_PyLocals_Kind)(ptr[i]);
}
static inline void
-_PyCode_ClearLocalsPlusKinds(_PyLocalsPlusKinds kinds)
+_PyLocals_SetKind(PyObject *kinds, int i, _PyLocals_Kind kind)
{
- if (kinds != NULL) {
- PyMem_Free(kinds);
- }
+ assert(PyBytes_Check(kinds));
+ assert(0 <= i && i < PyBytes_GET_SIZE(kinds));
+ char *ptr = PyBytes_AS_STRING(kinds);
+ ptr[i] = (char) kind;
}
+
struct _PyCodeConstructor {
/* metadata */
PyObject *filename;
@@ -229,8 +224,8 @@ struct _PyCodeConstructor {
PyObject *names;
/* mapping frame offsets to information */
- PyObject *localsplusnames;
- _PyLocalsPlusKinds localspluskinds;
+ PyObject *localsplusnames; // Tuple of strings
+ PyObject *localspluskinds; // Bytes object, one byte per variable
/* args (within varnames) */
int argcount;