diff options
author | Pablo Galindo <Pablogsal@gmail.com> | 2020-04-22 23:29:27 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-22 23:29:27 +0100 |
commit | c5fc15685202cda73f7c3f5c6f299b0945f58508 (patch) | |
tree | 7624ae45b95f2812e801c5879bdbdcb796f570a6 /Parser/pegen/peg_api.c | |
parent | bpo-39939: Add str.removeprefix and str.removesuffix (GH-18939) (diff) | |
download | cpython-c5fc15685202cda73f7c3f5c6f299b0945f58508.tar.gz cpython-c5fc15685202cda73f7c3f5c6f299b0945f58508.tar.bz2 cpython-c5fc15685202cda73f7c3f5c6f299b0945f58508.zip |
bpo-40334: PEP 617 implementation: New PEG parser for CPython (GH-19503)
Co-authored-by: Guido van Rossum <guido@python.org>
Co-authored-by: Lysandros Nikolaou <lisandrosnik@gmail.com>
Diffstat (limited to 'Parser/pegen/peg_api.c')
-rw-r--r-- | Parser/pegen/peg_api.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Parser/pegen/peg_api.c b/Parser/pegen/peg_api.c new file mode 100644 index 00000000000..7c6903cdd93 --- /dev/null +++ b/Parser/pegen/peg_api.c @@ -0,0 +1,134 @@ +#include <pegen_interface.h> + +#include "../tokenizer.h" +#include "pegen.h" + +mod_ty +PyPegen_ASTFromString(const char *str, int mode, PyCompilerFlags *flags, PyArena *arena) +{ + PyObject *filename_ob = PyUnicode_FromString("<string>"); + if (filename_ob == NULL) { + return NULL; + } + mod_ty result = PyPegen_ASTFromStringObject(str, filename_ob, mode, flags, arena); + Py_XDECREF(filename_ob); + return result; +} + +mod_ty +PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, PyCompilerFlags *flags, PyArena *arena) +{ + if (PySys_Audit("compile", "yO", str, filename) < 0) { + return NULL; + } + + int iflags = flags != NULL ? flags->cf_flags : PyCF_IGNORE_COOKIE; + mod_ty result = _PyPegen_run_parser_from_string(str, mode, filename, iflags, arena); + return result; +} + +mod_ty +PyPegen_ASTFromFile(const char *filename, int mode, PyArena *arena) +{ + PyObject *filename_ob = PyUnicode_FromString(filename); + if (filename_ob == NULL) { + return NULL; + } + + mod_ty result = _PyPegen_run_parser_from_file(filename, mode, filename_ob, arena); + Py_XDECREF(filename_ob); + return result; +} + +mod_ty +PyPegen_ASTFromFileObject(FILE *fp, PyObject *filename_ob, int mode, + const char *enc, const char *ps1, const char* ps2, + int *errcode, PyArena *arena) +{ + if (PySys_Audit("compile", "OO", Py_None, filename_ob) < 0) { + return NULL; + } + return _PyPegen_run_parser_from_file_pointer(fp, mode, filename_ob, enc, ps1, ps2, + 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("<string>"); + 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) +{ + 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, 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, 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, + errcode, arena); + if (res == NULL) { + goto error; + } + + result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); + +error: + PyArena_Free(arena); + return result; +} |