aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/scripts/generate-classes.ts
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-22 23:44:53 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-09-22 23:45:02 -0700
commit2c1926993bc4d94f9e7bc4d171217a707efd385c (patch)
tree827148c57920e40ad48c4c6d73ceec68a9b21c96 /src/bun.js/scripts/generate-classes.ts
parente14a3af491ece8d1b0309e76ae3022b4fad91f16 (diff)
downloadbun-2c1926993bc4d94f9e7bc4d171217a707efd385c.tar.gz
bun-2c1926993bc4d94f9e7bc4d171217a707efd385c.tar.zst
bun-2c1926993bc4d94f9e7bc4d171217a707efd385c.zip
Faster `Blob` + begin to implement `FileSink`
Diffstat (limited to 'src/bun.js/scripts/generate-classes.ts')
-rw-r--r--src/bun.js/scripts/generate-classes.ts105
1 files changed, 79 insertions, 26 deletions
diff --git a/src/bun.js/scripts/generate-classes.ts b/src/bun.js/scripts/generate-classes.ts
index 0b0bc700e..558ba5a31 100644
--- a/src/bun.js/scripts/generate-classes.ts
+++ b/src/bun.js/scripts/generate-classes.ts
@@ -401,9 +401,13 @@ void ${name}::initializeProperties(VM& vm, JSC::JSGlobalObject* globalObject, ${
const ClassInfo ${name}::s_info = { "Function"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(${name}) };
-
-extern "C" EncodedJSValue ${typeName}__getConstructor(Zig::GlobalObject* globalObject) {
- return JSValue::encode(globalObject->${className(typeName)}Constructor());
+${
+ !obj.noConstructor
+ ? `
+ extern "C" EncodedJSValue ${typeName}__getConstructor(Zig::GlobalObject* globalObject) {
+ return JSValue::encode(globalObject->${className(typeName)}Constructor());
+ }`
+ : ""
}
@@ -451,18 +455,16 @@ function renderDecls(symbolName, typeName, proto) {
"setter" in proto[name] ||
("accessor" in proto[name] && proto[name].setter)
) {
- rows
- .push(
- `extern "C" bool ${symbolName(
- typeName,
- proto[name].setter || proto[name].accessor.setter
- )}(void* ptr, JSC::JSGlobalObject* lexicalGlobalObject, EncoedJSValue value);`,
- `
+ rows.push(
+ `extern "C" bool ${symbolName(
+ typeName,
+ proto[name].setter || proto[name].accessor.setter
+ )}(void* ptr, JSC::JSGlobalObject* lexicalGlobalObject, JSC::EncodedJSValue value);`,
+ `
JSC_DECLARE_CUSTOM_SETTER(${symbolName(typeName, name)}SetterWrap);
- `,
- "\n"
- )
- .trim();
+ `.trim(),
+ "\n"
+ );
}
if ("fn" in proto[name]) {
@@ -620,7 +622,7 @@ JSC_DEFINE_CUSTOM_SETTER(${symbolName(
name
)}SetterWrap, (JSGlobalObject * lexicalGlobalObject, EncodedJSValue thisValue, EncodedJSValue encodedValue, PropertyName attributeName))
{
- auto& vm = lexicalGlobalObject>
+ auto& vm = lexicalGlobalObject->vm();
auto throwScope = DECLARE_THROW_SCOPE(vm);
${className(typeName)}* thisObject = jsCast<${className(
typeName
@@ -628,7 +630,7 @@ JSC_DEFINE_CUSTOM_SETTER(${symbolName(
JSC::EnsureStillAliveScope thisArg = JSC::EnsureStillAliveScope(thisObject);
auto result = ${symbolName(
typeName,
- roto[name].setter || proto[name].accessor.setter
+ proto[name].setter || proto[name].accessor.setter
)}(thisObject->wrapped(), lexicalGlobalObject, encodedValue);
RELEASE_AND_RETURN(throwScope, result);
@@ -871,7 +873,7 @@ function generateHeader(typeName, obj) {
return (
generateClassHeader(typeName, obj).trim() +
"\n" +
- generateConstructorHeader(typeName).trim() +
+ (!obj.noConstructor ? generateConstructorHeader(typeName).trim() : "") +
"\n"
);
}
@@ -880,7 +882,7 @@ function generateImpl(typeName, obj) {
const proto = obj.proto;
return [
Object.keys(proto).length > 0 && generatePrototype(typeName, obj).trim(),
- generateConstructorImpl(typeName, obj).trim(),
+ !obj.noConstructor ? generateConstructorImpl(typeName, obj).trim() : null,
Object.keys(proto).length > 0 && generateClassImpl(typeName, obj).trim(),
]
.filter(Boolean)
@@ -889,7 +891,13 @@ function generateImpl(typeName, obj) {
function generateZig(
typeName,
- { klass = {}, proto = {}, construct, finalize } = {} as ClassDefinition
+ {
+ klass = {},
+ proto = {},
+ construct,
+ finalize,
+ noConstructor,
+ } = {} as ClassDefinition
) {
const exports: [string, string][] = [];
@@ -1009,13 +1017,18 @@ pub const ${className(typeName)} = struct {
return ${symbolName(typeName, "fromJS")}(value);
}
+ ${
+ !noConstructor
+ ? `
/// Get the ${typeName} constructor value.
/// This loads lazily from the global object.
pub fn getConstructor(globalObject: *JSC.JSGlobalObject) JSC.JSValue {
JSC.markBinding();
return ${symbolName(typeName, "getConstructor")}(globalObject);
}
-
+ `
+ : ""
+ }
/// Create a new instance of ${typeName}
pub fn toJS(this: *${typeName}, globalObject: *JSC.JSGlobalObject) JSC.JSValue {
JSC.markBinding();
@@ -1092,6 +1105,32 @@ function generateLazyClassStructureHeader(
`.trim();
}
+function generateLazyStructureHeader(typeName, { klass = {}, proto = {} }) {
+ return `
+ JSC::Structure* ${className(
+ typeName
+ )}Structure() { return m_${className(typeName)}.get(this); }
+ JSC::LazyProperty<Zig::GlobalObject, Structure> m_${className(typeName)};
+ bool has${className(typeName)}SetterValue { false };
+ mutable JSC::WriteBarrier<JSC::Unknown> m_${className(typeName)}SetterValue;
+ `.trim();
+}
+
+function generateLazyStructureImpl(typeName, { klass = {}, proto = {} }) {
+ return `
+ m_${className(typeName)}.initLater(
+ [](const JSC::LazyProperty<JSC::JSGlobalObject, JSC::JSObject>::Initializer& init) {
+ auto *prototype = WebCore::${className(
+ typeName
+ )}::createPrototype(init.vm, reinterpret_cast<Zig::GlobalObject*>(init.owner));
+ init.set(WebCore::${className(
+ typeName
+ )}::createStructure(init.vm, init.owner, prototype));
+ });
+
+ `.trim();
+}
+
function generateLazyClassStructureImpl(typeName, { klass = {}, proto = {} }) {
return `
m_${className(typeName)}.initLater(
@@ -1273,7 +1312,13 @@ await writeAndUnlink(`${import.meta.dir}/../bindings/ZigGeneratedClasses.cpp`, [
]);
await writeAndUnlink(
`${import.meta.dir}/../bindings/ZigGeneratedClasses+lazyStructureHeader.h`,
- classes.map((a) => generateLazyClassStructureHeader(a.name, a)).join("\n")
+ classes
+ .map((a) =>
+ !a.noConstructor
+ ? generateLazyClassStructureHeader(a.name, a)
+ : generateLazyStructureHeader(a.name, a)
+ )
+ .join("\n")
);
await writeAndUnlink(
@@ -1281,9 +1326,11 @@ await writeAndUnlink(
classes.map((a) =>
[
`std::unique_ptr<GCClient::IsoSubspace> ${clientSubspaceFor(a.name)};`,
- `std::unique_ptr<GCClient::IsoSubspace> ${clientSubspaceFor(
- a.name
- )}Constructor;`,
+ !a.noConstructor
+ ? `std::unique_ptr<GCClient::IsoSubspace> ${clientSubspaceFor(
+ a.name
+ )}Constructor;`
+ : "",
].join("\n")
)
);
@@ -1293,7 +1340,9 @@ await writeAndUnlink(
classes.map((a) =>
[
`std::unique_ptr<IsoSubspace> ${subspaceFor(a.name)};`,
- `std::unique_ptr<IsoSubspace> ${subspaceFor(a.name)}Constructor;`,
+ !a.noConstructor
+ ? `std::unique_ptr<IsoSubspace> ${subspaceFor(a.name)}Constructor;`
+ : ``,
].join("\n")
)
);
@@ -1301,7 +1350,11 @@ await writeAndUnlink(
await writeAndUnlink(
`${import.meta.dir}/../bindings/ZigGeneratedClasses+lazyStructureImpl.h`,
initLazyClasses(
- classes.map((a) => generateLazyClassStructureImpl(a.name, a))
+ classes.map((a) =>
+ !a.noConstructor
+ ? generateLazyClassStructureImpl(a.name, a)
+ : generateLazyStructureImpl(a.name, a)
+ )
) +
"\n" +
visitLazyClasses(classes)