@@ -29,13 +29,14 @@ const Node = Document.Node;
2929const ExtraIndex = Document .ExtraIndex ;
3030const ExtraData = Document .ExtraData ;
3131const StringIndex = Document .StringIndex ;
32+ const ArrayList = std .ArrayListUnmanaged ;
3233
3334nodes : Node.List = .{},
34- extra : std . ArrayListUnmanaged (u32 ) = .empty ,
35- scratch_extra : std . ArrayListUnmanaged (u32 ) = .empty ,
36- string_bytes : std . ArrayListUnmanaged (u8 ) = .empty ,
37- scratch_string : std . ArrayListUnmanaged (u8 ) = .empty ,
38- pending_blocks : std . ArrayListUnmanaged (Block ) = .empty ,
35+ extra : ArrayList (u32 ) = .empty ,
36+ scratch_extra : ArrayList (u32 ) = .empty ,
37+ string_bytes : ArrayList (u8 ) = .empty ,
38+ scratch_string : ArrayList (u8 ) = .empty ,
39+ pending_blocks : ArrayList (Block ) = .empty ,
3940allocator : Allocator ,
4041
4142const Parser = @This ();
@@ -86,7 +87,8 @@ const Block = struct {
8687 continuation_indent : usize ,
8788 },
8889 table : struct {
89- column_alignments : std .BoundedArray (Node.TableCellAlignment , max_table_columns ) = .{},
90+ column_alignments_buffer : [max_table_columns ]Node.TableCellAlignment ,
91+ column_alignments_len : usize ,
9092 },
9193 heading : struct {
9294 /// Between 1 and 6, inclusive.
@@ -354,7 +356,8 @@ const BlockStart = struct {
354356 continuation_indent : usize ,
355357 },
356358 table_row : struct {
357- cells : std .BoundedArray ([]const u8 , max_table_columns ),
359+ cells_buffer : [max_table_columns ][]const u8 ,
360+ cells_len : usize ,
358361 },
359362 heading : struct {
360363 /// Between 1 and 6, inclusive.
@@ -422,7 +425,8 @@ fn appendBlockStart(p: *Parser, block_start: BlockStart) !void {
422425 try p .pending_blocks .append (p .allocator , .{
423426 .tag = .table ,
424427 .data = .{ .table = .{
425- .column_alignments = .{},
428+ .column_alignments_buffer = undefined ,
429+ .column_alignments_len = 0 ,
426430 } },
427431 .string_start = p .scratch_string .items .len ,
428432 .extra_start = p .scratch_extra .items .len ,
@@ -431,15 +435,20 @@ fn appendBlockStart(p: *Parser, block_start: BlockStart) !void {
431435
432436 const current_row = p .scratch_extra .items .len - p .pending_blocks .getLast ().extra_start ;
433437 if (current_row <= 1 ) {
434- if (parseTableHeaderDelimiter (block_start .data .table_row .cells )) | alignments | {
435- p .pending_blocks .items [p .pending_blocks .items .len - 1 ].data .table .column_alignments = alignments ;
438+ var buffer : [max_table_columns ]Node.TableCellAlignment = undefined ;
439+ const table_row = & block_start .data .table_row ;
440+
441+ if (parseTableHeaderDelimiter (table_row .cells_buffer [0.. table_row .cells_len ], & buffer )) | alignments | {
442+ const table = & p .pending_blocks .items [p .pending_blocks .items .len - 1 ].data .table ;
443+ @memcpy (table .column_alignments_buffer [0.. alignments .len ], & buffer );
444+ table .column_alignments_len = alignments .len ;
436445 if (current_row == 1 ) {
437446 // We need to go back and mark the header row and its column
438447 // alignments.
439448 const datas = p .nodes .items (.data );
440449 const header_data = datas [p .scratch_extra .getLast ()];
441450 for (p .extraChildren (header_data .container .children ), 0.. ) | header_cell , i | {
442- const alignment = if (i < alignments .len ) alignments . buffer [i ] else .unset ;
451+ const alignment = if (i < alignments .len ) alignments [i ] else .unset ;
443452 const cell_data = & datas [@intFromEnum (header_cell )].table_cell ;
444453 cell_data .info .alignment = alignment ;
445454 cell_data .info .header = true ;
@@ -480,8 +489,10 @@ fn appendBlockStart(p: *Parser, block_start: BlockStart) !void {
480489 // available in the BlockStart. We can immediately parse and append
481490 // these children now.
482491 const containing_table = p .pending_blocks .items [p .pending_blocks .items .len - 2 ];
483- const column_alignments = containing_table .data .table .column_alignments .slice ();
484- for (block_start .data .table_row .cells .slice (), 0.. ) | cell_content , i | {
492+ const table = & containing_table .data .table ;
493+ const column_alignments = table .column_alignments_buffer [0.. table .column_alignments_len ];
494+ const table_row = & block_start .data .table_row ;
495+ for (table_row .cells_buffer [0.. table_row .cells_len ], 0.. ) | cell_content , i | {
485496 const cell_children = try p .parseInlines (cell_content );
486497 const alignment = if (i < column_alignments .len ) column_alignments [i ] else .unset ;
487498 const cell = try p .addNode (.{
@@ -523,7 +534,8 @@ fn startBlock(p: *Parser, line: []const u8) !?BlockStart {
523534 return .{
524535 .tag = .table_row ,
525536 .data = .{ .table_row = .{
526- .cells = table_row .cells ,
537+ .cells_buffer = table_row .cells_buffer ,
538+ .cells_len = table_row .cells_len ,
527539 } },
528540 .rest = "" ,
529541 };
@@ -606,7 +618,8 @@ fn startListItem(unindented_line: []const u8) ?ListItemStart {
606618}
607619
608620const TableRowStart = struct {
609- cells : std .BoundedArray ([]const u8 , max_table_columns ),
621+ cells_buffer : [max_table_columns ][]const u8 ,
622+ cells_len : usize ,
610623};
611624
612625fn startTableRow (unindented_line : []const u8 ) ? TableRowStart {
@@ -615,15 +628,16 @@ fn startTableRow(unindented_line: []const u8) ?TableRowStart {
615628 mem .endsWith (u8 , unindented_line , "\\ |" ) or
616629 ! mem .endsWith (u8 , unindented_line , "|" )) return null ;
617630
618- var cells : std .BoundedArray ([]const u8 , max_table_columns ) = .{};
631+ var cells_buffer : [max_table_columns ][]const u8 = undefined ;
632+ var cells : ArrayList ([]const u8 ) = .initBuffer (& cells_buffer );
619633 const table_row_content = unindented_line [1 .. unindented_line .len - 1 ];
620634 var cell_start : usize = 0 ;
621635 var i : usize = 0 ;
622636 while (i < table_row_content .len ) : (i += 1 ) {
623637 switch (table_row_content [i ]) {
624638 '\\ ' = > i += 1 ,
625639 '|' = > {
626- cells .append (table_row_content [cell_start .. i ]) catch return null ;
640+ cells .appendBounded (table_row_content [cell_start .. i ]) catch return null ;
627641 cell_start = i + 1 ;
628642 },
629643 '`' = > {
@@ -641,20 +655,21 @@ fn startTableRow(unindented_line: []const u8) ?TableRowStart {
641655 else = > {},
642656 }
643657 }
644- cells .append (table_row_content [cell_start .. ]) catch return null ;
658+ cells .appendBounded (table_row_content [cell_start .. ]) catch return null ;
645659
646- return .{ .cells = cells };
660+ return .{ .cells_buffer = cells_buffer , . cells_len = cells . items . len };
647661}
648662
649663fn parseTableHeaderDelimiter (
650- row_cells : std .BoundedArray ([]const u8 , max_table_columns ),
651- ) ? std .BoundedArray (Node .TableCellAlignment , max_table_columns ) {
652- var alignments : std .BoundedArray (Node.TableCellAlignment , max_table_columns ) = .{};
653- for (row_cells .slice ()) | content | {
664+ row_cells : []const []const u8 ,
665+ buffer : []Node.TableCellAlignment ,
666+ ) ? []Node.TableCellAlignment {
667+ var alignments : ArrayList (Node .TableCellAlignment ) = .initBuffer (buffer );
668+ for (row_cells ) | content | {
654669 const alignment = parseTableHeaderDelimiterCell (content ) orelse return null ;
655670 alignments .appendAssumeCapacity (alignment );
656671 }
657- return alignments ;
672+ return alignments . items ;
658673}
659674
660675fn parseTableHeaderDelimiterCell (content : []const u8 ) ? Node.TableCellAlignment {
@@ -928,8 +943,8 @@ const InlineParser = struct {
928943 parent : * Parser ,
929944 content : []const u8 ,
930945 pos : usize = 0 ,
931- pending_inlines : std . ArrayListUnmanaged (PendingInline ) = .empty ,
932- completed_inlines : std . ArrayListUnmanaged (CompletedInline ) = .empty ,
946+ pending_inlines : ArrayList (PendingInline ) = .empty ,
947+ completed_inlines : ArrayList (CompletedInline ) = .empty ,
933948
934949 const PendingInline = struct {
935950 tag : Tag ,
0 commit comments