Closed
Bug 430427
Opened 17 years ago
Closed 17 years ago
ecma/Array/15.4.4.5-3.js test fails in GMT(BST) time zone
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
RESOLVED
WORKSFORME
People
(Reporter: ap, Unassigned)
Details
(Keywords: testcase)
Attachments
(1 file)
1.67 KB,
text/html
|
Details |
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_2; ru-ru) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.18
Build Identifier: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; ru; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
This test verifies how sorting works. In GMT time zone, the array being sorted happens to contain two instances of the same date (Jan 01 2000), but Array.sort() is not guaranteed to be stable by ECMA-262, and different Date objects don't compare as equal even if the dates are the same.
This was originally reported as <https://bugs.webkit.org/show_bug.cgi?id=18687>.
Reproducible: Always
Reporter | ||
Comment 1•17 years ago
|
||
A standalone test case derived from ecma/Array/15.4.4.5-3.js.
Updated•17 years ago
|
Assignee: nobody → general
Component: Testing → JavaScript Engine
Keywords: testcase
QA Contact: testing → general
comparefn3 isn't a consistent comparison function, so the behavior of sort is implementation-defined (i.e. may give any result) per ECMA3 15.4.4.11.
function comparefn3( x, y ) {
return ( x == y ? 0 : ( x > y ? 1: -1 ) );
}
For two different Date objects a and b that refer to the same time value, a == b will be false, a > b will be false, and b > a will be false, but a == a is true. Thus, a <CF b and b <CF a, but not a <CF a, so transitivity of <CF is violated.
Note that relational operators convert objects to number (or string), but equality operators do not. |new Date(v) == new Date(v)| will always be false.
Reporter | ||
Comment 3•17 years ago
|
||
It looks like stringsort from the original test could use some improvement, too.
Actually, the testcase doesn't fail with a trunk build, but fails with older builds (although jsDriver.pl doesn't detect the failure, see bug 430509).
It succeeds also with older builds if I change comparefn3 to
function comparefn3( x, y ) {
return ( +x == +y ? 0 : ( x > y ? 1 : -1 ) );
}
Then comparefn3 should be equivalent to realsort and both arrays sorted identically, even if the sort isn't stable (although ECMA doesn't guarantee a deterministic order).
Status: UNCONFIRMED → NEW
Ever confirmed: true
Comment 5•17 years ago
|
||
This does seem to work on trunk, currently.
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → WORKSFORME
Comment 6•7 years ago
|
||
This test is still broken, as explained in comment 2 above. Sort order is implementation defined if the comparison function is inconsistent.
comparefn3() is inconsistent. The reference comparison function realsort() is not. It's a matter of luck if this test succeeds or not.
The proper fix is probably just to remove testarr3 / comparefn3. Even if fixed, I don't think it adds any value over realsort since the '>' operator also ends up calling valueof().
See also the related V8 bug report: https://crbug.com/v8/8146
You need to log in
before you can comment on or make changes to this bug.
Description
•