Merge pull request #5989 from dearblue/integrate-eval

Integrate `mruby-binding-eval` into `mruby-eval`
This commit is contained in:
Yukihiro "Matz" Matsumoto
2023-04-19 00:06:13 +09:00
committed by GitHub
7 changed files with 25 additions and 56 deletions
-1
View File
@@ -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"
-11
View File
@@ -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
-40
View File
@@ -1,40 +0,0 @@
#include <mruby.h>
#include <mruby/array.h>
#include <mruby/class.h>
#include <mruby/compile.h>
#include <mruby/error.h>
#include <mruby/proc.h>
#include <mruby/string.h>
#include <mruby/internal.h>
#include <mruby/presym.h>
/* 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)
{
}
+2
View File
@@ -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
+22 -3
View File
@@ -1,4 +1,5 @@
#include <mruby.h>
#include <mruby/array.h>
#include <mruby/class.h>
#include <mruby/compile.h>
#include <mruby/irep.h>
@@ -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
+1 -1
View File
@@ -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