diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | Rakefile | 21 | ||||
| -rw-r--r-- | include/mruby/variable.h | 2 | ||||
| -rwxr-xr-x | minirake | 4 | ||||
| -rw-r--r-- | src/class.c | 40 | ||||
| -rw-r--r-- | src/variable.c | 24 | ||||
| -rw-r--r-- | test/t/module.rb | 8 |
7 files changed, 81 insertions, 20 deletions
@@ -2,7 +2,7 @@ # We provide a minimalistic version called minirake inside of our # codebase. -RAKE = ./minirake +RAKE = ruby ./minirake .PHONY : all all : @@ -2,9 +2,9 @@ # basic build file for mruby # compiler, linker (gcc), archiver, parser generator -CC = ENV['CC'] || 'gcc' -LL = ENV['LL'] || 'gcc' -AR = ENV['AR'] || 'ar' +CC = ENV['CC'] || 'gcc' +LL = ENV['LL'] || 'gcc' +AR = ENV['AR'] || 'ar' YACC = ENV['YACC'] || 'bison' MAKE = ENV['MAKE'] || 'make' @@ -12,13 +12,13 @@ MAKE = ENV['MAKE'] || 'make' MRUBY_ROOT = ENV['MRUBY_ROOT'] || File.expand_path(File.dirname(__FILE__)) # by default GEMs are deactivated -ENABLE_GEMS = false +ENABLE_GEMS = ENV['ENABLE_GEMS'] == 'true' # the default file which contains the active GEMs -ACTIVE_GEMS = File.join(File.dirname(__FILE__), 'mrbgems', 'GEMS.active') +ACTIVE_GEMS = ENV['ACTIVE_GEMS'] || File.join(MRUBY_ROOT, '/mrbgems/GEMS.active') # default compile option -COMPILE_MODE = :debug +COMPILE_MODE = ENV['COMPILE_MODE'] || :debug ############################## @@ -34,13 +34,12 @@ else # including 'debug' CFLAGS = if e then [e] else ['-g', '-O3'] end end LDFLAGS = [ENV['LDFLAGS']] -LIBS = [ENV['LIBS'] || '-lm'] +LIBS = [ENV['LIBS'] || '-lm'] -if !ENABLE_GEMS - CFLAGS << "-DDISABLE_GEMS" -end +CFLAGS << "-DDISABLE_GEMS" unless ENABLE_GEMS CFLAGS << "-Wall" << "-Werror-implicit-function-declaration" << "-I#{MRUBY_ROOT}/include" + if ENV['OS'] == 'Windows_NT' MAKE_FLAGS = "--no-print-directory CC=#{CC} LL=#{LL} AR=#{AR} YACC=#{YACC} CFLAGS=\"#{CFLAGS.join(' ')}\" LDFLAGS=\"#{LDFLAGS.join(' ')}\" LIBS=\"#{LIBS.join(' ')}\" ENABLE_GEMS=\"#{ENABLE_GEMS}\" MRUBY_ROOT=\"#{MRUBY_ROOT}\"" else @@ -48,7 +47,6 @@ else end - ############################## # internal variables @@ -59,6 +57,7 @@ CAT = ENV['CAT'] ||= 'cat' ############################## # generic build targets, rules + if ENABLE_GEMS require './mrbgems/build_tasks' end diff --git a/include/mruby/variable.h b/include/mruby/variable.h index 7189ef690..8754e8a90 100644 --- a/include/mruby/variable.h +++ b/include/mruby/variable.h @@ -55,6 +55,8 @@ mrb_value mrb_obj_instance_variables(mrb_state*, mrb_value); mrb_value mrb_obj_iv_inspect(mrb_state*, struct RObject*); mrb_sym mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer); mrb_value mrb_mod_class_variables(mrb_state*, mrb_value); +mrb_value mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym); +mrb_value mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym); /* GC functions */ void mrb_gc_mark_gv(mrb_state*); @@ -389,7 +389,6 @@ class RakeApp if $show_tasks display_tasks else - ARGV.push("default") if ARGV.size == 0 p ARGV tasks = [] ARGV.each do |task_name| @@ -399,6 +398,7 @@ class RakeApp tasks << task_name end end + tasks.push("default") if tasks.size == 0 tasks.each do |task_name| MiniRake::Task[task_name].invoke end @@ -412,7 +412,7 @@ class RakeApp puts ex.backtrace.find {|str| str =~ /#{@rakefile}/ } || "" end exit 1 - end + end end end diff --git a/src/class.c b/src/class.c index 339920b6e..19a697bc8 100644 --- a/src/class.c +++ b/src/class.c @@ -1445,6 +1445,45 @@ mrb_sym_value(mrb_state *mrb, mrb_value val) } static void +check_cv_name(mrb_state *mrb, mrb_sym id) +{ + const char *s; + int len; + + s = mrb_sym2name_len(mrb, id, &len); + if (len < 3 || !(s[0] == '@' && s[1] == '@')) { + mrb_name_error(mrb, id, "`%s' is not allowed as a class variable name", s); + } +} + +/* 15.2.2.4.17 */ +/* + * call-seq: + * mod.class_variable_get(symbol) -> obj + * + * Returns the value of the given class variable (or throws a + * <code>NameError</code> exception). The <code>@@</code> part of the + * variable name should be included for regular class variables + * + * class Fred + * @@foo = 99 + * end + * Fred.class_variable_get(:@@foo) #=> 99 + */ + +static mrb_value +mrb_mod_cvar_get(mrb_state *mrb, mrb_value mod) +{ + mrb_value sym; + mrb_sym id; + mrb_get_args(mrb, "o", &sym); + + id = mrb_sym_value(mrb,sym); + check_cv_name(mrb, id); + return mrb_cv_get(mrb, mod, id); +} + +static void check_const_name(mrb_state *mrb, mrb_sym id) { const char *s; @@ -1545,6 +1584,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, cls, "superclass", mrb_class_superclass, ARGS_NONE()); /* 15.2.3.3.4 */ mrb_define_method(mrb, cls, "new", mrb_instance_new, ARGS_ANY()); /* 15.2.3.3.3 */ mrb_define_method(mrb, cls, "inherited", mrb_bob_init, ARGS_REQ(1)); + mrb_define_method(mrb, mod, "class_variable_get", mrb_mod_cvar_get, ARGS_REQ(1)); /* 15.2.2.4.17 */ mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */ mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */ mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */ diff --git a/src/variable.c b/src/variable.c index 992663408..147373bd4 100644 --- a/src/variable.c +++ b/src/variable.c @@ -673,26 +673,38 @@ mrb_mod_class_variables(mrb_state *mrb, mrb_value mod) return ary; } - mrb_value -mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) +mrb_mod_cv_get(mrb_state *mrb, struct RClass * c, mrb_sym sym) { - struct RClass *c = mrb->ci->proc->target_class; - - if (!c) c = mrb->ci->target_class; while (c) { if (c->iv) { iv_tbl *t = c->iv; mrb_value v; if (iv_get(mrb, t, sym, &v)) - return v; + return v; } c = c->super; } return mrb_nil_value(); } +mrb_value +mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym) +{ + return mrb_mod_cv_get(mrb, mrb_class_ptr(mod), sym); +} + +mrb_value +mrb_vm_cv_get(mrb_state *mrb, mrb_sym sym) +{ + struct RClass *c = mrb->ci->proc->target_class; + + if (!c) c = mrb->ci->target_class; + + return mrb_mod_cv_get(mrb, c, sym); +} + void mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v) { diff --git a/test/t/module.rb b/test/t/module.rb index 5e825c6b5..fbc93eb08 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -46,6 +46,14 @@ assert('Module#class_eval', '15.2.2.4.15') do r.class == Array and r.include?(:method1) end +assert('Module#class_variable_get', '15.2.2.4.17') do + class Test4ClassVariableGet + @@cv = 99 + end + + Test4ClassVariableGet.class_variable_get(:@@cv) == 99 +end + assert('Module#class_variables', '15.2.2.4.19') do class Test4ClassVariables1 |
