ReadableStream WebIDL.py patch

This commit is contained in:
sagudev 2023-02-20 06:15:54 +01:00
parent 55dac83d9a
commit 42d8269ac9
3 changed files with 202 additions and 5 deletions

View file

@ -2498,6 +2498,9 @@ class IDLType(IDLObject):
def isRecord(self): def isRecord(self):
return False return False
def isReadableStream(self):
return False
def isArrayBuffer(self): def isArrayBuffer(self):
return False return False
@ -2526,7 +2529,7 @@ class IDLType(IDLObject):
def isSpiderMonkeyInterface(self): def isSpiderMonkeyInterface(self):
"""Returns a boolean indicating whether this type is an 'interface' """Returns a boolean indicating whether this type is an 'interface'
type that is implemented in SpiderMonkey.""" type that is implemented in SpiderMonkey."""
return self.isInterface() and self.isBufferSource() return self.isInterface() and (self.isBufferSource() or self.isReadableStream())
def isAny(self): def isAny(self):
return self.tag() == IDLType.Tags.any return self.tag() == IDLType.Tags.any
@ -2743,6 +2746,9 @@ class IDLNullableType(IDLParametrizedType):
def isRecord(self): def isRecord(self):
return self.inner.isRecord() return self.inner.isRecord()
def isReadableStream(self):
return self.inner.isReadableStream()
def isArrayBuffer(self): def isArrayBuffer(self):
return self.inner.isArrayBuffer() return self.inner.isArrayBuffer()
@ -3252,6 +3258,9 @@ class IDLTypedefType(IDLType):
def isRecord(self): def isRecord(self):
return self.inner.isRecord() return self.inner.isRecord()
def isReadableStream(self):
return self.inner.isReadableStream()
def isDictionary(self): def isDictionary(self):
return self.inner.isDictionary() return self.inner.isDictionary()
@ -3597,6 +3606,7 @@ class IDLBuiltinType(IDLType):
"Uint32Array", "Uint32Array",
"Float32Array", "Float32Array",
"Float64Array", "Float64Array",
"ReadableStream",
) )
TagLookup = { TagLookup = {
@ -3632,6 +3642,7 @@ class IDLBuiltinType(IDLType):
Types.Uint32Array: IDLType.Tags.interface, Types.Uint32Array: IDLType.Tags.interface,
Types.Float32Array: IDLType.Tags.interface, Types.Float32Array: IDLType.Tags.interface,
Types.Float64Array: IDLType.Tags.interface, Types.Float64Array: IDLType.Tags.interface,
Types.ReadableStream: IDLType.Tags.interface,
} }
PrettyNames = { PrettyNames = {
@ -3667,6 +3678,7 @@ class IDLBuiltinType(IDLType):
Types.Uint32Array: "Uint32Array", Types.Uint32Array: "Uint32Array",
Types.Float32Array: "Float32Array", Types.Float32Array: "Float32Array",
Types.Float64Array: "Float64Array", Types.Float64Array: "Float64Array",
Types.ReadableStream: "ReadableStream",
} }
def __init__( def __init__(
@ -3830,11 +3842,19 @@ class IDLBuiltinType(IDLType):
and self._typeTag <= IDLBuiltinType.Types.Float64Array and self._typeTag <= IDLBuiltinType.Types.Float64Array
) )
def isReadableStream(self):
return self._typeTag == IDLBuiltinType.Types.ReadableStream
def isInterface(self): def isInterface(self):
# TypedArray things are interface types per the TypedArray spec, # TypedArray things are interface types per the TypedArray spec,
# but we handle them as builtins because SpiderMonkey implements # but we handle them as builtins because SpiderMonkey implements
# all of it internally. # all of it internally.
return self.isArrayBuffer() or self.isArrayBufferView() or self.isTypedArray() return (
self.isArrayBuffer()
or self.isArrayBufferView()
or self.isTypedArray()
or self.isReadableStream()
)
def isNonCallbackInterface(self): def isNonCallbackInterface(self):
# All the interfaces we can be are non-callback # All the interfaces we can be are non-callback
@ -3928,6 +3948,7 @@ class IDLBuiltinType(IDLType):
# ArrayBuffer is distinguishable from everything # ArrayBuffer is distinguishable from everything
# that's not an ArrayBuffer or a callback interface # that's not an ArrayBuffer or a callback interface
(self.isArrayBuffer() and not other.isArrayBuffer()) (self.isArrayBuffer() and not other.isArrayBuffer())
or (self.isReadableStream() and not other.isReadableStream())
or or
# ArrayBufferView is distinguishable from everything # ArrayBufferView is distinguishable from everything
# that's not an ArrayBufferView or typed array. # that's not an ArrayBufferView or typed array.
@ -4134,6 +4155,11 @@ BuiltinTypes = {
"Float64Array", "Float64Array",
IDLBuiltinType.Types.Float64Array, IDLBuiltinType.Types.Float64Array,
), ),
IDLBuiltinType.Types.ReadableStream: IDLBuiltinType(
BuiltinLocation("<builtin type>"),
"ReadableStream",
IDLBuiltinType.Types.ReadableStream,
),
} }
@ -6883,6 +6909,9 @@ class Tokenizer(object):
def t_IDENTIFIER(self, t): def t_IDENTIFIER(self, t):
r"[_-]?[A-Za-z][0-9A-Z_a-z-]*" r"[_-]?[A-Za-z][0-9A-Z_a-z-]*"
t.type = self.keywords.get(t.value, "IDENTIFIER") t.type = self.keywords.get(t.value, "IDENTIFIER")
# If Builtin readable streams are disabled, mark ReadableStream as an identifier.
if t.type == "READABLESTREAM" and not self._use_builtin_readable_streams:
t.type = "IDENTIFIER"
return t return t
def t_STRING(self, t): def t_STRING(self, t):
@ -6973,6 +7002,7 @@ class Tokenizer(object):
"setlike": "SETLIKE", "setlike": "SETLIKE",
"iterable": "ITERABLE", "iterable": "ITERABLE",
"namespace": "NAMESPACE", "namespace": "NAMESPACE",
"ReadableStream": "READABLESTREAM",
"constructor": "CONSTRUCTOR", "constructor": "CONSTRUCTOR",
"symbol": "SYMBOL", "symbol": "SYMBOL",
"async": "ASYNC", "async": "ASYNC",
@ -6993,7 +7023,8 @@ class Tokenizer(object):
], ],
) )
def __init__(self, outputdir, lexer=None): def __init__(self, outputdir, lexer=None, use_builtin_readable_streams=True):
self._use_builtin_readable_streams = use_builtin_readable_streams
if lexer: if lexer:
self.lexer = lexer self.lexer = lexer
else: else:
@ -8482,6 +8513,7 @@ class Parser(Tokenizer):
""" """
DistinguishableType : PrimitiveType Null DistinguishableType : PrimitiveType Null
| ARRAYBUFFER Null | ARRAYBUFFER Null
| READABLESTREAM Null
| OBJECT Null | OBJECT Null
| UNDEFINED Null | UNDEFINED Null
""" """
@ -8489,6 +8521,8 @@ class Parser(Tokenizer):
type = BuiltinTypes[IDLBuiltinType.Types.object] type = BuiltinTypes[IDLBuiltinType.Types.object]
elif p[1] == "ArrayBuffer": elif p[1] == "ArrayBuffer":
type = BuiltinTypes[IDLBuiltinType.Types.ArrayBuffer] type = BuiltinTypes[IDLBuiltinType.Types.ArrayBuffer]
elif p[1] == "ReadableStream":
type = BuiltinTypes[IDLBuiltinType.Types.ReadableStream]
elif p[1] == "undefined": elif p[1] == "undefined":
type = BuiltinTypes[IDLBuiltinType.Types.undefined] type = BuiltinTypes[IDLBuiltinType.Types.undefined]
else: else:
@ -8827,8 +8861,8 @@ class Parser(Tokenizer):
[Location(self.lexer, p.lineno, p.lexpos, self._filename)], [Location(self.lexer, p.lineno, p.lexpos, self._filename)],
) )
def __init__(self, outputdir="", lexer=None): def __init__(self, outputdir="", lexer=None, use_builtin_readable_stream=True):
Tokenizer.__init__(self, outputdir, lexer) Tokenizer.__init__(self, outputdir, lexer, use_builtin_readable_stream)
logger = SqueakyCleanLogger() logger = SqueakyCleanLogger()
try: try:

