diff options
author | 2022-10-21 22:47:58 -0700 | |
---|---|---|
committer | 2022-10-21 22:47:58 -0700 | |
commit | cd2e9e9dcfcdb609026f9624e478b7e3af314de5 (patch) | |
tree | 5a801a245d5db32397503177de0b11449333426d | |
parent | 347309b26fadd7f51b9caeb61ff9d8c5e707899f (diff) | |
download | bun-cd2e9e9dcfcdb609026f9624e478b7e3af314de5.tar.gz bun-cd2e9e9dcfcdb609026f9624e478b7e3af314de5.tar.zst bun-cd2e9e9dcfcdb609026f9624e478b7e3af314de5.zip |
Emit errors
-rw-r--r-- | src/bun.js/bindings/webcore/EventEmitter.cpp | 23 | ||||
-rw-r--r-- | src/bun.js/bindings/webcore/EventEmitter.h | 16 |
2 files changed, 37 insertions, 2 deletions
diff --git a/src/bun.js/bindings/webcore/EventEmitter.cpp b/src/bun.js/bindings/webcore/EventEmitter.cpp index 2c80e9cc2..8d34ab7a2 100644 --- a/src/bun.js/bindings/webcore/EventEmitter.cpp +++ b/src/bun.js/bindings/webcore/EventEmitter.cpp @@ -37,7 +37,6 @@ bool EventEmitter::addListener(const Identifier& eventType, Ref<EventListener>&& return false; } - eventListenersDidChange(); return true; } @@ -205,7 +204,27 @@ void EventEmitter::innerInvokeEventListeners(const Identifier& eventType, Simple if (JSC::JSObject* jsFunction = registeredListener->callback().jsFunction()) { JSC::JSGlobalObject* lexicalGlobalObject = jsFunction->globalObject(); auto callData = JSC::getCallData(jsFunction); - JSC::call(jsFunction->globalObject(), jsFunction, callData, JSC::jsUndefined(), arguments); + if (callData.type == JSC::CallData::Type::None) + continue; + + WTF::NakedPtr<JSC::Exception> exceptionPtr; + JSC::call(jsFunction->globalObject(), jsFunction, callData, JSC::jsUndefined(), arguments, exceptionPtr); + if (auto* exception = exceptionPtr.get()) { + auto errorIdentifier = JSC::Identifier::fromString(vm, eventNames().errorEvent); + auto hasErrorListener = this->hasActiveEventListeners(errorIdentifier); + if (!hasErrorListener || eventType == errorIdentifier) { + // If the event type is error, report the exception to the console. + Bun__reportError(lexicalGlobalObject, JSValue::encode(JSValue(exception))); + } else if (hasErrorListener) { + MarkedArgumentBuffer expcep; + JSValue errorValue = exception->value(); + if (!errorValue) { + errorValue = JSC::jsUndefined(); + } + expcep.append(errorValue); + fireEventListeners(errorIdentifier, WTFMove(expcep)); + } + } } } } diff --git a/src/bun.js/bindings/webcore/EventEmitter.h b/src/bun.js/bindings/webcore/EventEmitter.h index eb6fa2e77..4aa143604 100644 --- a/src/bun.js/bindings/webcore/EventEmitter.h +++ b/src/bun.js/bindings/webcore/EventEmitter.h @@ -65,6 +65,11 @@ public: bool hasEventListeners() const; bool hasEventListeners(const Identifier& eventType) const; bool hasActiveEventListeners(const Identifier& eventType) const; + bool hasEventListeners(JSC::VM& vm, ASCIILiteral eventType) const; + + unsigned getMaxListeners() const { return m_maxListeners; }; + + void setMaxListeners(unsigned count); Vector<Identifier> eventTypes(); const SimpleEventListenerVector& eventListeners(const Identifier& eventType); @@ -93,6 +98,7 @@ private: void invalidateEventListenerRegions(); EventEmitterData m_eventTargetData; + unsigned m_maxListeners { 10 }; }; inline const EventEmitterData* EventEmitter::eventTargetData() const @@ -118,4 +124,14 @@ inline bool EventEmitter::hasEventListeners(const Identifier& eventType) const return data && data->eventListenerMap.contains(eventType); } +inline bool EventEmitter::hasEventListeners(JSC::VM& vm, ASCIILiteral eventType) const +{ + return this->hasEventListeners(Identifier::fromString(vm, eventType)); +} + +inline void EventEmitter::setMaxListeners(unsigned count) +{ + this->m_maxListeners = count; +} + } // namespace WebCore |