diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-11-04 14:05:36 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-11-04 14:05:36 +0900 |
| commit | 8a6e6005621800de45de5c92474b635f5a9fa2dd (patch) | |
| tree | b3a24e3729f43540f907f9a2321ec8df9448fd93 /src/load.c | |
| parent | 0e2ab2210c83a7278ad79a4a660aa7bd7683060f (diff) | |
| download | mruby-8a6e6005621800de45de5c92474b635f5a9fa2dd.tar.gz mruby-8a6e6005621800de45de5c92474b635f5a9fa2dd.zip | |
avoid using rewind(3) to load mrb files
Diffstat (limited to 'src/load.c')
| -rw-r--r-- | src/load.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/load.c b/src/load.c index 7574a1977..62f6b9433 100644 --- a/src/load.c +++ b/src/load.c @@ -653,7 +653,8 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) { mrb_irep *irep = NULL; uint8_t *buf; - size_t buf_size = sizeof(struct rite_binary_header); + const size_t header_size = sizeof(struct rite_binary_header); + size_t buf_size = 0; uint8_t flags; int result; @@ -662,25 +663,25 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) } /* You don't need use SIZE_ERROR as buf_size is enough small. */ - buf = (uint8_t*)mrb_malloc(mrb, buf_size); - if (fread(buf, buf_size, 1, fp) == 0) { + buf = (uint8_t*)mrb_malloc(mrb, header_size); + if (fread(buf, header_size, 1, fp) == 0) { mrb_free(mrb, buf); return NULL; } result = read_binary_header(buf, &buf_size, NULL, &flags); - mrb_free(mrb, buf); if (result != MRB_DUMP_OK) { + mrb_free(mrb, buf); return NULL; } - buf = (uint8_t*)mrb_malloc(mrb, buf_size); - rewind(fp); - if (fread(buf, buf_size, 1, fp) == 0) { + buf = (uint8_t*)mrb_realloc(mrb, buf, buf_size); + if (fread(buf+header_size, buf_size-header_size, 1, fp) == 0) { mrb_free(mrb, buf); return NULL; } irep = read_irep(mrb, buf, FLAG_SRC_MALLOC); mrb_free(mrb, buf); + return irep; } |
