mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
First round of trying to improve the performance of attr_reader and attr_writer. From ~24sec to ~15sec
This commit is contained in:
+13
-29
@@ -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
|
||||
|
||||
+3
-3
@@ -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
|
||||
|
||||
+35
-10
@@ -548,6 +548,14 @@ obj_is_instance_of(mrb_state *mrb, mrb_value self)
|
||||
return mrb_bool_value(instance_of_p);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -555,9 +563,23 @@ check_iv_name(mrb_state *mrb, mrb_sym id)
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user