summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--Rakefile21
-rw-r--r--include/mruby/variable.h2
-rwxr-xr-xminirake4
-rw-r--r--src/class.c40
-rw-r--r--src/variable.c24
-rw-r--r--test/t/module.rb8
7 files changed, 81 insertions, 20 deletions
diff --git a/Makefile b/Makefile
index 16e0b50b8..0a2afe2d1 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
# We provide a minimalistic version called minirake inside of our
# codebase.
-RAKE = ./minirake
+RAKE = ruby ./minirake
.PHONY : all
all :
diff --git a/Rakefile b/Rakefile
index a1c2e9441..aec259e06 100644
--- a/Rakefile
+++ b/Rakefile
@@ -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*);
diff --git a/minirake b/minirake
index 49772168c..d01ee0d78 100755
--- a/minirake
+++ b/minirake
@@ -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