diff options
Diffstat (limited to 'src/bun.js')
-rw-r--r-- | src/bun.js/api/postgres.classes.ts | 1 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGeneratedClasses.cpp | 8 | ||||
-rw-r--r-- | src/bun.js/bindings/ZigGeneratedClasses.h | 27 | ||||
-rw-r--r-- | src/bun.js/bindings/bindings.cpp | 5 | ||||
-rw-r--r-- | src/bun.js/bindings/generated_classes.zig | 1 | ||||
-rw-r--r-- | src/bun.js/bindings/structure.cpp | 2 |
6 files changed, 42 insertions, 2 deletions
diff --git a/src/bun.js/api/postgres.classes.ts b/src/bun.js/api/postgres.classes.ts index 0a6f209fe..1185f8389 100644 --- a/src/bun.js/api/postgres.classes.ts +++ b/src/bun.js/api/postgres.classes.ts @@ -42,6 +42,7 @@ export default [ construct: true, finalize: true, configurable: false, + hasPendingActivity: true, JSType: "0b11101110", klass: {}, proto: { diff --git a/src/bun.js/bindings/ZigGeneratedClasses.cpp b/src/bun.js/bindings/ZigGeneratedClasses.cpp index 47532a98c..aeba3881c 100644 --- a/src/bun.js/bindings/ZigGeneratedClasses.cpp +++ b/src/bun.js/bindings/ZigGeneratedClasses.cpp @@ -17913,6 +17913,12 @@ extern "C" EncodedJSValue PostgresSQLQuery__getConstructor(Zig::GlobalObject* gl return JSValue::encode(globalObject->JSPostgresSQLQueryConstructor()); } +extern "C" bool PostgresSQLQuery__hasPendingActivity(void* ptr); +bool JSPostgresSQLQuery::hasPendingActivity(void* ctx) +{ + return PostgresSQLQuery__hasPendingActivity(ctx); +} + JSPostgresSQLQuery::~JSPostgresSQLQuery() { if (m_ctx) { @@ -18016,6 +18022,8 @@ void JSPostgresSQLQuery::visitAdditionalChildren(Visitor& visitor) ASSERT_GC_OBJECT_INHERITS(thisObject, info()); visitor.append(thisObject->m_pendingValue); visitor.append(thisObject->m_binding); + + visitor.addOpaqueRoot(this->wrapped()); } DEFINE_VISIT_ADDITIONAL_CHILDREN(JSPostgresSQLQuery); diff --git a/src/bun.js/bindings/ZigGeneratedClasses.h b/src/bun.js/bindings/ZigGeneratedClasses.h index 7080146df..31ea8ef47 100644 --- a/src/bun.js/bindings/ZigGeneratedClasses.h +++ b/src/bun.js/bindings/ZigGeneratedClasses.h @@ -1928,10 +1928,37 @@ public: : Base(vm, structure) { m_ctx = sinkPtr; + m_weakThis = JSC::Weak<JSPostgresSQLQuery>(this, getOwner()); } void finishCreation(JSC::VM&); + JSC::Weak<JSPostgresSQLQuery> m_weakThis; + + static bool hasPendingActivity(void* ctx); + + class Owner final : public JSC::WeakHandleOwner { + public: + bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void* context, JSC::AbstractSlotVisitor& visitor, const char** reason) final + { + auto* controller = JSC::jsCast<JSPostgresSQLQuery*>(handle.slot()->asCell()); + if (JSPostgresSQLQuery::hasPendingActivity(controller->wrapped())) { + if (UNLIKELY(reason)) + *reason = "has pending activity"; + return true; + } + + return visitor.containsOpaqueRoot(context); + } + void finalize(JSC::Handle<JSC::Unknown>, void* context) final {} + }; + + static JSC::WeakHandleOwner* getOwner() + { + static NeverDestroyed<Owner> m_owner; + return &m_owner.get(); + } + DECLARE_VISIT_CHILDREN; template<typename Visitor> void visitAdditionalChildren(Visitor&); DECLARE_VISIT_OUTPUT_CONSTRAINTS; diff --git a/src/bun.js/bindings/bindings.cpp b/src/bun.js/bindings/bindings.cpp index a61a0221a..dd0e440af 100644 --- a/src/bun.js/bindings/bindings.cpp +++ b/src/bun.js/bindings/bindings.cpp @@ -4690,8 +4690,9 @@ extern "C" EncodedJSValue JSC__JSValue__dateInstanceFromNullTerminatedString(JSC } // this is largely copied from dateProtoFuncToISOString -extern "C" int JSC__JSValue__toISOString(JSC::JSGlobalObject* globalObject, EncodedJSValue dateValue, char buffer[28]) +extern "C" int JSC__JSValue__toISOString(JSC::JSGlobalObject* globalObject, EncodedJSValue dateValue, char* buf) { + char buffer[28]; JSC::DateInstance* thisDateObj = JSC::jsDynamicCast<JSC::DateInstance*>(JSC::JSValue::decode(dateValue)); if (!thisDateObj) return -1; @@ -4716,6 +4717,8 @@ extern "C" int JSC__JSValue__toISOString(JSC::JSGlobalObject* globalObject, Enco else charactersWritten = snprintf(buffer, sizeof(buffer), "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", gregorianDateTime->year(), gregorianDateTime->month() + 1, gregorianDateTime->monthDay(), gregorianDateTime->hour(), gregorianDateTime->minute(), gregorianDateTime->second(), ms); + memcpy(buf, buffer, charactersWritten); + ASSERT(charactersWritten > 0 && static_cast<unsigned>(charactersWritten) < sizeof(buffer)); if (static_cast<unsigned>(charactersWritten) >= sizeof(buffer)) return -1; diff --git a/src/bun.js/bindings/generated_classes.zig b/src/bun.js/bindings/generated_classes.zig index 7e76611b4..53be7b778 100644 --- a/src/bun.js/bindings/generated_classes.zig +++ b/src/bun.js/bindings/generated_classes.zig @@ -4532,6 +4532,7 @@ pub const JSPostgresSQLQuery = struct { @export(PostgresSQLQuery.doRun, .{ .name = "PostgresSQLQueryPrototype__doRun" }); @export(PostgresSQLQuery.estimatedSize, .{ .name = "PostgresSQLQuery__estimatedSize" }); @export(PostgresSQLQuery.finalize, .{ .name = "PostgresSQLQueryClass__finalize" }); + @export(PostgresSQLQuery.hasPendingActivity, .{ .name = "PostgresSQLQuery__hasPendingActivity" }); } } }; diff --git a/src/bun.js/bindings/structure.cpp b/src/bun.js/bindings/structure.cpp index 9e1fb6dc2..82358abf8 100644 --- a/src/bun.js/bindings/structure.cpp +++ b/src/bun.js/bindings/structure.cpp @@ -10,7 +10,7 @@ using namespace JSC; extern "C" EncodedJSValue JSC__createStructure(JSC::JSGlobalObject* globalObject, unsigned int inlineCapacity, BunString* names) { auto& vm = globalObject->vm(); - JSC::Structure* structure = JSC::Structure::create(vm, globalObject, globalObject->objectPrototype(), JSC::TypeInfo(ObjectType, JSC::JSObject::StructureFlags), JSC::JSFinalObject::info(), inlineCapacity); + JSC::Structure* structure = globalObject->structureCache().emptyObjectStructureConcurrently(globalObject->objectPrototype(), inlineCapacity); PropertyOffset offset = 0; for (unsigned i = 0; i < inlineCapacity; i++) { const Identifier& ident = JSC::Identifier::fromString(vm, Bun::toWTFString(names[i])); |