wanabe
null+****@clear*****
Thu Oct 10 00:11:39 JST 2013
wanabe 2013-10-10 00:11:39 +0900 (Thu, 10 Oct 2013) New Revision: 93d1d27e2c40204a3c542598bc30f42744cc79a1 https://github.com/groonga/groonga/commit/93d1d27e2c40204a3c542598bc30f42744cc79a1 Merged 0988a3d: Merge pull request #114 from wanabe/mruby-exprcode-get_weight Message: Make ruby instance of grn_expr_code in scan_info_build() Modified files: lib/mrb/mrb_expr.c Modified: lib/mrb/mrb_expr.c (+41 -23) =================================================================== --- lib/mrb/mrb_expr.c 2013-10-09 20:22:22 +0900 (cb89ac7) +++ lib/mrb/mrb_expr.c 2013-10-10 00:11:39 +0900 (4681f01) @@ -30,6 +30,7 @@ #include "mrb_expr.h" static struct mrb_data_type mrb_grn_scan_info_type = { "Groonga::ScanInfo", NULL }; +static struct mrb_data_type mrb_grn_expr_code_type = { "Groonga::ExpressionCode", NULL }; static mrb_value mrb_grn_scan_info_new(mrb_state *mrb, scan_info *ptr) @@ -45,6 +46,20 @@ mrb_grn_scan_info_new(mrb_state *mrb, scan_info *ptr) return mrb_obj_new(mrb, klass, 1, &mrb_ptr); } +static mrb_value +mrb_grn_expr_code_new(mrb_state *mrb, grn_expr_code *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, "ExpressionCode"))); + 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) @@ -155,13 +170,13 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n, grn_expr_code *ec; grn_expr *e = (grn_expr *)(*p); for (j = e->codes_curr, ec = e->codes; j--; ec++) { + int32_t weight; + mrb_value mrb_ec = mrb_grn_expr_code_new(mrb, ec); if (ec->value) { switch (ec->value->header.type) { case GRN_ACCESSOR : if (grn_column_index(ctx, ec->value, c->op, &index, 1, &sid)) { - int32_t weight = mrb_fixnum( - mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "weight", 1, - mrb_cptr_value(mrb, ec))); + 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); if (((grn_accessor *)ec->value)->next) { @@ -180,9 +195,7 @@ 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)) { - int32_t weight = mrb_fixnum( - mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "weight", 1, - mrb_cptr_value(mrb, ec))); + weight = mrb_fixnum(mrb_funcall(mrb, mrb_ec, "weight", 0)); mrb_si = mrb_grn_scan_info_new(mrb, si); mrb_funcall(mrb, mrb_si, "put_index", 3, mrb_cptr_value(mrb, index), @@ -201,16 +214,12 @@ scan_info_build(grn_ctx *ctx, grn_obj *expr, int *n, j -= 2; ec += 2; } - { - int32_t weight = mrb_fixnum( - mrb_funcall(mrb, mrb_obj_value(ctx->impl->mrb.module), "weight", 1, - mrb_cptr_value(mrb, ec))); - 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(weight)); - } + weight = mrb_fixnum(mrb_funcall(mrb, mrb_ec, "weight", 0)); + 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(weight)); break; } } @@ -417,6 +426,17 @@ mrb_grn_scan_info_initialize(mrb_state *mrb, mrb_value self) } static mrb_value +mrb_grn_expr_code_initialize(mrb_state *mrb, mrb_value self) +{ + mrb_value mrb_ptr; + + mrb_get_args(mrb, "o", &mrb_ptr); + DATA_TYPE(self) = &mrb_grn_expr_code_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; @@ -436,13 +456,9 @@ mrb_grn_scan_info_put_index(mrb_state *mrb, mrb_value self) static mrb_value mrb_grn_expr_code_get_weight(mrb_state *mrb, mrb_value self) { - int32_t weight; grn_ctx *ctx = (grn_ctx *)mrb->ud; - mrb_value mrb_ec; - mrb_get_args(mrb, "o", &mrb_ec); - weight = grn_expr_code_get_weight(ctx, mrb_cptr(mrb_ec)); - return mrb_fixnum_value(weight); + return mrb_fixnum_value(grn_expr_code_get_weight(ctx, DATA_PTR(self))); } void @@ -460,8 +476,10 @@ grn_mrb_expr_init(grn_ctx *ctx) 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)); - mrb_define_class_method(mrb, module, - "weight", mrb_grn_expr_code_get_weight, MRB_ARGS_REQ(1)); + klass = mrb_define_class_under(mrb, module, "ExpressionCode", mrb->object_class); + MRB_SET_INSTANCE_TT(klass, MRB_TT_DATA); + mrb_define_method(mrb, klass, "initialize", mrb_grn_expr_code_initialize, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, klass, "weight", mrb_grn_expr_code_get_weight, MRB_ARGS_NONE()); grn_mrb_load(ctx, "expression.rb"); } -------------- next part -------------- HTML����������������������������... 下载