blob: 7c6903cdd93343ba7b00c4c3b41cabe7ce17ebf5 [file] [log] [blame]
Pablo Galindoc5fc1562020-04-22 23:29:27 +01001#include <pegen_interface.h>
2
3#include "../tokenizer.h"
4#include "pegen.h"
5
6mod_ty
7PyPegen_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
18mod_ty
19PyPegen_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
30mod_ty
31PyPegen_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
43mod_ty
44PyPegen_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
55PyCodeObject *
56PyPegen_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
77error:
78 Py_XDECREF(filename_ob);
79 PyArena_Free(arena);
80 return result;
81}
82
83PyCodeObject *
84PyPegen_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
105error:
106 Py_XDECREF(filename_ob);
107 PyArena_Free(arena);
108 return result;
109}
110
111PyCodeObject *
112PyPegen_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
131error:
132 PyArena_Free(arena);
133 return result;
134}