From 0e00d8e224956a609c75c73acae0b5104606a49e Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 16 Apr 2023 21:44:00 +0900 Subject: [PATCH] Integrate `mruby-binding-eval` into `mruby-eval` Currently mruby-eval depends on mruby-binding (formerly mruby-binding-core). Also, `Kernel#eval` can accept `binding` objects. With this in mind, it would be better if `Binding#eval` could also be handled by `mrbgems/mruby-eval`. --- build_config/dreamcast_shelf.rb | 1 - mrbgems/mruby-binding-eval/mrbgem.rake | 11 ----- mrbgems/mruby-binding-eval/src/binding.c | 40 ------------------- mrbgems/mruby-eval/mrbgem.rake | 2 + mrbgems/mruby-eval/src/eval.c | 25 ++++++++++-- .../test/binding.rb | 0 mrbgems/mruby-proc-binding/mrbgem.rake | 2 +- 7 files changed, 25 insertions(+), 56 deletions(-) delete mode 100644 mrbgems/mruby-binding-eval/mrbgem.rake delete mode 100644 mrbgems/mruby-binding-eval/src/binding.c rename mrbgems/{mruby-binding-eval => mruby-eval}/test/binding.rb (100%) diff --git a/build_config/dreamcast_shelf.rb b/build_config/dreamcast_shelf.rb index c723d6f0c..53adad2a2 100644 --- a/build_config/dreamcast_shelf.rb +++ b/build_config/dreamcast_shelf.rb @@ -73,7 +73,6 @@ MRuby::CrossBuild.new("dreamcast") do |conf| # Some Gems are incompatible and were disabled. conf.gem :core => "mruby-array-ext" - conf.gem :core => "mruby-binding-eval" conf.gem :core => "mruby-catch" conf.gem :core => "mruby-class-ext" conf.gem :core => "mruby-cmath" diff --git a/mrbgems/mruby-binding-eval/mrbgem.rake b/mrbgems/mruby-binding-eval/mrbgem.rake deleted file mode 100644 index 54c28af4c..000000000 --- a/mrbgems/mruby-binding-eval/mrbgem.rake +++ /dev/null @@ -1,11 +0,0 @@ -MRuby::Gem::Specification.new('mruby-binding-eval') do |spec| - spec.license = 'MIT' - spec.author = 'mruby developers' - spec.summary = 'Binding class' - - spec.add_dependency('mruby-binding', :core => 'mruby-binding') - spec.add_dependency('mruby-eval', :core => 'mruby-eval') - spec.add_test_dependency('mruby-metaprog', :core => 'mruby-metaprog') - spec.add_test_dependency('mruby-method', :core => 'mruby-method') - spec.add_test_dependency('mruby-proc-ext', :core => 'mruby-proc-ext') -end diff --git a/mrbgems/mruby-binding-eval/src/binding.c b/mrbgems/mruby-binding-eval/src/binding.c deleted file mode 100644 index bd5674973..000000000 --- a/mrbgems/mruby-binding-eval/src/binding.c +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* provided by mruby-eval */ -mrb_value mrb_f_eval(mrb_state *mrb, mrb_value self); - -static mrb_value -mrb_binding_eval(mrb_state *mrb, mrb_value binding) -{ - mrb_callinfo *ci = mrb->c->ci; - int argc = ci->n; - mrb_value *argv = ci->stack + 1; - - if (argc < 15) { - argv[0] = mrb_ary_new_from_values(mrb, argc, argv); - argv[1] = argv[argc]; /* copy block */ - ci->n = 15; - } - mrb_ary_splice(mrb, argv[0], 1, 0, binding); /* insert binding as 2nd argument */ - return mrb_f_eval(mrb, binding); -} - -void -mrb_mruby_binding_eval_gem_init(mrb_state *mrb) -{ - struct RClass *binding = mrb_class_get_id(mrb, MRB_SYM(Binding)); - mrb_define_method(mrb, binding, "eval", mrb_binding_eval, MRB_ARGS_ANY()); -} - -void -mrb_mruby_binding_eval_gem_final(mrb_state *mrb) -{ -} diff --git a/mrbgems/mruby-eval/mrbgem.rake b/mrbgems/mruby-eval/mrbgem.rake index 887611f8f..d2986fd3b 100644 --- a/mrbgems/mruby-eval/mrbgem.rake +++ b/mrbgems/mruby-eval/mrbgem.rake @@ -5,4 +5,6 @@ MRuby::Gem::Specification.new('mruby-eval') do |spec| add_dependency 'mruby-compiler', :core => 'mruby-compiler' add_dependency 'mruby-binding', :core => 'mruby-binding' + spec.add_test_dependency('mruby-metaprog', :core => 'mruby-metaprog') + spec.add_test_dependency('mruby-method', :core => 'mruby-method') end diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index f44ab000f..5b8432166 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -251,8 +252,8 @@ binding_eval_prepare(mrb_state *mrb, mrb_value binding, const char *expr, mrb_in if (error) mrb_exc_raise(mrb, ret); } -mrb_value -mrb_f_eval(mrb_state *mrb, mrb_value self) +static mrb_value +f_eval(mrb_state *mrb, mrb_value self) { const char *s; mrb_int len; @@ -273,7 +274,6 @@ mrb_f_eval(mrb_state *mrb, mrb_value self) mrb_assert(!MRB_PROC_CFUNC_P(proc)); return exec_irep(mrb, self, proc); } -#define f_eval mrb_f_eval static mrb_value f_instance_eval(mrb_state *mrb, mrb_value self) @@ -323,6 +323,22 @@ f_class_eval(mrb_state *mrb, mrb_value self) } } +static mrb_value +mrb_binding_eval(mrb_state *mrb, mrb_value binding) +{ + mrb_callinfo *ci = mrb->c->ci; + int argc = ci->n; + mrb_value *argv = ci->stack + 1; + + if (argc < 15) { + argv[0] = mrb_ary_new_from_values(mrb, argc, argv); + argv[1] = argv[argc]; /* copy block */ + ci->n = 15; + } + mrb_ary_splice(mrb, argv[0], 1, 0, binding); /* insert binding as 2nd argument */ + return f_eval(mrb, binding); +} + void mrb_mruby_eval_gem_init(mrb_state* mrb) { @@ -330,6 +346,9 @@ mrb_mruby_eval_gem_init(mrb_state* mrb) mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(BasicObject)), MRB_SYM(instance_eval), f_instance_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK()); mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(Module)), MRB_SYM(module_eval), f_class_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK()); mrb_define_method_id(mrb, mrb_class_get_id(mrb, MRB_SYM(Module)), MRB_SYM(class_eval), f_class_eval, MRB_ARGS_OPT(3)|MRB_ARGS_BLOCK()); + + struct RClass *binding = mrb_class_get_id(mrb, MRB_SYM(Binding)); + mrb_define_method(mrb, binding, "eval", mrb_binding_eval, MRB_ARGS_ANY()); } void diff --git a/mrbgems/mruby-binding-eval/test/binding.rb b/mrbgems/mruby-eval/test/binding.rb similarity index 100% rename from mrbgems/mruby-binding-eval/test/binding.rb rename to mrbgems/mruby-eval/test/binding.rb diff --git a/mrbgems/mruby-proc-binding/mrbgem.rake b/mrbgems/mruby-proc-binding/mrbgem.rake index 736b38035..53e6faaef 100644 --- a/mrbgems/mruby-proc-binding/mrbgem.rake +++ b/mrbgems/mruby-proc-binding/mrbgem.rake @@ -5,6 +5,6 @@ MRuby::Gem::Specification.new('mruby-proc-binding') do |spec| spec.add_dependency('mruby-binding', :core => 'mruby-binding') spec.add_dependency('mruby-proc-ext', :core => 'mruby-proc-ext') - spec.add_test_dependency('mruby-binding-eval', :core => 'mruby-binding-eval') + spec.add_test_dependency('mruby-eval', :core => 'mruby-eval') spec.add_test_dependency('mruby-compiler', :core => 'mruby-compiler') end