haikuwebkit/LayoutTests/js/array-join-expected.txt

44 lines
2.3 KiB
Plaintext
Raw Permalink Normal View History

[JSC] Array.prototype.join() fails some conformance tests https://bugs.webkit.org/show_bug.cgi?id=159657 Patch by Benjamin Poulain <bpoulain@apple.com> on 2016-07-12 Reviewed by Saam Barati. Source/JavaScriptCore: There were a couple of failures: -separator.toString() was called *before* we get the length and process ToLength() on it. -We were using toUInt32() on length instead of ToLength(), failing on big integers and various negative numbers. Additionally, I replaced the "fast" ArrayStorage path by a fully generic implementation that does not depends on StringJoiner. The reason is StringJoiner was doing poorly on sparse objects in certain cases. If you have a sparse object with a length > INT_MAX but very few indices defined, and you join on the empty string, it should be possible to join the array (albeit very slowly). With StringJoiner, we fail because we try to allocate > INT_MAX empty strings in a contiguous vector. * runtime/ArrayPrototype.cpp: (JSC::slowJoin): (JSC::canUseFastJoin): (JSC::fastJoin): (JSC::arrayProtoFuncJoin): (JSC::join): Deleted. * runtime/JSArray.h: (JSC::toLength): Source/WTF: * wtf/text/AtomicString.cpp: (WTF::AtomicString::number): * wtf/text/AtomicString.h: LayoutTests: I removed 3 sputnik tests that are incorrect in the latest spec. In ES5, Array.prototype.join() was using ToUint32 on the argument: https://es5.github.io/#x15.4.4.5 In ES6, the function uses ToLength: https://tc39.github.io/ecma262/#sec-array.prototype.join The test use Infinity and very large integer as the length. They are guaranteed to time out or run out of memory. Even if we waited the hours it takes to run this, the results would be different from what the tests expect. * js/array-join-expected.txt: Added. * js/array-join.html: Added. * js/script-tests/array-join.js: Added. Canonical link: https://commits.webkit.org/177847@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@203147 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-07-13 01:25:25 +00:00
Verify Array.prototype.join() properties
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Function properties
PASS typeof Array.prototype.join is "function"
PASS Array.prototype.join.name is "join"
PASS Array.prototype.join.length is 1
PASS Object.getOwnPropertyDescriptor(Array.prototype, 'join').configurable is true
PASS Object.getOwnPropertyDescriptor(Array.prototype, 'join').enumerable is false
PASS Object.getOwnPropertyDescriptor(Array.prototype, 'join').writable is true
Int32 Array
PASS [1, 2, 3].join() is "1,2,3"
PASS [1, 2, 3].join('') is "123"
PASS [1, 2, 3].join('柰') is "1柰2柰3"
Double Array
PASS [Math.PI, Math.E, 6.626].join() is "3.141592653589793,2.718281828459045,6.626"
PASS [Math.PI, Math.E, 6.626].join('') is "3.1415926535897932.7182818284590456.626"
PASS [Math.PI, Math.E, 6.626].join('柰') is "3.141592653589793柰2.718281828459045柰6.626"
Contiguous Array
PASS [1, 'WebKit', { toString: () => { return 'IsIncredible'} }].join() is "1,WebKit,IsIncredible"
PASS [1, 'WebKit', { toString: () => { return 'IsIncredible'} }].join('') is "1WebKitIsIncredible"
PASS [1, 'WebKit', { toString: () => { return 'IsIncredible'} }].join('柰') is "1柰WebKit柰IsIncredible"
Sparse Array
PASS smallSparseArray.join() is "WebKit,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,15"
PASS smallSparseArray.join('') is "WebKit15"
PASS smallSparseArray.join('柰') is "WebKit柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰柰15"
PASS largeSparseArray1.join('') is "WebKit42"
PASS largeSparseArray2.join('') is "WebKit42"
Out of memory
[JSC] Make OutOfMemory error as instance of RangeError https://bugs.webkit.org/show_bug.cgi?id=211952 Reviewed by Mark Lam. JSTests: * ChakraCore/test/Error/outofmem.baseline-jsc: * es6/String.prototype_methods_String.prototype.padEnd.js: (TestMemoryLimits): * es6/String.prototype_methods_String.prototype.padStart.js: (TestMemoryLimits): * slowMicrobenchmarks/function-constructor-with-huge-strings.js: * stress/array-join-on-strings-need-overflow-checks.js: * stress/big-wasm-memory-grow-no-max.js: (test): * stress/big-wasm-memory-grow.js: (test): * stress/big-wasm-memory.js: (test): * stress/bigint-exponential-oom.js: (shouldThrow): * stress/bigint-int32-min-shift.js: (shouldThrow): * stress/check-symbol-description-oom.js: * stress/constructFunctionSkippingEvalEnabledCheck-should-throw-out-of-memory-error.js: * stress/intl-canonicalize-locale-list-error-oom.js: (shouldThrow): * stress/joined-strings-should-not-exceed-max-string-length.js: * stress/js-fixed-array-out-of-memory.js: (test): * stress/json-stringified-overflow-2.js: (catch): * stress/json-stringified-overflow.js: (catch): * stress/json-stringify-string-builder-overflow.js: * stress/missing-exception-check-in-JSValue-toWTFStringSlowCase.js: * stress/missing-exception-check-in-array-prototype-fastJoin.js: * stress/missing-exception-check-in-canonicalizeLocaleList.js: * stress/missing-exception-check-in-json-stringifier-gap.js: * stress/missing-exception-check-in-string-compare.js: * stress/missing-exception-check-in-string-greater-than-compare.js: * stress/missing-exception-check-in-string-greater-than-or-equal-compare.js: * stress/missing-exception-check-in-string-lastIndexOf.js: * stress/missing-exception-check-in-string-less-than-compare.js: * stress/missing-exception-check-in-string-less-than-or-equal-compare.js: * stress/missing-exception-check-in-string-toLower.js: * stress/missing-exception-check-in-string-toUpper.js: * stress/new_array_with_spread-should-cap-array-size-to-MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH.js: * stress/out-of-memory-while-constructing-BytecodeGenerator.js: * stress/regexp-prototype-exec-on-too-long-rope.js: * stress/regexp-prototype-match-on-too-long-rope.js: * stress/regexp-prototype-test-on-too-long-rope.js: * stress/regress-169783.js: (doTest): * stress/regress-178385.js: * stress/regress-178386.js: * stress/regress-185888.js: * stress/regress-189132.js: * stress/regress-190187.js: * stress/regress-191563.js: * stress/scoped-arguments-table-should-be-tolerant-for-oom.js: (i.canThrow): * stress/string-16bit-repeat-overflow.js: * stress/string-overflow-createError-builder.js: * stress/string-overflow-createError-fit.js: * stress/string-overflow-createError.js: * stress/string-prototype-charCodeAt-on-too-long-rope.js: * stress/string-prototype-replace-should-throw-out-of-memory-error-when-using-too-much-memory.js: * stress/switch-string-oom.js: (testLowerTiers): (testFTL): * stress/test-exception-assert-in-ExceptionHelpers-createError.js: * stress/test-out-of-memory.js: * stress/typed-array-subarray-can-throw-oom-error.js: (get bar): * wasm/regress/wasm-memory-requested-more-than-MAX_ARRAY_BUFFER_SIZE-2.js: * wasm/regress/wasm-memory-requested-more-than-MAX_ARRAY_BUFFER_SIZE.js: Source/JavaScriptCore: The spec sometimes requires "check parameters and throw RangeError" before allocating an object. But we are just allocating an object and throwing an out-of-memory error since wrong parameter will cause out-of-memory. If out-of-memory error is RangeError, then we can keep our current behavior while we can make us spec compliant. And note that out-of-memory error is RangeError in SpiderMonkey and V8. This patch makes out-of-memory error as RangeError instead of Error. We also fix @throwOutOfMemoryError in builtin code: the previous thrown errors are not marked as out-of-memory error. * bytecode/BytecodeList.rb: * bytecompiler/BytecodeGenerator.cpp: (JSC::BytecodeGenerator::emitThrowStaticError): (JSC::BytecodeGenerator::emitThrowReferenceError): (JSC::BytecodeGenerator::emitThrowTypeError): (JSC::BytecodeGenerator::emitThrowRangeError): (JSC::BytecodeGenerator::emitThrowOutOfMemoryError): * bytecompiler/BytecodeGenerator.h: * bytecompiler/NodesCodegen.cpp: (JSC::RegExpNode::emitBytecode): (JSC::BytecodeIntrinsicNode::emit_intrinsic_throwTypeError): (JSC::BytecodeIntrinsicNode::emit_intrinsic_throwRangeError): * dfg/DFGOperations.cpp: * runtime/CommonSlowPaths.cpp: (JSC::SLOW_PATH_DECL): * runtime/Error.cpp: (JSC::createError): (JSC::createOutOfMemoryError): * runtime/Error.h: * runtime/ErrorType.cpp: (JSC::errorTypeName): (WTF::printInternal): * runtime/ErrorType.h: We introduced ErrorTypeWithExtension separately from ErrorType to keep ErrorType one-on-one to spec-specified error types. LayoutTests: * inspector/debugger/no-pause-out-of-memory-exception-expected.txt: * js/array-join-expected.txt: * js/dom/concat-large-strings-crash-expected.txt: * js/dom/concat-large-strings-crash2-expected.txt: * js/dom/script-tests/string-replacement-outofmemory.js: * js/dom/string-concatenate-outofmemory-expected.txt: * js/dom/string-replacement-outofmemory-expected.txt: * js/large-expressions-expected.txt: * js/resources/string-concatenate-outofmemory.js: * js/script-tests/array-join.js: * js/script-tests/stack-overflow-regexp.js: (shouldThrow.recursiveCall): (shouldThrow): * js/script-tests/string-padend.js: * js/script-tests/string-padstart.js: * js/script-tests/string-repeat.js: * js/script-tests/stringimpl-to-jsstring-on-large-strings-1.js: * js/stack-overflow-regexp-expected.txt: * js/string-padend-expected.txt: * js/string-padstart-expected.txt: * js/string-repeat-expected.txt: * js/stringimpl-to-jsstring-on-large-strings-1-expected.txt: Canonical link: https://commits.webkit.org/224872@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@261780 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-05-16 08:24:22 +00:00
PASS oversizedArray.join('') threw exception RangeError: Out of memory.
[JSC] Array.prototype.join() fails some conformance tests https://bugs.webkit.org/show_bug.cgi?id=159657 Patch by Benjamin Poulain <bpoulain@apple.com> on 2016-07-12 Reviewed by Saam Barati. Source/JavaScriptCore: There were a couple of failures: -separator.toString() was called *before* we get the length and process ToLength() on it. -We were using toUInt32() on length instead of ToLength(), failing on big integers and various negative numbers. Additionally, I replaced the "fast" ArrayStorage path by a fully generic implementation that does not depends on StringJoiner. The reason is StringJoiner was doing poorly on sparse objects in certain cases. If you have a sparse object with a length > INT_MAX but very few indices defined, and you join on the empty string, it should be possible to join the array (albeit very slowly). With StringJoiner, we fail because we try to allocate > INT_MAX empty strings in a contiguous vector. * runtime/ArrayPrototype.cpp: (JSC::slowJoin): (JSC::canUseFastJoin): (JSC::fastJoin): (JSC::arrayProtoFuncJoin): (JSC::join): Deleted. * runtime/JSArray.h: (JSC::toLength): Source/WTF: * wtf/text/AtomicString.cpp: (WTF::AtomicString::number): * wtf/text/AtomicString.h: LayoutTests: I removed 3 sputnik tests that are incorrect in the latest spec. In ES5, Array.prototype.join() was using ToUint32 on the argument: https://es5.github.io/#x15.4.4.5 In ES6, the function uses ToLength: https://tc39.github.io/ecma262/#sec-array.prototype.join The test use Infinity and very large integer as the length. They are guaranteed to time out or run out of memory. Even if we waited the hours it takes to run this, the results would be different from what the tests expect. * js/array-join-expected.txt: Added. * js/array-join.html: Added. * js/script-tests/array-join.js: Added. Canonical link: https://commits.webkit.org/177847@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@203147 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2016-07-13 01:25:25 +00:00
ToLength is called first on "this", followed by ToString on the separator. Followed by ToString on each element.
PASS Array.prototype.join.call(calleeObject, separatorObject) is "WebKit0柰WebKit1"
PASS callSequence.join(', ') is "calle.length, length.valueOf, separator.toString, calle.get 0, index0.toString, calle.get 1, index0.toString"
We use ToLength on the object's length, not ToInt32 or ToUInt32.
PASS Array.prototype.join.call(lengthyObject) is ""
PASS Array.prototype.join.call(lengthyObject) is ""
PASS Array.prototype.join.call(lengthyObject) is ""
PASS successfullyParsed is true
TEST COMPLETE