[Groonga-commit] groonga/groonga at 61bdbc9 [master] mrb: create a context for evaluating Ruby code

Back to archive index

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 



More information about the Groonga-commit mailing list
Back to archive index