View file

@ -0,0 +1,162 @@
--- WebIDL.py
+++ WebIDL.py
@@ -2498,6 +2498,9 @@ class IDLType(IDLObject):
def isRecord(self):
return False
+ def isReadableStream(self):
+ return False
+
def isArrayBuffer(self):
return False
@@ -2526,7 +2529,7 @@ class IDLType(IDLObject):
def isSpiderMonkeyInterface(self):
"""Returns a boolean indicating whether this type is an 'interface'
type that is implemented in SpiderMonkey."""
- return self.isInterface() and self.isBufferSource()
+ return self.isInterface() and (self.isBufferSource() or self.isReadableStream())
def isAny(self):
return self.tag() == IDLType.Tags.any
@@ -2743,6 +2746,9 @@ class IDLNullableType(IDLParametrizedType):
def isRecord(self):
return self.inner.isRecord()
+ def isReadableStream(self):
+ return self.inner.isReadableStream()
+
def isArrayBuffer(self):
return self.inner.isArrayBuffer()
@@ -3252,6 +3258,9 @@ class IDLTypedefType(IDLType):
def isRecord(self):
return self.inner.isRecord()
+ def isReadableStream(self):
+ return self.inner.isReadableStream()
+
def isDictionary(self):
return self.inner.isDictionary()
@@ -3597,6 +3606,7 @@ class IDLBuiltinType(IDLType):
"Uint32Array",
"Float32Array",
"Float64Array",
+ "ReadableStream",
)
TagLookup = {
@@ -3632,6 +3642,7 @@ class IDLBuiltinType(IDLType):
Types.Uint32Array: IDLType.Tags.interface,
Types.Float32Array: IDLType.Tags.interface,
Types.Float64Array: IDLType.Tags.interface,
+ Types.ReadableStream: IDLType.Tags.interface,
}
PrettyNames = {
@@ -3667,6 +3678,7 @@ class IDLBuiltinType(IDLType):
Types.Uint32Array: "Uint32Array",
Types.Float32Array: "Float32Array",
Types.Float64Array: "Float64Array",
+ Types.ReadableStream: "ReadableStream",
}
def __init__(
@@ -3830,11 +3842,19 @@ class IDLBuiltinType(IDLType):
and self._typeTag <= IDLBuiltinType.Types.Float64Array
)
+ def isReadableStream(self):
+ return self._typeTag == IDLBuiltinType.Types.ReadableStream
+
def isInterface(self):
# TypedArray things are interface types per the TypedArray spec,
# but we handle them as builtins because SpiderMonkey implements
# all of it internally.
- return self.isArrayBuffer() or self.isArrayBufferView() or self.isTypedArray()
+ return (
+ self.isArrayBuffer()
+ or self.isArrayBufferView()
+ or self.isTypedArray()
+ or self.isReadableStream()
+ )
def isNonCallbackInterface(self):
# All the interfaces we can be are non-callback
@@ -3928,6 +3948,7 @@ class IDLBuiltinType(IDLType):
# ArrayBuffer is distinguishable from everything
# that's not an ArrayBuffer or a callback interface
(self.isArrayBuffer() and not other.isArrayBuffer())
+ or (self.isReadableStream() and not other.isReadableStream())
or
# ArrayBufferView is distinguishable from everything
# that's not an ArrayBufferView or typed array.
@@ -4134,6 +4155,11 @@ BuiltinTypes = {
"Float64Array",
IDLBuiltinType.Types.Float64Array,
),
+ IDLBuiltinType.Types.ReadableStream: IDLBuiltinType(
+ BuiltinLocation("<builtin type>"),
+ "ReadableStream",
+ IDLBuiltinType.Types.ReadableStream,
+ ),
}
@@ -6883,6 +6909,9 @@ class Tokenizer(object):
def t_IDENTIFIER(self, t):
r"[_-]?[A-Za-z][0-9A-Z_a-z-]*"
t.type = self.keywords.get(t.value, "IDENTIFIER")
+ # If Builtin readable streams are disabled, mark ReadableStream as an identifier.
+ if t.type == "READABLESTREAM" and not self._use_builtin_readable_streams:
+ t.type = "IDENTIFIER"
return t
def t_STRING(self, t):
@@ -6973,6 +7002,7 @@ class Tokenizer(object):
"setlike": "SETLIKE",
"iterable": "ITERABLE",
"namespace": "NAMESPACE",
+ "ReadableStream": "READABLESTREAM",
"constructor": "CONSTRUCTOR",
"symbol": "SYMBOL",
"async": "ASYNC",
@@ -6993,7 +7023,8 @@ class Tokenizer(object):
],
)
- def __init__(self, outputdir, lexer=None):
+ def __init__(self, outputdir, lexer=None, use_builtin_readable_streams=True):
+ self._use_builtin_readable_streams = use_builtin_readable_streams
if lexer:
self.lexer = lexer
else:
@@ -8482,6 +8513,7 @@ class Parser(Tokenizer):
"""
DistinguishableType : PrimitiveType Null
| ARRAYBUFFER Null
+ | READABLESTREAM Null
| OBJECT Null
| UNDEFINED Null
"""
@@ -8489,6 +8521,8 @@ class Parser(Tokenizer):
type = BuiltinTypes[IDLBuiltinType.Types.object]
elif p[1] == "ArrayBuffer":
type = BuiltinTypes[IDLBuiltinType.Types.ArrayBuffer]
+ elif p[1] == "ReadableStream":
+ type = BuiltinTypes[IDLBuiltinType.Types.ReadableStream]
elif p[1] == "undefined":
type = BuiltinTypes[IDLBuiltinType.Types.undefined]
else:
@@ -8827,8 +8861,8 @@ class Parser(Tokenizer):
[Location(self.lexer, p.lineno, p.lexpos, self._filename)],
)
- def __init__(self, outputdir="", lexer=None):
- Tokenizer.__init__(self, outputdir, lexer)
+ def __init__(self, outputdir="", lexer=None, use_builtin_readable_stream=True):
+ Tokenizer.__init__(self, outputdir, lexer, use_builtin_readable_stream)
logger = SqueakyCleanLogger()
try:

View file

@ -4,6 +4,7 @@ patch < debug.patch
patch < callback-location.patch patch < callback-location.patch
patch < union-typedef.patch patch < union-typedef.patch
patch < inline.patch patch < inline.patch
patch < readable-stream.patch
wget https://hg.mozilla.org/mozilla-central/archive/tip.zip/dom/bindings/parser/tests/ -O tests.zip wget https://hg.mozilla.org/mozilla-central/archive/tip.zip/dom/bindings/parser/tests/ -O tests.zip
rm -r tests rm -r tests