aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/JSReadableHelper.cpp
diff options
context:
space:
mode:
authorGravatar Dylan Conway <dylan.conway567@gmail.com> 2022-12-06 16:25:07 -0800
committerGravatar Dylan Conway <dylan.conway567@gmail.com> 2022-12-06 16:25:39 -0800
commit51d69d8c853ee634084c10b21720c0e201cc7721 (patch)
treed5c753beac1563cce7cd195c976528b06a1c1f3f /src/bun.js/bindings/JSReadableHelper.cpp
parent4dd2cb33b7603983f2ae9df425b8c0369acc9b61 (diff)
downloadbun-51d69d8c853ee634084c10b21720c0e201cc7721.tar.gz
bun-51d69d8c853ee634084c10b21720c0e201cc7721.tar.zst
bun-51d69d8c853ee634084c10b21720c0e201cc7721.zip
fix event emitter cast
Diffstat (limited to 'src/bun.js/bindings/JSReadableHelper.cpp')
-rw-r--r--src/bun.js/bindings/JSReadableHelper.cpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/bun.js/bindings/JSReadableHelper.cpp b/src/bun.js/bindings/JSReadableHelper.cpp
index 0565e3f28..271bfb358 100644
--- a/src/bun.js/bindings/JSReadableHelper.cpp
+++ b/src/bun.js/bindings/JSReadableHelper.cpp
@@ -68,10 +68,16 @@ JSC_DEFINE_HOST_FUNCTION(jsReadable_maybeReadMore, (JSGlobalObject * lexicalGlob
auto callData = JSC::getCallData(read);
if (callData.type == CallData::Type::None) {
throwException(lexicalGlobalObject, throwScope, createNotAFunctionError(lexicalGlobalObject, read));
- return JSValue::encode(jsUndefined());
+ return JSValue::encode({});
}
- auto& emitter = jsDynamicCast<JSEventEmitter*>(stream)->wrapped();
+ auto* jsEmitter = jsEventEmitterCastFast(vm, lexicalGlobalObject, stream);
+ RETURN_IF_EXCEPTION(throwScope, {});
+ if (UNLIKELY(!jsEmitter)) {
+ throwTypeError(lexicalGlobalObject, throwScope, "Stream must be an EventEmitter"_s);
+ return JSValue::encode(JSValue {});
+ }
+ auto& emitter = jsEmitter->wrapped();
while (
!state->getBool(JSReadableState::reading) && !state->getBool(JSReadableState::ended) && (state->m_length < state->m_highWaterMark || (state->m_flowing > 0 && state->m_length == 0))) {
@@ -102,10 +108,14 @@ void flow(JSGlobalObject* lexicalGlobalObject, JSObject* streamObj, JSReadableSt
return;
}
- while (state->m_flowing > 0) {
+ if (state->m_flowing > 0) {
+ WebCore::EventEmitter& emitter = jsEventEmitterCastFast(vm, lexicalGlobalObject, streamObj)->wrapped();
- if (!callRead(streamObj, jsCast<JSFunction*>(read), MarkedArgumentBuffer(), vm, lexicalGlobalObject, jsCast<JSEventEmitter*>(streamObj)->wrapped())) {
- break;
+ while (state->m_flowing > 0) {
+
+ if (!callRead(streamObj, jsCast<JSFunction*>(read), MarkedArgumentBuffer(), vm, lexicalGlobalObject, emitter)) {
+ break;
+ }
}
}
}
@@ -118,8 +128,8 @@ JSC_DEFINE_HOST_FUNCTION(jsReadable_resume, (JSGlobalObject * lexicalGlobalObjec
= jsEventEmitterCastFast(vm, lexicalGlobalObject, stream);
if (UNLIKELY(!jsEmitterWrap)) {
- throwTypeError(lexicalGlobalObject, throwScope, "stream is not EventEmitter"_s);
- return JSValue::encode(jsUndefined());
+ throwTypeError(lexicalGlobalObject, throwScope, "Stream must be an EventEmitter"_s);
+ return JSValue::encode(JSValue {});
}
auto& emitter = jsEmitterWrap->wrapped();
@@ -172,8 +182,8 @@ EncodedJSValue emitReadable_(JSGlobalObject* lexicalGlobalObject, JSObject* stre
auto* emitter
= jsEventEmitterCastFast(vm, lexicalGlobalObject, stream);
if (UNLIKELY(!emitter)) {
- throwTypeError(lexicalGlobalObject, throwScope, "stream is not EventEmitter"_s);
- return JSValue::encode(jsUndefined());
+ throwTypeError(lexicalGlobalObject, throwScope, "Stream must be an EventEmitter"_s);
+ return JSValue::encode(JSValue {});
}
emitter->wrapped().emitForBindings(eventType, args);