summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDaniel Bovensiepen <[email protected]>2013-08-01 15:17:34 +0800
committerDaniel Bovensiepen <[email protected]>2013-08-01 15:17:34 +0800
commit16a162ec45c8ad7827e4c771c35782a9bf9a320c (patch)
treeb37ecec53147d4bee632dfbad369650f6818e18d
parent6f95cd36bbec2b5b6ed9439178c27b8196a21e4e (diff)
parentd16edc11ca9b4754a79f0fb4f481c3bd46077bac (diff)
downloadmruby-16a162ec45c8ad7827e4c771c35782a9bf9a320c.tar.gz
mruby-16a162ec45c8ad7827e4c771c35782a9bf9a320c.zip
Merge remote-tracking branch 'upstream/master' into lang-doc
-rw-r--r--build_config.rb12
-rw-r--r--doc/mrbgems/README.md2
-rw-r--r--include/mruby/compile.h1
-rw-r--r--mrbgems/mruby-exit/mrbgem.rake4
-rw-r--r--mrbgems/mruby-exit/src/mruby-exit.c24
-rw-r--r--mrbgems/mruby-object-ext/src/object.c6
-rw-r--r--src/class.c1
-rw-r--r--src/codegen.c1
-rw-r--r--src/parse.y12
-rw-r--r--src/vm.c2
-rw-r--r--test/assert.rb4
-rw-r--r--test/t/syntax.rb9
12 files changed, 62 insertions, 16 deletions
diff --git a/build_config.rb b/build_config.rb
index 8367f4ca5..fce424686 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -42,25 +42,25 @@ MRuby::Build.new do |conf|
# linker.option_library_path = '-L%s'
# linker.link_options = "%{flags} -o %{outfile} %{objs} %{libs}"
# end
-
+
# Archiver settings
# conf.archiver do |archiver|
# archiver.command = ENV['AR'] || 'ar'
# archiver.archive_options = 'rs %{outfile} %{objs}'
# end
-
+
# Parser generator settings
# conf.yacc do |yacc|
# yacc.command = ENV['YACC'] || 'bison'
# yacc.compile_options = '-o %{outfile} %{infile}'
# end
-
+
# gperf settings
# conf.gperf do |gperf|
# gperf.command = 'gperf'
# gperf.compile_options = '-L ANSI-C -C -p -j1 -i 1 -g -o -t -N mrb_reserved_word -k"1,3,$" %{infile} > %{outfile}'
# end
-
+
# file extensions
# conf.exts do |exts|
# exts.object = '.o'
@@ -75,12 +75,12 @@ end
# Define cross build settings
# MRuby::CrossBuild.new('32bit') do |conf|
# toolchain :gcc
-#
+#
# conf.cc.flags << "-m32"
# conf.linker.flags << "-m32"
#
# conf.build_mrbtest_lib_only
-#
+#
# conf.gem 'examples/mrbgems/c_and_ruby_extension_example'
#
# conf.test_runner.command = 'env'
diff --git a/doc/mrbgems/README.md b/doc/mrbgems/README.md
index 881fbb228..65b794dc0 100644
--- a/doc/mrbgems/README.md
+++ b/doc/mrbgems/README.md
@@ -156,7 +156,7 @@ the following options additionally inside of your GEM specification:
mruby can be extended with C. This is possible by using the C API to
integrate C libraries into mruby.
-### Pre-Conditions
+### Preconditions
mrbgems expects that you have implemented a C method called
`mrb_YOURGEMNAME_gem_init(mrb_state)`. `YOURGEMNAME` will be replaced
diff --git a/include/mruby/compile.h b/include/mruby/compile.h
index c1c646508..7c5884e58 100644
--- a/include/mruby/compile.h
+++ b/include/mruby/compile.h
@@ -23,6 +23,7 @@ typedef struct mrbc_context {
short lineno;
int (*partial_hook)(struct mrb_parser_state*);
void *partial_data;
+ struct RClass *target_class;
mrb_bool capture_errors:1;
mrb_bool dump_result:1;
mrb_bool no_exec:1;
diff --git a/mrbgems/mruby-exit/mrbgem.rake b/mrbgems/mruby-exit/mrbgem.rake
new file mode 100644
index 000000000..910b3b4f9
--- /dev/null
+++ b/mrbgems/mruby-exit/mrbgem.rake
@@ -0,0 +1,4 @@
+MRuby::Gem::Specification.new('mruby-exit') do |spec|
+ spec.license = 'MIT'
+ spec.author = 'mruby developers'
+end
diff --git a/mrbgems/mruby-exit/src/mruby-exit.c b/mrbgems/mruby-exit/src/mruby-exit.c
new file mode 100644
index 000000000..d81657592
--- /dev/null
+++ b/mrbgems/mruby-exit/src/mruby-exit.c
@@ -0,0 +1,24 @@
+#include <stdlib.h>
+#include "mruby.h"
+
+static mrb_value
+f_exit(mrb_state *mrb, mrb_value self)
+{
+ mrb_int i = EXIT_SUCCESS;
+
+ mrb_get_args(mrb, "|i", &i);
+ exit(i);
+ /* not reached */
+ return mrb_nil_value();
+}
+
+void
+mrb_mruby_exit_gem_init(mrb_state* mrb)
+{
+ mrb_define_method(mrb, mrb->kernel_module, "exit", f_exit, MRB_ARGS_REQ(1));
+}
+
+void
+mrb_mruby_exit_gem_final(mrb_state* mrb)
+{
+}
diff --git a/mrbgems/mruby-object-ext/src/object.c b/mrbgems/mruby-object-ext/src/object.c
index 598ebe91d..927a23d66 100644
--- a/mrbgems/mruby-object-ext/src/object.c
+++ b/mrbgems/mruby-object-ext/src/object.c
@@ -59,7 +59,7 @@ nil_to_i(mrb_state *mrb, mrb_value obj)
* k.instance_exec(5) {|x| @secret+x } #=> 104
*/
-mrb_value
+mrb_value
mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c);
static mrb_value
@@ -69,7 +69,7 @@ mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
int argc;
mrb_value blk;
struct RClass *c;
-
+
mrb_get_args(mrb, "*&", &argv, &argc, &blk);
if (mrb_nil_p(blk)) {
@@ -80,7 +80,7 @@ mrb_obj_instance_exec(mrb_state *mrb, mrb_value self)
case MRB_TT_SYMBOL:
case MRB_TT_FIXNUM:
case MRB_TT_FLOAT:
- c = 0;
+ c = NULL;
break;
default:
c = mrb_class_ptr(mrb_singleton_class(mrb, self));
diff --git a/src/class.c b/src/class.c
index d67a4af3e..4994b0045 100644
--- a/src/class.c
+++ b/src/class.c
@@ -311,7 +311,6 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f
int ai = mrb_gc_arena_save(mrb);
p = mrb_proc_new_cfunc(mrb, func);
- p->target_class = c;
mrb_define_method_raw(mrb, c, mid, p);
mrb_gc_arena_restore(mrb, ai);
}
diff --git a/src/codegen.c b/src/codegen.c
index 5681ce03a..34ccd616f 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -1551,7 +1551,6 @@ codegen(codegen_scope *s, node *tree, int val)
// variable rhs
codegen(s, t, VAL);
gen_vmassignment(s, tree->car, rhs, val);
- if (!val) pop();
}
}
break;
diff --git a/src/parse.y b/src/parse.y
index 9a83d5cbd..4fa9e70de 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -5210,6 +5210,8 @@ mrb_parse_string(mrb_state *mrb, const char *s, mrbc_context *c)
static mrb_value
load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
{
+ struct RClass *target = mrb->object_class;
+ struct RProc *proc;
int n;
mrb_value v;
@@ -5243,8 +5245,16 @@ load_exec(mrb_state *mrb, parser_state *p, mrbc_context *c)
if (c) {
if (c->dump_result) codedump_all(mrb, n);
if (c->no_exec) return mrb_fixnum_value(n);
+ if (c->target_class) {
+ target = c->target_class;
+ }
+ }
+ proc = mrb_proc_new(mrb, mrb->irep[n]);
+ proc->target_class = target;
+ if (mrb->c->ci) {
+ mrb->c->ci->target_class = target;
}
- v = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
+ v = mrb_run(mrb, proc, mrb_top_self(mrb));
if (mrb->exc) return mrb_nil_value();
return v;
}
diff --git a/src/vm.c b/src/vm.c
index 3cdf57551..4d99ad413 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -386,9 +386,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr
if (MRB_PROC_CFUNC_P(p)) {
int ai = mrb_gc_arena_save(mrb);
val = p->body.func(mrb, self);
- mrb_gc_arena_restore(mrb, ai);
mrb->c->stack = mrb->c->stbase + mrb->c->ci->stackidx;
cipop(mrb);
+ mrb_gc_arena_restore(mrb, ai);
}
else {
val = mrb_run(mrb, p, self);
diff --git a/test/assert.rb b/test/assert.rb
index 98057331b..3d35fc267 100644
--- a/test/assert.rb
+++ b/test/assert.rb
@@ -101,7 +101,7 @@ end
def assert_equal(arg1, arg2 = nil, arg3 = nil)
if block_given?
- exp, act, msg = yield, arg1, arg2
+ exp, act, msg = arg1, yield, arg2
else
exp, act, msg = arg1, arg2, arg3
end
@@ -113,7 +113,7 @@ end
def assert_not_equal(arg1, arg2 = nil, arg3 = nil)
if block_given?
- exp, act, msg = yield, arg1, arg2
+ exp, act, msg = arg1, yield, arg2
else
exp, act, msg = arg1, arg2, arg3
end
diff --git a/test/t/syntax.rb b/test/t/syntax.rb
index 332cfcca8..b975d0103 100644
--- a/test/t/syntax.rb
+++ b/test/t/syntax.rb
@@ -65,3 +65,12 @@ assert('Abbreviated variable assignment as returns') do
end
assert_equal Syntax4AbbrVarAsgnAsReturns::A.new.b, 1
end
+
+assert('Splat and mass assignment') do
+ *a = *[1,2,3]
+ b, *c = *[7,8,9]
+
+ assert_equal [1,2,3], a
+ assert_equal 7, b
+ assert_equal [8,9], c
+end