summaryrefslogtreecommitdiffhomepage
path: root/src/state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c19
1 files changed, 14 insertions, 5 deletions
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