diff options
| author | Masaki Muranaka <[email protected]> | 2013-03-29 16:23:10 +0900 |
|---|---|---|
| committer | Masaki Muranaka <[email protected]> | 2013-03-29 16:23:10 +0900 |
| commit | c67aec25b6aeb4191b695a197eb3835b83d81886 (patch) | |
| tree | 0692ff7e0c08c93f98b57c0f41fc4d7d131ca444 /src | |
| parent | 87423130795fcfbc436ac735b3b44081cc5d57a4 (diff) | |
| download | mruby-c67aec25b6aeb4191b695a197eb3835b83d81886.tar.gz mruby-c67aec25b6aeb4191b695a197eb3835b83d81886.zip | |
Reduce temporary memory allocations. They are redundant.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dump.c | 72 |
1 files changed, 14 insertions, 58 deletions
diff --git a/src/dump.c b/src/dump.c index f4c48d951..3000f2bcf 100644 --- a/src/dump.c +++ b/src/dump.c @@ -107,19 +107,12 @@ get_pool_block_size(mrb_state *mrb, mrb_irep *irep) static int write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) { - int result; size_t pool_no; uint8_t *cur = buf; - size_t buf_size, len; + size_t len; mrb_value str; - char *char_buf = NULL; - - buf_size = MRB_DUMP_DEFAULT_STR_LEN; - char_buf = (char *)mrb_malloc(mrb, buf_size); - if (char_buf == NULL) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } + const char *char_ptr; + char char_buf[30]; cur += uint32_to_bin(irep->plen, cur); /* number of pool */ @@ -127,51 +120,37 @@ write_pool_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) int ai = mrb_gc_arena_save(mrb); cur += uint8_to_bin(mrb_type(irep->pool[pool_no]), cur); /* data type */ - memset(char_buf, 0, buf_size); switch (mrb_type(irep->pool[pool_no])) { case MRB_TT_FIXNUM: str = mrb_fix2str(mrb, irep->pool[pool_no], 10); - memcpy(char_buf, RSTRING_PTR(str), RSTRING_LEN(str)); + char_ptr = RSTRING_PTR(str); len = RSTRING_LEN(str); break; case MRB_TT_FLOAT: len = mrb_float_to_str(char_buf, mrb_float(irep->pool[pool_no])); + char_ptr = &char_buf[0]; break; case MRB_TT_STRING: str = irep->pool[pool_no]; + char_ptr = RSTRING_PTR(str); len = RSTRING_LEN(str); - if (len > buf_size - 1) { - buf_size = len + 1; - char_buf = (char *)mrb_realloc(mrb, char_buf, buf_size); - if (char_buf == NULL) { - mrb_gc_arena_restore(mrb, ai); - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - memset(char_buf, 0, buf_size); - } - memcpy(char_buf, RSTRING_PTR(str), RSTRING_LEN(str)); break; default: - len = 0; continue; } cur += uint16_to_bin(len, cur); /* data length */ - memcpy(cur, char_buf, len); + memcpy(cur, char_ptr, len); cur += len; mrb_gc_arena_restore(mrb, ai); } - result = (int)(cur - buf); -error_exit: - mrb_free(mrb, char_buf); - return result; + return (int)(cur - buf); } @@ -197,21 +176,10 @@ get_syms_block_size(mrb_state *mrb, mrb_irep *irep) static int write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) { - int result; size_t sym_no; - size_t buf_size; uint8_t *cur = buf; - uint16_t nlen; - char *char_buf = NULL; const char *name; - buf_size = MRB_DUMP_DEFAULT_STR_LEN; - char_buf = (char *)mrb_malloc(mrb, buf_size); - if (char_buf == NULL) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } - cur += uint32_to_bin(irep->slen, cur); /* number of symbol */ for (sym_no = 0; sym_no < irep->slen; sym_no++) { @@ -219,32 +187,20 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf) size_t len; name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len); - if (len > UINT16_MAX) goto error_exit; - nlen = (uint16_t)len; - if (nlen > buf_size - 1) { - buf_size = nlen + 1; - char_buf = (char *)mrb_realloc(mrb, char_buf, buf_size); - if (char_buf == NULL) { - result = MRB_DUMP_GENERAL_FAILURE; - goto error_exit; - } + if (len > UINT16_MAX) { + return MRB_DUMP_GENERAL_FAILURE; } - memset(char_buf, 0, buf_size); - memcpy(char_buf, name, len); - cur += uint16_to_bin(nlen, cur); /* length of symbol name */ - memcpy(cur, char_buf, nlen); /* symbol name */ - cur += nlen; + cur += uint16_to_bin((uint16_t)len, cur); /* length of symbol name */ + memcpy(cur, name, len); /* symbol name */ + cur += (uint16_t)len; } else { cur += uint16_to_bin(MRB_DUMP_NULL_SYM_LEN, cur); /* length of symbol name */ } } - result = (int)(cur - buf); -error_exit: - mrb_free(mrb, char_buf); - return result; + return (int)(cur - buf); } |
