core expr eval: fix assoc., commut and 0 adding for +, ==
authorAndrei Pelinescu-Onciul <andrei@iptel.org>
Tue, 28 Apr 2009 16:34:03 +0000 (18:34 +0200)
committerAndrei Pelinescu-Onciul <andrei@iptel.org>
Tue, 28 Apr 2009 16:34:03 +0000 (18:34 +0200)
commit3c8fc182ae386713f15e6a0362924e72b257c31e
tree0611965e9b59b1605a861d685ccd0b5df6d86c97
parent04ff69818798e2330587c4109a69d8974908b158
core expr eval: fix assoc., commut and 0 adding for +, ==

- fix associativity for the generic plus: because of the non-fixed
  argument types (can work with strings integers or both in the
  same type), RVE_PLUS_OP is associative _only_ if the operand
  types match.
  Non-assoc. example: "a" + 1 + "2"  (can be "a12" or "a3").
  Instead of adding extra checks for the same type, rely on the
  optimizer having already replaced RVE_PLUS_OP with RVE_IPLUS_OP
  or RVE_CONCAT_OP => RVE_PLUS_OP will be used only when the
  operands types are mixed or cannot be determined (e.g. AVP), or
  when script optimizations are turned off (-O0).
- fix commutativity for the generic plus. Similar to the above.
  Non-commut. example: 1 + "2" == 3, but  "2" + 1 == "21".
- fix commutativity for the generic == and !=.
  Non. commut. example:  0 == "" , but  "" != 0.
  Similar fix as above, relying on the optimizer and the type specific
  operators: RVE_IEQ_OP, RVE_IDIFF_OP, RVE_STREQ_OP and
  RVE_STRDIFF_OP.
- fix $v + 0 / 0 + $v -> $v optimizations. Because of the generic
  plus and recent changes that allow int + str, even if the result
  is an int (left side operant is integer), 0 + $v can be
  different from $v. E.g.: 0+"1" == 1, which is different from
  "1".
rvalue.c