[Groonga-commit] groonga/groonga at 1688ae6 [master] Make ruby instance of scan_info in scan_info_build()

Back to archive index

wanabe null+****@clear*****
Wed Oct 9 13:36:15 JST 2013


wanabe	2013-10-09 13:36:15 +0900 (Wed, 09 Oct 2013)

  New Revision: 1688ae663d76e810dfc5fbfa0bfbad6d529ec03a
  https://github.com/groonga/groonga/commit/1688ae663d76e810dfc5fbfa0bfbad6d529ec03a

  Merged 8df7ab9: Merge pull request #113 from wanabe/mruby-scaninfo-put_index

  Message:
    Make ruby instance of scan_info in scan_info_build()

  Modified files:
    lib/mrb/mrb_expr.c

  Modified: lib/mrb/mrb_expr.c (+56 -23)
===================================================================
--- lib/mrb/mrb_expr.c    2013-10-09 12:10:02 +0900 (758e61a)
+++ lib/mrb/mrb_expr.c    2013-10-09 13:36:15 +0900 (601042d)
@@ -21,12 +21,30 @@
 #ifdef GRN_WITH_MRUBY
 #include <mruby.h>
 #include <mruby/class.h>
+#include <mruby/variable.h>
+#include <mruby/data.h>
 
 #include "../expr.h"
 #include "../util.h"
 #include "../mrb.h"
 #include "mrb_expr.h"
 
+static struct mrb_data_type mrb_grn_scan_info_type = { "Groonga::ScanInfo", NULL };
+
+static mrb_value
+mrb_grn_scan_info_new(mrb_state *mrb, scan_info *ptr)
+{
+  grn_ctx *ctx = (grn_ctx *)mrb->ud;
+  struct RClass *module = ctx->impl->mrb.module;
+  struct RClass *klass;
+  mrb_value mrb_ptr;
+
+  mrb_ptr = mrb_cptr_value(mrb, ptr);
+  klass = mrb_class_ptr(mrb_const_get(mrb, mrb_obj_value(module),
+                                      mrb_intern(mrb, "ScanInfo")));
+  return mrb_obj_new(mrb, klass, 1, &mrb_ptr);
+}
+
 static scan_info **
 scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
                 grn_operator op, uint32_t size)
@@ -38,6 +56,7 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
   grn_expr_code *c, *ce;
   grn_expr *e = (grn_expr *)expr;
   mrb_state *mrb = ctx->impl->mrb.state;
