aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-27 22:55:46 -0800
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2023-01-27 22:55:46 -0800
commitaff91436c0998b0368f0970fa0da42afa09640fc (patch)
tree5b906088b4143c4c4963454246181fb1bf0728d5
parent80751586390cd0c73fab9b5ff2e9d48b7df54719 (diff)
downloadbun-aff91436c0998b0368f0970fa0da42afa09640fc.tar.gz
bun-aff91436c0998b0368f0970fa0da42afa09640fc.tar.zst
bun-aff91436c0998b0368f0970fa0da42afa09640fc.zip
`Buffer.from` doesn't need to be the Buffer constructor
-rw-r--r--src/bun.js/bindings/ZigGlobalObject.cpp6
-rw-r--r--src/bun.js/builtins/BunBuiltinNames.h1
-rw-r--r--src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp19
-rw-r--r--src/bun.js/builtins/js/JSBufferConstructor.js17
4 files changed, 21 insertions, 22 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp
index 756cb359d..9f6a13b40 100644
--- a/src/bun.js/bindings/ZigGlobalObject.cpp
+++ b/src/bun.js/bindings/ZigGlobalObject.cpp
@@ -3172,7 +3172,11 @@ void GlobalObject::addBuiltinGlobals(JSC::VM& vm)
putDirectCustomAccessor(vm, JSC::Identifier::fromString(vm, "CloseEvent"_s), JSC::CustomGetterSetter::create(vm, JSCloseEvent_getter, nullptr),
JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly);
- putDirectCustomAccessor(vm, JSC::Identifier::fromString(vm, "Buffer"_s), JSC::CustomGetterSetter::create(vm, JSBuffer_getter, nullptr),
+ auto bufferAccessor = JSC::CustomGetterSetter::create(vm, JSBuffer_getter, nullptr);
+
+ putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames().BufferPublicName(), bufferAccessor,
+ JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly);
+ putDirectCustomAccessor(vm, static_cast<JSVMClientData*>(vm.clientData)->builtinNames().BufferPrivateName(), bufferAccessor,
JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly);
PUT_WEBCORE_GENERATED_CONSTRUCTOR("TextEncoder"_s, JSTextEncoder);
diff --git a/src/bun.js/builtins/BunBuiltinNames.h b/src/bun.js/builtins/BunBuiltinNames.h
index 535ae2b5c..b9a9dfe13 100644
--- a/src/bun.js/builtins/BunBuiltinNames.h
+++ b/src/bun.js/builtins/BunBuiltinNames.h
@@ -22,6 +22,7 @@ using namespace JSC;
#define BUN_COMMON_PRIVATE_IDENTIFIERS_EACH_PROPERTY_NAME(macro) \
macro(AbortSignal) \
+ macro(Buffer) \
macro(Bun) \
macro(Loader) \
macro(ReadableByteStreamController) \
diff --git a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp
index a38be91a7..958126784 100644
--- a/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp
+++ b/src/bun.js/builtins/cpp/JSBufferConstructorBuiltins.cpp
@@ -51,15 +51,12 @@ 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 = 1843;
+const int s_jsBufferConstructorFromCodeLength = 1762;
static const JSC::Intrinsic s_jsBufferConstructorFromCodeIntrinsic = JSC::NoIntrinsic;
const char* const s_jsBufferConstructorFromCode =
"(function (items) {\n" \
" \"use strict\";\n" \
"\n" \
- " if (!@isConstructor(this))\n" \
- " @throwTypeError(\"Buffer.from requires |this| to be a constructor\");\n" \
- "\n" \
" if (@isUndefinedOrNull(items)) {\n" \
" @throwTypeError(\n" \
" \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.\",\n" \
@@ -78,13 +75,13 @@ const char* const s_jsBufferConstructorFromCode =
" ) {\n" \
" switch (@argumentCount()) {\n" \
" case 1: {\n" \
- " return new this(items);\n" \
+ " return new @Buffer(items);\n" \
" }\n" \
" case 2: {\n" \
- " return new this(items, @argument(1));\n" \
+ " return new @Buffer(items, @argument(1));\n" \
" }\n" \
" default: {\n" \
- " return new this(items, @argument(1), @argument(2));\n" \
+ " return new @Buffer(items, @argument(1), @argument(2));\n" \
" }\n" \
" }\n" \
" }\n" \
@@ -103,13 +100,13 @@ const char* const s_jsBufferConstructorFromCode =
" if (typeof primitive === \"string\") {\n" \
" switch (@argumentCount()) {\n" \
" case 1: {\n" \
- " return new this(primitive);\n" \
+ " return new @Buffer(primitive);\n" \
" }\n" \
" case 2: {\n" \
- " return new this(primitive, @argument(1));\n" \
+ " return new @Buffer(primitive, @argument(1));\n" \
" }\n" \
" default: {\n" \
- " return new this(primitive, @argument(1), @argument(2));\n" \
+ " return new @Buffer(primitive, @argument(1), @argument(2));\n" \
" }\n" \
" }\n" \
" }\n" \
@@ -125,7 +122,7 @@ const char* const s_jsBufferConstructorFromCode =
" //\n" \
" //\n" \
" //\n" \
- " return new this(@Uint8Array.from(arrayLike).buffer);\n" \
+ " return new @Buffer(@Uint8Array.from(arrayLike).buffer);\n" \
"})\n" \
;
diff --git a/src/bun.js/builtins/js/JSBufferConstructor.js b/src/bun.js/builtins/js/JSBufferConstructor.js
index 10994394e..eecd52568 100644
--- a/src/bun.js/builtins/js/JSBufferConstructor.js
+++ b/src/bun.js/builtins/js/JSBufferConstructor.js
@@ -28,9 +28,6 @@
function from(items) {
"use strict";
- if (!@isConstructor(this))
- @throwTypeError("Buffer.from requires |this| to be a constructor");
-
if (@isUndefinedOrNull(items)) {
@throwTypeError(
"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.",
@@ -49,13 +46,13 @@ function from(items) {
) {
switch (@argumentCount()) {
case 1: {
- return new this(items);
+ return new @Buffer(items);
}
case 2: {
- return new this(items, @argument(1));
+ return new @Buffer(items, @argument(1));
}
default: {
- return new this(items, @argument(1), @argument(2));
+ return new @Buffer(items, @argument(1), @argument(2));
}
}
}
@@ -74,13 +71,13 @@ function from(items) {
if (typeof primitive === "string") {
switch (@argumentCount()) {
case 1: {
- return new this(primitive);
+ return new @Buffer(primitive);
}
case 2: {
- return new this(primitive, @argument(1));
+ return new @Buffer(primitive, @argument(1));
}
default: {
- return new this(primitive, @argument(1), @argument(2));
+ return new @Buffer(primitive, @argument(1), @argument(2));
}
}
}
@@ -96,5 +93,5 @@ function from(items) {
// Don't pass the second argument because Node's Buffer.from doesn't accept
// a function and Uint8Array.from requires it if it exists
// That means we cannot use @tailCallFowrardArguments here, sadly
- return new this(@Uint8Array.from(arrayLike).buffer);
+ return new @Buffer(@Uint8Array.from(arrayLike).buffer);
}