mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
fix(node:buffer): fix the behavior of totalLength in Buffer.concat (#6574)
* fix(node:buffer): fix the behavior of `totalLength` in `Buffer.concat` Close: #6570 Close: #3639 * fix buffer totalLength type --------- Co-authored-by: Ashcon Partovi <ashcon@partovi.net>
This commit is contained in:
@@ -742,10 +742,16 @@ static inline JSC::EncodedJSValue jsBufferConstructorFunction_concatBody(JSC::JS
|
||||
byteLength += typedArray->length();
|
||||
}
|
||||
|
||||
if (callFrame->argumentCount() > 1) {
|
||||
auto byteLengthValue = callFrame->uncheckedArgument(1);
|
||||
byteLength = std::min(byteLength, byteLengthValue.toTypedArrayIndex(lexicalGlobalObject, "totalLength must be a valid number"_s));
|
||||
JSValue totalLengthValue = callFrame->argument(1);
|
||||
if (!totalLengthValue.isUndefined()) {
|
||||
if (UNLIKELY(!totalLengthValue.isNumber())) {
|
||||
throwTypeError(lexicalGlobalObject, throwScope, "totalLength must be a valid number"_s);
|
||||
return JSValue::encode(jsUndefined());
|
||||
}
|
||||
|
||||
auto totalLength = totalLengthValue.toTypedArrayIndex(lexicalGlobalObject, "totalLength must be a valid number"_s);
|
||||
RETURN_IF_EXCEPTION(throwScope, {});
|
||||
byteLength = totalLength;
|
||||
}
|
||||
|
||||
if (byteLength == 0) {
|
||||
|
||||
@@ -1327,6 +1327,20 @@ it("Buffer.concat", () => {
|
||||
expect(Buffer.concat([array1, array2, array3], 222).length).toBe(222);
|
||||
expect(Buffer.concat([array1, array2, array3], 222).subarray(0, 128).join("")).toBe("100".repeat(128));
|
||||
expect(Buffer.concat([array1, array2, array3], 222).subarray(129, 222).join("")).toBe("200".repeat(222 - 129));
|
||||
expect(() => {
|
||||
Buffer.concat([array1], -1);
|
||||
}).toThrow(RangeError);
|
||||
expect(() => {
|
||||
Buffer.concat([array1], "1");
|
||||
}).toThrow(TypeError);
|
||||
// issue#6570
|
||||
expect(Buffer.concat([array1, array2, array3], undefined).join("")).toBe(
|
||||
array1.join("") + array2.join("") + array3.join(""),
|
||||
);
|
||||
// issue#3639
|
||||
expect(Buffer.concat([array1, array2, array3], 128 * 4).join("")).toBe(
|
||||
array1.join("") + array2.join("") + array3.join("") + Buffer.alloc(128).join(""),
|
||||
);
|
||||
});
|
||||
|
||||
it("read", () => {
|
||||
|
||||
Reference in New Issue
Block a user