Pablo Galindo | c5fc156 | 2020-04-22 23:29:27 +0100 | [diff] [blame] | 1 | #ifndef STRINGS_H |
| 2 | #define STRINGS_H |
| 3 | |
| 4 | #include <Python.h> |
| 5 | #include <Python-ast.h> |
| 6 | #include "pegen.h" |
| 7 | |
| 8 | #define EXPRLIST_N_CACHED 64 |
| 9 | |
| 10 | typedef struct { |
| 11 | /* Incrementally build an array of expr_ty, so be used in an |
| 12 | asdl_seq. Cache some small but reasonably sized number of |
| 13 | expr_ty's, and then after that start dynamically allocating, |
| 14 | doubling the number allocated each time. Note that the f-string |
| 15 | f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one |
| 16 | Constant for the literal 'a'. So you add expr_ty's about twice as |
| 17 | fast as you add expressions in an f-string. */ |
| 18 | |
| 19 | Py_ssize_t allocated; /* Number we've allocated. */ |
| 20 | Py_ssize_t size; /* Number we've used. */ |
| 21 | expr_ty *p; /* Pointer to the memory we're actually |
| 22 | using. Will point to 'data' until we |
| 23 | start dynamically allocating. */ |
| 24 | expr_ty data[EXPRLIST_N_CACHED]; |
| 25 | } ExprList; |
| 26 | |
| 27 | /* The FstringParser is designed to add a mix of strings and |
| 28 | f-strings, and concat them together as needed. Ultimately, it |
| 29 | generates an expr_ty. */ |
| 30 | typedef struct { |
| 31 | PyObject *last_str; |
| 32 | ExprList expr_list; |
| 33 | int fmode; |
| 34 | } FstringParser; |
| 35 | |
| 36 | void _PyPegen_FstringParser_Init(FstringParser *); |
Lysandros Nikolaou | 2f37c35 | 2020-05-07 13:37:51 +0300 | [diff] [blame^] | 37 | int _PyPegen_parsestr(Parser *, int *, int *, PyObject **, |
| 38 | const char **, Py_ssize_t *, Token *); |
Pablo Galindo | c5fc156 | 2020-04-22 23:29:27 +0100 | [diff] [blame] | 39 | int _PyPegen_FstringParser_ConcatFstring(Parser *, FstringParser *, const char **, |
| 40 | const char *, int, int, Token *, Token *, |
| 41 | Token *); |
| 42 | int _PyPegen_FstringParser_ConcatAndDel(FstringParser *, PyObject *); |
| 43 | expr_ty _PyPegen_FstringParser_Finish(Parser *, FstringParser *, Token *, Token *); |
| 44 | void _PyPegen_FstringParser_Dealloc(FstringParser *); |
| 45 | |
| 46 | #endif |