assert: adjust loose assertions · nodejs/node@7493db2 (original) (raw)
`@@ -14,7 +14,9 @@ const {
`
14
14
` isStringObject,
`
15
15
` isBooleanObject,
`
16
16
` isBigIntObject,
`
17
``
`-
isSymbolObject
`
``
17
`+
isSymbolObject,
`
``
18
`+
isFloat32Array,
`
``
19
`+
isFloat64Array
`
18
20
`} = require('internal/util/types');
`
19
21
`const {
`
20
22
` getOwnNonIndexProperties,
`
`@@ -84,18 +86,6 @@ function areEqualArrayBuffers(buf1, buf2) {
`
84
86
`compare(new Uint8Array(buf1), new Uint8Array(buf2)) === 0;
`
85
87
`}
`
86
88
``
87
``
`-
function isFloatTypedArrayTag(tag) {
`
88
``
`-
return tag === '[object Float32Array]' || tag === '[object Float64Array]';
`
89
``
`-
}
`
90
``
-
91
``
`-
function isArguments(tag) {
`
92
``
`-
return tag === '[object Arguments]';
`
93
``
`-
}
`
94
``
-
95
``
`-
function isObjectOrArrayTag(tag) {
`
96
``
`-
return tag === '[object Array]' || tag === '[object Object]';
`
97
``
`-
}
`
98
``
-
99
89
`function isEqualBoxedPrimitive(val1, val2) {
`
100
90
`if (isNumberObject(val1)) {
`
101
91
`return isNumberObject(val2) &&
`
`@@ -132,23 +122,45 @@ function isEqualBoxedPrimitive(val1, val2) {
`
132
122
`// For strict comparison, objects should have
`
133
123
`// a) The same built-in type tags
`
134
124
`// b) The same prototypes.
`
135
``
`-
function strictDeepEqual(val1, val2, memos) {
`
136
``
`-
if (typeof val1 !== 'object') {
`
137
``
`-
return typeof val1 === 'number' && numberIsNaN(val1) &&
`
138
``
`-
numberIsNaN(val2);
`
``
125
+
``
126
`+
function innerDeepEqual(val1, val2, strict, memos) {
`
``
127
`+
// All identical values are equivalent, as determined by ===.
`
``
128
`+
if (val1 === val2) {
`
``
129
`+
if (val1 !== 0)
`
``
130
`+
return true;
`
``
131
`+
return strict ? objectIs(val1, val2) : true;
`
139
132
`}
`
140
``
`-
if (typeof val2 !== 'object' || val1 === null || val2 === null) {
`
141
``
`-
return false;
`
``
133
+
``
134
`+
// Check more closely if val1 and val2 are equal.
`
``
135
`+
if (strict) {
`
``
136
`+
if (typeof val1 !== 'object') {
`
``
137
`+
return typeof val1 === 'number' && numberIsNaN(val1) &&
`
``
138
`+
numberIsNaN(val2);
`
``
139
`+
}
`
``
140
`+
if (typeof val2 !== 'object' || val1 === null || val2 === null) {
`
``
141
`+
return false;
`
``
142
`+
}
`
``
143
`+
if (getPrototypeOf(val1) !== getPrototypeOf(val2)) {
`
``
144
`+
return false;
`
``
145
`+
}
`
``
146
`+
} else {
`
``
147
`+
if (val1 === null || typeof val1 !== 'object') {
`
``
148
`+
if (val2 === null || typeof val2 !== 'object') {
`
``
149
`+
// eslint-disable-next-line eqeqeq
`
``
150
`+
return val1 == val2;
`
``
151
`+
}
`
``
152
`+
return false;
`
``
153
`+
}
`
``
154
`+
if (val2 === null || typeof val2 !== 'object') {
`
``
155
`+
return false;
`
``
156
`+
}
`
142
157
`}
`
143
158
`const val1Tag = objectToString(val1);
`
144
159
`const val2Tag = objectToString(val2);
`
145
160
``
146
161
`if (val1Tag !== val2Tag) {
`
147
162
`return false;
`
148
163
`}
`
149
``
`-
if (getPrototypeOf(val1) !== getPrototypeOf(val2)) {
`
150
``
`-
return false;
`
151
``
`-
}
`
152
164
`if (Array.isArray(val1)) {
`
153
165
`// Check for sparse arrays and general fast path
`
154
166
`if (val1.length !== val2.length) {
`
`@@ -159,10 +171,10 @@ function strictDeepEqual(val1, val2, memos) {
`
159
171
`if (keys1.length !== keys2.length) {
`
160
172
`return false;
`
161
173
`}
`
162
``
`-
return keyCheck(val1, val2, kStrict, memos, kIsArray, keys1);
`
``
174
`+
return keyCheck(val1, val2, strict, memos, kIsArray, keys1);
`
163
175
`}
`
164
176
`if (val1Tag === '[object Object]') {
`
165
``
`-
return keyCheck(val1, val2, kStrict, memos, kNoIterator);
`
``
177
`+
return keyCheck(val1, val2, strict, memos, kNoIterator);
`
166
178
`}
`
167
179
`if (isDate(val1)) {
`
168
180
`if (dateGetTime(val1) !== dateGetTime(val2)) {
`
`@@ -174,13 +186,16 @@ function strictDeepEqual(val1, val2, memos) {
`
174
186
`}
`
175
187
`} else if (isNativeError(val1) || val1 instanceof Error) {
`
176
188
`// Do not compare the stack as it might differ even though the error itself
`
177
``
`-
// is otherwise identical. The non-enumerable name should be identical as
`
178
``
`-
// the prototype is also identical. Otherwise this is caught later on.
`
179
``
`-
if (val1.message !== val2.message) {
`
``
189
`+
// is otherwise identical.
`
``
190
`+
if (val1.message !== val2.message || val1.name !== val2.name) {
`
180
191
`return false;
`
181
192
`}
`
182
193
`} else if (isArrayBufferView(val1)) {
`
183
``
`-
if (!areSimilarTypedArrays(val1, val2)) {
`
``
194
`+
if (!strict && (isFloat32Array(val1) || isFloat64Array(val1))) {
`
``
195
`+
if (!areSimilarFloatArrays(val1, val2)) {
`
``
196
`+
return false;
`
``
197
`+
}
`
``
198
`+
} else if (!areSimilarTypedArrays(val1, val2)) {
`
184
199
`return false;
`
185
200
`}
`
186
201
`// Buffer.compare returns true, so val1.length === val2.length. If they both
`
`@@ -191,84 +206,25 @@ function strictDeepEqual(val1, val2, memos) {
`
191
206
`if (keys1.length !== keys2.length) {
`
192
207
`return false;
`
193
208
`}
`
194
``
`-
return keyCheck(val1, val2, kStrict, memos, kNoIterator, keys1);
`
``
209
`+
return keyCheck(val1, val2, strict, memos, kNoIterator, keys1);
`
195
210
`} else if (isSet(val1)) {
`
196
211
`if (!isSet(val2) || val1.size !== val2.size) {
`
197
212
`return false;
`
198
213
`}
`
199
``
`-
return keyCheck(val1, val2, kStrict, memos, kIsSet);
`
``
214
`+
return keyCheck(val1, val2, strict, memos, kIsSet);
`
200
215
`} else if (isMap(val1)) {
`
201
216
`if (!isMap(val2) || val1.size !== val2.size) {
`
202
217
`return false;
`
203
218
`}
`
204
``
`-
return keyCheck(val1, val2, kStrict, memos, kIsMap);
`
``
219
`+
return keyCheck(val1, val2, strict, memos, kIsMap);
`
205
220
`} else if (isAnyArrayBuffer(val1)) {
`
206
221
`if (!areEqualArrayBuffers(val1, val2)) {
`
207
222
`return false;
`
208
223
`}
`
209
224
`} else if (isBoxedPrimitive(val1) && !isEqualBoxedPrimitive(val1, val2)) {
`
210
225
`return false;
`
211
226
`}
`
212
``
`-
return keyCheck(val1, val2, kStrict, memos, kNoIterator);
`
213
``
`-
}
`
214
``
-
215
``
`-
function looseDeepEqual(val1, val2, memos) {
`
216
``
`-
if (val1 === null || typeof val1 !== 'object') {
`
217
``
`-
if (val2 === null || typeof val2 !== 'object') {
`
218
``
`-
// eslint-disable-next-line eqeqeq
`
219
``
`-
return val1 == val2;
`
220
``
`-
}
`
221
``
`-
return false;
`
222
``
`-
}
`
223
``
`-
if (val2 === null || typeof val2 !== 'object') {
`
224
``
`-
return false;
`
225
``
`-
}
`
226
``
`-
const val1Tag = objectToString(val1);
`
227
``
`-
const val2Tag = objectToString(val2);
`
228
``
`-
if (val1Tag === val2Tag) {
`
229
``
`-
if (isObjectOrArrayTag(val1Tag)) {
`
230
``
`-
return keyCheck(val1, val2, kLoose, memos, kNoIterator);
`
231
``
`-
}
`
232
``
`-
if (isArrayBufferView(val1)) {
`
233
``
`-
if (isFloatTypedArrayTag(val1Tag)) {
`
234
``
`-
return areSimilarFloatArrays(val1, val2);
`
235
``
`-
}
`
236
``
`-
return areSimilarTypedArrays(val1, val2);
`
237
``
`-
}
`
238
``
`-
if (isDate(val1) && isDate(val2)) {
`
239
``
`-
return val1.getTime() === val2.getTime();
`
240
``
`-
}
`
241
``
`-
if (isRegExp(val1) && isRegExp(val2)) {
`
242
``
`-
return areSimilarRegExps(val1, val2);
`
243
``
`-
}
`
244
``
`-
if (val1 instanceof Error && val2 instanceof Error) {
`
245
``
`-
if (val1.message !== val2.message || val1.name !== val2.name)
`
246
``
`-
return false;
`
247
``
`-
}
`
248
``
`` -
// Ensure reflexivity of deepEqual with arguments
objects.
``
249
``
`-
// See https://github.com/nodejs/node-v0.x-archive/pull/7178
`
250
``
`-
} else if (isArguments(val1Tag) || isArguments(val2Tag)) {
`
251
``
`-
return false;
`
252
``
`-
}
`
253
``
`-
if (isSet(val1)) {
`
254
``
`-
if (!isSet(val2) || val1.size !== val2.size) {
`
255
``
`-
return false;
`
256
``
`-
}
`
257
``
`-
return keyCheck(val1, val2, kLoose, memos, kIsSet);
`
258
``
`-
} else if (isMap(val1)) {
`
259
``
`-
if (!isMap(val2) || val1.size !== val2.size) {
`
260
``
`-
return false;
`
261
``
`-
}
`
262
``
`-
return keyCheck(val1, val2, kLoose, memos, kIsMap);
`
263
``
`-
} else if (isSet(val2) || isMap(val2)) {
`
264
``
`-
return false;
`
265
``
`-
}
`
266
``
`-
if (isAnyArrayBuffer(val1) && isAnyArrayBuffer(val2)) {
`
267
``
`-
if (!areEqualArrayBuffers(val1, val2)) {
`
268
``
`-
return false;
`
269
``
`-
}
`
270
``
`-
}
`
271
``
`-
return keyCheck(val1, val2, kLoose, memos, kNoIterator);
`
``
227
`+
return keyCheck(val1, val2, strict, memos, kNoIterator);
`
272
228
`}
`
273
229
``
274
230
`function getEnumerables(val, keys) {
`
`@@ -370,21 +326,6 @@ function keyCheck(val1, val2, strict, memos, iterationType, aKeys) {
`
370
326
`return areEq;
`
371
327
`}
`
372
328
``
373
``
`-
function innerDeepEqual(val1, val2, strict, memos) {
`
374
``
`-
// All identical values are equivalent, as determined by ===.
`
375
``
`-
if (val1 === val2) {
`
376
``
`-
if (val1 !== 0)
`
377
``
`-
return true;
`
378
``
`-
return strict ? objectIs(val1, val2) : true;
`
379
``
`-
}
`
380
``
-
381
``
`-
// Check more closely if val1 and val2 are equal.
`
382
``
`-
if (strict === true)
`
383
``
`-
return strictDeepEqual(val1, val2, memos);
`
384
``
-
385
``
`-
return looseDeepEqual(val1, val2, memos);
`
386
``
`-
}
`
387
``
-
388
329
`function setHasEqualElement(set, val1, strict, memo) {
`
389
330
`// Go looking.
`
390
331
`for (const val2 of set) {
`