[Groonga-commit] groonga/groonga [master] grn_expr_exec() returns the result of expression.

Back to archive index

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




Groonga-commit メーリングリストの案内
Back to archive index