diff options
author | 2022-12-06 16:25:07 -0800 | |
---|---|---|
committer | 2022-12-06 16:25:39 -0800 | |
commit | 51d69d8c853ee634084c10b21720c0e201cc7721 (patch) | |
tree | d5c753beac1563cce7cd195c976528b06a1c1f3f /src/bun.js/bindings/JSReadableHelper.cpp | |
parent | 4dd2cb33b7603983f2ae9df425b8c0369acc9b61 (diff) | |
download | bun-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.cpp | 28 |
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); |