diff options
| author | Ryan Scott <[email protected]> | 2013-07-18 07:54:16 +1000 |
|---|---|---|
| committer | Ryan Scott <[email protected]> | 2013-07-18 07:54:16 +1000 |
| commit | 75f8aab247abf58b61b3700c078d61ccf7e168bf (patch) | |
| tree | ec54bf94e01e56dec0c1702e4f003db79254a035 | |
| parent | 958d5b763df9cbfbf0173d35ba0ba27934f16394 (diff) | |
| download | mruby-75f8aab247abf58b61b3700c078d61ccf7e168bf.tar.gz mruby-75f8aab247abf58b61b3700c078d61ccf7e168bf.zip | |
First round of trying to improve the performance of attr_reader and attr_writer. From ~24sec to ~15sec
| -rw-r--r-- | benchmark/ao-render.rb | 42 | ||||
| -rw-r--r-- | mrblib/class.rb | 6 | ||||
| -rw-r--r-- | src/kernel.c | 45 |
3 files changed, 51 insertions, 42 deletions
diff --git a/benchmark/ao-render.rb b/benchmark/ao-render.rb index 793804a7b..e7406b26b 100644 --- a/benchmark/ao-render.rb +++ b/benchmark/ao-render.rb @@ -6,8 +6,8 @@ # mruby version by Hideki Miura # -IMAGE_WIDTH = 256 -IMAGE_HEIGHT = 256 +IMAGE_WIDTH = 64 +IMAGE_HEIGHT = 64 NSUBSAMPLES = 2 NAO_SAMPLES = 8 @@ -30,19 +30,14 @@ module Rand end class Vec + attr_accessor :x, :y, :z + def initialize(x, y, z) @x = x @y = y @z = z end - def x=(v); @x = v; end - def y=(v); @y = v; end - def z=(v); @z = v; end - def x; @x; end - def y; @y; end - def z; @z; end - def vadd(b) Vec.new(@x + b.x, @y + b.y, @z + b.z) end @@ -80,14 +75,13 @@ end class Sphere + attr_reader :center, :radius + def initialize(center, radius) @center = center @radius = radius end - def center; @center; end - def radius; @radius; end - def intersect(ray, isect) rs = ray.org.vsub(@center) b = rs.vdot(ray.dir) @@ -140,33 +134,23 @@ class Plane end class Ray + attr_accessor :org, :dir + def initialize(org, dir) @org = org @dir = dir end - - def org; @org; end - def org=(v); @org = v; end - def dir; @dir; end - def dir=(v); @dir = v; end end class Isect + attr_accessor :t, :hit, :pl, :n + def initialize @t = 10000000.0 @hit = false @pl = Vec.new(0.0, 0.0, 0.0) @n = Vec.new(0.0, 0.0, 0.0) end - - def t; @t; end - def t=(v); @t = v; end - def hit; @hit; end - def hit=(v); @hit = v; end - def pl; @pl; end - def pl=(v); @pl = v; end - def n; @n; end - def n=(v); @n = v; end end def clamp(f) @@ -298,9 +282,9 @@ class Scene r = rad.x / (nsf * nsf) g = rad.y / (nsf * nsf) b = rad.z / (nsf * nsf) - printf("%c", clamp(r)) - printf("%c", clamp(g)) - printf("%c", clamp(b)) + # printf("%c", clamp(r)) + # printf("%c", clamp(g)) + # printf("%c", clamp(b)) end end end diff --git a/mrblib/class.rb b/mrblib/class.rb index 4f268b6c8..d6ef34f17 100644 --- a/mrblib/class.rb +++ b/mrblib/class.rb @@ -2,15 +2,15 @@ class Module # 15.2.2.4.13 def attr_reader(*names) names.each{|name| - name2 = ('@'+name.to_s).intern + name2 = ('@'+name.to_s) define_method(name){self.instance_variable_get(name2)} } end # 15.2.2.4.14 def attr_writer(*names) names.each{|name| - name2 = ('@'+name.to_s).intern - name = (name.to_s+"=").intern + name2 = ('@'+name.to_s) + name = (name.to_s+"=") define_method(name){|v|self.instance_variable_set(name2,v)} } end diff --git a/src/kernel.c b/src/kernel.c index ae8d24710..068b80f62 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -549,15 +549,37 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self) } static void +valid_iv_name(mrb_state *mrb, mrb_sym id, const char* s, size_t len) +{ + if (len < 2 || !(s[0] == '@' && s[1] != '@')) { + mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + } +} + +static void check_iv_name(mrb_state *mrb, mrb_sym id) { const char *s; size_t len; s = mrb_sym2name_len(mrb, id, &len); - if (len < 2 || !(s[0] == '@' && s[1] != '@')) { - mrb_name_error(mrb, id, "`%S' is not allowed as an instance variable name", mrb_sym2str(mrb, id)); + valid_iv_name(mrb, id, s, len); +} + +static mrb_sym +get_valid_iv_sym(mrb_state *mrb, mrb_value val) +{ + mrb_sym id; + + if (mrb_string_p(val)) { + id = mrb_intern_cstr(mrb, RSTRING_PTR(val)); + valid_iv_name(mrb, id, RSTRING_PTR(val), RSTRING_LEN(val)); + } else if(mrb_symbol_p(val)) { + id = mrb_symbol(val); + check_iv_name(mrb, id); } + + return id; } /* 15.3.1.3.20 */ @@ -582,10 +604,11 @@ mrb_value mrb_obj_ivar_defined(mrb_state *mrb, mrb_value self) { mrb_sym mid; + mrb_value sym; mrb_bool defined_p; - mrb_get_args(mrb, "n", &mid); - check_iv_name(mrb, mid); + mrb_get_args(mrb, "o", &sym); + mid = get_valid_iv_sym(mrb, sym); defined_p = mrb_obj_iv_defined(mrb, mrb_obj_ptr(self), mid); return mrb_bool_value(defined_p); @@ -615,10 +638,11 @@ mrb_value mrb_obj_ivar_get(mrb_state *mrb, mrb_value self) { mrb_sym id; + mrb_value sym; + + mrb_get_args(mrb, "o", &sym); - mrb_get_args(mrb, "n", &id); - - check_iv_name(mrb, id); + id = get_valid_iv_sym(mrb, sym); return mrb_iv_get(mrb, self, id); } @@ -646,10 +670,11 @@ mrb_value mrb_obj_ivar_set(mrb_state *mrb, mrb_value self) { mrb_sym id; - mrb_value val; + mrb_value sym, val; - mrb_get_args(mrb, "no", &id, &val); - check_iv_name(mrb, id); + mrb_get_args(mrb, "oo", &sym, &val); + + id = get_valid_iv_sym(mrb, sym); mrb_iv_set(mrb, self, id, val); return val; } |
