зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1499813 - Part 7: Change ReaderFromStream to use UnwrapSlot. r=tcampbell
Depends on D9840 Differential Revision: https://phabricator.services.mozilla.com/D9841 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
6d0c89a3b4
Коммит
b714e51e15
|
@ -390,30 +390,31 @@ StreamFromReader(JSContext *maybeCx, const ReadableStreamReader* reader)
|
||||||
* Must only be called on ReadableStreams that already have a reader
|
* Must only be called on ReadableStreams that already have a reader
|
||||||
* associated with them.
|
* associated with them.
|
||||||
*
|
*
|
||||||
* If the reader is a wrapper, it will be unwrapped, so it might not be an
|
* If the reader is a wrapper, it will be unwrapped, so the object stored in
|
||||||
* object from the currently active compartment.
|
* `unwrappedResult` might not be an object from the currently active
|
||||||
*
|
* compartment.
|
||||||
* If the reader cannot be unwrapped, which can only happen if it's a dead
|
|
||||||
* wrapper object, a nullptr is returned. If a JSContext is available, an
|
|
||||||
* exception is reported, too. The JSContext isn't mandatory to make use
|
|
||||||
* easier for call sites that don't otherwise need a JSContext and can provide
|
|
||||||
* useful defaults in case the reader is a dead object wrapper.
|
|
||||||
*/
|
*/
|
||||||
|
static MOZ_MUST_USE bool
|
||||||
|
UnwrapReaderFromStream(JSContext* cx,
|
||||||
|
Handle<ReadableStream*> stream,
|
||||||
|
MutableHandle<ReadableStreamReader*> unwrappedResult)
|
||||||
|
{
|
||||||
|
return UnwrapInternalSlot(cx, stream, StreamSlot_Reader, unwrappedResult);
|
||||||
|
}
|
||||||
|
|
||||||
static MOZ_MUST_USE ReadableStreamReader*
|
static MOZ_MUST_USE ReadableStreamReader*
|
||||||
ReaderFromStream(JSContext* maybeCx, const ReadableStream* stream)
|
UnwrapReaderFromStreamNoThrow(ReadableStream* stream)
|
||||||
{
|
{
|
||||||
JSObject* readerObj = &stream->getFixedSlot(StreamSlot_Reader).toObject();
|
JSObject* readerObj = &stream->getFixedSlot(StreamSlot_Reader).toObject();
|
||||||
if (IsProxy(readerObj)) {
|
if (IsProxy(readerObj)) {
|
||||||
if (JS_IsDeadWrapper(readerObj)) {
|
if (JS_IsDeadWrapper(readerObj)) {
|
||||||
if (maybeCx) {
|
|
||||||
JS_ReportErrorNumberASCII(maybeCx, GetErrorMessage, nullptr, JSMSG_DEAD_OBJECT);
|
|
||||||
}
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// It's ok to do an unchecked unwrap here: the reader wouldn't have
|
readerObj = CheckedUnwrap(readerObj);
|
||||||
// been stored on the stream if it couldn't be unwrapped.
|
if (!readerObj) {
|
||||||
readerObj = UncheckedUnwrap(readerObj);
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return &readerObj->as<ReadableStreamReader>();
|
return &readerObj->as<ReadableStreamReader>();
|
||||||
|
@ -1274,10 +1275,11 @@ ReadableStreamTee_Pull(JSContext* cx, Handle<TeeState*> teeState,
|
||||||
if (!UnwrapInternalSlot(cx, teeState, TeeStateSlot_Stream, &stream)) {
|
if (!UnwrapInternalSlot(cx, teeState, TeeStateSlot_Stream, &stream)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
RootedObject readerObj(cx, ReaderFromStream(cx, stream));
|
Rooted<ReadableStreamReader*> readerObj(cx);
|
||||||
if (!readerObj) {
|
if (!UnwrapReaderFromStream(cx, stream, &readerObj)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rooted<ReadableStreamDefaultReader*> reader(cx,
|
Rooted<ReadableStreamDefaultReader*> reader(cx,
|
||||||
&readerObj->as<ReadableStreamDefaultReader>());
|
&readerObj->as<ReadableStreamDefaultReader>());
|
||||||
|
|
||||||
|
@ -1550,8 +1552,8 @@ ReadableStreamAddReadOrReadIntoRequest(JSContext* cx, Handle<ReadableStream*> st
|
||||||
{
|
{
|
||||||
// Step 1: Assert: ! IsReadableStreamBYOBReader(stream.[[reader]]) is true.
|
// Step 1: Assert: ! IsReadableStreamBYOBReader(stream.[[reader]]) is true.
|
||||||
// Skipped: handles both kinds of readers.
|
// Skipped: handles both kinds of readers.
|
||||||
Rooted<ReadableStreamReader*> reader(cx, ReaderFromStream(cx, stream));
|
Rooted<ReadableStreamReader*> reader(cx);
|
||||||
if (!reader) {
|
if (!UnwrapReaderFromStream(cx, stream, &reader)) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1669,8 +1671,8 @@ ReadableStreamCloseInternal(JSContext* cx, Handle<ReadableStream*> stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 3: Let reader be stream.[[reader]].
|
// Step 3: Let reader be stream.[[reader]].
|
||||||
Rooted<ReadableStreamReader*> reader(cx, ReaderFromStream(cx, stream));
|
Rooted<ReadableStreamReader*> reader(cx);
|
||||||
if (!reader) {
|
if (!UnwrapReaderFromStream(cx, stream, &reader)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1763,8 +1765,8 @@ ReadableStreamErrorInternal(JSContext* cx, Handle<ReadableStream*> stream, Handl
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 5: Let reader be stream.[[reader]].
|
// Step 5: Let reader be stream.[[reader]].
|
||||||
Rooted<ReadableStreamReader*> reader(cx, ReaderFromStream(cx, stream));
|
Rooted<ReadableStreamReader*> reader(cx);
|
||||||
if (!reader) {
|
if (!UnwrapReaderFromStream(cx, stream, &reader)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1847,8 +1849,8 @@ ReadableStreamFulfillReadOrReadIntoRequest(JSContext* cx, Handle<ReadableStream*
|
||||||
HandleValue chunk, bool done)
|
HandleValue chunk, bool done)
|
||||||
{
|
{
|
||||||
// Step 1: Let reader be stream.[[reader]].
|
// Step 1: Let reader be stream.[[reader]].
|
||||||
Rooted<ReadableStreamReader*> reader(cx, ReaderFromStream(cx, stream));
|
Rooted<ReadableStreamReader*> reader(cx);
|
||||||
if (!reader) {
|
if (!UnwrapReaderFromStream(cx, stream, &reader)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1892,7 +1894,7 @@ ReadableStreamGetNumReadRequests(ReadableStream* stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::AutoSuppressGCAnalysis nogc;
|
JS::AutoSuppressGCAnalysis nogc;
|
||||||
ReadableStreamReader* reader = ReaderFromStream(nullptr, stream);
|
ReadableStreamReader* reader = UnwrapReaderFromStreamNoThrow(stream);
|
||||||
|
|
||||||
// Reader is a dead wrapper, treat it as non-existent.
|
// Reader is a dead wrapper, treat it as non-existent.
|
||||||
if (!reader) {
|
if (!reader) {
|
||||||
|
@ -1912,7 +1914,7 @@ enum class ReaderMode
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
// Streams spec 3.4.12. ReadableStreamHasDefaultReader ( stream )
|
// Streams spec 3.4.12. ReadableStreamHasDefaultReader ( stream )
|
||||||
static MOZ_MUST_USE bool
|
static MOZ_MUST_USE bool
|
||||||
ReadableStreamHasDefaultReader(JSContext* cx, ReadableStream* stream, bool* result)
|
ReadableStreamHasDefaultReader(JSContext* cx, Handle<ReadableStream*> stream, bool* result)
|
||||||
{
|
{
|
||||||
// Step 1: Let reader be stream.[[reader]].
|
// Step 1: Let reader be stream.[[reader]].
|
||||||
// Step 2: If reader is undefined, return false.
|
// Step 2: If reader is undefined, return false.
|
||||||
|
@ -1923,26 +1925,26 @@ ReadableStreamHasDefaultReader(JSContext* cx, ReadableStream* stream, bool* resu
|
||||||
|
|
||||||
// Step 3: If ! ReadableStreamDefaultReader(reader) is false, return false.
|
// Step 3: If ! ReadableStreamDefaultReader(reader) is false, return false.
|
||||||
// Step 4: Return true.
|
// Step 4: Return true.
|
||||||
JSObject* readerObj = ReaderFromStream(cx, stream);
|
Rooted<ReadableStreamReader*> reader(cx);
|
||||||
if (!readerObj) {
|
if (!UnwrapReaderFromStream(cx, stream, &reader)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*result = readerObj->is<ReadableStreamDefaultReader>();
|
*result = reader->is<ReadableStreamDefaultReader>();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
|
|
||||||
static MOZ_MUST_USE bool
|
static MOZ_MUST_USE bool
|
||||||
ReadableStreamGetReaderMode(JSContext* cx, ReadableStream* stream, ReaderMode* mode)
|
ReadableStreamGetReaderMode(JSContext* cx, Handle<ReadableStream*> stream, ReaderMode* mode)
|
||||||
{
|
{
|
||||||
if (stream->getFixedSlot(StreamSlot_Reader).isUndefined()) {
|
if (stream->getFixedSlot(StreamSlot_Reader).isUndefined()) {
|
||||||
*mode = ReaderMode::None;
|
*mode = ReaderMode::None;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSObject* readerObj = ReaderFromStream(cx, stream);
|
Rooted<ReadableStreamReader*> reader(cx);
|
||||||
if (!readerObj) {
|
if (!UnwrapReaderFromStream(cx, stream, &reader)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2305,7 +2307,7 @@ ReadableStreamReaderGenericRelease(JSContext* cx, Handle<ReadableStreamReader*>
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 2: Assert: reader.[[ownerReadableStream]].[[reader]] is reader.
|
// Step 2: Assert: reader.[[ownerReadableStream]].[[reader]] is reader.
|
||||||
MOZ_ASSERT(ReaderFromStream(cx, stream) == reader);
|
MOZ_ASSERT(UnwrapReaderFromStreamNoThrow(stream) == reader);
|
||||||
|
|
||||||
// Create an exception to reject promises with below. We don't have a
|
// Create an exception to reject promises with below. We don't have a
|
||||||
// clean way to do this, unfortunately.
|
// clean way to do this, unfortunately.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче