@@ -333,6 +333,97 @@ mrb_write_section_irep(mrb_state *mrb, size_t start_index, uint8_t *bin)
333333 return MRB_DUMP_OK ;
334334}
335335
336+ static int
337+ mrb_write_section_lineno_header (mrb_state * mrb , uint32_t section_size , uint16_t nirep , uint16_t sirep , uint8_t * bin )
338+ {
339+ struct rite_section_lineno_header * header = (struct rite_section_lineno_header * )bin ;
340+
341+ // TODO
342+ memcpy (header -> section_identify , RITE_SECTION_LIENO_IDENTIFIER , sizeof (header -> section_identify ));
343+ uint32_to_bin (section_size , header -> section_size );
344+ uint16_to_bin (nirep , header -> nirep );
345+ uint16_to_bin (sirep , header -> sirep );
346+
347+ return MRB_DUMP_OK ;
348+ }
349+
350+ static size_t
351+ get_debug_record_size (mrb_state * mrb , mrb_irep * irep )
352+ {
353+ size_t size = 0 ;
354+
355+ size += sizeof (uint32_t ); // record size
356+ size += sizeof (uint16_t ); // filename size
357+ if (irep -> filename ) {
358+ size += strlen (irep -> filename ); // filename
359+ }
360+ size += sizeof (uint32_t ); // niseq
361+ if (irep -> lines ) {
362+ size += sizeof (uint16_t ) * irep -> ilen ; // lineno
363+ }
364+
365+ return size ;
366+ }
367+
368+ static int
369+ write_lineno_record (mrb_state * mrb , mrb_irep * irep , uint8_t * bin )
370+ {
371+ uint8_t * cur = bin ;
372+ size_t filename_len = 0 ;
373+ int iseq_no ;
374+
375+ cur += sizeof (uint32_t ); /* record size */
376+
377+ if (irep -> filename ) {
378+ filename_len = strlen (irep -> filename );
379+ }
380+ cur += uint16_to_bin (filename_len , cur ); /* filename size */
381+
382+ if (filename_len ) {
383+ memcpy (cur , irep -> filename , filename_len );
384+ cur += filename_len ; /* filename */
385+ }
386+
387+ if (irep -> lines ) {
388+ cur += uint32_to_bin (irep -> ilen , cur ); /* niseq */
389+ for (iseq_no = 0 ; iseq_no < irep -> ilen ; iseq_no ++ ) {
390+ cur += uint16_to_bin (irep -> lines [iseq_no ], cur ); /* opcode */
391+ }
392+ }
393+ else {
394+ cur += uint32_to_bin (0 , cur ); /* niseq */
395+ }
396+
397+ uint32_to_bin (cur - bin , bin ); /* record size */
398+
399+ return (cur - bin );
400+ }
401+
402+ static int
403+ mrb_write_section_lineno (mrb_state * mrb , int start_index , uint8_t * bin )
404+ {
405+ int irep_no ;
406+ uint32_t section_size = 0 , rlen = 0 ; /* size of irep record */
407+ uint8_t * cur = bin ;
408+
409+ if (mrb == NULL || start_index < 0 || start_index >= mrb -> irep_len || bin == NULL ) {
410+ return MRB_DUMP_INVALID_ARGUMENT ;
411+ }
412+
413+ cur += sizeof (struct rite_section_lineno_header );
414+ section_size += sizeof (struct rite_section_lineno_header );
415+
416+ for (irep_no = start_index ; irep_no < mrb -> irep_len ; irep_no ++ ) {
417+ rlen = write_lineno_record (mrb , mrb -> irep [irep_no ], cur );
418+ cur += rlen ;
419+ section_size += rlen ;
420+ }
421+
422+ mrb_write_section_lineno_header (mrb , section_size , mrb -> irep_len - start_index , start_index , bin );
423+
424+ return MRB_DUMP_OK ;
425+ }
426+
336427static int
337428write_rite_binary_header (mrb_state * mrb , size_t binary_size , uint8_t * bin )
338429{
@@ -354,10 +445,12 @@ write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t* bin)
354445}
355446
356447static int
357- mrb_dump_irep (mrb_state * mrb , size_t start_index , uint8_t * * bin , size_t * bin_size )
448+ mrb_dump_irep (mrb_state * mrb , size_t start_index , int debug_info , uint8_t * * bin , size_t * bin_size )
358449{
359450 int result = MRB_DUMP_GENERAL_FAILURE ;
451+ size_t section_size = 0 ;
360452 size_t section_irep_size ;
453+ size_t section_lineno_size = 0 ;
361454 size_t irep_no ;
362455 uint8_t * cur = NULL ;
363456
@@ -370,8 +463,18 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
370463 for (irep_no = start_index ; irep_no < mrb -> irep_len ; irep_no ++ ) {
371464 section_irep_size += get_irep_record_size (mrb , mrb -> irep [irep_no ]);
372465 }
466+ section_size += section_irep_size ;
467+
468+ /* DEBUG section size */
469+ if (debug_info ) {
470+ section_lineno_size += sizeof (struct rite_section_lineno_header );
471+ for (irep_no = start_index ; irep_no < mrb -> irep_len ; irep_no ++ ) {
472+ section_lineno_size += get_debug_record_size (mrb , mrb -> irep [irep_no ]);
473+ }
474+ section_size += section_lineno_size ;
475+ }
373476
374- * bin_size += sizeof (struct rite_binary_header ) + section_irep_size + sizeof (struct rite_binary_footer );
477+ * bin_size += sizeof (struct rite_binary_header ) + section_size + sizeof (struct rite_binary_footer );
375478 cur = * bin = (uint8_t * )mrb_malloc (mrb , * bin_size );
376479 if (cur == NULL ) {
377480 goto error_exit ;
@@ -383,8 +486,18 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
383486 if (result != MRB_DUMP_OK ) {
384487 goto error_exit ;
385488 }
386-
489+
387490 cur += section_irep_size ;
491+
492+ /* write DEBUG section */
493+ if (debug_info ) {
494+ result = mrb_write_section_lineno (mrb , start_index , cur );
495+ if (result != MRB_DUMP_OK ) {
496+ goto error_exit ;
497+ }
498+ cur += section_lineno_size ;
499+ }
500+
388501 mrb_write_eof (mrb , cur );
389502
390503 result = write_rite_binary_header (mrb , * bin_size , * bin );
@@ -401,7 +514,7 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
401514#ifdef ENABLE_STDIO
402515
403516int
404- mrb_dump_irep_binary (mrb_state * mrb , size_t start_index , FILE * fp )
517+ mrb_dump_irep_binary (mrb_state * mrb , size_t start_index , int debug_info , FILE * fp )
405518{
406519 uint8_t * bin = NULL ;
407520 size_t bin_size = 0 ;
@@ -411,7 +524,7 @@ mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, FILE* fp)
411524 return MRB_DUMP_INVALID_ARGUMENT ;
412525 }
413526
414- result = mrb_dump_irep (mrb , start_index , & bin , & bin_size );
527+ result = mrb_dump_irep (mrb , start_index , debug_info , & bin , & bin_size );
415528 if (result == MRB_DUMP_OK ) {
416529 fwrite (bin , bin_size , 1 , fp );
417530 }
@@ -421,7 +534,7 @@ mrb_dump_irep_binary(mrb_state *mrb, size_t start_index, FILE* fp)
421534}
422535
423536int
424- mrb_dump_irep_cfunc (mrb_state * mrb , size_t start_index , FILE * fp , const char * initname )
537+ mrb_dump_irep_cfunc (mrb_state * mrb , size_t start_index , int debug_info , FILE * fp , const char * initname )
425538{
426539 uint8_t * bin = NULL ;
427540 size_t bin_size = 0 , bin_idx = 0 ;
@@ -431,7 +544,7 @@ mrb_dump_irep_cfunc(mrb_state *mrb, size_t start_index, FILE *fp, const char *in
431544 return MRB_DUMP_INVALID_ARGUMENT ;
432545 }
433546
434- result = mrb_dump_irep (mrb , start_index , & bin , & bin_size );
547+ result = mrb_dump_irep (mrb , start_index , debug_info , & bin , & bin_size );
435548 if (result == MRB_DUMP_OK ) {
436549 fprintf (fp , "const uint8_t %s[] = {" , initname );
437550 while (bin_idx < bin_size ) {
0 commit comments