1 |
3a515b92
|
cagy
|
'use strict';
|
2 |
|
|
|
3 |
|
|
var GetIntrinsic = require('../GetIntrinsic');
|
4 |
|
|
|
5 |
|
|
var $Number = GetIntrinsic('%Number%');
|
6 |
|
|
var $TypeError = GetIntrinsic('%TypeError%');
|
7 |
|
|
|
8 |
|
|
var $isNaN = require('../helpers/isNaN');
|
9 |
|
|
var $isFinite = require('../helpers/isFinite');
|
10 |
|
|
var isPrefixOf = require('../helpers/isPrefixOf');
|
11 |
|
|
|
12 |
|
|
var ToNumber = require('./ToNumber');
|
13 |
|
|
var ToPrimitive = require('./ToPrimitive');
|
14 |
|
|
var Type = require('./Type');
|
15 |
|
|
|
16 |
|
|
// https://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5
|
17 |
|
|
|
18 |
|
|
// eslint-disable-next-line max-statements
|
19 |
|
|
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
|
20 |
|
|
if (Type(LeftFirst) !== 'Boolean') {
|
21 |
|
|
throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
|
22 |
|
|
}
|
23 |
|
|
var px;
|
24 |
|
|
var py;
|
25 |
|
|
if (LeftFirst) {
|
26 |
|
|
px = ToPrimitive(x, $Number);
|
27 |
|
|
py = ToPrimitive(y, $Number);
|
28 |
|
|
} else {
|
29 |
|
|
py = ToPrimitive(y, $Number);
|
30 |
|
|
px = ToPrimitive(x, $Number);
|
31 |
|
|
}
|
32 |
|
|
var bothStrings = Type(px) === 'String' && Type(py) === 'String';
|
33 |
|
|
if (!bothStrings) {
|
34 |
|
|
var nx = ToNumber(px);
|
35 |
|
|
var ny = ToNumber(py);
|
36 |
|
|
if ($isNaN(nx) || $isNaN(ny)) {
|
37 |
|
|
return undefined;
|
38 |
|
|
}
|
39 |
|
|
if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
|
40 |
|
|
return false;
|
41 |
|
|
}
|
42 |
|
|
if (nx === 0 && ny === 0) {
|
43 |
|
|
return false;
|
44 |
|
|
}
|
45 |
|
|
if (nx === Infinity) {
|
46 |
|
|
return false;
|
47 |
|
|
}
|
48 |
|
|
if (ny === Infinity) {
|
49 |
|
|
return true;
|
50 |
|
|
}
|
51 |
|
|
if (ny === -Infinity) {
|
52 |
|
|
return false;
|
53 |
|
|
}
|
54 |
|
|
if (nx === -Infinity) {
|
55 |
|
|
return true;
|
56 |
|
|
}
|
57 |
|
|
return nx < ny; // by now, these are both nonzero, finite, and not equal
|
58 |
|
|
}
|
59 |
|
|
if (isPrefixOf(py, px)) {
|
60 |
|
|
return false;
|
61 |
|
|
}
|
62 |
|
|
if (isPrefixOf(px, py)) {
|
63 |
|
|
return true;
|
64 |
|
|
}
|
65 |
|
|
return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
|
66 |
|
|
};
|