Remove readable streams from webidl/codegen (#34835)

Signed-off-by: Taym Haddadi <haddadi.taym@gmail.com>
This commit is contained in:
Taym Haddadi 2025-01-04 13:40:38 +01:00 committed by GitHub
parent 5b6c75e358
commit fd39d0d658
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 6 additions and 241 deletions

View file

@ -920,41 +920,6 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
return handleOptional(templateBody, declType, handleDefault("None")) return handleOptional(templateBody, declType, handleDefault("None"))
if type.isReadableStream():
assert not isEnforceRange and not isClamp
if failureCode is None:
unwrapFailureCode = '''throw_type_error(*cx, "This object is not \
an instance of ReadableStream.");\n'''
else:
unwrapFailureCode = failureCode
templateBody = fill(
"""
{
use crate::realms::{AlreadyInRealm, InRealm};
use crate::dom::readablestream::ReadableStream;
let in_realm_proof = AlreadyInRealm::assert_for_cx(cx);
match ReadableStream::from_js(cx, $${val}.get().to_object(), InRealm::Already(&in_realm_proof)) {
Ok(val) => val,
Err(()) => {
$*{failureCode}
}
}
}
""",
failureCode=f"{unwrapFailureCode}\n",
)
templateBody = wrapObjectTemplate(templateBody, "None",
isDefinitelyObject, type, failureCode)
declType = CGGeneric("DomRoot<dom::readablestream::ReadableStream>")
return handleOptional(templateBody, declType,
handleDefault("None"))
elif type.isSpiderMonkeyInterface(): elif type.isSpiderMonkeyInterface():
raise TypeError("Can't handle SpiderMonkey interface arguments other than typed arrays yet") raise TypeError("Can't handle SpiderMonkey interface arguments other than typed arrays yet")
@ -5061,9 +5026,6 @@ def getUnionTypeTemplateVars(type, descriptorProvider):
elif type.isObject(): elif type.isObject():
name = type.name name = type.name
typeName = "Heap<*mut JSObject>" typeName = "Heap<*mut JSObject>"
elif type.isReadableStream():
name = type.name
typeName = "DomRoot<ReadableStream>"
elif is_typed_array(type): elif is_typed_array(type):
name = type.name name = type.name
typeName = f"typedarray::Heap{name}" typeName = f"typedarray::Heap{name}"

View file

@ -30,7 +30,7 @@ def main():
from Configuration import Configuration from Configuration import Configuration
from CodegenRust import CGBindingRoot from CodegenRust import CGBindingRoot
parser = WebIDL.Parser(make_dir(os.path.join(out_dir, "cache")), use_builtin_readable_stream=False) parser = WebIDL.Parser(make_dir(os.path.join(out_dir, "cache")))
webidls = [name for name in os.listdir(webidls_dir) if name.endswith(".webidl")] webidls = [name for name in os.listdir(webidls_dir) if name.endswith(".webidl")]
for webidl in webidls: for webidl in webidls:
filename = os.path.join(webidls_dir, webidl) filename = os.path.join(webidls_dir, webidl)

View file

@ -2667,9 +2667,6 @@ 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
@ -2698,7 +2695,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() or self.isReadableStream()) return self.isInterface() and self.isBufferSource()
def isAny(self): def isAny(self):
return self.tag() == IDLType.Tags.any return self.tag() == IDLType.Tags.any
@ -2920,9 +2917,6 @@ 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()
@ -3449,9 +3443,6 @@ 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()
@ -3828,7 +3819,6 @@ class IDLBuiltinType(IDLType):
"Uint32Array", "Uint32Array",
"Float32Array", "Float32Array",
"Float64Array", "Float64Array",
"ReadableStream",
) )
TagLookup = { TagLookup = {
@ -3864,7 +3854,6 @@ class IDLBuiltinType(IDLType):
Types.Uint32Array: IDLType.Tags.uint32array, Types.Uint32Array: IDLType.Tags.uint32array,
Types.Float32Array: IDLType.Tags.float32array, Types.Float32Array: IDLType.Tags.float32array,
Types.Float64Array: IDLType.Tags.float64array, Types.Float64Array: IDLType.Tags.float64array,
Types.ReadableStream: IDLType.Tags.interface,
} }
PrettyNames = { PrettyNames = {
@ -3900,7 +3889,6 @@ class IDLBuiltinType(IDLType):
Types.Uint32Array: "Uint32Array", Types.Uint32Array: "Uint32Array",
Types.Float32Array: "Float32Array", Types.Float32Array: "Float32Array",
Types.Float64Array: "Float64Array", Types.Float64Array: "Float64Array",
Types.ReadableStream: "ReadableStream",
} }
__slots__ = ( __slots__ = (
@ -4072,19 +4060,11 @@ 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 ( return self.isArrayBuffer() or self.isArrayBufferView() or self.isTypedArray()
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
@ -4178,7 +4158,6 @@ 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.
@ -4385,11 +4364,6 @@ BuiltinTypes = {
"Float64Array", "Float64Array",
IDLBuiltinType.Types.Float64Array, IDLBuiltinType.Types.Float64Array,
), ),
IDLBuiltinType.Types.ReadableStream: IDLBuiltinType(
BuiltinLocation("<builtin type>"),
"ReadableStream",
IDLBuiltinType.Types.ReadableStream,
),
} }
@ -7272,9 +7246,6 @@ 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):
@ -7367,7 +7338,6 @@ 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",
@ -7388,8 +7358,7 @@ class Tokenizer(object):
], ],
) )
def __init__(self, outputdir, lexer=None, use_builtin_readable_streams=True): def __init__(self, outputdir, lexer=None):
self._use_builtin_readable_streams = use_builtin_readable_streams
if lexer: if lexer:
self.lexer = lexer self.lexer = lexer
else: else:
@ -8878,7 +8847,6 @@ class Parser(Tokenizer):
""" """
DistinguishableType : PrimitiveType Null DistinguishableType : PrimitiveType Null
| ARRAYBUFFER Null | ARRAYBUFFER Null
| READABLESTREAM Null
| OBJECT Null | OBJECT Null
| UNDEFINED Null | UNDEFINED Null
""" """
@ -8886,8 +8854,6 @@ 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:
@ -9229,8 +9195,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, use_builtin_readable_stream=True): def __init__(self, outputdir="", lexer=None):
Tokenizer.__init__(self, outputdir, lexer, use_builtin_readable_stream) Tokenizer.__init__(self, outputdir, lexer)
logger = SqueakyCleanLogger() logger = SqueakyCleanLogger()
try: try:

View file

@ -1,162 +0,0 @@
--- 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,7 +4,6 @@ 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
patch < like-as-iterable.patch patch < like-as-iterable.patch
patch < builtin-array.patch patch < builtin-array.patch