@@ -361,21 +361,35 @@ tok_concatenate_interactive_new_line(struct tok_state *tok, const char *line) {
361
361
return 0 ;
362
362
}
363
363
364
-
365
- /* Traverse and update all f-string buffers with the value */
364
+ /* Traverse and remember all f-string buffers, in order to be able to restore
365
+ them after reallocating tok->buf */
366
366
static void
367
- update_fstring_buffers (struct tok_state * tok , char value , int regular , int multiline )
367
+ remember_fstring_buffers (struct tok_state * tok )
368
368
{
369
369
int index ;
370
370
tokenizer_mode * mode ;
371
371
372
372
for (index = tok -> tok_mode_stack_index ; index >= 0 ; -- index ) {
373
373
mode = & (tok -> tok_mode_stack [index ]);
374
- if (regular && mode -> f_string_start != NULL ) {
375
- mode -> f_string_start += value ;
374
+ if (mode -> kind == TOK_FSTRING_MODE ) {
375
+ mode -> f_string_start_offset = mode -> f_string_start - tok -> buf ;
376
+ mode -> f_string_multi_line_start_offset = mode -> f_string_multi_line_start - tok -> buf ;
376
377
}
377
- if (multiline && mode -> f_string_multi_line_start != NULL ) {
378
- mode -> f_string_multi_line_start += value ;
378
+ }
379
+ }
380
+
381
+ /* Traverse and restore all f-string buffers after reallocating tok->buf */
382
+ static void
383
+ restore_fstring_buffers (struct tok_state * tok )
384
+ {
385
+ int index ;
386
+ tokenizer_mode * mode ;
387
+
388
+ for (index = tok -> tok_mode_stack_index ; index >= 0 ; -- index ) {
389
+ mode = & (tok -> tok_mode_stack [index ]);
390
+ if (mode -> kind == TOK_FSTRING_MODE ) {
391
+ mode -> f_string_start = tok -> buf + mode -> f_string_start_offset ;
392
+ mode -> f_string_multi_line_start = tok -> buf + mode -> f_string_multi_line_start_offset ;
379
393
}
380
394
}
381
395
}
@@ -476,7 +490,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size)
476
490
Py_ssize_t start = tok -> start == NULL ? -1 : tok -> start - tok -> buf ;
477
491
Py_ssize_t line_start = tok -> start == NULL ? -1 : tok -> line_start - tok -> buf ;
478
492
Py_ssize_t multi_line_start = tok -> multi_line_start - tok -> buf ;
479
- update_fstring_buffers (tok , - * tok -> buf , /*regular=*/ 1 , /*multiline=*/ 1 );
493
+ remember_fstring_buffers (tok );
480
494
newbuf = (char * )PyMem_Realloc (newbuf , newsize );
481
495
if (newbuf == NULL ) {
482
496
tok -> done = E_NOMEM ;
@@ -489,7 +503,7 @@ tok_reserve_buf(struct tok_state *tok, Py_ssize_t size)
489
503
tok -> start = start < 0 ? NULL : tok -> buf + start ;
490
504
tok -> line_start = line_start < 0 ? NULL : tok -> buf + line_start ;
491
505
tok -> multi_line_start = multi_line_start < 0 ? NULL : tok -> buf + multi_line_start ;
492
- update_fstring_buffers (tok , * tok -> buf , /*regular=*/ 1 , /*multiline=*/ 1 );
506
+ restore_fstring_buffers (tok );
493
507
}
494
508
return 1 ;
495
509
}
@@ -1051,7 +1065,7 @@ tok_underflow_interactive(struct tok_state *tok) {
1051
1065
}
1052
1066
else if (tok -> start != NULL ) {
1053
1067
Py_ssize_t cur_multi_line_start = tok -> multi_line_start - tok -> buf ;
1054
- update_fstring_buffers (tok , - * tok -> buf , /*regular=*/ 0 , /*multiline=*/ 1 );
1068
+ remember_fstring_buffers (tok );
1055
1069
size_t size = strlen (newtok );
1056
1070
ADVANCE_LINENO ();
1057
1071
if (!tok_reserve_buf (tok , size + 1 )) {
@@ -1064,7 +1078,7 @@ tok_underflow_interactive(struct tok_state *tok) {
1064
1078
PyMem_Free (newtok );
1065
1079
tok -> inp += size ;
1066
1080
tok -> multi_line_start = tok -> buf + cur_multi_line_start ;
1067
- update_fstring_buffers (tok , * tok -> buf , /*regular=*/ 0 , /*multiline=*/ 1 );
1081
+ restore_fstring_buffers (tok );
1068
1082
}
1069
1083
else {
1070
1084
ADVANCE_LINENO ();
@@ -2207,6 +2221,8 @@ tok_get_normal_mode(struct tok_state *tok, tokenizer_mode* current_tok, struct t
2207
2221
the_current_tok -> f_string_quote_size = quote_size ;
2208
2222
the_current_tok -> f_string_start = tok -> start ;
2209
2223
the_current_tok -> f_string_multi_line_start = tok -> line_start ;
2224
+ the_current_tok -> f_string_start_offset = -1 ;
2225
+ the_current_tok -> f_string_multi_line_start_offset = -1 ;
2210
2226
the_current_tok -> last_expr_buffer = NULL ;
2211
2227
the_current_tok -> last_expr_size = 0 ;
2212
2228
the_current_tok -> last_expr_end = -1 ;
0 commit comments