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