Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/src/dump.c

    r331 r439  
    77#include <string.h>
    88#include <limits.h>
     9#include <math.h>
    910#include <mruby/dump.h>
    1011#include <mruby/string.h>
     
    1617#define FLAG_BYTEORDER_NONATIVE 0
    1718
     19#ifndef MRB_WITHOUT_FLOAT
    1820#ifdef MRB_USE_FLOAT
    19 #define MRB_FLOAT_FMT "%.8e"
     21#define MRB_FLOAT_FMT "%.9g"
    2022#else
    21 #define MRB_FLOAT_FMT "%.16e"
     23#define MRB_FLOAT_FMT "%.17g"
     24#endif
    2225#endif
    2326
     
    8083{
    8184  uint8_t *cur = buf;
    82   uint32_t iseq_no;
    8385
    8486  cur += uint32_to_bin(irep->ilen, cur); /* number of opcode */
    8587  cur += write_padding(cur);
    86   switch (flags & DUMP_ENDIAN_NAT) {
    87   case DUMP_ENDIAN_BIG:
    88     if (bigendian_p()) goto native;
    89     for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
    90       cur += uint32_to_bin(irep->iseq[iseq_no], cur); /* opcode */
    91     }
    92     break;
    93   case DUMP_ENDIAN_LIL:
    94     if (!bigendian_p()) goto native;
    95     for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
    96       cur += uint32l_to_bin(irep->iseq[iseq_no], cur); /* opcode */
    97     }
    98     break;
    99 
    100   native:
    101   case DUMP_ENDIAN_NAT:
    102     memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code));
    103     cur += irep->ilen * sizeof(mrb_code);
    104     break;
    105   }
     88  memcpy(cur, irep->iseq, irep->ilen * sizeof(mrb_code));
     89  cur += irep->ilen * sizeof(mrb_code);
    10690
    10791  return cur - buf;
    10892}
    10993
     94#ifndef MRB_WITHOUT_FLOAT
     95static mrb_value
     96float_to_str(mrb_state *mrb, mrb_value flt)
     97{
     98  mrb_float f = mrb_float(flt);
     99
     100  if (isinf(f)) {
     101    return f < 0 ? mrb_str_new_lit(mrb, "I") : mrb_str_new_lit(mrb, "i");
     102  }
     103  return  mrb_float_to_str(mrb, flt, MRB_FLOAT_FMT);
     104}
     105#endif
    110106
    111107static size_t
    112108get_pool_block_size(mrb_state *mrb, mrb_irep *irep)
    113109{
     110  int pool_no;
    114111  size_t size = 0;
    115   size_t pool_no;
    116112  mrb_value str;
    117113
     
    132128      break;
    133129
     130#ifndef MRB_WITHOUT_FLOAT
    134131    case MRB_TT_FLOAT:
    135       str = mrb_float_to_str(mrb, irep->pool[pool_no], MRB_FLOAT_FMT);
     132      str = float_to_str(mrb, irep->pool[pool_no]);
    136133      {
    137134        mrb_int len = RSTRING_LEN(str);
     
    140137      }
    141138      break;
     139#endif
    142140
    143141    case MRB_TT_STRING:
     
    161159write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
    162160{
    163   size_t pool_no;
     161  int pool_no;
    164162  uint8_t *cur = buf;
    165163  uint16_t len;
     
    178176      break;
    179177
     178#ifndef MRB_WITHOUT_FLOAT
    180179    case MRB_TT_FLOAT:
    181180      cur += uint8_to_bin(IREP_TT_FLOAT, cur); /* data type */
    182       str = mrb_float_to_str(mrb, irep->pool[pool_no], MRB_FLOAT_FMT);
     181      str = float_to_str(mrb, irep->pool[pool_no]);
    183182      break;
     183#endif
    184184
    185185    case MRB_TT_STRING:
     
    214214{
    215215  size_t size = 0;
    216   uint32_t sym_no;
     216  int sym_no;
    217217  mrb_int len;
    218218
     
    221221    size += sizeof(uint16_t); /* snl(n) */
    222222    if (irep->syms[sym_no] != 0) {
    223       mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
     223      mrb_sym_name_len(mrb, irep->syms[sym_no], &len);
    224224      size += len + 1; /* sn(n) + null char */
    225225    }
     
    232232write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
    233233{
    234   uint32_t sym_no;
     234  int sym_no;
    235235  uint8_t *cur = buf;
    236236  const char *name;
     
    242242      mrb_int len;
    243243
    244       name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
     244      name = mrb_sym_name_len(mrb, irep->syms[sym_no], &len);
    245245
    246246      mrb_assert_int_fit(mrb_int, len, uint16_t, UINT16_MAX);
     
    274274{
    275275  size_t size = 0;
    276   size_t irep_no;
     276  int irep_no;
    277277
    278278  size = get_irep_record_size_1(mrb, irep);
     
    286286write_irep_record(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *irep_record_size, uint8_t flags)
    287287{
    288   uint32_t i;
     288  int i;
    289289  uint8_t *src = bin;
    290290
     
    367367}
    368368
    369 static int
    370 write_section_lineno_header(mrb_state *mrb, size_t section_size, uint8_t *bin)
    371 {
    372   struct rite_section_lineno_header *header = (struct rite_section_lineno_header*)bin;
    373 
    374   memcpy(header->section_ident, RITE_SECTION_LINENO_IDENT, sizeof(header->section_ident));
    375   uint32_to_bin((uint32_t)section_size, header->section_size);
    376 
    377   return MRB_DUMP_OK;
    378 }
    379 
    380 static size_t
    381 get_lineno_record_size(mrb_state *mrb, mrb_irep *irep)
    382 {
    383   size_t size = 0;
    384 
    385   size += sizeof(uint32_t); /* record size */
    386   size += sizeof(uint16_t); /* filename size */
    387   if (irep->filename) {
    388     size += strlen(irep->filename); /* filename */
    389   }
    390   size += sizeof(uint32_t); /* niseq */
    391   if (irep->lines) {
    392     size += sizeof(uint16_t) * irep->ilen; /* lineno */
    393   }
    394 
    395   return size;
    396 }
    397 
    398 static size_t
    399 write_lineno_record_1(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
    400 {
    401   uint8_t *cur = bin;
    402   size_t iseq_no;
    403   size_t filename_len;
    404   ptrdiff_t diff;
    405 
    406   cur += sizeof(uint32_t); /* record size */
    407 
    408   if (irep->filename) {
    409     filename_len = strlen(irep->filename);
    410   }
    411   else {
    412     filename_len = 0;
    413   }
    414   mrb_assert_int_fit(size_t, filename_len, uint16_t, UINT16_MAX);
    415   cur += uint16_to_bin((uint16_t)filename_len, cur); /* filename size */
    416 
    417   if (filename_len) {
    418     memcpy(cur, irep->filename, filename_len);
    419     cur += filename_len; /* filename */
    420   }
    421 
    422   if (irep->lines) {
    423     mrb_assert_int_fit(size_t, irep->ilen, uint32_t, UINT32_MAX);
    424     cur += uint32_to_bin((uint32_t)(irep->ilen), cur); /* niseq */
    425     for (iseq_no = 0; iseq_no < irep->ilen; iseq_no++) {
    426       cur += uint16_to_bin(irep->lines[iseq_no], cur); /* opcode */
    427     }
    428   }
    429   else {
    430     cur += uint32_to_bin(0, cur); /* niseq */
    431   }
    432 
    433   diff = cur - bin;
    434   mrb_assert_int_fit(ptrdiff_t, diff, uint32_t, UINT32_MAX);
    435 
    436   uint32_to_bin((uint32_t)diff, bin); /* record size */
    437 
    438   mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
    439   return (size_t)diff;
    440 }
    441 
    442 static size_t
    443 write_lineno_record(mrb_state *mrb, mrb_irep *irep, uint8_t* bin)
    444 {
    445   size_t i;
    446   size_t rlen, size = 0;
    447 
    448   rlen = write_lineno_record_1(mrb, irep, bin);
    449   bin += rlen;
    450   size += rlen;
    451   for (i=0; i<irep->rlen; i++) {
    452     rlen = write_lineno_record(mrb, irep, bin);
    453     bin += rlen;
    454     size += rlen;
    455   }
    456   return size;
    457 }
    458 
    459 static int
    460 write_section_lineno(mrb_state *mrb, mrb_irep *irep, uint8_t *bin)
    461 {
    462   size_t section_size = 0;
    463   size_t rlen = 0; /* size of irep record */
    464   uint8_t *cur = bin;
    465 
    466   if (mrb == NULL || bin == NULL) {
    467     return MRB_DUMP_INVALID_ARGUMENT;
    468   }
    469 
    470   cur += sizeof(struct rite_section_lineno_header);
    471   section_size += sizeof(struct rite_section_lineno_header);
    472 
    473   rlen = write_lineno_record(mrb, irep, cur);
    474   section_size += rlen;
    475 
    476   write_section_lineno_header(mrb, section_size, bin);
    477 
    478   return MRB_DUMP_OK;
    479 }
    480 
    481369static size_t
    482370get_debug_record_size(mrb_state *mrb, mrb_irep *irep)
     
    484372  size_t ret = 0;
    485373  uint16_t f_idx;
    486   size_t i;
     374  int i;
    487375
    488376  ret += sizeof(uint32_t); /* record size */
     
    532420{
    533421  mrb_sym *filenames = *fp;
    534   size_t i, size = 0;
     422  size_t size = 0;
    535423  mrb_irep_debug_info *di = irep->debug_info;
     424  int i;
    536425
    537426  mrb_assert(lp);
     
    548437
    549438      /* filename */
    550       mrb_sym2name_len(mrb, file->filename_sym, &filename_len);
     439      mrb_sym_name_len(mrb, file->filename_sym, &filename_len);
    551440      size += sizeof(uint16_t) + (size_t)filename_len;
    552441    }
     
    606495  ret = cur - bin;
    607496  mrb_assert_int_fit(ptrdiff_t, ret, uint32_t, UINT32_MAX);
    608   uint32_to_bin(ret, bin);
     497  uint32_to_bin((uint32_t)ret, bin);
    609498
    610499  mrb_assert_int_fit(ptrdiff_t, ret, size_t, SIZE_MAX);
     
    616505{
    617506  size_t size, len;
    618   size_t irep_no;
     507  int irep_no;
    619508
    620509  size = len = write_debug_record_1(mrb, irep, bin, filenames, filenames_len);
     
    652541  section_size += sizeof(uint16_t);
    653542  for (i = 0; i < filenames_len; ++i) {
    654     sym = mrb_sym2name_len(mrb, filenames[i], &sym_len);
     543    sym = mrb_sym_name_len(mrb, filenames[i], &sym_len);
    655544    mrb_assert(sym);
    656     cur += uint16_to_bin(sym_len, cur);
     545    cur += uint16_to_bin((uint16_t)sym_len, cur);
    657546    memcpy(cur, sym, sym_len);
    658547    cur += sym_len;
     
    666555  memcpy(header->section_ident, RITE_SECTION_DEBUG_IDENT, sizeof(header->section_ident));
    667556  mrb_assert(section_size <= INT32_MAX);
    668   uint32_to_bin(section_size, header->section_size);
     557  uint32_to_bin((uint32_t)section_size, header->section_size);
    669558
    670559  return MRB_DUMP_OK;
     
    674563create_lv_sym_table(mrb_state *mrb, const mrb_irep *irep, mrb_sym **syms, uint32_t *syms_len)
    675564{
    676   size_t i;
     565  int i;
    677566
    678567  if (*syms == NULL) {
     
    706595
    707596  for (i = 0; i < syms_len; ++i) {
    708     str = mrb_sym2name_len(mrb, syms[i], &str_len);
    709     cur += uint16_to_bin(str_len, cur);
     597    str = mrb_sym_name_len(mrb, syms[i], &str_len);
     598    cur += uint16_to_bin((uint16_t)str_len, cur);
    710599    memcpy(cur, str, str_len);
    711600    cur += str_len;
     
    721610{
    722611  uint8_t *cur = *start;
    723   size_t i;
     612  int i;
    724613
    725614  for (i = 0; i + 1 < irep->nlocals; ++i) {
     
    749638get_lv_record_size(mrb_state *mrb, mrb_irep *irep)
    750639{
    751   size_t ret = 0, i;
     640  size_t ret = 0;
     641  int i;
    752642
    753643  ret += (sizeof(uint16_t) + sizeof(uint16_t)) * (irep->nlocals - 1);
     
    769659  for (i = 0; i < syms_len; ++i) {
    770660    mrb_int str_len;
    771     mrb_sym2name_len(mrb, syms[i], &str_len);
     661    mrb_sym_name_len(mrb, syms[i], &str_len);
    772662    ret += str_len;
    773663  }
     
    807697  diff = cur - start;
    808698  mrb_assert_int_fit(ptrdiff_t, diff, size_t, SIZE_MAX);
    809   uint32_to_bin(diff, header->section_size);
     699  uint32_to_bin((uint32_t)diff, header->section_size);
    810700
    811701lv_section_exit:
     
    842732  uint32_to_bin((uint32_t)binary_size, header->binary_size);
    843733
    844   offset = (&(header->binary_crc[0]) - bin) + sizeof(uint16_t);
     734  offset = (uint32_t)((&(header->binary_crc[0]) - bin) + sizeof(uint16_t));
    845735  crc = calc_crc_16_ccitt(bin + offset, binary_size - offset, 0);
    846736  uint16_to_bin(crc, header->binary_crc);
     
    850740
    851741static mrb_bool
    852 is_debug_info_defined(mrb_irep *irep)
    853 {
    854   size_t i;
     742debug_info_defined_p(mrb_irep *irep)
     743{
     744  int i;
    855745
    856746  if (!irep->debug_info) return FALSE;
    857747  for (i=0; i<irep->rlen; i++) {
    858     if (!is_debug_info_defined(irep->reps[i])) return FALSE;
     748    if (!debug_info_defined_p(irep->reps[i])) return FALSE;
    859749  }
    860750  return TRUE;
     
    862752
    863753static mrb_bool
    864 is_lv_defined(mrb_irep *irep)
    865 {
    866   size_t i;
     754lv_defined_p(mrb_irep *irep)
     755{
     756  int i;
    867757
    868758  if (irep->lv) { return TRUE; }
    869759
    870760  for (i = 0; i < irep->rlen; ++i) {
    871     if (is_lv_defined(irep->reps[i])) { return TRUE; }
     761    if (lv_defined_p(irep->reps[i])) { return TRUE; }
    872762  }
    873763
     
    898788  size_t section_lineno_size = 0, section_lv_size = 0;
    899789  uint8_t *cur = NULL;
    900   mrb_bool const debug_info_defined = is_debug_info_defined(irep), lv_defined = is_lv_defined(irep);
     790  mrb_bool const debug_info_defined = debug_info_defined_p(irep), lv_defined = lv_defined_p(irep);
    901791  mrb_sym *lv_syms = NULL; uint32_t lv_syms_len = 0;
    902792  mrb_sym *filenames = NULL; uint16_t filenames_len = 0;
     
    923813      section_lineno_size += get_debug_record_size(mrb, irep);
    924814    }
    925     else {
    926       section_lineno_size += sizeof(struct rite_section_lineno_header);
    927       section_lineno_size += get_lineno_record_size(mrb, irep);
    928     }
    929815  }
    930816
     
    954840    if (debug_info_defined) {
    955841      result = write_section_debug(mrb, irep, cur, filenames, filenames_len);
    956     }
    957     else {
    958       result = write_section_lineno(mrb, irep, cur);
    959     }
    960     if (result != MRB_DUMP_OK) {
    961       goto error_exit;
     842      if (result != MRB_DUMP_OK) {
     843        goto error_exit;
     844      }
    962845    }
    963846    cur += section_lineno_size;
     
    1061944    }
    1062945    if (fprintf(fp,
     946          "#ifdef __cplusplus\n"
    1063947          "extern const uint8_t %s[];\n"
     948          "#endif\n"
    1064949          "const uint8_t\n"
    1065950          "#if defined __GNUC__\n"
Note: See TracChangeset for help on using the changeset viewer.