+  mrb_value mrb_si;
 
   if (!(var = grn_expr_get_var_by_offset(ctx, expr, 0))) { return NULL; }
   for (stat = SCAN_START, c = e->codes, ce = &e->codes[e->codes_curr]; c < ce; c++) {
@@ -142,15 +161,14 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
                   if (grn_column_index(ctx, ec->value, c->op, &index, 1, &sid)) {
                     int32_t weight = grn_expr_code_get_weight(ctx, ec);
                     grn_scan_info_set_flags(si, grn_scan_info_get_flags(si) | SCAN_ACCESSOR);
+                    mrb_si = mrb_grn_scan_info_new(mrb, si);
                     if (((grn_accessor *)ec->value)->next) {
-                      mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                                  mrb_cptr_value(mrb, si),
+                      mrb_funcall(mrb, mrb_si, "put_index", 3,
                                   mrb_cptr_value(mrb, ec->value),
                                   mrb_fixnum_value(sid),
                                   mrb_fixnum_value(weight));
                     } else {
-                      mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                                  mrb_cptr_value(mrb, si),
+                      mrb_funcall(mrb, mrb_si, "put_index", 3,
                                   mrb_cptr_value(mrb, index),
                                   mrb_fixnum_value(sid),
                                   mrb_fixnum_value(weight));
@@ -160,8 +178,8 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
                 case GRN_COLUMN_FIX_SIZE :
                 case GRN_COLUMN_VAR_SIZE :
                   if (grn_column_index(ctx, ec->value, c->op, &index, 1, &sid)) {
-                    mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                                mrb_cptr_value(mrb, si),
+                    mrb_si = mrb_grn_scan_info_new(mrb, si);
+                    mrb_funcall(mrb, mrb_si, "put_index", 3,
                                 mrb_cptr_value(mrb, index),
                                 mrb_fixnum_value(sid),
                                 mrb_fixnum_value(grn_expr_code_get_weight(ctx, ec)));
@@ -178,8 +196,8 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
                     j -= 2;
                     ec += 2;
                   }
-                  mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                              mrb_cptr_value(mrb, si),
+                  mrb_si = mrb_grn_scan_info_new(mrb, si);
+                  mrb_funcall(mrb, mrb_si, "put_index", 3,
                               mrb_cptr_value(mrb, index),
                               mrb_fixnum_value(sid),
                               mrb_fixnum_value(grn_expr_code_get_weight(ctx, ec)));
@@ -189,8 +207,8 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
             }
           } else if (GRN_DB_OBJP(*p)) {
             if (grn_column_index(ctx, *p, c->op, &index, 1, &sid)) {
-              mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                          mrb_cptr_value(mrb, si),
+              mrb_si = mrb_grn_scan_info_new(mrb, si);
+              mrb_funcall(mrb, mrb_si, "put_index", 3,
                           mrb_cptr_value(mrb, index),
                           mrb_fixnum_value(sid),
                           mrb_fixnum_value(1));
@@ -199,14 +217,14 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
             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)) {
               if (((grn_accessor *)(*p))->next) {
-                mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                            mrb_cptr_value(mrb, si),
+                mrb_si = mrb_grn_scan_info_new(mrb, si);
+                mrb_funcall(mrb, mrb_si, "put_index", 3,
                             mrb_cptr_value(mrb, *p),
                             mrb_fixnum_value(sid),
                             mrb_fixnum_value(1));
               } else {
-                mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                            mrb_cptr_value(mrb, si),
+                mrb_si = mrb_grn_scan_info_new(mrb, si);
+                mrb_funcall(mrb, mrb_si, "put_index", 3,
                             mrb_cptr_value(mrb, index),
                             mrb_fixnum_value(sid),
                             mrb_fixnum_value(1));
@@ -310,8 +328,8 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n,
           for (k = 0; (arg = grn_scan_info_get_arg(ctx, si, k)) ; k++) {
             if (GRN_DB_OBJP(*p)) {
               if (grn_column_index(ctx, *p, c->op, &index, 1, &sid)) {
-                mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                            mrb_cptr_value(mrb, si),
+                mrb_si = mrb_grn_scan_info_new(mrb, si);
+                mrb_funcall(mrb, mrb_si, "put_index", 3,
                             mrb_cptr_value(mrb, index),
                             mrb_fixnum_value(sid),
                             mrb_fixnum_value(1));
@@ -319,8 +337,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_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "put_index", 4,
-                            mrb_cptr_value(mrb, si),
+                mrb_si = mrb_grn_scan_info_new(mrb, si);
+                mrb_funcall(mrb, mrb_si, "put_index", 3,
                             mrb_cptr_value(mrb, index),
                             mrb_fixnum_value(sid),
                             mrb_fixnum_value(1));
@@ -378,6 +396,17 @@ mrb_grn_expr_build(mrb_state *mrb, mrb_value self)
 }
 
 static mrb_value
+mrb_grn_scan_info_initialize(mrb_state *mrb, mrb_value self)
+{
+  mrb_value mrb_ptr;
+
+  mrb_get_args(mrb, "o", &mrb_ptr);
+  DATA_TYPE(self) = &mrb_grn_scan_info_type;
+  DATA_PTR(self) = mrb_cptr(mrb_ptr);
+  return self;
+}
+
+static mrb_value
 mrb_grn_scan_info_put_index(mrb_state *mrb, mrb_value self)
 {
   int sid;
@@ -385,10 +414,10 @@ mrb_grn_scan_info_put_index(mrb_state *mrb, mrb_value self)
   scan_info *si;
   grn_ctx *ctx = (grn_ctx *)mrb->ud;
   grn_obj *obj;
-  mrb_value mrb_si, mrb_obj;
+  mrb_value mrb_obj;
 
-  mrb_get_args(mrb, "ooii", &mrb_si, &mrb_obj, &sid, &weight);
-  si = mrb_cptr(mrb_si);
+  mrb_get_args(mrb, "oii", &mrb_obj, &sid, &weight);
+  si = DATA_PTR(self);
   obj = mrb_cptr(mrb_obj);
   grn_scan_info_put_index(ctx, si, obj, sid, weight);
   return self;
@@ -399,11 +428,15 @@ grn_mrb_expr_init(grn_ctx *ctx)
 {
   mrb_state *mrb = ctx->impl->mrb.state;
   struct RClass *module = ctx->impl->mrb.module;
+  struct RClass *klass;
 
   mrb_define_class_method(mrb, module,
                           "build", mrb_grn_expr_build, MRB_ARGS_REQ(4));
-  mrb_define_class_method(mrb, module,
-                          "put_index", mrb_grn_scan_info_put_index, MRB_ARGS_REQ(4));
+
+  klass = mrb_define_class_under(mrb, module, "ScanInfo", mrb->object_class);
+  MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA);
+  mrb_define_method(mrb, klass, "initialize", mrb_grn_scan_info_initialize, MRB_ARGS_REQ(1));
+  mrb_define_method(mrb, klass, "put_index", mrb_grn_scan_info_put_index, MRB_ARGS_REQ(3));
   grn_mrb_load(ctx, "expression.rb");
 }
 
-------------- next part --------------
HTML����������������������������...
Download 



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