summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--benchmark/ao-render.rb42
-rw-r--r--mrblib/class.rb6
-rw-r--r--src/kernel.c45
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;
}