]> granicus.if.org Git - php/commit
Refactor operator implementations
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 31 Mar 2020 16:03:30 +0000 (18:03 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 31 Mar 2020 18:49:39 +0000 (20:49 +0200)
commitf182309e87cd45de0d110516c6af4b05da3ce266
tree5cd029cf6254a1354954a18ad26bb93773206ec9
parentdaf45f68d25af0e7e909214719f3fbe0306abb7a
Refactor operator implementations

Instead of looping, use straight-line code with the following
layout:

1. Try to apply the base operation on the dereferenced operands.
2. Try overloaded object operations.
3. Try to convert operands to number, else error out.
4. Apply the base operation on the converted operands.

This makes the code easier to reason about and fixes some edge-case
bugs:

1. We should only try invoking operator overloading once prior to
   type conversion. Previously it was invoked both before and after
   type conversion.
2. We should not modify any values if an exception is thrown.
   Previously we sometimes modified the LHS of a compound assignment
   operator.
3. If conversion of the first operand fails, we no longer try to
   convert the second operand. I think the previous behavior here
   was fine as well, but this still seems a more typical.

This will also make some followup changes I have in mind simpler.
Zend/tests/add_002.phpt
Zend/tests/add_007.phpt
Zend/tests/compound_assign_failure.phpt
Zend/zend_operators.c