Esempio n. 1
0
File: dump.c Progetto: takeru/mruby
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;
}
Esempio n. 2
0
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;
}