aboutsummaryrefslogtreecommitdiff
path: root/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp')
-rw-r--r--src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp87
1 files changed, 50 insertions, 37 deletions
diff --git a/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp b/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp
index a268cf2ce..68155a460 100644
--- a/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp
+++ b/src/javascript/jsc/bindings/ReadableStreamBuiltins.cpp
@@ -119,82 +119,73 @@ const char* const s_readableStreamInitializeReadableStreamCode =
const JSC::ConstructAbility s_readableStreamCreateNativeReadableStreamCodeConstructAbility = JSC::ConstructAbility::CannotConstruct;
const JSC::ConstructorKind s_readableStreamCreateNativeReadableStreamCodeConstructorKind = JSC::ConstructorKind::None;
-const int s_readableStreamCreateNativeReadableStreamCodeLength = 2905;
+const int s_readableStreamCreateNativeReadableStreamCodeLength = 3152;
static const JSC::Intrinsic s_readableStreamCreateNativeReadableStreamCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_readableStreamCreateNativeReadableStreamCode =
- "(function (nativePtr, nativeType) {\n" \
+ "(function (nativePtr, nativeType, autoAllocateChunkSize) {\n" \
" \"use strict\";\n" \
" var cached = globalThis[Symbol.for(\"Bun.nativeReadableStreamPrototype\")] ||= new @Map;\n" \
" var Prototype = cached.@get(nativeType);\n" \
" if (Prototype === @undefined) {\n" \
" var [pull, start, cancel, setClose, deinit] = globalThis[Symbol.for(\"Bun.lazy\")](nativeType);\n" \
" var closer = [false];\n" \
- "\n" \
+ "var handleResult;\n" \
" function handleNativeReadableStreamPromiseResult(val) {\n" \
" \"use strict\";\n" \
- " var {r, c} = this;\n" \
- " this.r = @undefined;\n" \
+ " var {c, v} = this;\n" \
" this.c = @undefined;\n" \
- " r(val, c);\n" \
+ " this.v = @undefined;\n" \
+ " closer[0] = false;\n" \
+ " handleResult(val, c, v);\n" \
" }\n" \
" \n" \
- " function closeNativeReadableStreamOnNextTick(controller) {\n" \
- " \"use strict\";\n" \
- " controller.close();\n" \
- " controller = @undefined;\n" \
- " } \n" \
- "\n" \
- " var handleResult = function handleResult(result, controller) {\n" \
+ " \n" \
+ " handleResult = function handleResult(result, controller, view) {\n" \
" \"use strict\";\n" \
"\n" \
" if (result && @isPromise(result)) {\n" \
- " return result.then(handleNativeReadableStreamPromiseResult.bind({c: controller, r: handleResult}), controller.error);\n" \
+ " return result.then(handleNativeReadableStreamPromiseResult.bind({c: controller, v: view}), (err) => controller.error(err));\n" \
" } else if (result !== false) {\n" \
- " controller.enqueue(result);\n" \
+ " if (view && view.byteLength === result) {\n" \
+ " controller.byobRequest.respondWithNewView(view);\n" \
+ " } else {\n" \
+ " controller.byobRequest.respond(result);\n" \
+ " }\n" \
" }\n" \
"\n" \
" if (closer[0] || result === false) {\n" \
- " @enqueueJob(closeNativeReadableStreamOnNextTick, controller);\n" \
+ " @enqueueJob(() => controller.close());\n" \
" closer[0] = false;\n" \
" }\n" \
- " }\n" \
+ " };\n" \
"\n" \
" Prototype = class NativeReadableStreamSource {\n" \
- " constructor(tag) {\n" \
+ " constructor(tag, autoAllocateChunkSize) {\n" \
" this.pull = this.pull_.bind(tag);\n" \
- " this.start = this.start_.bind(tag);\n" \
" this.cancel = this.cancel_.bind(tag);\n" \
+ " this.autoAllocateChunkSize = autoAllocateChunkSize;\n" \
" }\n" \
"\n" \
" pull;\n" \
- " start;\n" \
" cancel;\n" \
- " \n" \
- " pull_(controller) {\n" \
- " closer[0] = false;\n" \
- " var result;\n" \
- "\n" \
- " try {\n" \
- " result = pull(this, closer);\n" \
- " } catch(err) {\n" \
- " return controller.error(err);\n" \
- " }\n" \
"\n" \
- " return handleResult(result, controller);\n" \
- " }\n" \
+ " type = \"bytes\";\n" \
+ " autoAllocateChunkSize = 0;\n" \
"\n" \
- " start_(controller) {\n" \
- " setClose(this, controller.close);\n" \
+ " static startSync = start;\n" \
+ " \n" \
+ " pull_(controller) {\n" \
" closer[0] = false;\n" \
" var result;\n" \
"\n" \
+ " const view = controller.byobRequest.view;\n" \
" try {\n" \
- " result = start(this, closer);\n" \
+ " result = pull(this, view, closer);\n" \
" } catch(err) {\n" \
" return controller.error(err);\n" \
" }\n" \
"\n" \
- " return handleResult(result, controller);\n" \
+ " return handleResult(result, controller, view);\n" \
" }\n" \
"\n" \
" cancel_(reason) {\n" \
@@ -206,7 +197,29 @@ const char* const s_readableStreamCreateNativeReadableStreamCode =
" cached.@set(nativeType, Prototype);\n" \
" }\n" \
" \n" \
- " var instance = new Prototype(nativePtr);\n" \
+ " //\n" \
+ " //\n" \
+ " //\n" \
+ " const chunkSize = Prototype.startSync(nativePtr, autoAllocateChunkSize);\n" \
+ "\n" \
+ " //\n" \
+ " if (chunkSize === 0) {\n" \
+ " return new @ReadableStream({\n" \
+ " start(controller) {\n" \
+ " controller.close();\n" \
+ " },\n" \
+ "\n" \
+ " pull() {\n" \
+ "\n" \
+ " },\n" \
+ "\n" \
+ " cancel() {\n" \
+ "\n" \
+ " },\n" \
+ " });\n" \
+ " }\n" \
+ "\n" \
+ " var instance = new Prototype(nativePtr, chunkSize);\n" \
" Prototype.registry.register(instance, nativePtr);\n" \
" var stream = new @ReadableStream(instance);\n" \
" @putByIdDirectPrivate(stream, \"bunNativeType\", nativeType);\n" \