| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 42e1f72 commit cf0eabc
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -4,7 +4,6 @@ const { | |||
| 4 | 4 | Array, | |
| 5 | 5 | ArrayBuffer, | |
| 6 | 6 | ArrayIsArray, | |
| 7 | - ArrayPrototypeFilter, | ||
| 8 | 7 | ArrayPrototypePush, | |
| 9 | 8 | BigInt, | |
| 10 | 9 | BigInt64Array, | |
@@ -91,7 +90,7 @@ const wellKnownConstructors = new SafeSet() | |||
| 91 | 90 | .add(WeakMap) | |
| 92 | 91 | .add(WeakSet); | |
| 93 | 92 | ||
| 94 | - if (Float16Array) { // TODO(BridgeAR): Remove when regularly supported | ||
| 93 | + if (Float16Array) { // TODO(BridgeAR): Remove when Flag got removed from V8 | ||
| 95 | 94 | wellKnownConstructors.add(Float16Array); | |
| 96 | 95 | } | |
| 97 | 96 | ||
@@ -126,6 +125,11 @@ const { | |||
| 126 | 125 | getOwnNonIndexProperties, | |
| 127 | 126 | } = internalBinding('util'); | |
| 128 | 127 | ||
| 128 | + let kKeyObject; | ||
| 129 | + let kExtractable; | ||
| 130 | + let kAlgorithm; | ||
| 131 | + let kKeyUsages; | ||
| 132 | + | ||
| 129 | 133 | const kStrict = 2; | |
| 130 | 134 | const kStrictWithoutPrototypes = 3; | |
| 131 | 135 | const kLoose = 0; | |
@@ -151,7 +155,7 @@ function isPartialUint8Array(a, b) { | |||
| 151 | 155 | } | |
| 152 | 156 | let offsetA = 0; | |
| 153 | 157 | for (let offsetB = 0; offsetB < lenB; offsetB++) { | |
| 154 | - while (!ObjectIs(a[offsetA], b[offsetB])) { | ||
| 158 | + while (a[offsetA] !== b[offsetB]) { | ||
| 155 | 159 | offsetA++; | |
| 156 | 160 | if (offsetA > lenA - lenB + offsetB) { | |
| 157 | 161 | return false; | |
@@ -186,11 +190,7 @@ function areSimilarFloatArrays(a, b) { | |||
| 186 | 190 | } | |
| 187 | 191 | ||
| 188 | 192 | function areSimilarTypedArrays(a, b) { | |
| 189 | - if (a.byteLength !== b.byteLength) { | ||
| 190 | - return false; | ||
| 191 | - } | ||
| 192 | - return compare(new Uint8Array(a.buffer, a.byteOffset, a.byteLength), | ||
| 193 | - new Uint8Array(b.buffer, b.byteOffset, b.byteLength)) === 0; | ||
| 193 | + return a.byteLength === b.byteLength && compare(a, b) === 0; | ||
| 194 | 194 | } | |
| 195 | 195 | ||
| 196 | 196 | function areEqualArrayBuffers(buf1, buf2) { | |
@@ -224,7 +224,7 @@ function isEqualBoxedPrimitive(val1, val2) { | |||
| 224 | 224 | assert.fail(`Unknown boxed type ${val1}`); | |
| 225 | 225 | } | |
| 226 | 226 | ||
| 227 | - function isEnumerableOrIdentical(val1, val2, prop, mode, memos, method) { | ||
| 227 | + function isEnumerableOrIdentical(val1, val2, prop, mode, memos) { | ||
| 228 | 228 | return hasEnumerable(val2, prop) || // This is handled by Object.keys() | |
| 229 | 229 | (mode === kPartial && (val2[prop] === undefined || (prop === 'message' && val2[prop] === ''))) || | |
| 230 | 230 | innerDeepEqual(val1[prop], val2[prop], mode, memos); | |
@@ -394,8 +394,10 @@ function objectComparisonStart(val1, val2, mode, memos) { | |||
| 394 | 394 | return false; | |
| 395 | 395 | } | |
| 396 | 396 | } else if (isCryptoKey(val1)) { | |
| 397 | - const { kKeyObject } = require('internal/crypto/util'); | ||
| 398 | - const { kExtractable, kAlgorithm, kKeyUsages } = require('internal/crypto/keys'); | ||
| 397 | + if (kKeyObject === undefined) { | ||
| 398 | + kKeyObject = require('internal/crypto/util').kKeyObject; | ||
| 399 | + ({ kExtractable, kAlgorithm, kKeyUsages } = require('internal/crypto/keys')); | ||
| 400 | + } | ||
| 399 | 401 | if (!isCryptoKey(val2) || | |
| 400 | 402 | val1[kExtractable] !== val2[kExtractable] || | |
| 401 | 403 | !innerDeepEqual(val1[kAlgorithm], val2[kAlgorithm], mode, memos) || | |
@@ -411,18 +413,11 @@ function objectComparisonStart(val1, val2, mode, memos) { | |||
| 411 | 413 | return keyCheck(val1, val2, mode, memos, kNoIterator); | |
| 412 | 414 | } | |
| 413 | 415 | ||
| 414 | - function getEnumerables(val, keys) { | ||
| 415 | - return ArrayPrototypeFilter(keys, (key) => hasEnumerable(val, key)); | ||
| 416 | - } | ||
| 417 | - | ||
| 418 | 416 | function partialSymbolEquiv(val1, val2, keys2) { | |
| 419 | 417 | const symbolKeys = getOwnSymbols(val2); | |
| 420 | 418 | if (symbolKeys.length !== 0) { | |
| 421 | 419 | for (const key of symbolKeys) { | |
| 422 | 420 | if (hasEnumerable(val2, key)) { | |
| 423 | - if (!hasEnumerable(val1, key)) { | ||
| 424 | - return false; | ||
| 425 | - } | ||
| 426 | 421 | ArrayPrototypePush(keys2, key); | |
| 427 | 422 | } | |
| 428 | 423 | } | |
@@ -454,32 +449,19 @@ function keyCheck(val1, val2, mode, memos, iterationType, keys2) { | |||
| 454 | 449 | } else if (keys2.length !== (keys1 = ObjectKeys(val1)).length) { | |
| 455 | 450 | return false; | |
| 456 | 451 | } else if (mode === kStrict || mode === kStrictWithoutPrototypes) { | |
| 457 | - const symbolKeysA = getOwnSymbols(val1); | ||
| 458 | - if (symbolKeysA.length !== 0) { | ||
| 459 | - let count = 0; | ||
| 460 | - for (const key of symbolKeysA) { | ||
| 461 | - if (hasEnumerable(val1, key)) { | ||
| 462 | - if (!hasEnumerable(val2, key)) { | ||
| 463 | - return false; | ||
| 464 | - } | ||
| 465 | - ArrayPrototypePush(keys2, key); | ||
| 466 | - count++; | ||
| 467 | - } else if (hasEnumerable(val2, key)) { | ||
| 468 | - return false; | ||
| 469 | - } | ||
| 470 | - } | ||
| 471 | - const symbolKeysB = getOwnSymbols(val2); | ||
| 472 | - if (symbolKeysA.length !== symbolKeysB.length && | ||
| 473 | - getEnumerables(val2, symbolKeysB).length !== count) { | ||
| 474 | - return false; | ||
| 452 | + for (const key of getOwnSymbols(val1)) { | ||
| 453 | + if (hasEnumerable(val1, key)) { | ||
| 454 | + ArrayPrototypePush(keys1, key); | ||
| 475 | 455 | } | |
| 476 | - } else { | ||
| 477 | - const symbolKeysB = getOwnSymbols(val2); | ||
| 478 | - if (symbolKeysB.length !== 0 && | ||
| 479 | - getEnumerables(val2, symbolKeysB).length !== 0) { | ||
| 480 | - return false; | ||
| 456 | + } | ||
| 457 | + for (const key of getOwnSymbols(val2)) { | ||
| 458 | + if (hasEnumerable(val2, key)) { | ||
| 459 | + ArrayPrototypePush(keys2, key); | ||
| 481 | 460 | } | |
| 482 | 461 | } | |
| 462 | + if (keys1.length !== keys2.length) { | ||
| 463 | + return false; | ||
| 464 | + } | ||
| 483 | 465 | } | |
| 484 | 466 | } | |
| 485 | 467 | ||
@@ -641,16 +623,14 @@ function partialObjectSetEquiv(array, a, b, mode, memo) { | |||
| 641 | 623 | } | |
| 642 | 624 | ||
| 643 | 625 | function arrayHasEqualElement(array, val1, mode, memo, comparator, start, end) { | |
| 644 | - let matched = false; | ||
| 645 | 626 | for (let i = end - 1; i >= start; i--) { | |
| 646 | 627 | if (comparator(val1, array[i], mode, memo)) { | |
| 647 | - // Remove the matching element to make sure we do not check that again. | ||
| 648 | - array.splice(i, 1); | ||
| 649 | - matched = true; | ||
| 650 | - break; | ||
| 628 | + // Move the matching element to make sure we do not check that again. | ||
| 629 | + array[i] = array[end]; | ||
| 630 | + return true; | ||
| 651 | 631 | } | |
| 652 | 632 | } | |
| 653 | - return matched; | ||
| 633 | + return false; | ||
| 654 | 634 | } | |
| 655 | 635 | ||
| 656 | 636 | function setObjectEquiv(array, a, b, mode, memo) { | |
@@ -792,18 +772,16 @@ function partialObjectMapEquiv(array, a, b, mode, memo) { | |||
| 792 | 772 | } | |
| 793 | 773 | ||
| 794 | 774 | function arrayHasEqualMapElement(array, key1, item1, b, mode, memo, comparator, start, end) { | |
| 795 | - let matched = false; | ||
| 796 | 775 | for (let i = end - 1; i >= start; i--) { | |
| 797 | 776 | const key2 = array[i]; | |
| 798 | 777 | if (comparator(key1, key2, mode, memo) && | |
| 799 | 778 | innerDeepEqual(item1, b.get(key2), mode, memo)) { | |
| 800 | - // Remove the matching element to make sure we do not check that again. | ||
| 801 | - array.splice(i, 1); | ||
| 802 | - matched = true; | ||
| 803 | - break; | ||
| 779 | + // Move the matching element to make sure we do not check that again. | ||
| 780 | + array[i] = array[end]; | ||
| 781 | + return true; | ||
| 804 | 782 | } | |
| 805 | 783 | } | |
| 806 | - return matched; | ||
| 784 | + return false; | ||
| 807 | 785 | } | |
| 808 | 786 | ||
| 809 | 787 | function mapObjectEquiv(array, a, b, mode, memo) { | |
@@ -892,17 +870,21 @@ function mapEquiv(a, b, mode, memo) { | |||
| 892 | 870 | } | |
| 893 | 871 | ||
| 894 | 872 | function partialSparseArrayEquiv(a, b, mode, memos, startA, startB) { | |
| 895 | - let aPos = 0; | ||
| 896 | - const keysA = ObjectKeys(a).slice(startA); | ||
| 897 | - const keysB = ObjectKeys(b).slice(startB); | ||
| 898 | - if (keysA.length < keysB.length) { | ||
| 873 | + let aPos = startA; | ||
| 874 | + const keysA = ObjectKeys(a); | ||
| 875 | + const keysB = ObjectKeys(b); | ||
| 876 | + const keysBLength = keysB.length; | ||
| 877 | + const keysALength = keysA.length; | ||
| 878 | + const lenA = keysALength - startA; | ||
| 879 | + const lenB = keysBLength - startB; | ||
| 880 | + if (lenA < lenB) { | ||
| 899 | 881 | return false; | |
| 900 | 882 | } | |
| 901 | - for (let i = 0; i < keysB.length; i++) { | ||
| 902 | - const keyB = keysB[i]; | ||
| 883 | + for (let i = 0; i < lenB; i++) { | ||
| 884 | + const keyB = keysB[startB + i]; | ||
| 903 | 885 | while (!innerDeepEqual(a[keysA[aPos]], b[keyB], mode, memos)) { | |
| 904 | 886 | aPos++; | |
| 905 | - if (aPos > keysA.length - keysB.length + i) { | ||
| 887 | + if (aPos > keysALength - lenB + i) { | ||
| 906 | 888 | return false; | |
| 907 | 889 | } | |
| 908 | 890 | } | |
@@ -973,8 +955,11 @@ function objEquiv(a, b, mode, keys1, keys2, memos, iterationType) { | |||
| 973 | 955 | // property in V8 13.0 compared to calling Object.propertyIsEnumerable() | |
| 974 | 956 | // and accessing the property regularly. | |
| 975 | 957 | const descriptor = ObjectGetOwnPropertyDescriptor(a, key); | |
| 976 | - if (!descriptor?.enumerable || | ||
| 977 | - !innerDeepEqual(descriptor.value !== undefined ? descriptor.value : a[key], b[key], mode, memos)) { | ||
| 958 | + if (descriptor === undefined || descriptor.enumerable !== true) { | ||
| 959 | + return false; | ||
| 960 | + } | ||
| 961 | + const value = descriptor.writable !== undefined ? descriptor.value : a[key]; | ||
| 962 | + if (!innerDeepEqual(value, b[key], mode, memos)) { | ||
| 978 | 963 | return false; | |
| 979 | 964 | } | |
| 980 | 965 | } | |
@@ -1023,10 +1008,7 @@ module.exports = { | |||
| 1023 | 1008 | return detectCycles(val1, val2, kLoose); | |
| 1024 | 1009 | }, | |
| 1025 | 1010 | isDeepStrictEqual(val1, val2, skipPrototype) { | |
| 1026 | - if (skipPrototype) { | ||
| 1027 | - return detectCycles(val1, val2, kStrictWithoutPrototypes); | ||
| 1028 | - } | ||
| 1029 | - return detectCycles(val1, val2, kStrict); | ||
| 1011 | + return detectCycles(val1, val2, skipPrototype ? kStrictWithoutPrototypes : kStrict); | ||
| 1030 | 1012 | }, | |
| 1031 | 1013 | isPartialStrictEqual(val1, val2) { | |
| 1032 | 1014 | return detectCycles(val1, val2, kPartial); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -35,7 +35,12 @@ suite('equalArrayPairs', () => { | |||
| 35 | 35 | test('', () => { | |
| 36 | 36 | // eslint-disable-next-line no-restricted-properties | |
| 37 | 37 | assert.deepEqual(arrayPair[0], arrayPair[1]); | |
| 38 | + // eslint-disable-next-line no-restricted-properties | ||
| 39 | + assert.deepEqual(arrayPair[1], arrayPair[0]); | ||
| 38 | 40 | assert.deepStrictEqual(arrayPair[0], arrayPair[1]); | |
| 41 | + assert.deepStrictEqual(arrayPair[1], arrayPair[0]); | ||
| 42 | + assert.partialDeepStrictEqual(arrayPair[0], arrayPair[1]); | ||
| 43 | + assert.partialDeepStrictEqual(arrayPair[1], arrayPair[0]); | ||
| 39 | 44 | }); | |
| 40 | 45 | } | |
| 41 | 46 | }); | |
@@ -51,10 +56,24 @@ suite('looseEqualArrayPairs', () => { | |||
| 51 | 56 | test('', () => { | |
| 52 | 57 | // eslint-disable-next-line no-restricted-properties | |
| 53 | 58 | assert.deepEqual(arrayPair[0], arrayPair[1]); | |
| 59 | + // eslint-disable-next-line no-restricted-properties | ||
| 60 | + assert.deepEqual(arrayPair[1], arrayPair[0]); | ||
| 54 | 61 | assert.throws( | |
| 55 | 62 | makeBlock(assert.deepStrictEqual, arrayPair[0], arrayPair[1]), | |
| 56 | 63 | assert.AssertionError | |
| 57 | 64 | ); | |
| 65 | + assert.throws( | ||
| 66 | + makeBlock(assert.deepStrictEqual, arrayPair[1], arrayPair[0]), | ||
| 67 | + assert.AssertionError | ||
| 68 | + ); | ||
| 69 | + assert.throws( | ||
| 70 | + makeBlock(assert.partialDeepStrictEqual, arrayPair[0], arrayPair[1]), | ||
| 71 | + assert.AssertionError | ||
| 72 | + ); | ||
| 73 | + assert.throws( | ||
| 74 | + makeBlock(assert.partialDeepStrictEqual, arrayPair[1], arrayPair[0]), | ||
| 75 | + assert.AssertionError | ||
| 76 | + ); | ||
| 58 | 77 | }); | |
| 59 | 78 | } | |
| 60 | 79 | }); | |
@@ -65,7 +84,7 @@ suite('notEqualArrayPairs', () => { | |||
| 65 | 84 | [new Int16Array(256), new Uint16Array(256)], | |
| 66 | 85 | [new Int16Array([256]), new Uint16Array([256])], | |
| 67 | 86 | [new Float64Array([+0.0]), new Float32Array([-0.0])], | |
| 68 | - [new Uint8Array(2), new Uint8Array(3)], | ||
| 87 | + [new Uint8Array(2), new Uint8Array(3), 'unequal length'], | ||
| 69 | 88 | [new Uint8Array([1, 2, 3]), new Uint8Array([4, 5, 6])], | |
| 70 | 89 | [new Uint8ClampedArray([300, 2, 3]), new Uint8Array([300, 2, 3])], | |
| 71 | 90 | [new Uint16Array([2]), new Uint16Array([3])], | |
@@ -74,17 +93,17 @@ suite('notEqualArrayPairs', () => { | |||
| 74 | 93 | [new Int16Array([-256]), new Uint16Array([0xff00])], // same bits | |
| 75 | 94 | [new Int32Array([-256]), new Uint32Array([0xffffff00])], // ditto | |
| 76 | 95 | [new Float16Array([0.1]), new Float16Array([0.0])], | |
| 77 | - [new Float16Array([0.1]), new Float16Array([0.1, 0.2])], | ||
| 96 | + [new Float16Array([0.1]), new Float16Array([0.1, 0.2]), 'unequal length'], | ||
| 78 | 97 | [new Float32Array([0.1]), new Float32Array([0.0])], | |
| 79 | - [new Float32Array([0.1]), new Float32Array([0.1, 0.2])], | ||
| 98 | + [new Float32Array([0.1]), new Float32Array([0.1, 0.2]), 'unequal length'], | ||
| 80 | 99 | [new Float64Array([0.1]), new Float64Array([0.0])], | |
| 81 | 100 | [new Uint8Array([1, 2, 3]).buffer, new Uint8Array([4, 5, 6]).buffer], | |
| 82 | 101 | [ | |
| 83 | 102 | new Uint8Array(new SharedArrayBuffer(3)).fill(1).buffer, | |
| 84 | 103 | new Uint8Array(new SharedArrayBuffer(3)).fill(2).buffer, | |
| 85 | 104 | ], | |
| 86 | - [new ArrayBuffer(2), new ArrayBuffer(3)], | ||
| 87 | - [new SharedArrayBuffer(2), new SharedArrayBuffer(3)], | ||
| 105 | + [new ArrayBuffer(2), new ArrayBuffer(3), 'unequal length'], | ||
| 106 | + [new SharedArrayBuffer(2), new SharedArrayBuffer(3), 'unequal length'], | ||
| 88 | 107 | [new ArrayBuffer(2), new SharedArrayBuffer(3)], | |
| 89 | 108 | [ | |
| 90 | 109 | new Uint8Array(new ArrayBuffer(3)).fill(1).buffer, | |
@@ -101,14 +120,31 @@ suite('notEqualArrayPairs', () => { | |||
| 101 | 120 | makeBlock(assert.deepEqual, arrayPair[0], arrayPair[1]), | |
| 102 | 121 | assert.AssertionError | |
| 103 | 122 | ); | |
| 123 | + assert.throws( | ||
| 124 | + // eslint-disable-next-line no-restricted-properties | ||
| 125 | + makeBlock(assert.deepEqual, arrayPair[1], arrayPair[0]), | ||
| 126 | + assert.AssertionError | ||
| 127 | + ); | ||
| 104 | 128 | assert.throws( | |
| 105 | 129 | makeBlock(assert.deepStrictEqual, arrayPair[0], arrayPair[1]), | |
| 106 | 130 | assert.AssertionError | |
| 107 | 131 | ); | |
| 132 | + assert.throws( | ||
| 133 | + makeBlock(assert.deepStrictEqual, arrayPair[1], arrayPair[0]), | ||
| 134 | + assert.AssertionError | ||
| 135 | + ); | ||
| 108 | 136 | assert.throws( | |
| 109 | 137 | makeBlock(assert.partialDeepStrictEqual, arrayPair[0], arrayPair[1]), | |
| 110 | 138 | assert.AssertionError | |
| 111 | 139 | ); | |
| 140 | + if (arrayPair[2]) { | ||
| 141 | + assert.partialDeepStrictEqual(arrayPair[1], arrayPair[0]); | ||
| 142 | + } else { | ||
| 143 | + assert.throws( | ||
| 144 | + makeBlock(assert.partialDeepStrictEqual, arrayPair[1], arrayPair[0]), | ||
| 145 | + assert.AssertionError | ||
| 146 | + ); | ||
| 147 | + } | ||
| 112 | 148 | }); | |
| 113 | 149 | } | |
| 114 | 150 | }); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments