summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/codegen.c44
-rw-r--r--src/gc.c3
-rw-r--r--src/load.c4
-rw-r--r--src/parse.y15
-rw-r--r--src/vm.c10
5 files changed, 40 insertions, 36 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 578fb96ac..548d8d8f8 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -9,7 +9,7 @@
#include <string.h>
#include "mruby.h"
#include "mruby/compile.h"
-#include "mruby/irep.h"
+#include "mruby/proc.h"
#include "mruby/numeric.h"
#include "mruby/string.h"
#include "mruby/debug.h"
@@ -67,8 +67,6 @@ typedef struct scope {
int nregs;
int ai;
- int idx;
-
int debug_start_pos;
uint16_t filename_index;
parser_state* parser;
@@ -500,7 +498,7 @@ static void
for_body(codegen_scope *s, node *tree)
{
codegen_scope *prev = s;
- int idx, base = s->idx;
+ int idx, base = s->irep->idx;
struct loopinfo *lp;
node *n2;
mrb_code c;
@@ -509,7 +507,7 @@ for_body(codegen_scope *s, node *tree)
codegen(s, tree->cdr->car, VAL);
// generate loop-block
s = scope_new(s->mrb, s, tree->car);
- idx = s->idx;
+ idx = s->irep->idx;
lp = loop_push(s, LOOP_FOR);
lp->pc1 = new_label(s);
@@ -543,11 +541,11 @@ for_body(codegen_scope *s, node *tree)
static int
lambda_body(codegen_scope *s, node *tree, int blk)
{
- int idx, base = s->idx;
+ int idx, base = s->irep->idx;
mrb_code c;
s = scope_new(s->mrb, s, tree->car);
- idx = s->idx;
+ idx = s->irep->idx;
s->mscope = !blk;
if (blk) {
@@ -634,7 +632,7 @@ static int
scope_body(codegen_scope *s, node *tree)
{
codegen_scope *scope = scope_new(s->mrb, s, tree->car);
- int idx = scope->idx;
+ int idx = scope->irep->idx;
codegen(scope, tree->cdr, VAL);
if (!s->iseq) {
@@ -652,8 +650,9 @@ scope_body(codegen_scope *s, node *tree)
}
}
scope_finish(scope);
-
- return idx - s->idx;
+ if (s->irep)
+ return idx - s->irep->idx;
+ return 0;
}
static mrb_bool
@@ -2361,7 +2360,6 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p->mscope = 0;
p->irep = mrb_add_irep(mrb);
- p->idx = p->irep->idx;
p->icapa = 1024;
p->iseq = (mrb_code*)mrb_malloc(mrb, sizeof(mrb_code)*p->icapa);
@@ -2509,16 +2507,15 @@ loop_pop(codegen_scope *s, int val)
}
static void
-codedump(mrb_state *mrb, int n)
+codedump(mrb_state *mrb, mrb_irep *irep)
{
#ifdef ENABLE_STDIO
- mrb_irep *irep = mrb->irep[n];
uint32_t i;
int ai;
mrb_code c;
if (!irep) return;
- printf("irep %d nregs=%d nlocals=%d pools=%d syms=%d\n", n,
+ printf("irep %d nregs=%d nlocals=%d pools=%d syms=%d\n", irep->idx,
irep->nregs, irep->nlocals, (int)irep->plen, (int)irep->slen);
for (i=0; i<irep->ilen; i++) {
ai = mrb_gc_arena_save(mrb);
@@ -2787,7 +2784,7 @@ codedump(mrb_state *mrb, int n)
mrb_sym2name(mrb, irep->syms[GETARG_B(c)]));
break;
case OP_EXEC:
- printf("OP_EXEC\tR%d\tI(%d)\n", GETARG_A(c), n+GETARG_Bx(c));
+ printf("OP_EXEC\tR%d\tI(%d)\n", GETARG_A(c), irep->idx+GETARG_Bx(c));
break;
case OP_SCLASS:
printf("OP_SCLASS\tR%d\tR%d\n", GETARG_A(c), GETARG_B(c));
@@ -2799,7 +2796,7 @@ codedump(mrb_state *mrb, int n)
printf("OP_ERR\tL(%d)\n", GETARG_Bx(c));
break;
case OP_EPUSH:
- printf("OP_EPUSH\t:I(%d)\n", n+GETARG_Bx(c));
+ printf("OP_EPUSH\t:I(%d)\n", irep->idx+GETARG_Bx(c));
break;
case OP_ONERR:
printf("OP_ONERR\t%03d\n", i+GETARG_sBx(c));
@@ -2829,14 +2826,16 @@ codedump(mrb_state *mrb, int n)
}
void
-codedump_all(mrb_state *mrb, int start)
+codedump_all(mrb_state *mrb, struct RProc *proc)
{
size_t i;
+ mrb_irep *irep = proc->body.irep;
- for (i=start; i<mrb->irep_len; i++) {
- codedump(mrb, i);
+ for (i=irep->idx; i<mrb->irep_len; i++) {
+ codedump(mrb, mrb->irep[i]);
}
}
+
static int
codegen_start(mrb_state *mrb, parser_state *p)
{
@@ -2860,14 +2859,13 @@ codegen_start(mrb_state *mrb, parser_state *p)
}
}
-int
+struct RProc*
mrb_generate_code(mrb_state *mrb, parser_state *p)
{
int start = mrb->irep_len;
int n;
n = codegen_start(mrb, p);
- if (n < 0) return n;
-
- return start;
+ if (n < 0) return NULL;
+ return mrb_proc_new(mrb, mrb->irep[start]);
}
diff --git a/src/gc.c b/src/gc.c
index 361024af3..ccd925da8 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -619,7 +619,8 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
{
struct mrb_context *c = ((struct RFiber*)obj)->cxt;
- mrb_free_context(mrb, c);
+ if (c != mrb->root_c)
+ mrb_free_context(mrb, c);
}
break;
diff --git a/src/load.c b/src/load.c
index e2f74d504..d6397d652 100644
--- a/src/load.c
+++ b/src/load.c
@@ -510,7 +510,7 @@ mrb_load_irep(mrb_state *mrb, const uint8_t *bin)
irep_error(mrb, n);
return mrb_nil_value();
}
- return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
+ return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0);
}
#ifdef ENABLE_STDIO
@@ -760,6 +760,6 @@ mrb_load_irep_file(mrb_state *mrb, FILE* fp)
irep_error(mrb, n);
return mrb_nil_value();
}
- return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
+ return mrb_context_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb), 0);
}
#endif /* ENABLE_STDIO */
diff --git a/src/parse.y b/src/parse.y
index c382c633c..b60316cee 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -5161,7 +5161,7 @@ parser_update_cxt(parser_state *p, mrbc_context *cxt)
}
}
-void codedump_all(mrb_state*, int);
+void codedump_all(mrb_state*, struct RProc*);
void parser_dump(mrb_state *mrb, node *tree, int offset);
void
@@ -5352,7 +5352,6 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
{
struct RClass *target = mrb->object_class;
struct RProc *proc;
- int n;
mrb_value v;
if (!p) {
@@ -5361,6 +5360,7 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
if (!p->tree || p->nerr) {
if (p->capture_errors) {
char buf[256];
+ int n;
n = snprintf(buf, sizeof(buf), "line %d: %s\n",
p->error_buffer[0].lineno, p->error_buffer[0].message);
@@ -5375,26 +5375,25 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
return mrb_undef_value();
}
}
- n = mrb_generate_code(mrb, p);
+ proc = mrb_generate_code(mrb, p);
mrb_parser_free(p);
- if (n < 0) {
+ if (proc == NULL) {
static const char msg[] = "codegen error";
mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1));
return mrb_nil_value();
}
if (c) {
- if (c->dump_result) codedump_all(mrb, n);
- if (c->no_exec) return mrb_fixnum_value(n);
+ if (c->dump_result) codedump_all(mrb, proc);
+ if (c->no_exec) return mrb_fixnum_value(0);
if (c->target_class) {
target = c->target_class;
}
}
- proc = mrb_proc_new(mrb, mrb->irep[n]);
proc->target_class = target;
if (mrb->c->ci) {
mrb->c->ci->target_class = target;
}
- v = mrb_run(mrb, proc, mrb_top_self(mrb));
+ v = mrb_context_run(mrb, proc, mrb_top_self(mrb), 0);
if (mrb->exc) return mrb_nil_value();
return v;
}
diff --git a/src/vm.c b/src/vm.c
index 1099db8a1..d35ab59f2 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -547,7 +547,7 @@ void mrb_gv_val_set(mrb_state *mrb, mrb_sym sym, mrb_value val);
#define CALL_MAXARGS 127
mrb_value
-mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
+mrb_context_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep)
{
/* mrb_assert(mrb_proc_cfunc_p(proc)) */
mrb_irep *irep = proc->body.irep;
@@ -595,7 +595,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
if (!mrb->c->stack) {
stack_init(mrb);
}
- stack_extend(mrb, irep->nregs, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
+ stack_extend(mrb, irep->nregs, stack_keep);
mrb->c->ci->err = pc;
mrb->c->ci->proc = proc;
mrb->c->ci->nregs = irep->nregs + 1;
@@ -2145,6 +2145,12 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
END_DISPATCH;
}
+mrb_value
+mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
+{
+ return mrb_context_run(mrb, proc, self, mrb->c->ci->argc + 2); /* argc + 2 (receiver and block) */
+}
+
void
mrb_longjmp(mrb_state *mrb)
{