aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/JSBuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc/bindings/JSBuffer.cpp')
-rw-r--r--src/javascript/jsc/bindings/JSBuffer.cpp95
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)
{