null+****@clear*****
null+****@clear*****
2010年 6月 10日 (木) 23:07:55 JST
Daijiro MORI 2010-06-10 14:07:55 +0000 (Thu, 10 Jun 2010) New Revision: 0a153f33a7ccb30b8ac5d17286697b6efedb0609 Log: grn_expr_exec() returns the result of expression. Modified files: groonga.h lib/ctx.c lib/db.c lib/expr.c src/groonga.c test/unit/core/test-expr-parse.c Modified: groonga.h (+1 -4) =================================================================== --- groonga.h 2010-06-10 11:29:44 +0000 (2ed5922) +++ groonga.h 2010-06-10 14:07:55 +0000 (b280268) @@ -2015,13 +2015,10 @@ GRN_API grn_obj *grn_expr_append_const_int(grn_ctx *ctx, grn_obj *expr, int i, GRN_API grn_rc grn_expr_append_op(grn_ctx *ctx, grn_obj *expr, grn_operator op, int nargs); GRN_API grn_rc grn_expr_compile(grn_ctx *ctx, grn_obj *expr); -GRN_API grn_rc grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs); +GRN_API grn_obj *grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs); GRN_API grn_rc grn_ctx_push(grn_ctx *ctx, grn_obj *obj); GRN_API grn_obj *grn_ctx_pop(grn_ctx *ctx); -#define GRN_EXPR_CALL(ctx,expr,nargs) \ - (grn_expr_exec((ctx), (expr), (nargs)), grn_ctx_pop(ctx)) - GRN_API grn_obj *grn_expr_alloc(grn_ctx *ctx, grn_obj *expr, grn_id domain, grn_obj_flags flags); Modified: lib/ctx.c (+3 -6) =================================================================== --- lib/ctx.c 2010-06-10 11:29:44 +0000 (401e668) +++ lib/ctx.c 2010-06-10 14:07:55 +0000 (3d177d6) @@ -813,8 +813,7 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len) GRN_TEXT_PUT(ctx, val, path, path_len); } grn_ctx_push(ctx, ctx->impl->outbuf); - grn_expr_exec(ctx, expr, 1); - val = grn_ctx_pop(ctx); + val = grn_expr_exec(ctx, expr, 1); grn_expr_clear_vars(ctx, expr); } else { grn_obj key; @@ -845,8 +844,7 @@ grn_ctx_qe_exec_uri(grn_ctx *ctx, const char *path, uint32_t path_len) } grn_ctx_push(ctx, ctx->impl->outbuf); - grn_expr_exec(ctx, expr, 1); - val = grn_ctx_pop(ctx); + val = grn_expr_exec(ctx, expr, 1); grn_expr_clear_vars(ctx, expr); } GRN_OBJ_FIN(ctx, &key); @@ -923,8 +921,7 @@ grn_ctx_qe_exec(grn_ctx *ctx, const char *str, uint32_t str_len) GRN_INT32_SET(ctx, val, (int32_t)ot); } grn_ctx_push(ctx, ctx->impl->outbuf); - grn_expr_exec(ctx, expr, 1); - val = grn_ctx_pop(ctx); + val = grn_expr_exec(ctx, expr, 1); grn_expr_clear_vars(ctx, expr); } if (!ctx->impl->qe_next) { Modified: lib/db.c (+1 -2) =================================================================== --- lib/db.c 2010-06-10 11:29:44 +0000 (3dcc107) +++ lib/db.c 2010-06-10 14:07:55 +0000 (a6a1e57) @@ -6929,8 +6929,7 @@ loader_add(grn_ctx *ctx, grn_obj *key) grn_obj *result; unsigned int result_boolean; GRN_RECORD_SET(ctx, v, id); - grn_expr_exec(ctx, loader->ifexists, 0); - result = grn_ctx_pop(ctx); + result = grn_expr_exec(ctx, loader->ifexists, 0); GRN_TRUEP(ctx, result, result_boolean); if (!result_boolean) { id = 0; } } Modified: lib/expr.c (+16 -17) =================================================================== --- lib/expr.c 2010-06-10 11:29:44 +0000 (a951ae6) +++ lib/expr.c 2010-06-10 14:07:55 +0000 (fe197ee) @@ -2060,9 +2060,10 @@ pseudo_query_scan(grn_ctx *ctx, grn_obj *x, grn_obj *y, grn_obj *res) if (b) { grn_str_close(ctx, b); } } -grn_rc +grn_obj * grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs) { + grn_obj *val = NULL; uint32_t stack_curr = ctx->impl->stack_curr; GRN_API_ENTER; if (expr->header.type == GRN_PROC) { @@ -3120,15 +3121,18 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr, int nargs) } ctx->impl->stack_curr = sp - s_; } - if (ctx->impl->stack_curr + nargs != stack_curr + 1) { - /* - GRN_LOG(ctx, GRN_LOG_WARNING, "nargs=%d stack balance=%d", - nargs, stack_curr - ctx->impl->stack_curr); - */ - ctx->impl->stack_curr = stack_curr + 1 - nargs; + if (ctx->impl->stack_curr + nargs > stack_curr) { + val = grn_ctx_pop(ctx); + if (ctx->impl->stack_curr + nargs > stack_curr) { + /* + GRN_LOG(ctx, GRN_LOG_WARNING, "nargs=%d stack balance=%d", + nargs, stack_curr - ctx->impl->stack_curr); + */ + ctx->impl->stack_curr = stack_curr - nargs; + } } exit : - GRN_API_RETURN(ctx->rc); + GRN_API_RETURN(val); } grn_obj * @@ -3592,8 +3596,7 @@ grn_table_select_(grn_ctx *ctx, grn_obj *table, grn_obj *expr, grn_obj *v, if ((tc = grn_table_cursor_open(ctx, table, NULL, 0, NULL, 0, 0, -1, 0))) { while ((id = grn_table_cursor_next(ctx, tc))) { GRN_RECORD_SET(ctx, v, id); - grn_expr_exec(ctx, expr, 0); - r = grn_ctx_pop(ctx); + r = grn_expr_exec(ctx, expr, 0); if (r && (score = GRN_UINT32_VALUE(r))) { grn_rset_recinfo *ri; if (grn_hash_add(ctx, s, &id, s->key_size, (void **)&ri, NULL)) { @@ -3609,8 +3612,7 @@ grn_table_select_(grn_ctx *ctx, grn_obj *table, grn_obj *expr, grn_obj *v, while (grn_hash_cursor_next(ctx, hc)) { grn_hash_cursor_get_key(ctx, hc, (void **) &idp); GRN_RECORD_SET(ctx, v, *idp); - grn_expr_exec(ctx, expr, 0); - r = grn_ctx_pop(ctx); + r = grn_expr_exec(ctx, expr, 0); if (r && (score = GRN_UINT32_VALUE(r))) { grn_rset_recinfo *ri; grn_hash_cursor_get_value(ctx, hc, (void **) &ri); @@ -3627,8 +3629,7 @@ grn_table_select_(grn_ctx *ctx, grn_obj *table, grn_obj *expr, grn_obj *v, while (grn_hash_cursor_next(ctx, hc)) { grn_hash_cursor_get_key(ctx, hc, (void **) &idp); GRN_RECORD_SET(ctx, v, *idp); - grn_expr_exec(ctx, expr, 0); - r = grn_ctx_pop(ctx); + r = grn_expr_exec(ctx, expr, 0); if (r && (score = GRN_UINT32_VALUE(r))) { grn_hash_cursor_delete(ctx, hc, NULL); } @@ -3641,8 +3642,7 @@ grn_table_select_(grn_ctx *ctx, grn_obj *table, grn_obj *expr, grn_obj *v, while (grn_hash_cursor_next(ctx, hc)) { grn_hash_cursor_get_key(ctx, hc, (void **) &idp); GRN_RECORD_SET(ctx, v, *idp); - grn_expr_exec(ctx, expr, 0); - r = grn_ctx_pop(ctx); + r = grn_expr_exec(ctx, expr, 0); if (r && (score = GRN_UINT32_VALUE(r))) { grn_rset_recinfo *ri; grn_hash_cursor_get_value(ctx, hc, (void **) &ri); @@ -5588,7 +5588,6 @@ grn_select(grn_ctx *ctx, grn_obj *outbuf, grn_content_type output_type, if ((tc = grn_table_cursor_open(ctx, res, NULL, 0, NULL, 0, 0, -1, 0))) { while (!grn_table_cursor_next_o(ctx, tc, v)) { grn_expr_exec(ctx, scorer_, 0); - grn_ctx_pop(ctx); } grn_table_cursor_close(ctx, tc); } Modified: src/groonga.c (+4 -4) =================================================================== --- src/groonga.c 2010-06-10 11:29:44 +0000 (3570da5) +++ src/groonga.c 2010-06-10 14:07:55 +0000 (60a27da) @@ -569,8 +569,8 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body) } ctx->impl->output_type = ot; grn_ctx_push(ctx, ctx->impl->outbuf); - expr_rc = grn_expr_exec(ctx, expr, 1); - val = grn_ctx_pop(ctx); + val = grn_expr_exec(ctx, expr, 1); + expr_rc = ctx->rc; grn_expr_clear_vars(ctx, expr); } else if ((expr = grn_ctx_get(ctx, GRN_EXPR_MISSING_NAME, strlen(GRN_EXPR_MISSING_NAME)))) { @@ -581,8 +581,8 @@ do_htreq(grn_ctx *ctx, grn_msg *msg, grn_obj *body) } ctx->impl->output_type = ot; grn_ctx_push(ctx, ctx->impl->outbuf); - expr_rc = grn_expr_exec(ctx, expr, 1); - val = grn_ctx_pop(ctx); + val = grn_expr_exec(ctx, expr, 1); + expr_rc = ctx->rc; grn_expr_clear_vars(ctx, expr); } GRN_OBJ_FIN(ctx, &key); Modified: test/unit/core/test-expr-parse.c (+2 -1) =================================================================== --- test/unit/core/test-expr-parse.c 2010-06-10 11:29:44 +0000 (85cdf57) +++ test/unit/core/test-expr-parse.c 2010-06-10 14:07:55 +0000 (4dbddc8) @@ -793,7 +793,8 @@ parse_numeric_literal(const char *str_expr) GRN_EXPR_ALLOW_UPDATE)); grn_test_assert(grn_expr_compile(&context, expr)); - grn_test_assert(grn_expr_exec(&context, expr, 0)); + grn_expr_exec(&context, expr, 0); + grn_test_assert(context.rc); return var; }