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;
}