@@ -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