Kouhei Sutou
null+****@clear*****
Wed Dec 4 00:46:54 JST 2013
Kouhei Sutou 2013-12-04 00:46:54 +0900 (Wed, 04 Dec 2013) New Revision: 61bdbc90a0945010d85f38e80f4003aa6ba7b435 https://github.com/groonga/groonga/commit/61bdbc90a0945010d85f38e80f4003aa6ba7b435 Message: mrb: create a context for evaluating Ruby code Added files: lib/mrb/scripts/eval_context.rb Modified files: lib/ctx_impl_mrb.c lib/mrb.c lib/mrb/scripts/sources.am Modified: lib/ctx_impl_mrb.c (+8 -0) =================================================================== --- lib/ctx_impl_mrb.c 2013-12-04 00:22:34 +0900 (cffdf54) +++ lib/ctx_impl_mrb.c 2013-12-04 00:46:54 +0900 (e617225) @@ -19,6 +19,7 @@ #include "ctx_impl_mrb.h" #include "ctx_impl.h" +#include "mrb.h" #include "mrb/mrb_ctx.h" #include "mrb/mrb_obj.h" #include "mrb/mrb_column.h" @@ -43,6 +44,12 @@ grn_ctx_impl_mrb_init_bindings(grn_ctx *ctx) grn_mrb_accessor_init(ctx); } +static void +grn_ctx_impl_mrb_init_eval(grn_ctx *ctx) +{ + grn_mrb_load(ctx, "eval_context.rb"); +} + void grn_ctx_impl_mrb_init(grn_ctx *ctx) { @@ -54,6 +61,7 @@ grn_ctx_impl_mrb_init(grn_ctx *ctx) } else { ctx->impl->mrb.state = mrb_open(); grn_ctx_impl_mrb_init_bindings(ctx); + grn_ctx_impl_mrb_init_eval(ctx); } } Modified: lib/mrb.c (+14 -5) =================================================================== --- lib/mrb.c 2013-12-04 00:22:34 +0900 (b9baa5f) +++ lib/mrb.c 2013-12-04 00:46:54 +0900 (9d23f38) @@ -108,7 +108,8 @@ grn_mrb_open_script(grn_ctx *ctx, const char *path) mrb_value grn_mrb_load(grn_ctx *ctx, const char *path) { - mrb_state *mrb = ctx->impl->mrb.state; + grn_mrb_data *data = &(ctx->impl->mrb); + mrb_state *mrb = data->state; int n; FILE *file; mrb_value result; @@ -142,7 +143,8 @@ grn_mrb_load(grn_ctx *ctx, const char *path) mrb_value grn_mrb_eval(grn_ctx *ctx, const char *script, int script_length) { - mrb_state *mrb = ctx->impl->mrb.state; + grn_mrb_data *data = &(ctx->impl->mrb); + mrb_state *mrb = data->state; int n; mrb_value result; struct mrb_parser_state *parser; @@ -156,9 +158,16 @@ grn_mrb_eval(grn_ctx *ctx, const char *script, int script_length) } parser = mrb_parse_nstring(mrb, script, script_length, NULL); n = mrb_generate_code(mrb, parser); - result = mrb_run(mrb, - mrb_proc_new(mrb, mrb->irep[n]), - mrb_top_self(mrb)); + { + struct RClass *eval_context_class; + mrb_value eval_context; + + eval_context_class = mrb_class_get_under(mrb, data->module, "EvalContext"); + eval_context = mrb_obj_new(mrb, eval_context_class, 0, NULL); + result = mrb_run(mrb, + mrb_proc_new(mrb, mrb->irep[n]), + eval_context); + } mrb_parser_free(parser); return result; Added: lib/mrb/scripts/eval_context.rb (+13 -0) 100644 =================================================================== --- /dev/null +++ lib/mrb/scripts/eval_context.rb 2013-12-04 00:46:54 +0900 (546c130) @@ -0,0 +1,13 @@ +module Groonga + class EvalContext + def method_missing(id, *args, &block) + return super unless args.empty? + return super if block_given? + + object = Context.instance[id.to_s] + return super if object.nil? + + object + end + end +end Modified: lib/mrb/scripts/sources.am (+1 -0) =================================================================== --- lib/mrb/scripts/sources.am 2013-12-04 00:22:34 +0900 (f286529) +++ lib/mrb/scripts/sources.am 2013-12-04 00:46:54 +0900 (0de8bf9) @@ -1,2 +1,3 @@ RUBY_SCRIPT_FILES = \ + eval_context.rb \ expression.rb -------------- next part -------------- HTML����������������������������...Download