@@ -8228,8 +8228,7 @@ parser_lex(pm_parser_t *parser) {
8228
8228
8229
8229
// If we haven't found an escape yet, then this buffer will be
8230
8230
// unallocated since we can refer directly to the source string.
8231
- pm_buffer_t buffer = (pm_buffer_t) { .value = NULL, .length = 0, .capacity = 0 };
8232
- const uint8_t *buffer_cursor = NULL;
8231
+ pm_token_buffer_t token_buffer = { 0 };
8233
8232
8234
8233
while (breakpoint != NULL) {
8235
8234
// If we hit the incrementor, then we'll increment then nesting and
@@ -8256,14 +8255,7 @@ parser_lex(pm_parser_t *parser) {
8256
8255
// then we need to return that content as string content first.
8257
8256
if (breakpoint > parser->current.start) {
8258
8257
parser->current.end = breakpoint;
8259
-
8260
- if (buffer_cursor == NULL) {
8261
- pm_string_shared_init(&parser->current_string, parser->current.start, parser->current.end);
8262
- } else {
8263
- pm_buffer_append_bytes(&buffer, buffer_cursor, (size_t) (parser->current.end - buffer_cursor));
8264
- pm_string_owned_init(&parser->current_string, (uint8_t *) buffer.value, buffer.length);
8265
- }
8266
-
8258
+ pm_token_buffer_flush(parser, &token_buffer);
8267
8259
LEX(PM_TOKEN_STRING_CONTENT);
8268
8260
}
8269
8261
@@ -8300,14 +8292,7 @@ parser_lex(pm_parser_t *parser) {
8300
8292
} else {
8301
8293
parser->current.end = breakpoint + 1;
8302
8294
parser_flush_heredoc_end(parser);
8303
-
8304
- if (buffer_cursor == NULL) {
8305
- pm_string_shared_init(&parser->current_string, parser->current.start, parser->current.end);
8306
- } else {
8307
- pm_buffer_append_bytes(&buffer, buffer_cursor, (size_t) (parser->current.end - buffer_cursor));
8308
- pm_string_owned_init(&parser->current_string, (uint8_t *) buffer.value, buffer.length);
8309
- }
8310
-
8295
+ pm_token_buffer_flush(parser, &token_buffer);
8311
8296
LEX(PM_TOKEN_STRING_CONTENT);
8312
8297
}
8313
8298
}
@@ -8319,14 +8304,8 @@ parser_lex(pm_parser_t *parser) {
8319
8304
break;
8320
8305
case '\\': {
8321
8306
// Here we hit escapes.
8322
- if (buffer_cursor == NULL) {
8323
- pm_buffer_init_capacity(&buffer, 16);
8324
- pm_buffer_append_bytes(&buffer, parser->current.start, (size_t) (breakpoint - parser->current.start));
8325
- } else {
8326
- pm_buffer_append_bytes(&buffer, buffer_cursor, (size_t) (breakpoint - buffer_cursor));
8327
- }
8328
-
8329
8307
parser->current.end = breakpoint + 1;
8308
+ pm_token_buffer_escape(parser, &token_buffer);
8330
8309
8331
8310
// If we've hit the end of the file, then break out of
8332
8311
// the loop by setting the breakpoint to NULL.
@@ -8338,31 +8317,31 @@ parser_lex(pm_parser_t *parser) {
8338
8317
uint8_t peeked = peek(parser);
8339
8318
switch (peeked) {
8340
8319
case '\\':
8341
- pm_buffer_append_u8(&buffer , '\\');
8320
+ pm_token_buffer_push(&token_buffer , '\\');
8342
8321
parser->current.end++;
8343
8322
break;
8344
8323
case '\r':
8345
8324
parser->current.end++;
8346
8325
if (peek(parser) != '\n') {
8347
8326
if (!lex_mode->as.string.interpolation) {
8348
- pm_buffer_append_u8(&buffer , '\\');
8327
+ pm_token_buffer_push(&token_buffer , '\\');
8349
8328
}
8350
- pm_buffer_append_u8(&buffer , '\r');
8329
+ pm_token_buffer_push(&token_buffer , '\r');
8351
8330
break;
8352
8331
}
8353
8332
/* fallthrough */
8354
8333
case '\n':
8355
8334
if (!lex_mode->as.string.interpolation) {
8356
- pm_buffer_append_u8(&buffer , '\\');
8357
- pm_buffer_append_u8(&buffer , '\n');
8335
+ pm_token_buffer_push(&token_buffer , '\\');
8336
+ pm_token_buffer_push(&token_buffer , '\n');
8358
8337
}
8359
8338
8360
8339
if (parser->heredoc_end) {
8361
8340
// ... if we are on the same line as a heredoc,
8362
8341
// flush the heredoc and continue parsing after
8363
8342
// heredoc_end.
8364
8343
parser_flush_heredoc_end(parser);
8365
- pm_string_owned_init(& parser->current_string, (uint8_t *) buffer.value, buffer.length );
8344
+ pm_token_buffer_copy( parser, &token_buffer );
8366
8345
LEX(PM_TOKEN_STRING_CONTENT);
8367
8346
} else {
8368
8347
// ... else track the newline.
@@ -8373,23 +8352,23 @@ parser_lex(pm_parser_t *parser) {
8373
8352
break;
8374
8353
default:
8375
8354
if (lex_mode->as.string.incrementor != '\0' && peeked == lex_mode->as.string.incrementor) {
8376
- pm_buffer_append_u8(&buffer , peeked);
8355
+ pm_token_buffer_push(&token_buffer , peeked);
8377
8356
parser->current.end++;
8378
8357
} else if (lex_mode->as.string.terminator != '\0' && peeked == lex_mode->as.string.terminator) {
8379
- pm_buffer_append_u8(&buffer , peeked);
8358
+ pm_token_buffer_push(&token_buffer , peeked);
8380
8359
parser->current.end++;
8381
8360
} else if (lex_mode->as.string.interpolation) {
8382
- escape_read(parser, &buffer, PM_ESCAPE_FLAG_NONE);
8361
+ escape_read(parser, &token_buffer. buffer, PM_ESCAPE_FLAG_NONE);
8383
8362
} else {
8384
- pm_buffer_append_u8(&buffer , '\\');
8385
- pm_buffer_append_u8(&buffer , peeked);
8363
+ pm_token_buffer_push(&token_buffer , '\\');
8364
+ pm_token_buffer_push(&token_buffer , peeked);
8386
8365
parser->current.end++;
8387
8366
}
8388
8367
8389
8368
break;
8390
8369
}
8391
8370
8392
- buffer_cursor = parser->current.end;
8371
+ token_buffer.cursor = parser->current.end;
8393
8372
breakpoint = pm_strpbrk(parser, parser->current.end, breakpoints, parser->end - parser->current.end);
8394
8373
break;
8395
8374
}
@@ -8406,12 +8385,7 @@ parser_lex(pm_parser_t *parser) {
8406
8385
}
8407
8386
8408
8387
if (type == PM_TOKEN_STRING_CONTENT) {
8409
- if (buffer_cursor == NULL) {
8410
- pm_string_shared_init(&parser->current_string, parser->current.start, parser->current.end);
8411
- } else {
8412
- pm_buffer_append_bytes(&buffer, buffer_cursor, (size_t) (parser->current.end - buffer_cursor));
8413
- pm_string_owned_init(&parser->current_string, (uint8_t *) buffer.value, buffer.length);
8414
- }
8388
+ pm_token_buffer_flush(parser, &token_buffer);
8415
8389
}
8416
8390
8417
8391
LEX(type);
0 commit comments