diff options
| author | Masaki Muranaka <[email protected]> | 2013-03-18 22:11:43 +0900 |
|---|---|---|
| committer | Masaki Muranaka <[email protected]> | 2013-03-18 23:29:11 +0900 |
| commit | 1272d5fe0c803d06ff2eb62a65bab817b1fb2f6d (patch) | |
| tree | c21d3e0e585c754d566188bed47721830e0db27e /src/vm.c | |
| parent | 4a17b3d908543fe97365904a3549be7478d7cf2f (diff) | |
| download | mruby-1272d5fe0c803d06ff2eb62a65bab817b1fb2f6d.tar.gz mruby-1272d5fe0c803d06ff2eb62a65bab817b1fb2f6d.zip | |
Extract uvget/uvset to OP_GETUPVAR/OP_SETUPVAR. This is for speed tuning.
Diffstat (limited to 'src/vm.c')
| -rw-r--r-- | src/vm.c | 43 |
1 files changed, 22 insertions, 21 deletions
@@ -182,25 +182,6 @@ uvenv(mrb_state *mrb, int up) return e; } -static mrb_value -uvget(mrb_state *mrb, int up, int idx) -{ - struct REnv *e = uvenv(mrb, up); - - if (!e) return mrb_nil_value(); - return e->stack[idx]; -} - -static void -uvset(mrb_state *mrb, int up, int idx, mrb_value v) -{ - struct REnv *e = uvenv(mrb, up); - - if (!e) return; - e->stack[idx] = v; - mrb_write_barrier(mrb, (struct RBasic*)e); -} - static inline int is_strict(mrb_state *mrb, struct REnv *e) { @@ -730,14 +711,34 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) CASE(OP_GETUPVAR) { /* A B C R(A) := uvget(B,C) */ + mrb_value *regs_a = regs + GETARG_A(i); + int up = GETARG_C(i); - regs[GETARG_A(i)] = uvget(mrb, GETARG_C(i), GETARG_B(i)); + struct REnv *e = uvenv(mrb, up); + + if (!e) { + *regs_a = mrb_nil_value(); + } + else { + int idx = GETARG_B(i); + *regs_a = e->stack[idx]; + } NEXT; } CASE(OP_SETUPVAR) { /* A B C uvset(B,C,R(A)) */ - uvset(mrb, GETARG_C(i), GETARG_B(i), regs[GETARG_A(i)]); + /* A B C R(A) := uvget(B,C) */ + int up = GETARG_C(i); + + struct REnv *e = uvenv(mrb, up); + + if (e) { + mrb_value *regs_a = regs + GETARG_A(i); + int idx = GETARG_B(i); + e->stack[idx] = *regs_a; + mrb_write_barrier(mrb, (struct RBasic*)e); + } NEXT; } |
