On 2023/02/19 09:45, Nikita Popov <nikita.ppv@gmail.com> wrote:
> I expect that there are two main reasons for that:
> - There are probably some places that return a (non-negative) value or FAILURE.
> - There are probably some places that check for success/failure using >= 0 and < 0. Another POSIX-ism.
>
> I don't think we endorse such usage, but it likely exists.
Oh. That's .... bad.
(Again, with C++'s strictly-typed enums, this would be easy to find:
if it compiles, it's correct.)
> Let me turn the question around: Is there some reason to change the value of FAILURE at this point?
Right now, I'm trying to understand this choice of number and the
obscure code comment NOT explaining it. A comprehensive understanding
of a design is an important first step for any other decision.
And indeed there would be a good practical reason to change this. For
example, on x86, the check for -1 compiles to:
83 f8 ff cmp $0xffffffff,%eax
While the check for false (or 0) compiles to:
85 c0 test %eax,%eax
On Aarch64, check for -1 is:
3100041f cmn w0, #0x1
54000060 b.eq 1c <Foo>
While false/0 compile to just one conditional branch:
35000060 cbnz w0, 3c <Foo>
For such a basic definition used everywhere, this does make a
difference.
It was rather clumsy to choose -1 for FAILURE because it leads to
less-than-optimal machine code. Larger machine code means slower
execution. For one central basic definition as zend_result that gets
used everywhere, it can make a measurable difference.
(Note that using "bool" would still be faster than using an enum with
0 and 1, but everything's better than -1.)
> > If I understand the guideline correctly, then those examples (and
> > countless others) are defective and should be fixed, correct?
>
> At least in principle, yes. Of course, actually doing a change may not always be worthwhile, especially as this might result in a silent behavior change for extensions (as putting the return value into an "if" would invert behavior now).
(... and yet again, C++ would have saved us from this pain by not
allowing implicit bool casts - sorry for annoying you with my C++
fanboyism, but any pain that stems from choosing C is self-inflicted.)
The zend_fibers thing is a fairly recent addition, yet nobody spotted
this API mistake befor merging it. I've submitted a PR to fix it:
https://github.com/php/php-src/pull/10622
Surprisingly, CODING_STANDARDS.md doesn't mention this API convention.
Maybe it should?
Max