morit****@razil*****
morit****@razil*****
2009年 7月 28日 (火) 22:20:02 JST
森です。
grn_expr_exec()に渡しているgrn_exprで、
popするオブジェクトよりpushするオブジェクトの方が
多くなっているのかも知れません。
オーバーフローするパタンを教えていただけますか?
>>> Kouhei Sutou さんは書きました:
> 須藤です。
>
> grn_ctxはスタックを持っていますが、何度もgrn_expr_exec()して
> いるとスタックがオーバーフローしてしまいます。
>
> よくわかっていないのですが、sizeof(grn_obj *)で割る必要があ
> るのかなぁと思いました。
>
> diff --git a/lib/db.c b/lib/db.c
> index 93b3c6d..aa57446 100644
> --- a/lib/db.c
> +++ b/lib/db.c
> @@ -5460,7 +5460,7 @@ grn_obj_unlink(grn_ctx *ctx, grn_obj *obj)
> }
>
> #define WITH_SPSAVE(block) {\
> - ctx->impl->stack_curr = sp - ctx->impl->stack;\
> + ctx->impl->stack_curr = (sp - ctx->impl->stack) / sizeof(grn_obj *);\
> block\
> if (sp != ctx->impl->stack + ctx->impl->stack_curr) {\
> sp = ctx->impl->stack + ctx->impl->stack_curr;\
> @@ -6309,7 +6309,7 @@ grn_expr_exec(grn_ctx *ctx, grn_obj *expr)
> }
> }
> res = s0;
> - ctx->impl->stack_curr = sp == ctx->impl->stack ? 0 : sp - ctx->impl->stack - 1;
> + ctx->impl->stack_curr = sp == ctx->impl->stack ? 0 : (sp - ctx->impl->stack - 1) / sizeof(grn_obj *);
> }
> exit :
> GRN_API_RETURN(res);
>
> --
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード (http://www.clear-code.com/)
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>
--
morita