From ed421855d70c64f55a5cb15a1a46798457697d3e Mon Sep 17 00:00:00 2001 From: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> Date: Sat, 21 Jan 2023 04:06:06 -0800 Subject: [buffer] Add faster path for Uint8Array --- src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp | 8 +++++++- src/bun.js/builtins/js/JSBufferConstructor.js | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp index 213060f58..7025ea8b8 100644 --- a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp +++ b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp @@ -51,7 +51,7 @@ namespace WebCore { const JSC::ConstructAbility s_jsBufferConstructorFromCodeConstructAbility = JSC::ConstructAbility::CannotConstruct; const JSC::ConstructorKind s_jsBufferConstructorFromCodeConstructorKind = JSC::ConstructorKind::None; const JSC::ImplementationVisibility s_jsBufferConstructorFromCodeImplementationVisibility = JSC::ImplementationVisibility::Public; -const int s_jsBufferConstructorFromCodeLength = 1832; +const int s_jsBufferConstructorFromCodeLength = 1984; static const JSC::Intrinsic s_jsBufferConstructorFromCodeIntrinsic = JSC::NoIntrinsic; const char* const s_jsBufferConstructorFromCode = "(function (items) {\n" \ @@ -65,6 +65,12 @@ const char* const s_jsBufferConstructorFromCode = " \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.\",\n" \ " );\n" \ "\n" \ + " if (@argumentCount() === 1 && @isTypedArrayView(items)) {\n" \ + " var out = this.allocUnsafe(items.byteLength);\n" \ + " out.copy(items);\n" \ + " return out;\n" \ + " }\n" \ + "\n" \ " //\n" \ " if (\n" \ " typeof items === \"string\" ||\n" \ diff --git a/src/bun.js/builtins/js/JSBufferConstructor.js b/src/bun.js/builtins/js/JSBufferConstructor.js index 9f61220cc..4c3650360 100644 --- a/src/bun.js/builtins/js/JSBufferConstructor.js +++ b/src/bun.js/builtins/js/JSBufferConstructor.js @@ -36,6 +36,12 @@ function from(items) { "The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.", ); + if (@argumentCount() === 1 && @isTypedArrayView(items)) { + var out = this.allocUnsafe(items.byteLength); + out.copy(items); + return out; + } + // TODO: figure out why private symbol not found if ( typeof items === "string" || -- cgit v1.2.3