summaryrefslogtreecommitdiffstats
path: root/Parser/pegen/peg_api.c
blob: 7c6903cdd93343ba7b00c4c3b41cabe7ce17ebf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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;
}