aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-21 04:06:06 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-21 04:06:06 -0800
commited421855d70c64f55a5cb15a1a46798457697d3e (patch)
treef4177544ce601d0c6051d0f687084f605969753b
parent627da4452714bc7126db776682882afd26f89516 (diff)
downloadbun-ed421855d70c64f55a5cb15a1a46798457697d3e.tar.gz
bun-ed421855d70c64f55a5cb15a1a46798457697d3e.tar.zst
bun-ed421855d70c64f55a5cb15a1a46798457697d3e.zip
[buffer] Add faster path for Uint8Array
-rw-r--r--src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp8
-rw-r--r--src/bun.js/builtins/js/JSBufferConstructor.js6
2 files changed, 13 insertions, 1 deletions
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" ||