null+****@clear*****
null+****@clear*****
2010年 11月 9日 (火) 17:37:38 JST
Kouhei Sutou 2010-11-09 08:37:38 +0000 (Tue, 09 Nov 2010) New Revision: b602e7d942b605541f0e83b31ba122b880c5915b Log: fix numeric operation and assing with expression is broken. #669 Modified files: lib/expr.c test/unit/core/test-expr-script.c Modified: lib/expr.c (+23 -17) =================================================================== --- lib/expr.c 2010-11-09 11:59:59 +0000 (9824f18) +++ lib/expr.c 2010-11-09 08:37:38 +0000 (7298f7d) @@ -2158,43 +2158,49 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller) right_expression_check,\ text_operation) \ { \ - grn_obj *value, *casted_value, *variable_value, *var; \ + grn_obj *value, *var, *res; \ if (code->value) { \ value = code->value; \ + POP1ALLOC1(var, res); \ } else { \ - POP1(value); \ + POP2ALLOC1(var, value, res); \ } \ - value = GRN_OBJ_RESOLVE(ctx, value); \ - POP1(var); \ if (var->header.type == GRN_PTR && \ GRN_BULK_VSIZE(var) == (sizeof(grn_obj *) + sizeof(grn_id))) { \ grn_obj *col = GRN_PTR_VALUE(var); \ grn_id rid = *(grn_id *)(GRN_BULK_HEAD(var) + sizeof(grn_obj *)); \ + grn_obj variable_value, casted_value; \ + grn_id domain; \ \ - ALLOC1(res); \ - ALLOC1(variable_value); \ - ALLOC1(casted_value); \ - grn_obj_reinit(ctx, variable_value, col->header.domain, 0); \ - grn_obj_get_value(ctx, col, rid, variable_value); \ + value = GRN_OBJ_RESOLVE(ctx, value); \ \ - casted_value->header.type = GRN_BULK; \ - casted_value->header.domain = variable_value->header.domain; \ - if (grn_obj_cast(ctx, value, casted_value, GRN_FALSE)) { \ + domain = grn_obj_get_range(ctx, col); \ + GRN_OBJ_INIT(&variable_value, GRN_BULK, 0, domain); \ + grn_obj_get_value(ctx, col, rid, &variable_value); \ + \ + GRN_OBJ_INIT(&casted_value, GRN_BULK, 0, domain); \ + if (grn_obj_cast(ctx, value, &casted_value, GRN_FALSE)) { \ ERR(GRN_INVALID_ARGUMENT, "invalid value: string"); \ + GRN_OBJ_FIN(ctx, &variable_value); \ + GRN_OBJ_FIN(ctx, &casted_value); \ + POP1(res); \ goto exit; \ } \ - res->header.type = GRN_BULK; \ - res->header.domain = variable_value->header.domain; \ - ARITHMETIC_OPERATION_DISPATCH(variable_value, casted_value, res, \ + grn_obj_reinit(ctx, res, domain, 0); \ + ARITHMETIC_OPERATION_DISPATCH((&variable_value), (&casted_value), \ + res, \ integer32_operation, \ integer64_operation, \ float_operation, \ left_expression_check, \ right_expression_check, \ text_operation,); \ - POP1(casted_value); \ - POP1(variable_value); \ grn_obj_set_value(ctx, col, rid, res, GRN_OBJ_SET); \ + GRN_OBJ_FIN(ctx, (&variable_value)); \ + GRN_OBJ_FIN(ctx, (&casted_value)); \ + } else { \ + ERR(GRN_INVALID_ARGUMENT, "left hand expression isn't column."); \ + POP1(res); \ } \ } Modified: test/unit/core/test-expr-script.c (+4 -0) =================================================================== --- test/unit/core/test-expr-script.c 2010-11-09 11:59:59 +0000 (b8a98ef) +++ test/unit/core/test-expr-script.c 2010-11-09 08:37:38 +0000 (6b89c46) @@ -584,6 +584,10 @@ data_arithmetic_operator_minus_assign(void) gcut_list_string_new("fuga fuga", "hoge hoge", NULL), "size <= 9 && ((size -= \"4\") || 1) && size == 5"); + ADD_DATUM("integer -= expression", + gcut_list_string_new("fuga fuga", "hoge hoge", NULL), + "size <= 9 && ((size -= (3 + 1)) || 1) && size == 5"); + ADD_DATUM("float -= float", gcut_list_string_new("fuga fuga", "hoge hoge", NULL), "size_in_float <= 9.1 && "