On 10/21/2013 02:27 PM, Hochstrasser Christoph wrote:
Hi Derick,
This is again an RFC that does not even attempt to argue for its
usefulness. "This functionality was meant to replace the assert() API
that currently exists in PHP, because of problems replacing it in a
compatible manner". This doesn't say what is wrong with assert() or
whether we *need* expect.
The RFC was first proposed as a RFC to replace the "assert()" function with a "assert"
keyword (which produces an opcode) in order to fix the unacceptable performance of the current
"assert()" implementation. See also https://wiki.php.net/rfc/expectations#performance
Later it was renamed to "expect" because the overall opinion was that changing
"assert()" can't be done in 5.x.
Yes, this RFC could state more clearly what its purpose is, but it certainly has usefulness. It's a lot
faster than "assert()", when turned off "expect" becomes a NOOP, and it doesn't rely on
"eval()".
Morning,
I'm not so good at conveying ideas; the explanation you have there
is a summarized version of the java documentation of the same idea, the
implementations are so similar they could be called identical.
So everyone has a clear idea of how this works, here's some detail
about the op array for the statement "expect false;":
Optimizations=On Expectations=On (DEVELOPMENT):
opcodes[2]
opcodes[0] -> ZEND_EXPCT expression
opcodes[1] -> ZEND_RETURN
Optimizations=Off Expectations=On:
opcodes[9]
opcodes[0]-opcodes[6] -> ZEND_NOP
opcodes[7] -> ZEND_EXPCT expression
opcodes[8] -> ZEND_RETURN
Optimizations=On Expectations=Off (PRODUCTION)
opcodes[1]
opcodes[0] -> ZEND_RETURN
Optimizations=Off Expectations=Off:
opcodes[8]
opcodes[0] -> ZEND_JMP opcodes[7]
opcodes[1]-opcodes[6] -> ZEND_NOP
opcodes[7] -> ZEND_RETURN
The same opcodes for "assert("false")":
Optimizations=Either Assertions=Either (LEGACY):
opcodes[3]
opcodes[0] -> ZEND_SEND_VAL string
opcodes[1] -> ZEND_DO_FCALL assert
opcodes[2] -> ZEND_RETURN
When Assertions=Off opcodes[1] does not result in a call to
eval, but the actual call to assert cannot be optimized, dragging down
production considerably.
Cheers
Joe
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php