mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
fix buffer.copy (#1113)
This commit is contained in:
@@ -800,25 +800,23 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_copyBody(JSC::JSGlob
|
||||
}
|
||||
|
||||
size_t targetStart = 0;
|
||||
size_t targetEndInit = view->byteLength();
|
||||
size_t targetEnd = targetEndInit;
|
||||
size_t targetEnd = view->byteLength();
|
||||
|
||||
size_t sourceStart = 0;
|
||||
size_t sourceEndInit = castedThis->byteLength();
|
||||
size_t sourceEnd = sourceEndInit;
|
||||
|
||||
if (callFrame->argumentCount() > 1) {
|
||||
if (auto targetEnd_ = callFrame->uncheckedArgument(1).tryGetAsUint32Index()) {
|
||||
targetStart = targetEnd_.value();
|
||||
if (auto targetStart_ = callFrame->uncheckedArgument(1).tryGetAsUint32Index()) {
|
||||
targetStart = targetStart_.value();
|
||||
} else {
|
||||
throwVMTypeError(lexicalGlobalObject, throwScope, "Expected number"_s);
|
||||
return JSValue::encode(jsUndefined());
|
||||
}
|
||||
|
||||
if (callFrame->argumentCount() > 2) {
|
||||
auto targetEndArgument = callFrame->uncheckedArgument(2);
|
||||
if (auto targetEnd_ = targetEndArgument.tryGetAsUint32Index()) {
|
||||
targetEnd = targetEnd_.value();
|
||||
if (auto sourceStart_ = callFrame->uncheckedArgument(2).tryGetAsUint32Index()) {
|
||||
sourceStart = sourceStart_.value();
|
||||
} else {
|
||||
throwVMTypeError(lexicalGlobalObject, throwScope, "Expected number"_s);
|
||||
return JSValue::encode(jsUndefined());
|
||||
@@ -826,19 +824,8 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_copyBody(JSC::JSGlob
|
||||
}
|
||||
|
||||
if (callFrame->argumentCount() > 3) {
|
||||
auto targetEndArgument = callFrame->uncheckedArgument(3);
|
||||
if (auto targetEnd_ = targetEndArgument.tryGetAsUint32Index()) {
|
||||
sourceStart = targetEnd_.value();
|
||||
} else {
|
||||
throwVMTypeError(lexicalGlobalObject, throwScope, "Expected number"_s);
|
||||
return JSValue::encode(jsUndefined());
|
||||
}
|
||||
}
|
||||
|
||||
if (callFrame->argumentCount() > 4) {
|
||||
auto targetEndArgument = callFrame->uncheckedArgument(4);
|
||||
if (auto targetEnd_ = targetEndArgument.tryGetAsUint32Index()) {
|
||||
sourceEnd = targetEnd_.value();
|
||||
if (auto sourceEnd_ = callFrame->uncheckedArgument(3).tryGetAsUint32Index()) {
|
||||
sourceEnd = sourceEnd_.value();
|
||||
} else {
|
||||
throwVMTypeError(lexicalGlobalObject, throwScope, "Expected number"_s);
|
||||
return JSValue::encode(jsUndefined());
|
||||
@@ -846,7 +833,7 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_copyBody(JSC::JSGlob
|
||||
}
|
||||
}
|
||||
|
||||
targetStart = std::min(targetStart, std::min(targetEnd, targetEndInit));
|
||||
targetStart = std::min(targetStart, targetEnd);
|
||||
sourceStart = std::min(sourceStart, std::min(sourceEnd, sourceEndInit));
|
||||
|
||||
auto sourceLength = sourceEnd - sourceStart;
|
||||
|
||||
@@ -209,6 +209,33 @@ it("Buffer.copy", () => {
|
||||
gc();
|
||||
expect(array1.copy(array2)).toBe(128);
|
||||
expect(array1.join("")).toBe(array2.join(""));
|
||||
|
||||
{
|
||||
// Create two `Buffer` instances.
|
||||
const buf1 = Buffer.allocUnsafe(26);
|
||||
const buf2 = Buffer.allocUnsafe(26).fill('!');
|
||||
|
||||
for (let i = 0; i < 26; i++) {
|
||||
// 97 is the decimal ASCII value for 'a'.
|
||||
buf1[i] = i + 97;
|
||||
}
|
||||
|
||||
// Copy `buf1` bytes 16 through 19 into `buf2` starting at byte 8 of `buf2`.
|
||||
buf1.copy(buf2, 8, 16, 20);
|
||||
expect(buf2.toString('ascii', 0, 25)).toBe('!!!!!!!!qrst!!!!!!!!!!!!!');
|
||||
}
|
||||
|
||||
{
|
||||
const buf = Buffer.allocUnsafe(26);
|
||||
|
||||
for (let i = 0; i < 26; i++) {
|
||||
// 97 is the decimal ASCII value for 'a'.
|
||||
buf[i] = i + 97;
|
||||
}
|
||||
|
||||
buf.copy(buf, 0, 4, 10);
|
||||
expect(buf.toString()).toBe('efghijghijklmnopqrstuvwxyz');
|
||||
}
|
||||
});
|
||||
|
||||
export function fillRepeating(dstBuffer, start, end) {
|
||||
|
||||
Reference in New Issue
Block a user