summaryrefslogtreecommitdiffhomepage
path: root/src/load.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-11-04 14:05:36 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-11-04 14:05:36 +0900
commit8a6e6005621800de45de5c92474b635f5a9fa2dd (patch)
treeb3a24e3729f43540f907f9a2321ec8df9448fd93 /src/load.c
parent0e2ab2210c83a7278ad79a4a660aa7bd7683060f (diff)
downloadmruby-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.c15
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;
}