diff options
| author | Daniel Bovensiepen <[email protected]> | 2013-08-01 15:17:34 +0800 |
|---|---|---|
| committer | Daniel Bovensiepen <[email protected]> | 2013-08-01 15:17:34 +0800 |
| commit | 16a162ec45c8ad7827e4c771c35782a9bf9a320c (patch) | |
| tree | b37ecec53147d4bee632dfbad369650f6818e18d | |
| parent | 6f95cd36bbec2b5b6ed9439178c27b8196a21e4e (diff) | |
| parent | d16edc11ca9b4754a79f0fb4f481c3bd46077bac (diff) | |
| download | mruby-16a162ec45c8ad7827e4c771c35782a9bf9a320c.tar.gz mruby-16a162ec45c8ad7827e4c771c35782a9bf9a320c.zip | |
Merge remote-tracking branch 'upstream/master' into lang-doc
| -rw-r--r-- | build_config.rb | 12 | ||||
| -rw-r--r-- | doc/mrbgems/README.md | 2 | ||||
| -rw-r--r-- | include/mruby/compile.h | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-exit/mrbgem.rake | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-exit/src/mruby-exit.c | 24 | ||||
| -rw-r--r-- | mrbgems/mruby-object-ext/src/object.c | 6 | ||||
| -rw-r--r-- | src/class.c | 1 | ||||
| -rw-r--r-- | src/codegen.c | 1 | ||||
| -rw-r--r-- | src/parse.y | 12 | ||||
| -rw-r--r-- | src/vm.c | 2 | ||||
| -rw-r--r-- | test/assert.rb | 4 | ||||
| -rw-r--r-- | test/t/syntax.rb | 9 |
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; } @@ -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 |
