You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1163 lines
29 KiB

  1. #include <stdbool.h>
  2. #include "Python.h"
  3. #include "Python-ast.h"
  4. static PyObject *_str_open_br;
  5. static PyObject *_str_dbl_open_br;
  6. static PyObject *_str_close_br;
  7. static PyObject *_str_dbl_close_br;
  8. /* Forward declarations for recursion via helper functions. */
  9. static PyObject *
  10. expr_as_unicode(expr_ty e, bool omit_parens);
  11. static int
  12. append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens);
  13. static int
  14. append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
  15. static int
  16. append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
  17. static int
  18. append_charp(_PyUnicodeWriter *writer, const char *charp)
  19. {
  20. return _PyUnicodeWriter_WriteASCIIString(writer, charp, -1);
  21. }
  22. static int
  23. append_repr(_PyUnicodeWriter *writer, PyObject *obj)
  24. {
  25. int ret;
  26. PyObject *repr;
  27. repr = PyObject_Repr(obj);
  28. if (!repr) {
  29. return -1;
  30. }
  31. ret = _PyUnicodeWriter_WriteStr(writer, repr);
  32. Py_DECREF(repr);
  33. return ret;
  34. }
  35. static int
  36. append_ast_boolop(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  37. {
  38. Py_ssize_t i, value_count;
  39. asdl_seq *values;
  40. if (!omit_parens && -1 == append_charp(writer, "(")) {
  41. return -1;
  42. }
  43. values = e->v.BoolOp.values;
  44. value_count = asdl_seq_LEN(values) - 1;
  45. assert(value_count >= 0);
  46. if (-1 == append_ast_expr(writer,
  47. (expr_ty)asdl_seq_GET(values, 0),
  48. false)) {
  49. return -1;
  50. }
  51. const char *op = (e->v.BoolOp.op == And) ? " and " : " or ";
  52. for (i = 1; i <= value_count; ++i) {
  53. if (-1 == append_charp(writer, op)) {
  54. return -1;
  55. }
  56. if (-1 == append_ast_expr(writer,
  57. (expr_ty)asdl_seq_GET(values, i),
  58. false)) {
  59. return -1;
  60. }
  61. }
  62. return omit_parens ? 0 : append_charp(writer, ")");
  63. }
  64. static int
  65. append_ast_binop(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  66. {
  67. const char *op;
  68. if (!omit_parens && -1 == append_charp(writer, "(")) {
  69. return -1;
  70. }
  71. if (-1 == append_ast_expr(writer, e->v.BinOp.left, false)) {
  72. return -1;
  73. }
  74. switch(e->v.BinOp.op) {
  75. case Add: op = " + "; break;
  76. case Sub: op = " - "; break;
  77. case Mult: op = " * "; break;
  78. case MatMult: op = " @ "; break;
  79. case Div: op = " / "; break;
  80. case Mod: op = " % "; break;
  81. case LShift: op = " << "; break;
  82. case RShift: op = " >> "; break;
  83. case BitOr: op = " | "; break;
  84. case BitXor: op = " ^ "; break;
  85. case BitAnd: op = " & "; break;
  86. case FloorDiv: op = " // "; break;
  87. case Pow: op = " ** "; break;
  88. }
  89. if (-1 == append_charp(writer, op)) {
  90. return -1;
  91. }
  92. if (-1 == append_ast_expr(writer, e->v.BinOp.right, false)) {
  93. return -1;
  94. }
  95. return omit_parens ? 0 : append_charp(writer, ")");
  96. }
  97. static int
  98. append_ast_unaryop(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  99. {
  100. const char *op;
  101. if (!omit_parens && -1 == append_charp(writer, "(")) {
  102. return -1;
  103. }
  104. switch(e->v.UnaryOp.op) {
  105. case Invert: op = "~"; break;
  106. case Not: op = "not "; break;
  107. case UAdd: op = "+"; break;
  108. case USub: op = "-"; break;
  109. }
  110. if (-1 == append_charp(writer, op)) {
  111. return -1;
  112. }
  113. if (-1 == append_ast_expr(writer, e->v.UnaryOp.operand, false)) {
  114. return -1;
  115. }
  116. return omit_parens ? 0 : append_charp(writer, ")");
  117. }
  118. static int
  119. append_ast_arg(_PyUnicodeWriter *writer, arg_ty arg)
  120. {
  121. if (-1 == _PyUnicodeWriter_WriteStr(writer, arg->arg)) {
  122. return -1;
  123. }
  124. if (arg->annotation) {
  125. if (-1 == append_charp(writer, ": ")) {
  126. return -1;
  127. }
  128. if (-1 == append_ast_expr(writer, arg->annotation, true)) {
  129. return -1;
  130. }
  131. }
  132. return 0;
  133. }
  134. static int
  135. append_ast_args(_PyUnicodeWriter *writer, arguments_ty args)
  136. {
  137. bool first;
  138. Py_ssize_t i, di, arg_count, default_count;
  139. arg_ty arg;
  140. expr_ty default_;
  141. first = true;
  142. /* positional arguments with defaults */
  143. arg_count = asdl_seq_LEN(args->args);
  144. default_count = asdl_seq_LEN(args->defaults);
  145. for (i = 0; i < arg_count; i++) {
  146. if (first) {
  147. first = false;
  148. }
  149. else if (-1 == append_charp(writer, ", ")) {
  150. return -1;
  151. }
  152. arg = (arg_ty)asdl_seq_GET(args->args, i);
  153. if (-1 == append_ast_arg(writer, arg)) {
  154. return -1;
  155. }
  156. di = i - arg_count + default_count;
  157. if (di >= 0) {
  158. if (-1 == append_charp(writer, "=")) {
  159. return -1;
  160. }
  161. default_ = (expr_ty)asdl_seq_GET(args->defaults, di);
  162. if (-1 == append_ast_expr(writer, default_, false)) {
  163. return -1;
  164. }
  165. }
  166. }
  167. /* vararg, or bare '*' if no varargs but keyword-only arguments present */
  168. if (args->vararg || args->kwonlyargs) {
  169. if (first) {
  170. first = false;
  171. }
  172. else if (-1 == append_charp(writer, ", ")) {
  173. return -1;
  174. }
  175. if (-1 == append_charp(writer, "*")) {
  176. return -1;
  177. }
  178. if (args->vararg) {
  179. if (-1 == append_ast_arg(writer, args->vararg)) {
  180. return -1;
  181. }
  182. }
  183. }
  184. /* keyword-only arguments */
  185. arg_count = asdl_seq_LEN(args->kwonlyargs);
  186. default_count = asdl_seq_LEN(args->kw_defaults);
  187. for (i = 0; i < arg_count; i++) {
  188. if (first) {
  189. first = false;
  190. }
  191. else if (-1 == append_charp(writer, ", ")) {
  192. return -1;
  193. }
  194. arg = (arg_ty)asdl_seq_GET(args->kwonlyargs, i);
  195. if (-1 == append_ast_arg(writer, arg)) {
  196. return -1;
  197. }
  198. di = i - arg_count + default_count;
  199. if (di >= 0) {
  200. if (-1 == append_charp(writer, "=")) {
  201. return -1;
  202. }
  203. default_ = (expr_ty)asdl_seq_GET(args->kw_defaults, di);
  204. if (-1 == append_ast_expr(writer, default_, false)) {
  205. return -1;
  206. }
  207. }
  208. }
  209. /* **kwargs */
  210. if (args->kwarg) {
  211. if (first) {
  212. first = false;
  213. }
  214. else if (-1 == append_charp(writer, ", ")) {
  215. return -1;
  216. }
  217. if (-1 == append_charp(writer, "**")) {
  218. return -1;
  219. }
  220. if (-1 == append_ast_arg(writer, args->kwarg)) {
  221. return -1;
  222. }
  223. }
  224. return 0;
  225. }
  226. static int
  227. append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  228. {
  229. if (!omit_parens && -1 == append_charp(writer, "(")) {
  230. return -1;
  231. }
  232. if (-1 == append_charp(writer, "lambda ")) {
  233. return -1;
  234. }
  235. if (-1 == append_ast_args(writer, e->v.Lambda.args)) {
  236. return -1;
  237. }
  238. if (-1 == append_charp(writer, ": ")) {
  239. return -1;
  240. }
  241. if (-1 == append_ast_expr(writer, e->v.Lambda.body, true)) {
  242. return -1;
  243. }
  244. return omit_parens ? 0 : append_charp(writer, ")");
  245. }
  246. static int
  247. append_ast_ifexp(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  248. {
  249. if (!omit_parens && -1 == append_charp(writer, "(")) {
  250. return -1;
  251. }
  252. if (-1 == append_ast_expr(writer, e->v.IfExp.body, false)) {
  253. return -1;
  254. }
  255. if (-1 == append_charp(writer, " if ")) {
  256. return -1;
  257. }
  258. if (-1 == append_ast_expr(writer, e->v.IfExp.test, false)) {
  259. return -1;
  260. }
  261. if (-1 == append_charp(writer, " else ")) {
  262. return -1;
  263. }
  264. if (-1 == append_ast_expr(writer, e->v.IfExp.orelse, false)) {
  265. return -1;
  266. }
  267. return omit_parens ? 0 : append_charp(writer, ")");
  268. }
  269. static int
  270. append_ast_dict(_PyUnicodeWriter *writer, expr_ty e)
  271. {
  272. Py_ssize_t i, value_count;
  273. expr_ty key_node, value_node;
  274. if (-1 == append_charp(writer, "{")) {
  275. return -1;
  276. }
  277. value_count = asdl_seq_LEN(e->v.Dict.values);
  278. for (i = 0; i < value_count; i++) {
  279. if (i > 0 && -1 == append_charp(writer, ", ")) {
  280. return -1;
  281. }
  282. key_node = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i);
  283. if (key_node != NULL) {
  284. if (-1 == append_ast_expr(writer, key_node, false)) {
  285. return -1;
  286. }
  287. if (-1 == append_charp(writer, ": ")) {
  288. return -1;
  289. }
  290. }
  291. else if (-1 == append_charp(writer, "**")) {
  292. return -1;
  293. }
  294. value_node = (expr_ty)asdl_seq_GET(e->v.Dict.values, i);
  295. if (-1 == append_ast_expr(writer, value_node, false)) {
  296. return -1;
  297. }
  298. }
  299. return append_charp(writer, "}");
  300. }
  301. static int
  302. append_ast_set(_PyUnicodeWriter *writer, expr_ty e)
  303. {
  304. Py_ssize_t i, elem_count;
  305. expr_ty elem_node;
  306. if (-1 == append_charp(writer, "{")) {
  307. return -1;
  308. }
  309. elem_count = asdl_seq_LEN(e->v.Set.elts);
  310. for (i = 0; i < elem_count; i++) {
  311. if (i > 0 && -1 == append_charp(writer, ", ")) {
  312. return -1;
  313. }
  314. elem_node = (expr_ty)asdl_seq_GET(e->v.Set.elts, i);
  315. if (-1 == append_ast_expr(writer, elem_node, false)) {
  316. return -1;
  317. }
  318. }
  319. return append_charp(writer, "}");
  320. }
  321. static int
  322. append_ast_list(_PyUnicodeWriter *writer, expr_ty e)
  323. {
  324. Py_ssize_t i, elem_count;
  325. expr_ty elem_node;
  326. if (-1 == append_charp(writer, "[")) {
  327. return -1;
  328. }
  329. elem_count = asdl_seq_LEN(e->v.List.elts);
  330. for (i = 0; i < elem_count; i++) {
  331. if (i > 0 && -1 == append_charp(writer, ", ")) {
  332. return -1;
  333. }
  334. elem_node = (expr_ty)asdl_seq_GET(e->v.List.elts, i);
  335. if (-1 == append_ast_expr(writer, elem_node, false)) {
  336. return -1;
  337. }
  338. }
  339. return append_charp(writer, "]");
  340. }
  341. static int
  342. append_ast_tuple(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  343. {
  344. Py_ssize_t i, elem_count;
  345. expr_ty elem_node;
  346. elem_count = asdl_seq_LEN(e->v.Tuple.elts);
  347. if (!omit_parens || elem_count < 2) {
  348. if (-1 == append_charp(writer, "(")) {
  349. return -1;
  350. }
  351. }
  352. for (i = 0; i < elem_count; i++) {
  353. if ((i > 0 || elem_count == 1) && -1 == append_charp(writer, ", ")) {
  354. return -1;
  355. }
  356. elem_node = (expr_ty)asdl_seq_GET(e->v.Tuple.elts, i);
  357. if (-1 == append_ast_expr(writer, elem_node, false)) {
  358. return -1;
  359. }
  360. }
  361. if (!omit_parens || elem_count < 2) {
  362. return append_charp(writer, ")");
  363. }
  364. return 0;
  365. }
  366. static int
  367. append_ast_comprehension(_PyUnicodeWriter *writer, comprehension_ty gen)
  368. {
  369. Py_ssize_t i, if_count;
  370. if (-1 == append_charp(writer, gen->is_async ? " async for " : " for ")) {
  371. return -1;
  372. }
  373. if (-1 == append_ast_expr(writer, gen->target, true)) {
  374. return -1;
  375. }
  376. if (-1 == append_charp(writer, " in ")) {
  377. return -1;
  378. }
  379. if (-1 == append_ast_expr(writer, gen->iter, false)) {
  380. return -1;
  381. }
  382. if_count = asdl_seq_LEN(gen->ifs);
  383. for (i = 0; i < if_count; i++) {
  384. if (-1 == append_charp(writer, " if ")) {
  385. return -1;
  386. }
  387. if (-1 == append_ast_expr(writer,
  388. (expr_ty)asdl_seq_GET(gen->ifs, i),
  389. false)) {
  390. return -1;
  391. }
  392. }
  393. return 0;
  394. }
  395. static int
  396. append_ast_comprehensions(_PyUnicodeWriter *writer, asdl_seq *comprehensions)
  397. {
  398. Py_ssize_t i, gen_count;
  399. comprehension_ty comp_node;
  400. gen_count = asdl_seq_LEN(comprehensions);
  401. for (i = 0; i < gen_count; i++) {
  402. comp_node = (comprehension_ty)asdl_seq_GET(comprehensions, i);
  403. if (-1 == append_ast_comprehension(writer, comp_node)) {
  404. return -1;
  405. }
  406. }
  407. return 0;
  408. }
  409. static int
  410. append_ast_genexp(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  411. {
  412. if (!omit_parens && -1 == append_charp(writer, "(")) {
  413. return -1;
  414. }
  415. if (-1 == append_ast_expr(writer, e->v.GeneratorExp.elt, false)) {
  416. return -1;
  417. }
  418. if (-1 == append_ast_comprehensions(writer, e->v.GeneratorExp.generators)) {
  419. return -1;
  420. }
  421. return omit_parens ? 0 : append_charp(writer, ")");
  422. }
  423. static int
  424. append_ast_listcomp(_PyUnicodeWriter *writer, expr_ty e)
  425. {
  426. if (-1 == append_charp(writer, "[")) {
  427. return -1;
  428. }
  429. if (-1 == append_ast_expr(writer, e->v.ListComp.elt, false)) {
  430. return -1;
  431. }
  432. if (-1 == append_ast_comprehensions(writer, e->v.ListComp.generators)) {
  433. return -1;
  434. }
  435. return append_charp(writer, "]");
  436. }
  437. static int
  438. append_ast_setcomp(_PyUnicodeWriter *writer, expr_ty e)
  439. {
  440. if (-1 == append_charp(writer, "{")) {
  441. return -1;
  442. }
  443. if (-1 == append_ast_expr(writer, e->v.SetComp.elt, false)) {
  444. return -1;
  445. }
  446. if (-1 == append_ast_comprehensions(writer, e->v.SetComp.generators)) {
  447. return -1;
  448. }
  449. return append_charp(writer, "}");
  450. }
  451. static int
  452. append_ast_dictcomp(_PyUnicodeWriter *writer, expr_ty e)
  453. {
  454. if (-1 == append_charp(writer, "{")) {
  455. return -1;
  456. }
  457. if (-1 == append_ast_expr(writer, e->v.DictComp.key, false)) {
  458. return -1;
  459. }
  460. if (-1 == append_charp(writer, ": ")) {
  461. return -1;
  462. }
  463. if (-1 == append_ast_expr(writer, e->v.DictComp.value, false)) {
  464. return -1;
  465. }
  466. if (-1 == append_ast_comprehensions(writer, e->v.DictComp.generators)) {
  467. return -1;
  468. }
  469. return append_charp(writer, "}");
  470. }
  471. static int
  472. append_ast_compare(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  473. {
  474. const char *op;
  475. Py_ssize_t i, comparator_count;
  476. asdl_seq *comparators;
  477. asdl_int_seq *ops;
  478. if (!omit_parens && -1 == append_charp(writer, "(")) {
  479. return -1;
  480. }
  481. comparators = e->v.Compare.comparators;
  482. ops = e->v.Compare.ops;
  483. comparator_count = asdl_seq_LEN(comparators);
  484. assert(comparator_count > 0);
  485. assert(comparator_count == asdl_seq_LEN(ops));
  486. if (-1 == append_ast_expr(writer, e->v.Compare.left, false)) {
  487. return -1;
  488. }
  489. for (i = 0; i < comparator_count; i++) {
  490. switch ((cmpop_ty)asdl_seq_GET(ops, i)) {
  491. case Eq:
  492. op = " == ";
  493. break;
  494. case NotEq:
  495. op = " != ";
  496. break;
  497. case Lt:
  498. op = " < ";
  499. break;
  500. case LtE:
  501. op = " <= ";
  502. break;
  503. case Gt:
  504. op = " > ";
  505. break;
  506. case GtE:
  507. op = " >= ";
  508. break;
  509. case Is:
  510. op = " is ";
  511. break;
  512. case IsNot:
  513. op = " is not ";
  514. break;
  515. case In:
  516. op = " in ";
  517. break;
  518. case NotIn:
  519. op = " not in ";
  520. break;
  521. default:
  522. PyErr_SetString(PyExc_SystemError,
  523. "unexpected comparison kind");
  524. return -1;
  525. }
  526. if (-1 == append_charp(writer, op)) {
  527. return -1;
  528. }
  529. if (-1 == append_ast_expr(writer,
  530. (expr_ty)asdl_seq_GET(comparators, i),
  531. false)) {
  532. return -1;
  533. }
  534. }
  535. return omit_parens ? 0 : append_charp(writer, ")");
  536. }
  537. static int
  538. append_ast_keyword(_PyUnicodeWriter *writer, keyword_ty kw)
  539. {
  540. if (kw->arg == NULL) {
  541. if (-1 == append_charp(writer, "**")) {
  542. return -1;
  543. }
  544. }
  545. else {
  546. if (-1 == _PyUnicodeWriter_WriteStr(writer, kw->arg)) {
  547. return -1;
  548. }
  549. if (-1 == append_charp(writer, "=")) {
  550. return -1;
  551. }
  552. }
  553. return append_ast_expr(writer, kw->value, false);
  554. }
  555. static int
  556. append_ast_call(_PyUnicodeWriter *writer, expr_ty e)
  557. {
  558. bool first;
  559. Py_ssize_t i, arg_count, kw_count;
  560. expr_ty expr;
  561. keyword_ty kw;
  562. if (-1 == append_ast_expr(writer, e->v.Call.func, false)) {
  563. return -1;
  564. }
  565. if (-1 == append_charp(writer, "(")) {
  566. return -1;
  567. }
  568. first = true;
  569. arg_count = asdl_seq_LEN(e->v.Call.args);
  570. for (i = 0; i < arg_count; i++) {
  571. if (first) {
  572. first = false;
  573. }
  574. else if (-1 == append_charp(writer, ", ")) {
  575. return -1;
  576. }
  577. expr = (expr_ty)asdl_seq_GET(e->v.Call.args, i);
  578. if (-1 == append_ast_expr(writer, expr, false)) {
  579. return -1;
  580. }
  581. }
  582. kw_count = asdl_seq_LEN(e->v.Call.keywords);
  583. for (i = 0; i < kw_count; i++) {
  584. if (first) {
  585. first = false;
  586. }
  587. else if (-1 == append_charp(writer, ", ")) {
  588. return -1;
  589. }
  590. kw = (keyword_ty)asdl_seq_GET(e->v.Call.keywords, i);
  591. if (-1 == append_ast_keyword(writer, kw)) {
  592. return -1;
  593. }
  594. }
  595. return append_charp(writer, ")");
  596. }
  597. static PyObject *
  598. escape_braces(PyObject *orig)
  599. {
  600. PyObject *temp;
  601. PyObject *result;
  602. temp = PyUnicode_Replace(orig, _str_open_br, _str_dbl_open_br, -1);
  603. if (!temp) {
  604. return NULL;
  605. }
  606. result = PyUnicode_Replace(temp, _str_close_br, _str_dbl_close_br, -1);
  607. Py_DECREF(temp);
  608. return result;
  609. }
  610. static int
  611. append_fstring_unicode(_PyUnicodeWriter *writer, PyObject *unicode)
  612. {
  613. PyObject *escaped;
  614. int result = -1;
  615. escaped = escape_braces(unicode);
  616. if (escaped) {
  617. result = _PyUnicodeWriter_WriteStr(writer, escaped);
  618. Py_DECREF(escaped);
  619. }
  620. return result;
  621. }
  622. static int
  623. append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
  624. {
  625. switch (e->kind) {
  626. case Constant_kind:
  627. return append_fstring_unicode(writer, e->v.Constant.value);
  628. case Str_kind:
  629. return append_fstring_unicode(writer, e->v.Str.s);
  630. case JoinedStr_kind:
  631. return append_joinedstr(writer, e, is_format_spec);
  632. case FormattedValue_kind:
  633. return append_formattedvalue(writer, e, is_format_spec);
  634. default:
  635. PyErr_SetString(PyExc_SystemError,
  636. "unknown expression kind inside f-string");
  637. return -1;
  638. }
  639. }
  640. /* Build body separately to enable wrapping the entire stream of Strs,
  641. Constants and FormattedValues in one opening and one closing quote. */
  642. static PyObject *
  643. build_fstring_body(asdl_seq *values, bool is_format_spec)
  644. {
  645. Py_ssize_t i, value_count;
  646. _PyUnicodeWriter body_writer;
  647. _PyUnicodeWriter_Init(&body_writer);
  648. body_writer.min_length = 256;
  649. body_writer.overallocate = 1;
  650. value_count = asdl_seq_LEN(values) - 1;
  651. assert(value_count >= 0);
  652. for (i = 0; i <= value_count; ++i) {
  653. if (-1 == append_fstring_element(&body_writer,
  654. (expr_ty)asdl_seq_GET(values, i),
  655. is_format_spec
  656. )) {
  657. _PyUnicodeWriter_Dealloc(&body_writer);
  658. return NULL;
  659. }
  660. }
  661. return _PyUnicodeWriter_Finish(&body_writer);
  662. }
  663. static int
  664. append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
  665. {
  666. int result = -1;
  667. PyObject *body = build_fstring_body(e->v.JoinedStr.values, is_format_spec);
  668. if (!body) {
  669. return -1;
  670. }
  671. if (!is_format_spec) {
  672. if (-1 != append_charp(writer, "f") &&
  673. -1 != append_repr(writer, body))
  674. {
  675. result = 0;
  676. }
  677. }
  678. else {
  679. result = _PyUnicodeWriter_WriteStr(writer, body);
  680. }
  681. Py_DECREF(body);
  682. return result;
  683. }
  684. static int
  685. append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
  686. {
  687. char *conversion;
  688. char *outer_brace = "{";
  689. PyObject *temp_fv_str = expr_as_unicode(e->v.FormattedValue.value, true);
  690. if (!temp_fv_str) {
  691. return -1;
  692. }
  693. if (PyUnicode_Find(temp_fv_str, _str_open_br, 0, 1, 1) == 0) {
  694. /* Expression starts with a brace, split it with a space from the outer
  695. one. */
  696. outer_brace = "{ ";
  697. }
  698. if (-1 == append_charp(writer, outer_brace)) {
  699. Py_DECREF(temp_fv_str);
  700. return -1;
  701. }
  702. if (-1 == _PyUnicodeWriter_WriteStr(writer, temp_fv_str)) {
  703. Py_DECREF(temp_fv_str);
  704. return -1;
  705. }
  706. Py_DECREF(temp_fv_str);
  707. if (e->v.FormattedValue.conversion > 0) {
  708. switch (e->v.FormattedValue.conversion) {
  709. case 97:
  710. conversion = "!a";
  711. break;
  712. case 114:
  713. conversion = "!r";
  714. break;
  715. case 115:
  716. conversion = "!s";
  717. break;
  718. default:
  719. PyErr_SetString(PyExc_SystemError,
  720. "unknown f-value conversion kind");
  721. return -1;
  722. }
  723. if (-1 == append_charp(writer, conversion)) {
  724. return -1;
  725. }
  726. }
  727. if (e->v.FormattedValue.format_spec > 0) {
  728. if (-1 == _PyUnicodeWriter_WriteASCIIString(writer, ":", 1) ||
  729. -1 == append_fstring_element(writer,
  730. e->v.FormattedValue.format_spec,
  731. true
  732. ))
  733. {
  734. return -1;
  735. }
  736. }
  737. return append_charp(writer, "}");
  738. }
  739. static int
  740. append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e)
  741. {
  742. const char *period;
  743. if (-1 == append_ast_expr(writer, e->v.Attribute.value, false)) {
  744. return -1;
  745. }
  746. /* Special case: integers require a space for attribute access to be
  747. unambiguous. Floats and complex numbers don't but work with it, too. */
  748. if (e->v.Attribute.value->kind == Num_kind ||
  749. e->v.Attribute.value->kind == Constant_kind)
  750. {
  751. period = " .";
  752. }
  753. else {
  754. period = ".";
  755. }
  756. if (-1 == append_charp(writer, period)) {
  757. return -1;
  758. }
  759. return _PyUnicodeWriter_WriteStr(writer, e->v.Attribute.attr);
  760. }
  761. static int
  762. append_ast_simple_slice(_PyUnicodeWriter *writer, slice_ty slice)
  763. {
  764. if (slice->v.Slice.lower) {
  765. if (-1 == append_ast_expr(writer, slice->v.Slice.lower, false)) {
  766. return -1;
  767. }
  768. }
  769. if (-1 == append_charp(writer, ":")) {
  770. return -1;
  771. }
  772. if (slice->v.Slice.upper) {
  773. if (-1 == append_ast_expr(writer, slice->v.Slice.upper, false)) {
  774. return -1;
  775. }
  776. }
  777. if (slice->v.Slice.step) {
  778. if (-1 == append_charp(writer, ":")) {
  779. return -1;
  780. }
  781. if (-1 == append_ast_expr(writer, slice->v.Slice.step, false)) {
  782. return -1;
  783. }
  784. }
  785. return 0;
  786. }
  787. static int
  788. append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice)
  789. {
  790. Py_ssize_t i, dims_count;
  791. dims_count = asdl_seq_LEN(slice->v.ExtSlice.dims);
  792. for (i = 0; i < dims_count; i++) {
  793. if (i > 0 && -1 == append_charp(writer, ", ")) {
  794. return -1;
  795. }
  796. if (-1 == append_ast_expr(writer,
  797. (expr_ty)asdl_seq_GET(slice->v.ExtSlice.dims, i),
  798. false)) {
  799. return -1;
  800. }
  801. }
  802. return 0;
  803. }
  804. static int
  805. append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice, bool omit_parens)
  806. {
  807. switch(slice->kind) {
  808. case Slice_kind:
  809. return append_ast_simple_slice(writer, slice);
  810. case ExtSlice_kind:
  811. return append_ast_ext_slice(writer, slice);
  812. case Index_kind:
  813. return append_ast_expr(writer, slice->v.Index.value, omit_parens);
  814. default:
  815. PyErr_SetString(PyExc_SystemError,
  816. "unexpected slice kind");
  817. return -1;
  818. }
  819. }
  820. static int
  821. append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e)
  822. {
  823. if (-1 == append_ast_expr(writer, e->v.Subscript.value, false)) {
  824. return -1;
  825. }
  826. if (-1 == append_charp(writer, "[")) {
  827. return -1;
  828. }
  829. if (-1 == append_ast_slice(writer, e->v.Subscript.slice, true)) {
  830. return -1;
  831. }
  832. return append_charp(writer, "]");
  833. }
  834. static int
  835. append_ast_starred(_PyUnicodeWriter *writer, expr_ty e)
  836. {
  837. if (-1 == append_charp(writer, "*")) {
  838. return -1;
  839. }
  840. return append_ast_expr(writer, e->v.Starred.value, false);
  841. }
  842. static int
  843. append_ast_yield(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  844. {
  845. if (!omit_parens && -1 == append_charp(writer, "(")) {
  846. return -1;
  847. }
  848. if (-1 == append_charp(writer, e->v.Yield.value ? "yield " : "yield")) {
  849. return -1;
  850. }
  851. if (e->v.Yield.value) {
  852. if (-1 == append_ast_expr(writer, e->v.Yield.value, false)) {
  853. return -1;
  854. }
  855. }
  856. return omit_parens ? 0 : append_charp(writer, ")");
  857. }
  858. static int
  859. append_ast_yield_from(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  860. {
  861. if (!omit_parens && -1 == append_charp(writer, "(")) {
  862. return -1;
  863. }
  864. if (-1 == append_charp(writer,
  865. e->v.YieldFrom.value ? "yield from " : "yield from")) {
  866. return -1;
  867. }
  868. if (e->v.YieldFrom.value) {
  869. if (-1 == append_ast_expr(writer, e->v.YieldFrom.value, false)) {
  870. return -1;
  871. }
  872. }
  873. return omit_parens ? 0 : append_charp(writer, ")");
  874. }
  875. static int
  876. append_ast_await(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  877. {
  878. if (!omit_parens && -1 == append_charp(writer, "(")) {
  879. return -1;
  880. }
  881. if (-1 == append_charp(writer, e->v.Await.value ? "await " : "await")) {
  882. return -1;
  883. }
  884. if (e->v.Await.value) {
  885. if (-1 == append_ast_expr(writer, e->v.Await.value, false)) {
  886. return -1;
  887. }
  888. }
  889. return omit_parens ? 0 : append_charp(writer, ")");
  890. }
  891. static int
  892. append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
  893. {
  894. switch (e->kind) {
  895. case BoolOp_kind:
  896. return append_ast_boolop(writer, e, omit_parens);
  897. case BinOp_kind:
  898. return append_ast_binop(writer, e, omit_parens);
  899. case UnaryOp_kind:
  900. return append_ast_unaryop(writer, e, omit_parens);
  901. case Lambda_kind:
  902. return append_ast_lambda(writer, e, omit_parens);
  903. case IfExp_kind:
  904. return append_ast_ifexp(writer, e, omit_parens);
  905. case Dict_kind:
  906. return append_ast_dict(writer, e);
  907. case Set_kind:
  908. return append_ast_set(writer, e);
  909. case GeneratorExp_kind:
  910. return append_ast_genexp(writer, e, omit_parens);
  911. case ListComp_kind:
  912. return append_ast_listcomp(writer, e);
  913. case SetComp_kind:
  914. return append_ast_setcomp(writer, e);
  915. case DictComp_kind:
  916. return append_ast_dictcomp(writer, e);
  917. case Yield_kind:
  918. return append_ast_yield(writer, e, omit_parens);
  919. case YieldFrom_kind:
  920. return append_ast_yield_from(writer, e, omit_parens);
  921. case Await_kind:
  922. return append_ast_await(writer, e, omit_parens);
  923. case Compare_kind:
  924. return append_ast_compare(writer, e, omit_parens);
  925. case Call_kind:
  926. return append_ast_call(writer, e);
  927. case Constant_kind:
  928. return append_repr(writer, e->v.Constant.value);
  929. case Num_kind:
  930. return append_repr(writer, e->v.Num.n);
  931. case Str_kind:
  932. return append_repr(writer, e->v.Str.s);
  933. case JoinedStr_kind:
  934. return append_joinedstr(writer, e, false);
  935. case FormattedValue_kind:
  936. return append_formattedvalue(writer, e, false);
  937. case Bytes_kind:
  938. return append_repr(writer, e->v.Bytes.s);
  939. case Ellipsis_kind:
  940. return append_charp(writer, "...");
  941. case NameConstant_kind:
  942. return append_repr(writer, e->v.NameConstant.value);
  943. /* The following exprs can be assignment targets. */
  944. case Attribute_kind:
  945. return append_ast_attribute(writer, e);
  946. case Subscript_kind:
  947. return append_ast_subscript(writer, e);
  948. case Starred_kind:
  949. return append_ast_starred(writer, e);
  950. case Name_kind:
  951. return _PyUnicodeWriter_WriteStr(writer, e->v.Name.id);
  952. /* child nodes of List and Tuple will have expr_context set */
  953. case List_kind:
  954. return append_ast_list(writer, e);
  955. case Tuple_kind:
  956. return append_ast_tuple(writer, e, omit_parens);
  957. default:
  958. PyErr_SetString(PyExc_SystemError,
  959. "unknown expression kind");
  960. return -1;
  961. }
  962. }
  963. static int
  964. maybe_init_static_strings()
  965. {
  966. if (!_str_open_br &&
  967. !(_str_open_br = PyUnicode_InternFromString("{"))) {
  968. return -1;
  969. }
  970. if (!_str_dbl_open_br &&
  971. !(_str_dbl_open_br = PyUnicode_InternFromString("{{"))) {
  972. return -1;
  973. }
  974. if (!_str_close_br &&
  975. !(_str_close_br = PyUnicode_InternFromString("}"))) {
  976. return -1;
  977. }
  978. if (!_str_dbl_close_br &&
  979. !(_str_dbl_close_br = PyUnicode_InternFromString("}}"))) {
  980. return -1;
  981. }
  982. return 0;
  983. }
  984. static PyObject *
  985. expr_as_unicode(expr_ty e, bool omit_parens)
  986. {
  987. _PyUnicodeWriter writer;
  988. _PyUnicodeWriter_Init(&writer);
  989. writer.min_length = 256;
  990. writer.overallocate = 1;
  991. if (-1 == maybe_init_static_strings() ||
  992. -1 == append_ast_expr(&writer, e, omit_parens))
  993. {
  994. _PyUnicodeWriter_Dealloc(&writer);
  995. return NULL;
  996. }
  997. return _PyUnicodeWriter_Finish(&writer);
  998. }
  999. PyObject *
  1000. _PyAST_ExprAsUnicode(expr_ty e, bool omit_parens)
  1001. {
  1002. return expr_as_unicode(e, omit_parens);
  1003. }