diff options
author | Mark Shannon <mark@hotpy.org> | 2022-04-21 18:08:36 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-21 18:08:36 (GMT) |
commit | d44815cabc0a8d9932df2fa95cb374eadddb7c17 (patch) | |
tree | 12cd641cbd5b32d20983b5edb7ac650ea85a434a /Objects/codeobject.c | |
parent | 5974827c71d884bb3cc58f07a9eaefafe0cbaa6e (diff) | |
download | cpython-d44815cabc0a8d9932df2fa95cb374eadddb7c17.zip cpython-d44815cabc0a8d9932df2fa95cb374eadddb7c17.tar.gz cpython-d44815cabc0a8d9932df2fa95cb374eadddb7c17.tar.bz2 |
GH-88116: Document that PyCodeNew is dangerous, and make PyCode_NewEmpty less dangerous. (GH-91790)
Diffstat (limited to 'Objects/codeobject.c')
-rw-r--r-- | Objects/codeobject.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 9a57815..4fc4b8f 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -626,12 +626,20 @@ PyCode_New(int argcount, int kwonlyargcount, exceptiontable); } +static const char assert0[4] = { + LOAD_ASSERTION_ERROR, + 0, + RAISE_VARARGS, + 1 +}; + PyCodeObject * PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) { PyObject *nulltuple = NULL; PyObject *filename_ob = NULL; PyObject *funcname_ob = NULL; + PyObject *code_ob = NULL; PyCodeObject *result = NULL; nulltuple = PyTuple_New(0); @@ -646,13 +654,17 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) if (filename_ob == NULL) { goto failed; } + code_ob = PyBytes_FromStringAndSize(assert0, 4); + if (code_ob == NULL) { + goto failed; + } #define emptystring (PyObject *)&_Py_SINGLETON(bytes_empty) struct _PyCodeConstructor con = { .filename = filename_ob, .name = funcname_ob, .qualname = funcname_ob, - .code = emptystring, + .code = code_ob, .firstlineno = firstlineno, .linetable = emptystring, .consts = nulltuple, @@ -660,6 +672,7 @@ PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) .localsplusnames = nulltuple, .localspluskinds = emptystring, .exceptiontable = emptystring, + .stacksize = 1, }; result = _PyCode_New(&con); @@ -667,6 +680,7 @@ failed: Py_XDECREF(nulltuple); Py_XDECREF(funcname_ob); Py_XDECREF(filename_ob); + Py_XDECREF(code_ob); return result; } |