static size_t write_filename_table(mrb_state *mrb, mrb_irep *irep, uint8_t **cp, mrb_sym **fp, uint16_t *lp) { uint8_t *cur = *cp; mrb_sym *filenames = *fp; uint32_t file_i; uint16_t fn_len; size_t size = 0; mrb_irep_debug_info *debug_info = irep->debug_info; for (file_i = 0; file_i < debug_info->flen; ++file_i) { mrb_irep_debug_info_file *file = debug_info->files[file_i]; if (find_filename_index(filenames, *lp, file->filename_sym) != -1) continue; /* register filename */ *lp += 1; *fp = filenames = (mrb_sym*)mrb_realloc(mrb, filenames, sizeof(mrb_sym) * (*lp)); filenames[*lp - 1] = file->filename_sym; /* filename */ fn_len = (uint16_t)strlen(file->filename); cur += uint16_to_bin(fn_len, cur); memcpy(cur, file->filename, fn_len); cur += fn_len; size += sizeof(uint16_t) + fn_len; } for (file_i=0; file_i<irep->rlen; file_i++) { size += write_filename_table(mrb, irep->reps[file_i], &cur, fp, lp); } *cp = cur; return size; }
static int write_section_debug(mrb_state *mrb, mrb_irep *irep, uint8_t *cur) { uint32_t section_size = 0; const uint8_t *bin = cur; struct rite_section_debug_header *header; mrb_sym *filenames; size_t filenames_len = 0, i; uint8_t *filenames_len_out; uint32_t dlen; if (mrb == NULL || cur == NULL) { return MRB_DUMP_INVALID_ARGUMENT; } header = (struct rite_section_debug_header *)bin; cur += sizeof(struct rite_section_debug_header); section_size += sizeof(struct rite_section_debug_header); // filename table filenames = (mrb_sym *)mrb_malloc(mrb, sizeof(mrb_sym *) * 1); filenames_len_out = cur; cur += sizeof(uint16_t); section_size += sizeof(uint16_t); section_size += write_filename_table(mrb, irep, &cur, &filenames, &filenames_len); for (i=0; i<irep->rlen; i++) { section_size += write_filename_table(mrb, irep->reps[i], &cur, &filenames, &filenames_len); } uint16_to_bin(filenames_len, filenames_len_out); // debug records dlen = write_debug_record(mrb, irep, cur, filenames, filenames_len); cur += dlen; section_size += dlen; for (i=0; i<irep->rlen; i++) { dlen = write_debug_record(mrb, irep->reps[i], cur, filenames, filenames_len); cur += dlen; section_size += dlen; } memcpy(header->section_identify, RITE_SECTION_DEBUG_IDENTIFIER, sizeof(header->section_identify)); uint32_to_bin(section_size, header->section_size); mrb_free(mrb, filenames); return MRB_DUMP_OK; }