diff options
Diffstat (limited to 'src/javascript/jsc/bindings/JSBuffer.cpp')
-rw-r--r-- | src/javascript/jsc/bindings/JSBuffer.cpp | 95 |
1 files changed, 94 insertions, 1 deletions
diff --git a/src/javascript/jsc/bindings/JSBuffer.cpp b/src/javascript/jsc/bindings/JSBuffer.cpp index ab5e0341d..8f56703ce 100644 --- a/src/javascript/jsc/bindings/JSBuffer.cpp +++ b/src/javascript/jsc/bindings/JSBuffer.cpp @@ -798,7 +798,100 @@ static inline JSC::EncodedJSValue jsBufferPrototypeFunction_fillBody(JSC::JSGlob { auto& vm = JSC::getVM(lexicalGlobalObject); - return JSC::JSValue::encode(jsUndefined()); + if (callFrame->argumentCount() < 1) { + return JSValue::encode(castedThis); + } + + auto value = callFrame->uncheckedArgument(0); + + if (!value.isString()) { + auto value_ = value.toInt32() & 0xFF; + + auto value_uint8 = static_cast<uint8_t>(value_); + auto length = castedThis->byteLength(); + auto start = 0; + auto end = length; + if (callFrame->argumentCount() > 1) { + if (auto start_ = callFrame->uncheckedArgument(1).tryGetAsUint32Index()) { + start = start_.value(); + } else { + return throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "start out of range"_s)); + } + if (callFrame->argumentCount() > 2) { + if (auto end_ = callFrame->uncheckedArgument(2).tryGetAsUint32Index()) { + end = end_.value(); + } else { + return throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "end out of range"_s)); + } + } + } + if (start > end) { + return throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "start out of range"_s)); + } + if (end > length) { + return throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "end out of range"_s)); + } + auto startPtr = castedThis->typedVector() + start; + auto endPtr = castedThis->typedVector() + end; + memset(startPtr, value_uint8, endPtr - startPtr); + return JSValue::encode(castedThis); + } + + { + EnsureStillAliveScope value_ = callFrame->argument(0); + + unsigned int length = castedThis->byteLength(); + unsigned int start = 0; + unsigned int end = length; + WebCore::BufferEncodingType encoding = WebCore::BufferEncodingType::utf8; + if (callFrame->argumentCount() > 1) { + if (auto start_ = callFrame->uncheckedArgument(1).tryGetAsUint32Index()) { + start = start_.value(); + } else { + throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "start out of range"_s)); + return JSC::JSValue::encode(jsUndefined()); + } + if (callFrame->argumentCount() > 2) { + if (auto end_ = callFrame->uncheckedArgument(2).tryGetAsUint32Index()) { + end = end_.value(); + } else { + throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "end out of range"_s)); + return JSC::JSValue::encode(jsUndefined()); + } + } + + if (callFrame->argumentCount() > 3) { + auto encoding_ = callFrame->uncheckedArgument(3).toString(lexicalGlobalObject); + + std::optional<BufferEncodingType> encoded = parseEnumeration<BufferEncodingType>(*lexicalGlobalObject, arg1.value()); + if (!encoded) { + throwTypeError(lexicalGlobalObject, scope, "Invalid encoding"); + return JSC::JSValue::encode(jsUndefined()); + } + + encoding = encoded.value(); + } + } + if (start > end) { + throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "start out of range"_s)); + return JSC::JSValue::encode(jsUndefined()); + } + if (end > length) { + throwVMError(lexicalGlobalObject, JSC::throwScope, createRangeError(lexicalGlobalObject, "end out of range"_s)); + return JSC::JSValue::encode(jsUndefined()); + } + + auto startPtr = castedThis->typedVector() + start; + + ZigString str = Zig::toString(value.toString(lexicalGlobalObject)); + + Bun__ArrayBuffer buf; + JSC__JSValue__asArrayBuffer_(JSC::JSValue::encode(castedThis), lexicalGlobalObject, + &buf); + Bun__Buffer_fill(lexicalGlobalObject, &buf, &str, start, end, encoding); + + return JSValue::encode(castedThis); + } } static inline JSC::EncodedJSValue jsBufferPrototypeFunction_includesBody(JSC::JSGlobalObject* lexicalGlobalObject, JSC::CallFrame* callFrame, typename IDLOperation<JSBuffer>::ClassParameter castedThis) { |