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