From 03b7642265e65f198682f22648dbe6cf4fff9835 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Fri, 1 May 2020 20:30:51 +0300 Subject: [PATCH] bpo-40334: Make the PyPegen* and PyParser* APIs more consistent (GH-19839) This commit makes both APIs more consistent by doing the following: - Remove the `PyPegen_CodeObjectFrom*` functions, which weren't used and will probably not be needed. Functions like `Py_CompileStringObject` can be used instead. - Include a `const char *filename` parameter in `PyPegen_ASTFromString`. - Rename `PyPegen_ASTFromFile` to `PyPegen_ASTFromFilename`, because its signature is not the same with `PyParser_ASTFromFile`. --- Include/internal/pegen_interface.h | 47 ++++++++------- Modules/_peg_parser.c | 4 +- Parser/pegen/peg_api.c | 91 ++---------------------------- 3 files changed, 36 insertions(+), 106 deletions(-) diff --git a/Include/internal/pegen_interface.h b/Include/internal/pegen_interface.h index adff7315681..ee4c77ec006 100644 --- a/Include/internal/pegen_interface.h +++ b/Include/internal/pegen_interface.h @@ -11,25 +11,34 @@ extern "C" { #include "Python.h" #include "Python-ast.h" -PyAPI_FUNC(mod_ty) PyPegen_ASTFromFile(const char *filename, int mode, PyCompilerFlags*, PyArena *arena); -PyAPI_FUNC(mod_ty) PyPegen_ASTFromString(const char *str, int mode, PyCompilerFlags *flags, - PyArena *arena); -PyAPI_FUNC(mod_ty) PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, - PyCompilerFlags *flags, PyArena *arena); -PyAPI_FUNC(mod_ty) PyPegen_ASTFromFileObject(FILE *fp, PyObject *filename_ob, - int mode, const char *enc, const char *ps1, - const char *ps2, PyCompilerFlags *flags, - int *errcode, PyArena *arena); -PyAPI_FUNC(PyCodeObject *) PyPegen_CodeObjectFromFile(const char *filename, int mode, PyCompilerFlags *flags); -PyAPI_FUNC(PyCodeObject *) PyPegen_CodeObjectFromString(const char *str, int mode, - PyCompilerFlags *flags); -PyAPI_FUNC(PyCodeObject *) PyPegen_CodeObjectFromFileObject(FILE *, PyObject *filename_ob, - int mode, - const char *ps1, - const char *ps2, - PyCompilerFlags *flags, - const char *enc, - int *errcode); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromString( + const char *str, + const char *filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromStringObject( + const char *str, + PyObject* filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromFileObject( + FILE *fp, + PyObject *filename_ob, + int mode, + const char *enc, + const char *ps1, + const char *ps2, + PyCompilerFlags *flags, + int *errcode, + PyArena *arena); +PyAPI_FUNC(mod_ty) PyPegen_ASTFromFilename( + const char *filename, + int mode, + PyCompilerFlags *flags, + PyArena *arena); + #ifdef __cplusplus } diff --git a/Modules/_peg_parser.c b/Modules/_peg_parser.c index 59b80f9e06e..3b27b2c9cba 100644 --- a/Modules/_peg_parser.c +++ b/Modules/_peg_parser.c @@ -31,7 +31,7 @@ _Py_parse_file(PyObject *self, PyObject *args, PyObject *kwds) PyCompilerFlags flags = _PyCompilerFlags_INIT; PyObject *result = NULL; - mod_ty res = PyPegen_ASTFromFile(filename, mode, &flags, arena); + mod_ty res = PyPegen_ASTFromFilename(filename, mode, &flags, arena); if (res == NULL) { goto error; } @@ -84,7 +84,7 @@ _Py_parse_string(PyObject *self, PyObject *args, PyObject *kwds) res = PyParser_ASTFromString(the_string, "", mode, &flags, arena); } else { - res = PyPegen_ASTFromString(the_string, mode, &flags, arena); + res = PyPegen_ASTFromString(the_string, "", mode, &flags, arena); } if (res == NULL) { goto error; diff --git a/Parser/pegen/peg_api.c b/Parser/pegen/peg_api.c index 31ac2e13992..5e71ecdb13c 100644 --- a/Parser/pegen/peg_api.c +++ b/Parser/pegen/peg_api.c @@ -4,9 +4,10 @@ #include "pegen.h" mod_ty -PyPegen_ASTFromString(const char *str, int mode, PyCompilerFlags *flags, PyArena *arena) +PyPegen_ASTFromString(const char *str, const char *filename, int mode, + PyCompilerFlags *flags, PyArena *arena) { - PyObject *filename_ob = PyUnicode_FromString(""); + PyObject *filename_ob = PyUnicode_FromString(filename); if (filename_ob == NULL) { return NULL; } @@ -16,7 +17,8 @@ PyPegen_ASTFromString(const char *str, int mode, PyCompilerFlags *flags, PyArena } mod_ty -PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, PyCompilerFlags *flags, PyArena *arena) +PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, + PyCompilerFlags *flags, PyArena *arena) { if (PySys_Audit("compile", "yO", str, filename) < 0) { return NULL; @@ -27,7 +29,7 @@ PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, PyCom } mod_ty -PyPegen_ASTFromFile(const char *filename, int mode, PyCompilerFlags *flags, PyArena *arena) +PyPegen_ASTFromFilename(const char *filename, int mode, PyCompilerFlags *flags, PyArena *arena) { PyObject *filename_ob = PyUnicode_FromString(filename); if (filename_ob == NULL) { @@ -50,84 +52,3 @@ PyPegen_ASTFromFileObject(FILE *fp, PyObject *filename_ob, int mode, return _PyPegen_run_parser_from_file_pointer(fp, mode, filename_ob, enc, ps1, ps2, flags, errcode, arena); } - -PyCodeObject * -PyPegen_CodeObjectFromString(const char *str, int mode, PyCompilerFlags *flags) -{ - PyArena *arena = PyArena_New(); - if (arena == NULL) { - return NULL; - } - - PyCodeObject *result = NULL; - - PyObject *filename_ob = PyUnicode_FromString(""); - if (filename_ob == NULL) { - goto error; - } - - mod_ty res = PyPegen_ASTFromString(str, mode, flags, arena); - if (res == NULL) { - goto error; - } - - result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); - -error: - Py_XDECREF(filename_ob); - PyArena_Free(arena); - return result; -} - -PyCodeObject * -PyPegen_CodeObjectFromFile(const char *filename, int mode, PyCompilerFlags* flags) -{ - PyArena *arena = PyArena_New(); - if (arena == NULL) { - return NULL; - } - - PyCodeObject *result = NULL; - - PyObject *filename_ob = PyUnicode_FromString(filename); - if (filename_ob == NULL) { - goto error; - } - - mod_ty res = PyPegen_ASTFromFile(filename, mode, flags, arena); - if (res == NULL) { - goto error; - } - - result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); - -error: - Py_XDECREF(filename_ob); - PyArena_Free(arena); - return result; -} - -PyCodeObject * -PyPegen_CodeObjectFromFileObject(FILE *fp, PyObject *filename_ob, int mode, - const char *ps1, const char *ps2, - PyCompilerFlags *flags, const char *enc, int *errcode) -{ - PyArena *arena = PyArena_New(); - if (arena == NULL) { - return NULL; - } - - PyCodeObject *result = NULL; - - mod_ty res = PyPegen_ASTFromFileObject(fp, filename_ob, mode, enc, ps1, ps2, - flags, errcode, arena); - if (res == NULL) { - goto error; - } - - result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); - -error: - PyArena_Free(arena); - return result; -}