Closed
Bug 802473
Opened 13 years ago
Closed 13 years ago
NS_FAILED returns values other than 0 and 1; NS_FAILED/NS_SUCCEEDED should use branch prediction macros
Categories
(Core :: XPCOM, defect)
Core
XPCOM
Tracking
()
RESOLVED
FIXED
mozilla19
People
(Reporter: MatsPalmgren_bugz, Assigned: MatsPalmgren_bugz)
References
Details
(Keywords: perf, regression)
Attachments
(1 file, 1 obsolete file)
|
1.53 KB,
patch
|
benjamin
:
review+
|
Details | Diff | Splinter Review |
Bug 768865 removed "defined(NS_STATIC_CHECKING)" so that a faulty
version of NS_FAILED is now used for all C++ code.
There are two problems:
1. Assigning NS_FAILED(an_error) to an integral type gives the wrong result.
Assigning to a variable of narrower type results in zero, assigning to a
same or wider type it's non-zero but still wrong (0x80000000).
The result should be 1, as documented in the file.
2. Since the result of NS_FAILED/NS_SUCCEEDED is very likely to be 0/1
we should use NS_LIKELY/NS_UNLIKELY to indicate so. I'm surprised
bug 768865 didn't cause a performance regression, but perhaps PGO
wallpapers over it?
Since NS_LIKELY/NS_UNLIKELY returns exactly 0 or 1, we get point 1 for free.
| Assignee | ||
Comment 1•13 years ago
|
||
This fixes point 1 and 2 above, and still keeps the desirable
type check that bug 768865 was after, IIUC.
It appears to be green on Try:
https://tbpl.mozilla.org/?tree=Try&rev=d715a0990034
Attachment #672149 -
Flags: review?(ayg)
Comment 2•13 years ago
|
||
Comment on attachment 672149 [details] [diff] [review]
fix
>-inline int NS_FAILED(nsresult _nsresult) {
>+inline int _NS_FAILED(nsresult _nsresult) {
Don't use underscore + uppercase. It is always reserved in C/C++.
Comment 3•13 years ago
|
||
Comment on attachment 672149 [details] [diff] [review]
fix
Review of attachment 672149 [details] [diff] [review]:
-----------------------------------------------------------------
stealing the review. Please call the underlying function/macro something like NS_FAILED_impl.
Attachment #672149 -
Flags: review?(ayg) → review+
Comment 4•13 years ago
|
||
Also, out of curiosity, how did you find out about this?
Comment 5•13 years ago
|
||
Why is this an int and not a bool return value?
Comment 6•13 years ago
|
||
It shouldn't be. I thought I changed it to bool in some patch of mine somewhere along the line, but it seems I didn't.
Comment 7•13 years ago
|
||
ok, can you make them bools?
| Assignee | ||
Comment 8•13 years ago
|
||
> Please call the underlying function/macro something like NS_FAILED_impl.
Fixed.
> ok, can you make them bools?
Fixed. NS_FAILED_impl isn't supposed to be called directly so I made
it return uint32_t to avoid any unnecessary cycles spent before giving
the value to NS_LIKELY.
Assignee: nobody → matspal
Attachment #672301 -
Flags: review?(benjamin)
Updated•13 years ago
|
Attachment #672301 -
Flags: review?(benjamin) → review+
| Assignee | ||
Comment 9•13 years ago
|
||
(In reply to Ehsan Akhgari [:ehsan] from comment #4)
> Also, out of curiosity, how did you find out about this?
The background is that I investigated this exact problem with assigning
the result of NS_FAILED in bug 340244 a few years back. It caused a test
to fail because of an assignment to a PRUint8 (see bug 340244 comment 5
for all the gory details).
Then I stumbled over bug 801464 and got curious what NS_FAILED looked like
nowadays after the nsresult enum changes, and when I saw it I knew instantly
that it was broken.
| Assignee | ||
Comment 10•13 years ago
|
||
| Assignee | ||
Updated•13 years ago
|
Attachment #672149 -
Attachment is obsolete: true
Comment 11•13 years ago
|
||
Status: NEW → RESOLVED
Closed: 13 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla19
You need to log in
before you can comment on or make changes to this bug.
Description
•