summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorMasaki Muranaka <[email protected]>2013-03-18 22:11:43 +0900
committerMasaki Muranaka <[email protected]>2013-03-18 23:29:11 +0900
commit1272d5fe0c803d06ff2eb62a65bab817b1fb2f6d (patch)
treec21d3e0e585c754d566188bed47721830e0db27e /src/vm.c
parent4a17b3d908543fe97365904a3549be7478d7cf2f (diff)
downloadmruby-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.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/src/vm.c b/src/vm.c
index 640228371..42fdedf80 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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;
}