Pablo Galindo | c5fc156 | 2020-04-22 23:29:27 +0100 | [diff] [blame] | 1 | #include <pegen_interface.h> |
| 2 | |
| 3 | #include "../tokenizer.h" |
| 4 | #include "pegen.h" |
| 5 | |
| 6 | mod_ty |
| 7 | PyPegen_ASTFromString(const char *str, int mode, PyCompilerFlags *flags, PyArena *arena) |
| 8 | { |
| 9 | PyObject *filename_ob = PyUnicode_FromString("<string>"); |
| 10 | if (filename_ob == NULL) { |
| 11 | return NULL; |
| 12 | } |
| 13 | mod_ty result = PyPegen_ASTFromStringObject(str, filename_ob, mode, flags, arena); |
| 14 | Py_XDECREF(filename_ob); |
| 15 | return result; |
| 16 | } |
| 17 | |
| 18 | mod_ty |
| 19 | PyPegen_ASTFromStringObject(const char *str, PyObject* filename, int mode, PyCompilerFlags *flags, PyArena *arena) |
| 20 | { |
| 21 | if (PySys_Audit("compile", "yO", str, filename) < 0) { |
| 22 | return NULL; |
| 23 | } |
| 24 | |
| 25 | int iflags = flags != NULL ? flags->cf_flags : PyCF_IGNORE_COOKIE; |
| 26 | mod_ty result = _PyPegen_run_parser_from_string(str, mode, filename, iflags, arena); |
| 27 | return result; |
| 28 | } |
| 29 | |
| 30 | mod_ty |
| 31 | PyPegen_ASTFromFile(const char *filename, int mode, PyArena *arena) |
| 32 | { |
| 33 | PyObject *filename_ob = PyUnicode_FromString(filename); |
| 34 | if (filename_ob == NULL) { |
| 35 | return NULL; |
| 36 | } |
| 37 | |
| 38 | mod_ty result = _PyPegen_run_parser_from_file(filename, mode, filename_ob, arena); |
| 39 | Py_XDECREF(filename_ob); |
| 40 | return result; |
| 41 | } |
| 42 | |
| 43 | mod_ty |
| 44 | PyPegen_ASTFromFileObject(FILE *fp, PyObject *filename_ob, int mode, |
| 45 | const char *enc, const char *ps1, const char* ps2, |
| 46 | int *errcode, PyArena *arena) |
| 47 | { |
| 48 | if (PySys_Audit("compile", "OO", Py_None, filename_ob) < 0) { |
| 49 | return NULL; |
| 50 | } |
| 51 | return _PyPegen_run_parser_from_file_pointer(fp, mode, filename_ob, enc, ps1, ps2, |
| 52 | errcode, arena); |
| 53 | } |
| 54 | |
| 55 | PyCodeObject * |
| 56 | PyPegen_CodeObjectFromString(const char *str, int mode, PyCompilerFlags *flags) |
| 57 | { |
| 58 | PyArena *arena = PyArena_New(); |
| 59 | if (arena == NULL) { |
| 60 | return NULL; |
| 61 | } |
| 62 | |
| 63 | PyCodeObject *result = NULL; |
| 64 | |
| 65 | PyObject *filename_ob = PyUnicode_FromString("<string>"); |
| 66 | if (filename_ob == NULL) { |
| 67 | goto error; |
| 68 | } |
| 69 | |
| 70 | mod_ty res = PyPegen_ASTFromString(str, mode, flags, arena); |
| 71 | if (res == NULL) { |
| 72 | goto error; |
| 73 | } |
| 74 | |
| 75 | result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); |
| 76 | |
| 77 | error: |
| 78 | Py_XDECREF(filename_ob); |
| 79 | PyArena_Free(arena); |
| 80 | return result; |
| 81 | } |
| 82 | |
| 83 | PyCodeObject * |
| 84 | PyPegen_CodeObjectFromFile(const char *filename, int mode) |
| 85 | { |
| 86 | PyArena *arena = PyArena_New(); |
| 87 | if (arena == NULL) { |
| 88 | return NULL; |
| 89 | } |
| 90 | |
| 91 | PyCodeObject *result = NULL; |
| 92 | |
| 93 | PyObject *filename_ob = PyUnicode_FromString(filename); |
| 94 | if (filename_ob == NULL) { |
| 95 | goto error; |
| 96 | } |
| 97 | |
| 98 | mod_ty res = PyPegen_ASTFromFile(filename, mode, arena); |
| 99 | if (res == NULL) { |
| 100 | goto error; |
| 101 | } |
| 102 | |
| 103 | result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); |
| 104 | |
| 105 | error: |
| 106 | Py_XDECREF(filename_ob); |
| 107 | PyArena_Free(arena); |
| 108 | return result; |
| 109 | } |
| 110 | |
| 111 | PyCodeObject * |
| 112 | PyPegen_CodeObjectFromFileObject(FILE *fp, PyObject *filename_ob, int mode, |
| 113 | const char *ps1, const char *ps2, const char *enc, |
| 114 | int *errcode) |
| 115 | { |
| 116 | PyArena *arena = PyArena_New(); |
| 117 | if (arena == NULL) { |
| 118 | return NULL; |
| 119 | } |
| 120 | |
| 121 | PyCodeObject *result = NULL; |
| 122 | |
| 123 | mod_ty res = PyPegen_ASTFromFileObject(fp, filename_ob, mode, enc, ps1, ps2, |
| 124 | errcode, arena); |
| 125 | if (res == NULL) { |
| 126 | goto error; |
| 127 | } |
| 128 | |
| 129 | result = PyAST_CompileObject(res, filename_ob, NULL, -1, arena); |
| 130 | |
| 131 | error: |
| 132 | PyArena_Free(arena); |
| 133 | return result; |
| 134 | } |