[Groonga-commit] groonga/groonga at c1d7cad [master] mruby: Define Groonga::Accessor to wrap grn_accessor

Back to archive index

wanabe null+****@clear*****
Fri Oct 11 19:47:01 JST 2013


wanabe	2013-10-11 19:47:01 +0900 (Fri, 11 Oct 2013)

  New Revision: c1d7cadcb5f2a164b46767695c1e75973cd17767
  https://github.com/groonga/groonga/commit/c1d7cadcb5f2a164b46767695c1e75973cd17767

  Merged 8bf2bf8: Merge pull request #116 from wanabe/mruby-accessor

  Message:
    mruby: Define Groonga::Accessor to wrap grn_accessor

  Modified files:
    lib/mrb/mrb_expr.c
    lib/mrb/mrb_obj.c
    lib/mrb/mrb_obj.h

  Modified: lib/mrb/mrb_expr.c (+6 -20)
===================================================================
--- lib/mrb/mrb_expr.c    2013-10-11 19:01:58 +0900 (0ec386e)
+++ lib/mrb/mrb_expr.c    2013-10-11 19:47:01 +0900 (20c1127)
@@ -27,6 +27,7 @@
 #include "../expr.h"
 #include "../util.h"
 #include "../mrb.h"
+#include "mrb_obj.h"
 #include "mrb_expr.h"
 
 static struct mrb_data_type mrb_grn_scan_info_type = {
@@ -182,13 +183,12 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
                 case GRN_ACCESSOR :
                   if (grn_column_index(ctx, ec->value, c->op, &index, 1, &sid)) {
                     mrb_value mrb_ec = mrb_grn_expr_code_new(mrb, ec);
-                    mrb_value mrb_accessor_next;
+                    mrb_value mrb_accessor;
                     weight = mrb_fixnum(mrb_funcall(mrb, mrb_ec, "weight", 0));
                     grn_scan_info_set_flags(si, grn_scan_info_get_flags(si) | SCAN_ACCESSOR);
                     mrb_si = mrb_grn_scan_info_new(mrb, si);
-                    mrb_accessor_next = mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "next", 1,
-                                                    mrb_cptr_value(mrb, ec->value));
-                    if (!mrb_nil_p(mrb_accessor_next)) {
+                    mrb_accessor = mrb_grn_accessor_new(mrb, (grn_accessor *)ec->value);
+                    if (!mrb_nil_p(mrb_funcall(mrb, mrb_accessor, "next", 0))) {
                       mrb_funcall(mrb, mrb_si, "put_index", 3,
                                   mrb_cptr_value(mrb, ec->value),
                                   mrb_fixnum_value(sid),
@@ -248,9 +248,8 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
           } else if (GRN_ACCESSORP(*p)) {
             grn_scan_info_set_flags(si, grn_scan_info_get_flags(si) | SCAN_ACCESSOR);
             if (grn_column_index(ctx, *p, c->op, &index, 1, &sid)) {
-              mrb_value mrb_accessor_next = mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "next", 1,
-                                                        mrb_cptr_value(mrb, *p));
-              if (!mrb_nil_p(mrb_accessor_next)) {
+              mrb_value mrb_accessor = mrb_grn_accessor_new(mrb, (grn_accessor *)*p);
+              if (!mrb_nil_p(mrb_funcall(mrb, mrb_accessor, "next", 0))) {
                 mrb_si = mrb_grn_scan_info_new(mrb, si);
                 mrb_funcall(mrb, mrb_si, "put_index", 3,
                             mrb_cptr_value(mrb, *p),
@@ -476,18 +475,6 @@ mrb_grn_expr_code_get_weight(mrb_state *mrb, mrb_value self)
   return mrb_fixnum_value(grn_expr_code_get_weight(ctx, DATA_PTR(self)));
 }
 
-static mrb_value
-mrb_grn_accessor_next(mrb_state *mrb, mrb_value self)
-{
-  grn_accessor *accessor;
-  mrb_value mrb_accessor;
-
-  mrb_get_args(mrb, "o", &mrb_accessor);
-  accessor = mrb_cptr(mrb_accessor);
-  if (!accessor->next) { return mrb_nil_value(); }
-  return mrb_cptr_value(mrb, accessor->next);
-}
-
 void
 grn_mrb_expr_init(grn_ctx *ctx)
 {
@@ -497,7 +484,6 @@ grn_mrb_expr_init(grn_ctx *ctx)
 
   mrb_define_class_method(mrb, module,
                           "build", mrb_grn_expr_build, MRB_ARGS_REQ(4));
-  mrb_define_class_method(mrb, module, "next", mrb_grn_accessor_next, MRB_ARGS_REQ(1));
 
   klass = mrb_define_class_under(mrb, module, "ScanInfo", mrb->object_class);
   MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA);

  Modified: lib/mrb/mrb_obj.c (+48 -0)
===================================================================
--- lib/mrb/mrb_obj.c    2013-10-11 19:01:58 +0900 (a7f48d6)
+++ lib/mrb/mrb_obj.c    2013-10-11 19:47:01 +0900 (dca1ca5)
@@ -21,9 +21,52 @@
 #ifdef GRN_WITH_MRUBY
 #include <mruby.h>
 #include <mruby/class.h>
+#include <mruby/variable.h>
+#include <mruby/data.h>
 
+#include "../db.h"
 #include "mrb_obj.h"
 
+static struct mrb_data_type mrb_grn_accessor_type = {
+  "Groonga::Accessor",
+  NULL
+};
+
+mrb_value
+mrb_grn_accessor_new(mrb_state *mrb, grn_accessor *accessor)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  struct RClass *module = ctx->impl->mrb.module;
+  struct RClass *klass;
+  mrb_value mrb_accessor_ptr;
+
+  mrb_accessor_ptr = mrb_cptr_value(mrb, accessor);
+  klass = mrb_class_ptr(mrb_const_get(mrb, mrb_obj_value(module),
+                                      mrb_intern(mrb, "Accessor")));
+  return mrb_obj_new(mrb, klass, 1, &mrb_accessor_ptr);
+}
+
+static mrb_value
+mrb_grn_accessor_initialize(mrb_state *mrb, mrb_value self)
+{
+  mrb_value mrb_accessor_ptr;
+
+  mrb_get_args(mrb, "o", &mrb_accessor_ptr);
+  DATA_TYPE(self) = &mrb_grn_accessor_type;
+  DATA_PTR(self) = mrb_cptr(mrb_accessor_ptr);
+  return self;
+}
+
+static mrb_value
+mrb_grn_accessor_next(mrb_state *mrb, mrb_value self)
+{
+  grn_accessor *accessor;
+
+  accessor = DATA_PTR(self);
+  if (!accessor->next) { return mrb_nil_value(); }
+  return mrb_cptr_value(mrb, accessor->next);
+}
+
 void
 grn_mrb_obj_init(grn_ctx *ctx)
 {
@@ -33,5 +76,10 @@ grn_mrb_obj_init(grn_ctx *ctx)
 
   klass = mrb_define_class_under(mrb, module, "Object", mrb->object_class);
   MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA);
+
+  klass = mrb_define_class_under(mrb, module, "Accessor", mrb->object_class);
+  MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA);
+  mrb_define_method(mrb, klass, "initialize", mrb_grn_accessor_initialize, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, klass, "next", mrb_grn_accessor_next, MRB_ARGS_NONE());
 }
 #endif

  Modified: lib/mrb/mrb_obj.h (+2 -0)
===================================================================
--- lib/mrb/mrb_obj.h    2013-10-11 19:01:58 +0900 (31d5324)
+++ lib/mrb/mrb_obj.h    2013-10-11 19:47:01 +0900 (e5183d4)
@@ -20,11 +20,13 @@
 #define GRN_MRB_OBJ_H
 
 #include "../ctx.h"
+#include "../db.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+mrb_value mrb_grn_accessor_new(mrb_state *mrb, grn_accessor *accessor);
 void grn_mrb_obj_init(grn_ctx *ctx);
 
 #ifdef __cplusplus
-------------- next part --------------
HTML����������������������������...
Download 



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