summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c16
-rw-r--r--src/load.c19
-rw-r--r--src/state.c19
3 files changed, 23 insertions, 31 deletions
diff --git a/src/codegen.c b/src/codegen.c
index a6c94d871..c9225e91e 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -2055,8 +2055,9 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
static const codegen_scope codegen_scope_zero = { 0 };
mrb_pool *pool = mrb_pool_open(mrb);
codegen_scope *p = (codegen_scope *)mrb_pool_alloc(pool, sizeof(codegen_scope));
- if (!p) return 0;
+ mrb_irep *irep;
+ if (!p) return 0;
*p = codegen_scope_zero;
p->mrb = mrb;
p->mpool = pool;
@@ -2079,11 +2080,9 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p->nlocals = p->sp;
p->ai = mrb->arena_idx;
- //because of a potential bad memory access in case of gc let's allocate the irep right now
- mrb_add_irep(mrb, mrb->irep_len);
- mrb->irep[mrb->irep_len] = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
- mrb->irep[mrb->irep_len]->plen = 0;
- p->idx = mrb->irep_len++;
+ irep = mrb_add_irep(mrb);
+ p->idx = irep->idx;
+
p->filename = prev->filename;
if (p->filename) {
p->lines = (short*)mrb_malloc(mrb, sizeof(short)*p->icapa);
@@ -2097,13 +2096,8 @@ scope_finish(codegen_scope *s, int idx)
mrb_state *mrb = s->mrb;
mrb_irep *irep;
- //Comment out these instructions already done in scope_new
- //mrb_add_irep(mrb, idx);
- //irep = mrb->irep[idx] = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
irep = mrb->irep[idx];
-
irep->flags = 0;
- irep->idx = idx;
if (s->iseq) {
irep->iseq = (mrb_code *)codegen_realloc(s, s->iseq, sizeof(mrb_code)*s->pc);
irep->ilen = s->pc;
diff --git a/src/load.c b/src/load.c
index 3cd8d91b0..282237d72 100644
--- a/src/load.c
+++ b/src/load.c
@@ -47,7 +47,7 @@ static unsigned char* rite_fgets(RiteFILE*,unsigned char*,int,int);
static int load_rite_header(FILE*,rite_binary_header*,unsigned char*);
static int load_rite_irep_record(mrb_state*, RiteFILE*,unsigned char*,uint32_t*);
static int read_rite_header(mrb_state*,unsigned char*,rite_binary_header*);
-static int read_rite_irep_record(mrb_state*,unsigned char*,mrb_irep*,uint32_t*);
+static int read_rite_irep_record(mrb_state*,unsigned char*,uint32_t*);
static unsigned char
@@ -321,7 +321,7 @@ read_rite_header(mrb_state *mrb, unsigned char *bin, rite_binary_header* bin_he
}
static int
-read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32_t* len)
+read_rite_irep_record(mrb_state *mrb, unsigned char *src, uint32_t* len)
{
int i, ret = MRB_DUMP_OK;
char *buf;
@@ -330,6 +330,7 @@ read_rite_irep_record(mrb_state *mrb, unsigned char *src, mrb_irep *irep, uint32
mrb_int fix_num;
mrb_float f;
int ai = mrb_gc_arena_save(mrb);
+ mrb_irep *irep = mrb_add_irep(mrb);
recordStart = src;
buf = (char *)mrb_malloc(mrb, bufsize);
@@ -509,25 +510,13 @@ mrb_read_irep(mrb_state *mrb, const char *bin)
//Read File Header Section
if ((nirep = read_rite_header(mrb, src, &bin_header)) < 0)
return nirep;
-
- mrb_add_irep(mrb, sirep + nirep);
-
- for (n=0,i=sirep; n<nirep; n++,i++) {
- static const mrb_irep mrb_irep_zero = { 0 };
- if ((mrb->irep[i] = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep))) == NULL) {
- ret = MRB_DUMP_GENERAL_FAILURE;
- goto error_exit;
- }
- *mrb->irep[i] = mrb_irep_zero;
- }
src += sizeof(bin_header) + MRB_DUMP_SIZE_OF_SHORT; //header + crc
//Read Binary Data Section
for (n=0,i=sirep; n<nirep; n++,i++) {
src += MRB_DUMP_SIZE_OF_LONG; //record ren
- if ((ret = read_rite_irep_record(mrb, src, mrb->irep[i], &len)) != MRB_DUMP_OK)
+ if ((ret = read_rite_irep_record(mrb, src, &len)) != MRB_DUMP_OK)
goto error_exit;
- mrb->irep[mrb->irep_len++]->idx = i;
src += len;
}
if (0 != bin_to_uint32(src)) { //dummy record len
diff --git a/src/state.c b/src/state.c
index 106ab2aa3..c1ad4c6ad 100644
--- a/src/state.c
+++ b/src/state.c
@@ -109,20 +109,23 @@ mrb_close(mrb_state *mrb)
mrb_free(mrb, mrb);
}
-void
-mrb_add_irep(mrb_state *mrb, int idx)
+mrb_irep*
+mrb_add_irep(mrb_state *mrb)
{
+ static const mrb_irep mrb_irep_zero = { 0 };
+ mrb_irep *irep;
+
if (!mrb->irep) {
int max = 256;
- if (idx > max) max = idx+1;
+ if (mrb->irep_len > max) max = mrb->irep_len+1;
mrb->irep = (mrb_irep **)mrb_calloc(mrb, max, sizeof(mrb_irep*));
mrb->irep_capa = max;
}
- else if (mrb->irep_capa <= idx) {
+ else if (mrb->irep_capa <= mrb->irep_len) {
int i;
size_t old_capa = mrb->irep_capa;
- while (mrb->irep_capa <= idx) {
+ while (mrb->irep_capa <= mrb->irep_len) {
mrb->irep_capa *= 2;
}
mrb->irep = (mrb_irep **)mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep*)*mrb->irep_capa);
@@ -130,6 +133,12 @@ mrb_add_irep(mrb_state *mrb, int idx)
mrb->irep[i] = NULL;
}
}
+ irep = (mrb_irep *)mrb_malloc(mrb, sizeof(mrb_irep));
+ *irep = mrb_irep_zero;
+ mrb->irep[mrb->irep_len] = irep;
+ irep->idx = mrb->irep_len++;
+
+ return irep;
}
mrb_value