Commit d3f5dd8c authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

IDL compiler: Turn ArrayBufferView into a built-in type

- Turn ArrayBufferView into a built-in type
  (was a union of all typed arrays)
- Remove flattened_member_types_in_original_order
  (turned out that there was no need to flatten unions)

Bug: 839389
Change-Id: I1a6eecf217b1d8021b6e7b5b520500f43c57fb10
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2032695Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737694}
parent 4928b6f2
...@@ -860,9 +860,7 @@ def _make_overload_dispatcher_per_arg_size(cg_context, items): ...@@ -860,9 +860,7 @@ def _make_overload_dispatcher_per_arg_size(cg_context, items):
_format("{}::HasInstance(${isolate}, {value})", v8_bridge_name)) _format("{}::HasInstance(${isolate}, {value})", v8_bridge_name))
is_typedef_name = lambda t, name: t.is_typedef and t.identifier == name is_typedef_name = lambda t, name: t.is_typedef and t.identifier == name
func_like_a = find( func_like_a = find(lambda t, u: u.is_array_buffer_view)
lambda t, u: is_typedef_name(t.unwrap(typedef=False),
"ArrayBufferView"))
func_like_b = find( func_like_b = find(
lambda t, u: is_typedef_name(t.unwrap(typedef=False), "BufferSource")) lambda t, u: is_typedef_name(t.unwrap(typedef=False), "BufferSource"))
if func_like_a or func_like_b: if func_like_a or func_like_b:
...@@ -3188,5 +3186,5 @@ def generate_interface(interface): ...@@ -3188,5 +3186,5 @@ def generate_interface(interface):
def generate_interfaces(web_idl_database): def generate_interfaces(web_idl_database):
interface = web_idl_database.find("Element") interface = web_idl_database.find("Blob")
generate_interface(interface) generate_interface(interface)
...@@ -317,6 +317,11 @@ class IdlType(WithExtendedAttributes, WithDebugInfo): ...@@ -317,6 +317,11 @@ class IdlType(WithExtendedAttributes, WithDebugInfo):
"""Returns True if this is ArrayBuffer.""" """Returns True if this is ArrayBuffer."""
return False return False
@property
def is_array_buffer_view(self):
"""Returns True if this is ArrayBufferView."""
return False
@property @property
def is_data_view(self): def is_data_view(self):
"""Returns True if this is DataView.""" """Returns True if this is DataView."""
...@@ -559,7 +564,17 @@ class SimpleType(IdlType): ...@@ -559,7 +564,17 @@ class SimpleType(IdlType):
_TYPED_ARRAY_TYPES = ('Int8Array', 'Int16Array', 'Int32Array', _TYPED_ARRAY_TYPES = ('Int8Array', 'Int16Array', 'Int32Array',
'Uint8Array', 'Uint16Array', 'Uint32Array', 'Uint8Array', 'Uint16Array', 'Uint32Array',
'Uint8ClampedArray', 'Float32Array', 'Float64Array') 'Uint8ClampedArray', 'Float32Array', 'Float64Array')
_BUFFER_SOURCE_TYPES = ('ArrayBuffer', 'DataView') + _TYPED_ARRAY_TYPES # ArrayBufferView is not defined as a buffer source type in Web IDL, it's
# defined as an union type of all typed array types. However, practically
# it's much more convenient and reasonable for most of (if not all) use
# cases to treat ArrayBufferView as a buffer source type than as an union
# type.
# https://heycam.github.io/webidl/#ArrayBufferView
#
# Note that BufferSource is an union type as defined in Web IDL.
# https://heycam.github.io/webidl/#BufferSource
_BUFFER_SOURCE_TYPES = (
('ArrayBuffer', 'ArrayBufferView', 'DataView') + _TYPED_ARRAY_TYPES)
_MISC_TYPES = ('any', 'boolean', 'object', 'symbol', 'void') _MISC_TYPES = ('any', 'boolean', 'object', 'symbol', 'void')
_VALID_TYPES = set(_NUMERIC_TYPES + _STRING_TYPES + _BUFFER_SOURCE_TYPES + _VALID_TYPES = set(_NUMERIC_TYPES + _STRING_TYPES + _BUFFER_SOURCE_TYPES +
_MISC_TYPES) _MISC_TYPES)
...@@ -629,6 +644,10 @@ class SimpleType(IdlType): ...@@ -629,6 +644,10 @@ class SimpleType(IdlType):
def is_array_buffer(self): def is_array_buffer(self):
return self._name == 'ArrayBuffer' return self._name == 'ArrayBuffer'
@property
def is_array_buffer_view(self):
return self._name == 'ArrayBufferView'
@property @property
def is_data_view(self): def is_data_view(self):
return self._name == 'DataView' return self._name == 'DataView'
...@@ -1144,10 +1163,6 @@ class UnionType(IdlType): ...@@ -1144,10 +1163,6 @@ class UnionType(IdlType):
@property @property
def flattened_member_types(self): def flattened_member_types(self):
return set(self.flattened_member_types_in_original_order)
@property
def flattened_member_types_in_original_order(self):
def flatten(idl_type): def flatten(idl_type):
if idl_type.is_union: if idl_type.is_union:
return functools.reduce( return functools.reduce(
...@@ -1160,7 +1175,7 @@ class UnionType(IdlType): ...@@ -1160,7 +1175,7 @@ class UnionType(IdlType):
else: else:
return [idl_type] return [idl_type]
return flatten(self) return set(flatten(self))
@property @property
def union_definition_object(self): def union_definition_object(self):
......
...@@ -688,6 +688,7 @@ class _IRBuilder(object): ...@@ -688,6 +688,7 @@ class _IRBuilder(object):
buffer_source_types = set([ buffer_source_types = set([
'ArrayBuffer', 'ArrayBuffer',
'ArrayBufferView', # Blink-specific ArrayBufferView definition
'DataView', 'DataView',
'Int8Array', 'Int8Array',
'Int16Array', 'Int16Array',
......
...@@ -24,8 +24,3 @@ typedef SpeechRecognition SpeechRecognitionConstructor; ...@@ -24,8 +24,3 @@ typedef SpeechRecognition SpeechRecognitionConstructor;
typedef SpeechRecognitionErrorEvent SpeechRecognitionErrorEventConstructor; typedef SpeechRecognitionErrorEvent SpeechRecognitionErrorEventConstructor;
typedef SpeechRecognitionEvent SpeechRecognitionEventConstructor; typedef SpeechRecognitionEvent SpeechRecognitionEventConstructor;
typedef URL URLConstructor; typedef URL URLConstructor;
// https://heycam.github.io/webidl/#ArrayBufferView
typedef (Int8Array or Int16Array or Int32Array or
Uint8Array or Uint16Array or Uint32Array or Uint8ClampedArray or
Float32Array or Float64Array or DataView) ArrayBufferView;
...@@ -87,8 +87,7 @@ class Union(WithIdentifier, WithCodeGeneratorInfo, WithComponent, ...@@ -87,8 +87,7 @@ class Union(WithIdentifier, WithCodeGeneratorInfo, WithComponent,
# type_names = sorted( # type_names = sorted(
# [idl_type.type_name for idl_type in flattened_members]) # [idl_type.type_name for idl_type in flattened_members])
type_names = [ type_names = [
idl_type.type_name for idl_type in union_types[0]. idl_type.type_name for idl_type in union_types[0].member_types
flattened_member_types_in_original_order
] ]
if does_include_nullable_type: if does_include_nullable_type:
type_names.append('Null') type_names.append('Null')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment