Commit 9074983b authored by Masaki Muranaka's avatar Masaki Muranaka

Reduce temporary memory allocations. They are redundant.

parent 2b6e9ee5
...@@ -35,21 +35,12 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) ...@@ -35,21 +35,12 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
{ {
int ret; int ret;
size_t i; size_t i;
char *char_buf;
const uint8_t *src = bin; const uint8_t *src = bin;
uint16_t tt, pool_data_len, snl, buf_size = MRB_DUMP_DEFAULT_STR_LEN; uint16_t tt, pool_data_len, snl;
mrb_int fix_num;
mrb_float f;
size_t plen; size_t plen;
int ai = mrb_gc_arena_save(mrb); int ai = mrb_gc_arena_save(mrb);
mrb_irep *irep = mrb_add_irep(mrb); mrb_irep *irep = mrb_add_irep(mrb);
char_buf = (char *)mrb_malloc(mrb, buf_size);
if (char_buf == NULL) {
ret = MRB_DUMP_GENERAL_FAILURE;
goto error_exit;
}
// skip record size // skip record size
src += sizeof(uint32_t); src += sizeof(uint32_t);
...@@ -88,34 +79,23 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) ...@@ -88,34 +79,23 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
} }
for (i = 0; i < plen; i++) { for (i = 0; i < plen; i++) {
mrb_value s;
tt = *src++; //pool TT tt = *src++; //pool TT
pool_data_len = bin_to_uint16(src); //pool data length pool_data_len = bin_to_uint16(src); //pool data length
src += sizeof(uint16_t); src += sizeof(uint16_t);
if (pool_data_len > buf_size - 1) { s = mrb_str_new(mrb, (char *)src, pool_data_len);
mrb_free(mrb, char_buf);
buf_size = pool_data_len + 1;
char_buf = (char *)mrb_malloc(mrb, buf_size);
if (char_buf == NULL) {
ret = MRB_DUMP_GENERAL_FAILURE;
goto error_exit;
}
}
memcpy(char_buf, src, pool_data_len);
src += pool_data_len; src += pool_data_len;
char_buf[pool_data_len] = '\0';
switch (tt) { //pool data switch (tt) { //pool data
case MRB_TT_FIXNUM: case MRB_TT_FIXNUM:
fix_num = str_to_mrb_int(char_buf); irep->pool[i] = mrb_str_to_inum(mrb, s, 10, FALSE);
irep->pool[i] = mrb_fixnum_value(fix_num);
break; break;
case MRB_TT_FLOAT: case MRB_TT_FLOAT:
f = str_to_mrb_float(char_buf); irep->pool[i] = mrb_float_value(mrb_str_to_dbl(mrb, s, FALSE));
irep->pool[i] = mrb_float_value(f);
break; break;
case MRB_TT_STRING: case MRB_TT_STRING:
irep->pool[i] = mrb_str_new(mrb, char_buf, pool_data_len); irep->pool[i] = s;
break; break;
default: default:
...@@ -137,10 +117,6 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) ...@@ -137,10 +117,6 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
goto error_exit; goto error_exit;
} }
for (i = 0; i < irep->slen; i++) {
static const mrb_sym mrb_sym_zero = { 0 };
*irep->syms = mrb_sym_zero;
}
for (i = 0; i < irep->slen; i++) { for (i = 0; i < irep->slen; i++) {
snl = bin_to_uint16(src); //symbol name length snl = bin_to_uint16(src); //symbol name length
src += sizeof(uint16_t); src += sizeof(uint16_t);
...@@ -150,26 +126,16 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len) ...@@ -150,26 +126,16 @@ read_rite_irep_record(mrb_state *mrb, const uint8_t *bin, uint32_t *len)
continue; continue;
} }
if (snl > buf_size - 1) { irep->syms[i] = mrb_intern2(mrb, (char *)src, snl);
mrb_free(mrb, char_buf);
buf_size = snl + 1;
char_buf = (char *)mrb_malloc(mrb, buf_size);
if (char_buf == NULL) {
ret = MRB_DUMP_GENERAL_FAILURE;
goto error_exit;
}
}
memcpy(char_buf, src, snl); //symbol name
src += snl; src += snl;
char_buf[snl] = '\0';
irep->syms[i] = mrb_intern2(mrb, char_buf, snl); mrb_gc_arena_restore(mrb, ai);
} }
} }
*len = src - bin; *len = src - bin;
ret = MRB_DUMP_OK; ret = MRB_DUMP_OK;
error_exit: error_exit:
mrb_free(mrb, char_buf);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment