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����������������������������... 다운로드