aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-21 22:47:58 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-21 22:47:58 -0700
commitcd2e9e9dcfcdb609026f9624e478b7e3af314de5 (patch)
tree5a801a245d5db32397503177de0b11449333426d /src
parent347309b26fadd7f51b9caeb61ff9d8c5e707899f (diff)
downloadbun-cd2e9e9dcfcdb609026f9624e478b7e3af314de5.tar.gz
bun-cd2e9e9dcfcdb609026f9624e478b7e3af314de5.tar.zst
bun-cd2e9e9dcfcdb609026f9624e478b7e3af314de5.zip
Emit errors
Diffstat (limited to 'src')
-rw-r--r--src/bun.js/bindings/webcore/EventEmitter.cpp23
-rw-r--r--src/bun.js/bindings/webcore/EventEmitter.h16
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