blob: f376e86ddc4c0d87af9df3703d17c51851fe69b6 [file] [log] [blame]
Guido van Rossum95e4d582018-01-26 08:20:18 -08001#include <stdbool.h>
2#include "Python.h"
3#include "Python-ast.h"
4
5static PyObject *_str_open_br;
6static PyObject *_str_dbl_open_br;
7static PyObject *_str_close_br;
8static PyObject *_str_dbl_close_br;
9
10/* Forward declarations for recursion via helper functions. */
11static PyObject *
Serhiy Storchaka64fddc42018-05-17 06:17:48 +030012expr_as_unicode(expr_ty e, int level);
Guido van Rossum95e4d582018-01-26 08:20:18 -080013static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +030014append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level);
Guido van Rossum95e4d582018-01-26 08:20:18 -080015static int
16append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
17static int
18append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
Serhiy Storchaka64fddc42018-05-17 06:17:48 +030019static int
20append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice);
Guido van Rossum95e4d582018-01-26 08:20:18 -080021
22static int
23append_charp(_PyUnicodeWriter *writer, const char *charp)
24{
Stéphane Wirtel83ab9952018-02-01 17:59:27 +010025 return _PyUnicodeWriter_WriteASCIIString(writer, charp, -1);
Guido van Rossum95e4d582018-01-26 08:20:18 -080026}
27
Serhiy Storchaka64fddc42018-05-17 06:17:48 +030028#define APPEND_STR_FINISH(str) do { \
29 return append_charp(writer, (str)); \
30 } while (0)
31
32#define APPEND_STR(str) do { \
33 if (-1 == append_charp(writer, (str))) { \
34 return -1; \
35 } \
36 } while (0)
37
38#define APPEND_STR_IF(cond, str) do { \
39 if ((cond) && -1 == append_charp(writer, (str))) { \
40 return -1; \
41 } \
42 } while (0)
43
44#define APPEND_STR_IF_NOT_FIRST(str) do { \
45 APPEND_STR_IF(!first, (str)); \
46 first = false; \
47 } while (0)
48
49#define APPEND_EXPR(expr, pr) do { \
50 if (-1 == append_ast_expr(writer, (expr), (pr))) { \
51 return -1; \
52 } \
53 } while (0)
54
55#define APPEND(type, value) do { \
56 if (-1 == append_ast_ ## type(writer, (value))) { \
57 return -1; \
58 } \
59 } while (0)
60
Guido van Rossum95e4d582018-01-26 08:20:18 -080061static int
62append_repr(_PyUnicodeWriter *writer, PyObject *obj)
63{
64 int ret;
65 PyObject *repr;
66 repr = PyObject_Repr(obj);
67 if (!repr) {
68 return -1;
69 }
70 ret = _PyUnicodeWriter_WriteStr(writer, repr);
71 Py_DECREF(repr);
72 return ret;
73}
74
Serhiy Storchaka64fddc42018-05-17 06:17:48 +030075/* Priority levels */
76
77enum {
78 PR_TUPLE,
79 PR_TEST, /* 'if'-'else', 'lambda' */
80 PR_OR, /* 'or' */
81 PR_AND, /* 'and' */
82 PR_NOT, /* 'not' */
83 PR_CMP, /* '<', '>', '==', '>=', '<=', '!=',
84 'in', 'not in', 'is', 'is not' */
85 PR_EXPR,
86 PR_BOR = PR_EXPR, /* '|' */
87 PR_BXOR, /* '^' */
88 PR_BAND, /* '&' */
89 PR_SHIFT, /* '<<', '>>' */
90 PR_ARITH, /* '+', '-' */
91 PR_TERM, /* '*', '@', '/', '%', '//' */
92 PR_FACTOR, /* unary '+', '-', '~' */
93 PR_POWER, /* '**' */
94 PR_AWAIT, /* 'await' */
95 PR_ATOM,
96};
97
Guido van Rossum95e4d582018-01-26 08:20:18 -080098static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +030099append_ast_boolop(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800100{
101 Py_ssize_t i, value_count;
102 asdl_seq *values;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300103 const char *op = (e->v.BoolOp.op == And) ? " and " : " or ";
104 int pr = (e->v.BoolOp.op == And) ? PR_AND : PR_OR;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800105
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300106 APPEND_STR_IF(level > pr, "(");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800107
108 values = e->v.BoolOp.values;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300109 value_count = asdl_seq_LEN(values);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800110
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300111 for (i = 0; i < value_count; ++i) {
112 APPEND_STR_IF(i > 0, op);
113 APPEND_EXPR((expr_ty)asdl_seq_GET(values, i), pr + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800114 }
115
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300116 APPEND_STR_IF(level > pr, ")");
117 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800118}
119
120static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300121append_ast_binop(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800122{
123 const char *op;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300124 int pr;
125 bool rassoc = false; /* is right-associative? */
Guido van Rossum95e4d582018-01-26 08:20:18 -0800126
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300127 switch (e->v.BinOp.op) {
128 case Add: op = " + "; pr = PR_ARITH; break;
129 case Sub: op = " - "; pr = PR_ARITH; break;
130 case Mult: op = " * "; pr = PR_TERM; break;
131 case MatMult: op = " @ "; pr = PR_TERM; break;
132 case Div: op = " / "; pr = PR_TERM; break;
133 case Mod: op = " % "; pr = PR_TERM; break;
134 case LShift: op = " << "; pr = PR_SHIFT; break;
135 case RShift: op = " >> "; pr = PR_SHIFT; break;
136 case BitOr: op = " | "; pr = PR_BOR; break;
137 case BitXor: op = " ^ "; pr = PR_BXOR; break;
138 case BitAnd: op = " & "; pr = PR_BAND; break;
139 case FloorDiv: op = " // "; pr = PR_TERM; break;
140 case Pow: op = " ** "; pr = PR_POWER; rassoc = true; break;
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100141 default:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300142 PyErr_SetString(PyExc_SystemError,
143 "unknown binary operator");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800144 return -1;
145 }
146
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300147 APPEND_STR_IF(level > pr, "(");
148 APPEND_EXPR(e->v.BinOp.left, pr + rassoc);
149 APPEND_STR(op);
150 APPEND_EXPR(e->v.BinOp.right, pr + !rassoc);
151 APPEND_STR_IF(level > pr, ")");
152 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800153}
154
155static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300156append_ast_unaryop(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800157{
158 const char *op;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300159 int pr;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800160
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300161 switch (e->v.UnaryOp.op) {
162 case Invert: op = "~"; pr = PR_FACTOR; break;
163 case Not: op = "not "; pr = PR_NOT; break;
164 case UAdd: op = "+"; pr = PR_FACTOR; break;
165 case USub: op = "-"; pr = PR_FACTOR; break;
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100166 default:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300167 PyErr_SetString(PyExc_SystemError,
168 "unknown unary operator");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800169 return -1;
170 }
171
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300172 APPEND_STR_IF(level > pr, "(");
173 APPEND_STR(op);
174 APPEND_EXPR(e->v.UnaryOp.operand, pr);
175 APPEND_STR_IF(level > pr, ")");
176 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800177}
178
179static int
180append_ast_arg(_PyUnicodeWriter *writer, arg_ty arg)
181{
182 if (-1 == _PyUnicodeWriter_WriteStr(writer, arg->arg)) {
183 return -1;
184 }
185 if (arg->annotation) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300186 APPEND_STR(": ");
187 APPEND_EXPR(arg->annotation, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800188 }
189 return 0;
190}
191
192static int
193append_ast_args(_PyUnicodeWriter *writer, arguments_ty args)
194{
195 bool first;
Pablo Galindoda6129e2019-05-18 23:40:22 +0100196 Py_ssize_t i, di, arg_count, posonlyarg_count, default_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800197
198 first = true;
199
Pablo Galindoda6129e2019-05-18 23:40:22 +0100200 /* positional-only and positional arguments with defaults */
201 posonlyarg_count = asdl_seq_LEN(args->posonlyargs);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800202 arg_count = asdl_seq_LEN(args->args);
203 default_count = asdl_seq_LEN(args->defaults);
Pablo Galindoda6129e2019-05-18 23:40:22 +0100204 for (i = 0; i < posonlyarg_count + arg_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300205 APPEND_STR_IF_NOT_FIRST(", ");
Pablo Galindoda6129e2019-05-18 23:40:22 +0100206 if (i < posonlyarg_count){
207 APPEND(arg, (arg_ty)asdl_seq_GET(args->posonlyargs, i));
208 } else {
209 APPEND(arg, (arg_ty)asdl_seq_GET(args->args, i-posonlyarg_count));
210 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800211
Pablo Galindoda6129e2019-05-18 23:40:22 +0100212 di = i - posonlyarg_count - arg_count + default_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800213 if (di >= 0) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300214 APPEND_STR("=");
215 APPEND_EXPR((expr_ty)asdl_seq_GET(args->defaults, di), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800216 }
Pablo Galindoda6129e2019-05-18 23:40:22 +0100217 if (posonlyarg_count && i + 1 == posonlyarg_count) {
218 APPEND_STR(", /");
219 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800220 }
221
222 /* vararg, or bare '*' if no varargs but keyword-only arguments present */
Serhiy Storchaka2a2940e2018-09-30 21:07:05 +0300223 if (args->vararg || asdl_seq_LEN(args->kwonlyargs)) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300224 APPEND_STR_IF_NOT_FIRST(", ");
225 APPEND_STR("*");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800226 if (args->vararg) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300227 APPEND(arg, args->vararg);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800228 }
229 }
230
231 /* keyword-only arguments */
232 arg_count = asdl_seq_LEN(args->kwonlyargs);
233 default_count = asdl_seq_LEN(args->kw_defaults);
234 for (i = 0; i < arg_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300235 APPEND_STR_IF_NOT_FIRST(", ");
236 APPEND(arg, (arg_ty)asdl_seq_GET(args->kwonlyargs, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800237
238 di = i - arg_count + default_count;
239 if (di >= 0) {
Serhiy Storchaka2a2940e2018-09-30 21:07:05 +0300240 expr_ty default_ = (expr_ty)asdl_seq_GET(args->kw_defaults, di);
241 if (default_) {
242 APPEND_STR("=");
243 APPEND_EXPR(default_, PR_TEST);
244 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800245 }
246 }
247
248 /* **kwargs */
249 if (args->kwarg) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300250 APPEND_STR_IF_NOT_FIRST(", ");
251 APPEND_STR("**");
252 APPEND(arg, args->kwarg);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800253 }
254
255 return 0;
256}
257
258static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300259append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800260{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300261 APPEND_STR_IF(level > PR_TEST, "(");
Pablo Galindoda6129e2019-05-18 23:40:22 +0100262 Py_ssize_t n_positional = (asdl_seq_LEN(e->v.Lambda.args->args) +
263 asdl_seq_LEN(e->v.Lambda.args->posonlyargs));
264 APPEND_STR(n_positional ? "lambda " : "lambda");
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300265 APPEND(args, e->v.Lambda.args);
266 APPEND_STR(": ");
267 APPEND_EXPR(e->v.Lambda.body, PR_TEST);
268 APPEND_STR_IF(level > PR_TEST, ")");
269 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800270}
271
272static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300273append_ast_ifexp(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800274{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300275 APPEND_STR_IF(level > PR_TEST, "(");
276 APPEND_EXPR(e->v.IfExp.body, PR_TEST + 1);
277 APPEND_STR(" if ");
278 APPEND_EXPR(e->v.IfExp.test, PR_TEST + 1);
279 APPEND_STR(" else ");
280 APPEND_EXPR(e->v.IfExp.orelse, PR_TEST);
281 APPEND_STR_IF(level > PR_TEST, ")");
282 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800283}
284
285static int
286append_ast_dict(_PyUnicodeWriter *writer, expr_ty e)
287{
288 Py_ssize_t i, value_count;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300289 expr_ty key_node;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800290
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300291 APPEND_STR("{");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800292 value_count = asdl_seq_LEN(e->v.Dict.values);
293
294 for (i = 0; i < value_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300295 APPEND_STR_IF(i > 0, ", ");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800296 key_node = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i);
297 if (key_node != NULL) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300298 APPEND_EXPR(key_node, PR_TEST);
299 APPEND_STR(": ");
300 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Dict.values, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800301 }
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300302 else {
303 APPEND_STR("**");
304 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Dict.values, i), PR_EXPR);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800305 }
306 }
307
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300308 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800309}
310
311static int
312append_ast_set(_PyUnicodeWriter *writer, expr_ty e)
313{
314 Py_ssize_t i, elem_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800315
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300316 APPEND_STR("{");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800317 elem_count = asdl_seq_LEN(e->v.Set.elts);
318 for (i = 0; i < elem_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300319 APPEND_STR_IF(i > 0, ", ");
320 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Set.elts, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800321 }
322
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300323 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800324}
325
326static int
327append_ast_list(_PyUnicodeWriter *writer, expr_ty e)
328{
329 Py_ssize_t i, elem_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800330
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300331 APPEND_STR("[");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800332 elem_count = asdl_seq_LEN(e->v.List.elts);
333 for (i = 0; i < elem_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300334 APPEND_STR_IF(i > 0, ", ");
335 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.List.elts, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800336 }
337
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300338 APPEND_STR_FINISH("]");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800339}
340
341static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300342append_ast_tuple(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800343{
344 Py_ssize_t i, elem_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800345
346 elem_count = asdl_seq_LEN(e->v.Tuple.elts);
347
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300348 if (elem_count == 0) {
349 APPEND_STR_FINISH("()");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800350 }
351
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300352 APPEND_STR_IF(level > PR_TUPLE, "(");
353
Guido van Rossum95e4d582018-01-26 08:20:18 -0800354 for (i = 0; i < elem_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300355 APPEND_STR_IF(i > 0, ", ");
356 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Tuple.elts, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800357 }
358
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300359 APPEND_STR_IF(elem_count == 1, ",");
360 APPEND_STR_IF(level > PR_TUPLE, ")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800361 return 0;
362}
363
364static int
365append_ast_comprehension(_PyUnicodeWriter *writer, comprehension_ty gen)
366{
367 Py_ssize_t i, if_count;
368
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300369 APPEND_STR(gen->is_async ? " async for " : " for ");
370 APPEND_EXPR(gen->target, PR_TUPLE);
371 APPEND_STR(" in ");
372 APPEND_EXPR(gen->iter, PR_TEST + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800373
374 if_count = asdl_seq_LEN(gen->ifs);
375 for (i = 0; i < if_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300376 APPEND_STR(" if ");
377 APPEND_EXPR((expr_ty)asdl_seq_GET(gen->ifs, i), PR_TEST + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800378 }
379 return 0;
380}
381
382static int
383append_ast_comprehensions(_PyUnicodeWriter *writer, asdl_seq *comprehensions)
384{
385 Py_ssize_t i, gen_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800386 gen_count = asdl_seq_LEN(comprehensions);
387
388 for (i = 0; i < gen_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300389 APPEND(comprehension, (comprehension_ty)asdl_seq_GET(comprehensions, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800390 }
391
392 return 0;
393}
394
395static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300396append_ast_genexp(_PyUnicodeWriter *writer, expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800397{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300398 APPEND_STR("(");
399 APPEND_EXPR(e->v.GeneratorExp.elt, PR_TEST);
400 APPEND(comprehensions, e->v.GeneratorExp.generators);
401 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800402}
403
404static int
405append_ast_listcomp(_PyUnicodeWriter *writer, expr_ty e)
406{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300407 APPEND_STR("[");
408 APPEND_EXPR(e->v.ListComp.elt, PR_TEST);
409 APPEND(comprehensions, e->v.ListComp.generators);
410 APPEND_STR_FINISH("]");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800411}
412
413static int
414append_ast_setcomp(_PyUnicodeWriter *writer, expr_ty e)
415{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300416 APPEND_STR("{");
417 APPEND_EXPR(e->v.SetComp.elt, PR_TEST);
418 APPEND(comprehensions, e->v.SetComp.generators);
419 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800420}
421
422static int
423append_ast_dictcomp(_PyUnicodeWriter *writer, expr_ty e)
424{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300425 APPEND_STR("{");
426 APPEND_EXPR(e->v.DictComp.key, PR_TEST);
427 APPEND_STR(": ");
428 APPEND_EXPR(e->v.DictComp.value, PR_TEST);
429 APPEND(comprehensions, e->v.DictComp.generators);
430 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800431}
432
433static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300434append_ast_compare(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800435{
436 const char *op;
437 Py_ssize_t i, comparator_count;
438 asdl_seq *comparators;
439 asdl_int_seq *ops;
440
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300441 APPEND_STR_IF(level > PR_CMP, "(");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800442
443 comparators = e->v.Compare.comparators;
444 ops = e->v.Compare.ops;
445 comparator_count = asdl_seq_LEN(comparators);
446 assert(comparator_count > 0);
447 assert(comparator_count == asdl_seq_LEN(ops));
448
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300449 APPEND_EXPR(e->v.Compare.left, PR_CMP + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800450
451 for (i = 0; i < comparator_count; i++) {
452 switch ((cmpop_ty)asdl_seq_GET(ops, i)) {
453 case Eq:
454 op = " == ";
455 break;
456 case NotEq:
457 op = " != ";
458 break;
459 case Lt:
460 op = " < ";
461 break;
462 case LtE:
463 op = " <= ";
464 break;
465 case Gt:
466 op = " > ";
467 break;
468 case GtE:
469 op = " >= ";
470 break;
471 case Is:
472 op = " is ";
473 break;
474 case IsNot:
475 op = " is not ";
476 break;
477 case In:
478 op = " in ";
479 break;
480 case NotIn:
481 op = " not in ";
482 break;
483 default:
484 PyErr_SetString(PyExc_SystemError,
485 "unexpected comparison kind");
486 return -1;
487 }
488
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300489 APPEND_STR(op);
490 APPEND_EXPR((expr_ty)asdl_seq_GET(comparators, i), PR_CMP + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800491 }
492
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300493 APPEND_STR_IF(level > PR_CMP, ")");
494 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800495}
496
497static int
498append_ast_keyword(_PyUnicodeWriter *writer, keyword_ty kw)
499{
500 if (kw->arg == NULL) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300501 APPEND_STR("**");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800502 }
503 else {
504 if (-1 == _PyUnicodeWriter_WriteStr(writer, kw->arg)) {
505 return -1;
506 }
507
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300508 APPEND_STR("=");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800509 }
510
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300511 APPEND_EXPR(kw->value, PR_TEST);
512 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800513}
514
515static int
516append_ast_call(_PyUnicodeWriter *writer, expr_ty e)
517{
518 bool first;
519 Py_ssize_t i, arg_count, kw_count;
520 expr_ty expr;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800521
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300522 APPEND_EXPR(e->v.Call.func, PR_ATOM);
523
524 arg_count = asdl_seq_LEN(e->v.Call.args);
525 kw_count = asdl_seq_LEN(e->v.Call.keywords);
526 if (arg_count == 1 && kw_count == 0) {
527 expr = (expr_ty)asdl_seq_GET(e->v.Call.args, 0);
528 if (expr->kind == GeneratorExp_kind) {
529 /* Special case: a single generator expression. */
530 return append_ast_genexp(writer, expr);
531 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800532 }
533
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300534 APPEND_STR("(");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800535
536 first = true;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800537 for (i = 0; i < arg_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300538 APPEND_STR_IF_NOT_FIRST(", ");
539 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Call.args, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800540 }
541
Guido van Rossum95e4d582018-01-26 08:20:18 -0800542 for (i = 0; i < kw_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300543 APPEND_STR_IF_NOT_FIRST(", ");
544 APPEND(keyword, (keyword_ty)asdl_seq_GET(e->v.Call.keywords, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800545 }
546
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300547 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800548}
549
550static PyObject *
551escape_braces(PyObject *orig)
552{
553 PyObject *temp;
554 PyObject *result;
555 temp = PyUnicode_Replace(orig, _str_open_br, _str_dbl_open_br, -1);
556 if (!temp) {
557 return NULL;
558 }
559 result = PyUnicode_Replace(temp, _str_close_br, _str_dbl_close_br, -1);
560 Py_DECREF(temp);
561 return result;
562}
563
564static int
565append_fstring_unicode(_PyUnicodeWriter *writer, PyObject *unicode)
566{
567 PyObject *escaped;
568 int result = -1;
569 escaped = escape_braces(unicode);
570 if (escaped) {
571 result = _PyUnicodeWriter_WriteStr(writer, escaped);
572 Py_DECREF(escaped);
573 }
574 return result;
575}
576
577static int
578append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
579{
580 switch (e->kind) {
581 case Constant_kind:
582 return append_fstring_unicode(writer, e->v.Constant.value);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800583 case JoinedStr_kind:
584 return append_joinedstr(writer, e, is_format_spec);
585 case FormattedValue_kind:
586 return append_formattedvalue(writer, e, is_format_spec);
587 default:
588 PyErr_SetString(PyExc_SystemError,
589 "unknown expression kind inside f-string");
590 return -1;
591 }
592}
593
594/* Build body separately to enable wrapping the entire stream of Strs,
595 Constants and FormattedValues in one opening and one closing quote. */
596static PyObject *
597build_fstring_body(asdl_seq *values, bool is_format_spec)
598{
599 Py_ssize_t i, value_count;
600 _PyUnicodeWriter body_writer;
601 _PyUnicodeWriter_Init(&body_writer);
602 body_writer.min_length = 256;
603 body_writer.overallocate = 1;
604
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300605 value_count = asdl_seq_LEN(values);
606 for (i = 0; i < value_count; ++i) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800607 if (-1 == append_fstring_element(&body_writer,
608 (expr_ty)asdl_seq_GET(values, i),
609 is_format_spec
610 )) {
611 _PyUnicodeWriter_Dealloc(&body_writer);
612 return NULL;
613 }
614 }
615
616 return _PyUnicodeWriter_Finish(&body_writer);
617}
618
619static int
620append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
621{
622 int result = -1;
623 PyObject *body = build_fstring_body(e->v.JoinedStr.values, is_format_spec);
624 if (!body) {
625 return -1;
626 }
627
628 if (!is_format_spec) {
629 if (-1 != append_charp(writer, "f") &&
630 -1 != append_repr(writer, body))
631 {
632 result = 0;
633 }
634 }
635 else {
636 result = _PyUnicodeWriter_WriteStr(writer, body);
637 }
638 Py_DECREF(body);
639 return result;
640}
641
642static int
643append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
644{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300645 const char *conversion;
646 const char *outer_brace = "{";
647 /* Grammar allows PR_TUPLE, but use >PR_TEST for adding parenthesis
648 around a lambda with ':' */
649 PyObject *temp_fv_str = expr_as_unicode(e->v.FormattedValue.value, PR_TEST + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800650 if (!temp_fv_str) {
651 return -1;
652 }
653 if (PyUnicode_Find(temp_fv_str, _str_open_br, 0, 1, 1) == 0) {
654 /* Expression starts with a brace, split it with a space from the outer
655 one. */
656 outer_brace = "{ ";
657 }
658 if (-1 == append_charp(writer, outer_brace)) {
659 Py_DECREF(temp_fv_str);
660 return -1;
661 }
662 if (-1 == _PyUnicodeWriter_WriteStr(writer, temp_fv_str)) {
663 Py_DECREF(temp_fv_str);
664 return -1;
665 }
666 Py_DECREF(temp_fv_str);
667
668 if (e->v.FormattedValue.conversion > 0) {
669 switch (e->v.FormattedValue.conversion) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300670 case 'a':
Guido van Rossum95e4d582018-01-26 08:20:18 -0800671 conversion = "!a";
672 break;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300673 case 'r':
Guido van Rossum95e4d582018-01-26 08:20:18 -0800674 conversion = "!r";
675 break;
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300676 case 's':
Guido van Rossum95e4d582018-01-26 08:20:18 -0800677 conversion = "!s";
678 break;
679 default:
680 PyErr_SetString(PyExc_SystemError,
681 "unknown f-value conversion kind");
682 return -1;
683 }
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300684 APPEND_STR(conversion);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800685 }
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100686 if (e->v.FormattedValue.format_spec) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800687 if (-1 == _PyUnicodeWriter_WriteASCIIString(writer, ":", 1) ||
688 -1 == append_fstring_element(writer,
689 e->v.FormattedValue.format_spec,
690 true
691 ))
692 {
693 return -1;
694 }
695 }
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300696
697 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800698}
699
700static int
701append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e)
702{
703 const char *period;
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300704 expr_ty v = e->v.Attribute.value;
705 APPEND_EXPR(v, PR_ATOM);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800706
707 /* Special case: integers require a space for attribute access to be
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300708 unambiguous. */
709 if (v->kind == Constant_kind && PyLong_CheckExact(v->v.Constant.value)) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800710 period = " .";
711 }
712 else {
713 period = ".";
714 }
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300715 APPEND_STR(period);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800716
717 return _PyUnicodeWriter_WriteStr(writer, e->v.Attribute.attr);
718}
719
720static int
721append_ast_simple_slice(_PyUnicodeWriter *writer, slice_ty slice)
722{
723 if (slice->v.Slice.lower) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300724 APPEND_EXPR(slice->v.Slice.lower, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800725 }
726
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300727 APPEND_STR(":");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800728
729 if (slice->v.Slice.upper) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300730 APPEND_EXPR(slice->v.Slice.upper, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800731 }
732
733 if (slice->v.Slice.step) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300734 APPEND_STR(":");
735 APPEND_EXPR(slice->v.Slice.step, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800736 }
737 return 0;
738}
739
740static int
741append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice)
742{
743 Py_ssize_t i, dims_count;
744 dims_count = asdl_seq_LEN(slice->v.ExtSlice.dims);
745 for (i = 0; i < dims_count; i++) {
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300746 APPEND_STR_IF(i > 0, ", ");
747 APPEND(slice, (slice_ty)asdl_seq_GET(slice->v.ExtSlice.dims, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800748 }
749 return 0;
750}
751
752static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300753append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800754{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300755 switch (slice->kind) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800756 case Slice_kind:
757 return append_ast_simple_slice(writer, slice);
758 case ExtSlice_kind:
759 return append_ast_ext_slice(writer, slice);
760 case Index_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300761 APPEND_EXPR(slice->v.Index.value, PR_TUPLE);
762 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800763 default:
764 PyErr_SetString(PyExc_SystemError,
765 "unexpected slice kind");
766 return -1;
767 }
768}
769
770static int
771append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e)
772{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300773 APPEND_EXPR(e->v.Subscript.value, PR_ATOM);
774 APPEND_STR("[");
775 APPEND(slice, e->v.Subscript.slice);
776 APPEND_STR_FINISH("]");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800777}
778
779static int
780append_ast_starred(_PyUnicodeWriter *writer, expr_ty e)
781{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300782 APPEND_STR("*");
783 APPEND_EXPR(e->v.Starred.value, PR_EXPR);
784 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800785}
786
787static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300788append_ast_yield(_PyUnicodeWriter *writer, expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800789{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300790 if (!e->v.Yield.value) {
791 APPEND_STR_FINISH("(yield)");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800792 }
793
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300794 APPEND_STR("(yield ");
795 APPEND_EXPR(e->v.Yield.value, PR_TEST);
796 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800797}
798
799static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300800append_ast_yield_from(_PyUnicodeWriter *writer, expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800801{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300802 APPEND_STR("(yield from ");
803 APPEND_EXPR(e->v.YieldFrom.value, PR_TEST);
804 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800805}
806
807static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300808append_ast_await(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800809{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300810 APPEND_STR_IF(level > PR_AWAIT, "(");
811 APPEND_STR("await ");
812 APPEND_EXPR(e->v.Await.value, PR_ATOM);
813 APPEND_STR_IF(level > PR_AWAIT, ")");
814 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800815}
816
817static int
Batuhan Taşkayafa19a252019-05-19 01:10:20 +0300818append_named_expr(_PyUnicodeWriter *writer, expr_ty e, int level)
819{
820 APPEND_STR_IF(level > PR_TUPLE, "(");
821 APPEND_EXPR(e->v.NamedExpr.target, PR_ATOM);
822 APPEND_STR(":=");
823 APPEND_EXPR(e->v.NamedExpr.value, PR_ATOM);
824 APPEND_STR_IF(level > PR_TUPLE, ")");
825 return 0;
826}
827
828static int
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300829append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800830{
831 switch (e->kind) {
832 case BoolOp_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300833 return append_ast_boolop(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800834 case BinOp_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300835 return append_ast_binop(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800836 case UnaryOp_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300837 return append_ast_unaryop(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800838 case Lambda_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300839 return append_ast_lambda(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800840 case IfExp_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300841 return append_ast_ifexp(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800842 case Dict_kind:
843 return append_ast_dict(writer, e);
844 case Set_kind:
845 return append_ast_set(writer, e);
846 case GeneratorExp_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300847 return append_ast_genexp(writer, e);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800848 case ListComp_kind:
849 return append_ast_listcomp(writer, e);
850 case SetComp_kind:
851 return append_ast_setcomp(writer, e);
852 case DictComp_kind:
853 return append_ast_dictcomp(writer, e);
854 case Yield_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300855 return append_ast_yield(writer, e);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800856 case YieldFrom_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300857 return append_ast_yield_from(writer, e);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800858 case Await_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300859 return append_ast_await(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800860 case Compare_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300861 return append_ast_compare(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800862 case Call_kind:
863 return append_ast_call(writer, e);
864 case Constant_kind:
Serhiy Storchaka3f228112018-09-27 17:42:37 +0300865 if (e->v.Constant.value == Py_Ellipsis) {
866 APPEND_STR_FINISH("...");
867 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800868 return append_repr(writer, e->v.Constant.value);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800869 case JoinedStr_kind:
870 return append_joinedstr(writer, e, false);
871 case FormattedValue_kind:
872 return append_formattedvalue(writer, e, false);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800873 /* The following exprs can be assignment targets. */
874 case Attribute_kind:
875 return append_ast_attribute(writer, e);
876 case Subscript_kind:
877 return append_ast_subscript(writer, e);
878 case Starred_kind:
879 return append_ast_starred(writer, e);
880 case Name_kind:
881 return _PyUnicodeWriter_WriteStr(writer, e->v.Name.id);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800882 case List_kind:
883 return append_ast_list(writer, e);
884 case Tuple_kind:
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300885 return append_ast_tuple(writer, e, level);
Batuhan Taşkayafa19a252019-05-19 01:10:20 +0300886 case NamedExpr_kind:
887 return append_named_expr(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800888 default:
889 PyErr_SetString(PyExc_SystemError,
890 "unknown expression kind");
891 return -1;
892 }
893}
894
895static int
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100896maybe_init_static_strings(void)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800897{
898 if (!_str_open_br &&
899 !(_str_open_br = PyUnicode_InternFromString("{"))) {
900 return -1;
901 }
902 if (!_str_dbl_open_br &&
903 !(_str_dbl_open_br = PyUnicode_InternFromString("{{"))) {
904 return -1;
905 }
906 if (!_str_close_br &&
907 !(_str_close_br = PyUnicode_InternFromString("}"))) {
908 return -1;
909 }
910 if (!_str_dbl_close_br &&
911 !(_str_dbl_close_br = PyUnicode_InternFromString("}}"))) {
912 return -1;
913 }
914 return 0;
915}
916
917static PyObject *
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300918expr_as_unicode(expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800919{
920 _PyUnicodeWriter writer;
921 _PyUnicodeWriter_Init(&writer);
922 writer.min_length = 256;
923 writer.overallocate = 1;
924 if (-1 == maybe_init_static_strings() ||
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300925 -1 == append_ast_expr(&writer, e, level))
Guido van Rossum95e4d582018-01-26 08:20:18 -0800926 {
927 _PyUnicodeWriter_Dealloc(&writer);
928 return NULL;
929 }
930 return _PyUnicodeWriter_Finish(&writer);
931}
932
933PyObject *
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300934_PyAST_ExprAsUnicode(expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800935{
Serhiy Storchaka64fddc42018-05-17 06:17:48 +0300936 return expr_as_unicode(e, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800937}