18abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# Copyright (C) 2013 Google Inc. All rights reserved.
28abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#
38abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
48abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# modification, are permitted provided that the following conditions are
58abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# met:
68abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#
78abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#     * Redistributions of source code must retain the above copyright
88abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# notice, this list of conditions and the following disclaimer.
98abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#     * Redistributions in binary form must reproduce the above
108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# in the documentation and/or other materials provided with the
128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# distribution.
138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# contributors may be used to endorse or promote products derived from
158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# this software without specific prior written permission.
168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#
178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
238abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
258abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)"""Functions for type handling and type conversion (Blink/C++ <-> V8/JS).
309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)Spec:
32bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)http://www.w3.org/TR/WebIDL/#es-type-mapping
33bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FIXME: Not currently used in build.
359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)This is a rewrite of the Perl IDL compiler in Python, but is not complete.
369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)Once it is complete, we will switch all IDL files over to Python at once.
379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)Until then, please work on the Perl IDL compiler.
389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)For details, see bug http://crbug.com/239771
399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)"""
409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)import posixpath
428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)import re
438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
44f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)from v8_globals import includes
4506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)import idl_definitions  # for UnionType
46f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)from v8_utilities import strip_suffix
4706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
4806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
4906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# IDL types
5006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
5106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)BASIC_TYPES = set([
531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # Built-in, non-composite, non-object data types
5406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # http://www.w3.org/TR/WebIDL/#dfn-primitive-type
558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'boolean',
568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'float',
578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    # unrestricted float is not supported
588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'double',
598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    # unrestricted double is not supported
608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    # integer types
618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    # http://www.w3.org/TR/WebIDL/#dfn-integer-type
628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'byte',
638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'octet',
648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'short',
658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'unsigned short',
668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    # int and unsigned are not IDL types
678abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'long',
688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'unsigned long',
698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'long long',
708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'unsigned long long',
711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # http://www.w3.org/TR/WebIDL/#idl-types
721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'DOMString',
738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'Date',
741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # http://www.w3.org/TR/WebIDL/#es-type-mapping
758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    'void',
768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)])
7706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)enum_types = {}  # name -> values
7906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)callback_function_types = set()
808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)def array_or_sequence_type(idl_type):
838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return array_type(idl_type) or sequence_type(idl_type)
848abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
858abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
868abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)def array_type(idl_type):
878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    matched = re.match(r'([\w\s]+)\[\]', idl_type)
888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return matched and matched.group(1)
898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
91bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_basic_type(idl_type):
921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return idl_type in BASIC_TYPES
931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
95bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_callback_function_type(idl_type):
9606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return idl_type in callback_function_types
9706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
9806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
9906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)def set_callback_function_types(callback_functions):
10006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    callback_function_types.update(callback_functions.keys())
10106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
10206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
103bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_composite_type(idl_type):
1041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return (idl_type == 'any' or
1051e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            array_type(idl_type) or
1061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            sequence_type(idl_type) or
107bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            is_union_type(idl_type))
1081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1091e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
110bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_enum_type(idl_type):
1111e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return idl_type in enum_types
11206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
11306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
114bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def enum_values(idl_type):
115bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return enum_types.get(idl_type)
116bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
117bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)def set_enum_types(enumerations):
1191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    enum_types.update([[enum.name, enum.values]
1201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)                       for enum in enumerations.values()])
1218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1228abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
123bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_interface_type(idl_type):
1241e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # Anything that is not another type is an interface type.
1251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # http://www.w3.org/TR/WebIDL/#idl-types
1261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # http://www.w3.org/TR/WebIDL/#idl-interface
1271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # In C++ these are RefPtr or PassRefPtr types.
128bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return not(is_basic_type(idl_type) or
129bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)               is_composite_type(idl_type) or
130bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)               is_callback_function_type(idl_type) or
131bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)               is_enum_type(idl_type) or
132bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)               idl_type == 'object' or
133bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)               idl_type == 'Promise')  # Promise will be basic in future
13406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
13506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
1368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)def sequence_type(idl_type):
1378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    matched = re.match(r'sequence<([\w\s]+)>', idl_type)
1388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return matched and matched.group(1)
1398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
141bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_union_type(idl_type):
14206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return isinstance(idl_type, idl_definitions.IdlUnionType)
1438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
1451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)################################################################################
1461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)# V8-specific type handling
1471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)################################################################################
1481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
1491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)DOM_NODE_TYPES = set([
1501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Attr',
1511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'CDATASection',
1521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'CharacterData',
1531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Comment',
1541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Document',
1551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'DocumentFragment',
1561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'DocumentType',
1571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Element',
1581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Entity',
1591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'HTMLDocument',
1601e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Node',
1611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Notation',
1621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ProcessingInstruction',
1631e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ShadowRoot',
1641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'SVGDocument',
1651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Text',
1661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'TestNode',
1671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)])
1681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)NON_WRAPPER_TYPES = set([
16919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'CompareHow',
17019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'Dictionary',
17119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'MediaQueryListListener',
1721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'NodeFilter',
1731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'SerializedScriptValue',
1741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)])
1751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)TYPED_ARRAYS = {
1761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # (cpp_type, v8_type), used by constructor templates
1771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ArrayBuffer': None,
1781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'ArrayBufferView': None,
1791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Float32Array': ('float', 'v8::kExternalFloatArray'),
1801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Float64Array': ('double', 'v8::kExternalDoubleArray'),
1811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Int8Array': ('signed char', 'v8::kExternalByteArray'),
1821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Int16Array': ('short', 'v8::kExternalShortArray'),
1831e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Int32Array': ('int', 'v8::kExternalIntArray'),
1841e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Uint8Array': ('unsigned char', 'v8::kExternalUnsignedByteArray'),
1851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Uint8ClampedArray': ('unsigned char', 'v8::kExternalPixelArray'),
1861e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Uint16Array': ('unsigned short', 'v8::kExternalUnsignedShortArray'),
1871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Uint32Array': ('unsigned int', 'v8::kExternalUnsignedIntArray'),
1881e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
190bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
191f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)def constructor_type(idl_type):
192f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return strip_suffix(idl_type, 'Constructor')
193f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
194f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
195bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_dom_node_type(idl_type):
1961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return (idl_type in DOM_NODE_TYPES or
1971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            (idl_type.startswith(('HTML', 'SVG')) and
1981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)             idl_type.endswith('Element')))
1991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
201bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_typed_array_type(idl_type):
2021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return idl_type in TYPED_ARRAYS
2031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
2041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
205bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def is_wrapper_type(idl_type):
206bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return (is_interface_type(idl_type) and
2071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            idl_type not in NON_WRAPPER_TYPES)
2088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
2098abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
21006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
21106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# C++ types
21206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
21306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
21406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)CPP_TYPE_SAME_AS_IDL_TYPE = set([
21506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'double',
21606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'float',
21706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'long long',
21806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'unsigned long long',
21906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)])
22006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)CPP_INT_TYPES = set([
22106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'byte',
22206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'long',
22306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'short',
22406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)])
22506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)CPP_UNSIGNED_TYPES = set([
22606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'octet',
22706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'unsigned int',
22806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'unsigned long',
22906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'unsigned short',
23006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)])
231bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)CPP_SPECIAL_CONVERSION_RULES = {
23219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'CompareHow': 'Range::CompareHow',
233bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    'Date': 'double',
23419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'Dictionary': 'Dictionary',
23519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'EventHandler': 'EventListener*',
2361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'Promise': 'ScriptPromise',
2371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'any': 'ScriptValue',
2381e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'boolean': 'bool',
2391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
24006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
24106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)def cpp_type(idl_type, extended_attributes=None, used_as_argument=False):
24206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    """Returns C++ type corresponding to IDL type."""
24319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    def string_mode():
244bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        # FIXME: the Web IDL spec requires 'EmptyString', not 'NullString',
245bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        # but we use NullString for performance.
24619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if extended_attributes.get('TreatNullAs') != 'NullString':
24719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            return ''
24819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if extended_attributes.get('TreatUndefinedAs') != 'NullString':
24919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            return 'WithNullCheck'
25019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return 'WithUndefinedOrNullCheck'
251bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
25206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    extended_attributes = extended_attributes or {}
253bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    idl_type = preprocess_idl_type(idl_type)
254bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
2558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if idl_type in CPP_TYPE_SAME_AS_IDL_TYPE:
2568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return idl_type
2578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if idl_type in CPP_INT_TYPES:
2588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return 'int'
2598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if idl_type in CPP_UNSIGNED_TYPES:
2608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return 'unsigned'
261bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if idl_type in CPP_SPECIAL_CONVERSION_RULES:
262bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return CPP_SPECIAL_CONVERSION_RULES[idl_type]
26319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (idl_type in NON_WRAPPER_TYPES or
26419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        idl_type == 'XPathNSResolver'):  # FIXME: eliminate this special case
265bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 'RefPtr<%s>' % idl_type
266bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if idl_type == 'DOMString':
26719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        if not used_as_argument:
26819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)            return 'String'
26919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return 'V8StringResource<%s>' % string_mode()
270bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_union_type(idl_type):
27106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        raise Exception('UnionType is not supported')
272bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    this_array_or_sequence_type = array_or_sequence_type(idl_type)
273bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if this_array_or_sequence_type:
274bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return cpp_template_type('Vector', cpp_type(this_array_or_sequence_type))
2751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
276bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_typed_array_type and used_as_argument:
277bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return idl_type + '*'
278bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_interface_type(idl_type) and not used_as_argument:
27906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return cpp_template_type('RefPtr', idl_type)
28006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # Default, assume native type is a pointer with same type name as idl type
28106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return idl_type + '*'
2828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
2838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
28406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)def cpp_template_type(template, inner_type):
28506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    """Returns C++ template specialized to type, with space added if needed."""
28606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if inner_type.endswith('>'):
28706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        format_string = '{template}<{inner_type} >'
2888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    else:
28906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        format_string = '{template}<{inner_type}>'
29006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return format_string.format(template=template, inner_type=inner_type)
29106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
29206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
29306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)def v8_type(interface_type):
29406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return 'V8' + interface_type
29506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
29606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
29706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
29806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# Includes
29906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
30006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
30106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
30206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)def includes_for_cpp_class(class_name, relative_dir_posix):
30306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return set([posixpath.join('bindings', relative_dir_posix, class_name + '.h')])
30406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
30506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
3061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)INCLUDES_FOR_TYPE = {
307bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    'any': set(['bindings/v8/ScriptValue.h']),
30851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'object': set(),
30951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'Dictionary': set(['bindings/v8/Dictionary.h']),
310bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    'EventHandler': set(['bindings/v8/V8AbstractEventListener.h',
311bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)                         'bindings/v8/V8EventListenerList.h']),
31251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'EventListener': set(['bindings/v8/BindingSecurity.h',
31351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                          'bindings/v8/V8EventListenerList.h',
31451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                          'core/frame/DOMWindow.h']),
31551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'MediaQueryListListener': set(['core/css/MediaQueryListListener.h']),
316bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    'Promise': set(['bindings/v8/ScriptPromise.h']),
3171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'SerializedScriptValue': set(['bindings/v8/SerializedScriptValue.h']),
3181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
3198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3208abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)def includes_for_type(idl_type):
3211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if idl_type in INCLUDES_FOR_TYPE:
3221e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return INCLUDES_FOR_TYPE[idl_type]
323bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_basic_type(idl_type) or is_enum_type(idl_type):
3248abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return set()
325bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_typed_array_type(idl_type):
3261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return set(['bindings/v8/custom/V8%sCustom.h' % idl_type])
3278abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    this_array_or_sequence_type = array_or_sequence_type(idl_type)
3288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if this_array_or_sequence_type:
3298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return includes_for_type(this_array_or_sequence_type)
330f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if idl_type.endswith('Constructor'):
331f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        idl_type = constructor_type(idl_type)
3328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return set(['V8%s.h' % idl_type])
33306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
33406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
335f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)def add_includes_for_type(idl_type):
336f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    includes.update(includes_for_type(idl_type))
337f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
338f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
33906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
34006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# V8 -> C++
34106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
34206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
34351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)V8_VALUE_TO_CPP_VALUE = {
34451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    # Basic
345bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    'Date': 'toWebCoreDate({v8_value})',
346bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    'DOMString': '{v8_value}',
34706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'boolean': '{v8_value}->BooleanValue()',
34806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'float': 'static_cast<float>({v8_value}->NumberValue())',
34906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'double': 'static_cast<double>({v8_value}->NumberValue())',
35006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'byte': 'toInt8({arguments})',
35106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'octet': 'toUInt8({arguments})',
35219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'short': 'toInt16({arguments})',
35319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'unsigned short': 'toUInt16({arguments})',
35406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'long': 'toInt32({arguments})',
35506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'unsigned long': 'toUInt32({arguments})',
35606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'long long': 'toInt64({arguments})',
35706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'unsigned long long': 'toUInt64({arguments})',
35851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    # Interface types
35951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'any': 'ScriptValue({v8_value}, info.GetIsolate())',
36051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'CompareHow': 'static_cast<Range::CompareHow>({v8_value}->Int32Value())',
36151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'Dictionary': 'Dictionary({v8_value}, info.GetIsolate())',
36251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'MediaQueryListListener': 'MediaQueryListListener::create(ScriptValue({v8_value}, info.GetIsolate()))',
36351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'NodeFilter': 'toNodeFilter({v8_value}, info.GetIsolate())',
36451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'Promise': 'ScriptPromise({v8_value})',
36551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'SerializedScriptValue': 'SerializedScriptValue::create({v8_value}, info.GetIsolate())',
36651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'XPathNSResolver': 'toXPathNSResolver({v8_value}, info.GetIsolate())',
36706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
36806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
36906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
37019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)def v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, index):
37106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    this_array_or_sequence_type = array_or_sequence_type(idl_type)
37206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if this_array_or_sequence_type:
37319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        return v8_value_to_cpp_value_array_or_sequence(this_array_or_sequence_type, v8_value, index)
37406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
375bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    idl_type = preprocess_idl_type(idl_type)
37651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    add_includes_for_type(idl_type)
37706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
37806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if 'EnforceRange' in extended_attributes:
37906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        arguments = ', '.join([v8_value, 'EnforceRange', 'ok'])
38006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    else:  # NormalConversion
38106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        arguments = v8_value
38206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
38351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if idl_type in V8_VALUE_TO_CPP_VALUE:
38451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        cpp_expression_format = V8_VALUE_TO_CPP_VALUE[idl_type]
385bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    elif is_typed_array_type(idl_type):
386bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        cpp_expression_format = (
387f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            '{v8_value}->Is{idl_type}() ? '
388bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            'V8{idl_type}::toNative(v8::Handle<v8::{idl_type}>::Cast({v8_value})) : 0')
38906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    else:
39006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        cpp_expression_format = (
39151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            'V8{idl_type}::hasInstance({v8_value}, info.GetIsolate(), worldType(info.GetIsolate())) ? '
392bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            'V8{idl_type}::toNative(v8::Handle<v8::Object>::Cast({v8_value})) : 0')
39306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
39419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return cpp_expression_format.format(arguments=arguments, idl_type=idl_type, v8_value=v8_value)
39506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
39606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
39719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)def v8_value_to_cpp_value_array_or_sequence(this_array_or_sequence_type, v8_value, index):
398f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    # Index is None for setters, index (starting at 0) for method arguments,
399f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    # and is used to provide a human-readable exception message
400f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if index is None:
401f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        index = 0  # special case, meaning "setter"
402f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    else:
403f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        index += 1  # human-readable index
40451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (is_interface_type(this_array_or_sequence_type) and
40551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this_array_or_sequence_type != 'Dictionary'):
40606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        this_cpp_type = None
40719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        expression_format = '(toRefPtrNativeArray<{array_or_sequence_type}, V8{array_or_sequence_type}>({v8_value}, {index}, info.GetIsolate()))'
40851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        add_includes_for_type(this_array_or_sequence_type)
40906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    else:
41006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        this_cpp_type = cpp_type(this_array_or_sequence_type)
41119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        expression_format = 'toNativeArray<{cpp_type}>({v8_value}, {index}, info.GetIsolate())'
41219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    expression = expression_format.format(array_or_sequence_type=this_array_or_sequence_type, cpp_type=this_cpp_type, index=index, v8_value=v8_value)
413bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return expression
41406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
41506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
41619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)def v8_value_to_local_cpp_value(idl_type, extended_attributes, v8_value, variable_name, index=None):
417bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    """Returns an expression that converts a V8 value to a C++ value and stores it as a local value."""
41806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    this_cpp_type = cpp_type(idl_type, extended_attributes=extended_attributes, used_as_argument=True)
41906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
420bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    idl_type = preprocess_idl_type(idl_type)
42106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if idl_type == 'DOMString':
422bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        format_string = 'V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID({cpp_type}, {variable_name}, {cpp_value})'
42306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    elif 'EnforceRange' in extended_attributes:
42419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        format_string = 'V8TRYCATCH_WITH_TYPECHECK_VOID({cpp_type}, {variable_name}, {cpp_value}, info.GetIsolate())'
42506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    else:
426bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        format_string = 'V8TRYCATCH_VOID({cpp_type}, {variable_name}, {cpp_value})'
42706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
42819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    cpp_value = v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, index)
42919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    return format_string.format(cpp_type=this_cpp_type, cpp_value=cpp_value, variable_name=variable_name)
43006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
43106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
43206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
43306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)# C++ -> V8
43406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)################################################################################
43506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
43606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
437bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def preprocess_idl_type(idl_type):
438bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_enum_type(idl_type):
4391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        # Enumerations are internally DOMStrings
440bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 'DOMString'
441bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_callback_function_type(idl_type):
442bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 'ScriptValue'
443bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return idl_type
444bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
445bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
446bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)def preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes):
447bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    """Returns IDL type and value, with preliminary type conversions applied."""
448bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    idl_type = preprocess_idl_type(idl_type)
449bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if idl_type in ['Promise', 'any']:
4501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        idl_type = 'ScriptValue'
4511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if idl_type in ['long long', 'unsigned long long']:
45206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        # long long and unsigned long long are not representable in ECMAScript;
45306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        # we represent them as doubles.
45406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        idl_type = 'double'
45506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        cpp_value = 'static_cast<double>(%s)' % cpp_value
45606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # HTML5 says that unsigned reflected attributes should be in the range
45706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # [0, 2^31). When a value isn't in this range, a default value (or 0)
45806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # should be returned instead.
45906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    extended_attributes = extended_attributes or {}
46006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if ('Reflect' in extended_attributes and
46106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        idl_type in ['unsigned long', 'unsigned short']):
46206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        cpp_value = cpp_value.replace('getUnsignedIntegralAttribute',
46306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)                                      'getIntegralAttribute')
46406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        cpp_value = 'std::max(0, %s)' % cpp_value
46506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return idl_type, cpp_value
46606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
46706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
468f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)def v8_conversion_type(idl_type, extended_attributes):
469bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    """Returns V8 conversion type, adding any additional includes.
47006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
47106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    The V8 conversion type is used to select the C++ -> V8 conversion function
47206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    or v8SetReturnValue* function; it can be an idl_type, a cpp_type, or a
47306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    separate name for the type of conversion (e.g., 'DOMWrapper').
47406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    """
475f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    extended_attributes = extended_attributes or {}
4761e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # Basic types, without additional includes
47706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if idl_type in CPP_INT_TYPES:
478bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 'int'
47906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if idl_type in CPP_UNSIGNED_TYPES:
480bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 'unsigned'
481bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if idl_type == 'DOMString':
482bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if 'TreatReturnedNullStringAs' not in extended_attributes:
483bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            return 'DOMString'
484bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        treat_returned_null_string_as = extended_attributes['TreatReturnedNullStringAs']
485bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if treat_returned_null_string_as == 'Null':
486bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            return 'StringOrNull'
487bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if treat_returned_null_string_as == 'Undefined':
488bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)            return 'StringOrUndefined'
489bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        raise 'Unrecognized TreatReturnNullStringAs value: "%s"' % treat_returned_null_string_as
490bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if is_basic_type(idl_type) or idl_type == 'ScriptValue':
491bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return idl_type
49206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
49306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # Data type with potential additional includes
49406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    this_array_or_sequence_type = array_or_sequence_type(idl_type)
49506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if this_array_or_sequence_type:
496bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if is_interface_type(this_array_or_sequence_type):
497f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)            add_includes_for_type(this_array_or_sequence_type)
498bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 'array'
49906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
500f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    add_includes_for_type(idl_type)
50151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if idl_type in V8_SET_RETURN_VALUE:  # Special v8SetReturnValue treatment
502bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return idl_type
50306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
50406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # Pointer type
505bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    includes.add('wtf/GetPtr.h')  # FIXME: remove if can eliminate WTF::getPtr
50606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    includes.add('wtf/RefPtr.h')
507bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return 'DOMWrapper'
50806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
50906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
51006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)V8_SET_RETURN_VALUE = {
51119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'boolean': 'v8SetReturnValueBool(info, {cpp_value})',
51219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'int': 'v8SetReturnValueInt(info, {cpp_value})',
51319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'unsigned': 'v8SetReturnValueUnsigned(info, {cpp_value})',
51419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'DOMString': 'v8SetReturnValueString(info, {cpp_value}, info.GetIsolate())',
515bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    # [TreatNullReturnValueAs]
51619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'StringOrNull': 'v8SetReturnValueStringOrNull(info, {cpp_value}, info.GetIsolate())',
51719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'StringOrUndefined': 'v8SetReturnValueStringOrUndefined(info, {cpp_value}, info.GetIsolate())',
51806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'void': '',
51906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # No special v8SetReturnValue* function (set value directly)
52019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'float': 'v8SetReturnValue(info, {cpp_value})',
52119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'double': 'v8SetReturnValue(info, {cpp_value})',
52206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # No special v8SetReturnValue* function, but instead convert value to V8
52306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # and then use general v8SetReturnValue.
52419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'array': 'v8SetReturnValue(info, {cpp_value})',
52519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'Date': 'v8SetReturnValue(info, {cpp_value})',
52619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'EventHandler': 'v8SetReturnValue(info, {cpp_value})',
52719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'ScriptValue': 'v8SetReturnValue(info, {cpp_value})',
52819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'SerializedScriptValue': 'v8SetReturnValue(info, {cpp_value})',
52906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # DOMWrapper
53019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'DOMWrapperFast': 'v8SetReturnValueFast(info, {cpp_value}, {script_wrappable})',
53119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    'DOMWrapperDefault': 'v8SetReturnValue(info, {cpp_value})',
53206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
53306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
53406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
53519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)def v8_set_return_value(idl_type, cpp_value, extended_attributes=None, script_wrappable=''):
53606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    """Returns a statement that converts a C++ value to a V8 value and sets it as a return value."""
53706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    def dom_wrapper_conversion_type():
53806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if not script_wrappable:
53906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            return 'DOMWrapperDefault'
54006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return 'DOMWrapperFast'
54106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
542bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    idl_type, cpp_value = preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes)
543f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    this_v8_conversion_type = v8_conversion_type(idl_type, extended_attributes)
54406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # SetReturn-specific overrides
545bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if this_v8_conversion_type in ['Date', 'EventHandler', 'ScriptValue', 'SerializedScriptValue', 'array']:
54606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        # Convert value to V8 and then use general v8SetReturnValue
54719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        cpp_value = cpp_value_to_v8_value(idl_type, cpp_value, extended_attributes=extended_attributes)
548bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if this_v8_conversion_type == 'DOMWrapper':
549bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        this_v8_conversion_type = dom_wrapper_conversion_type()
55006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
551bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    format_string = V8_SET_RETURN_VALUE[this_v8_conversion_type]
55219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    statement = format_string.format(cpp_value=cpp_value, script_wrappable=script_wrappable)
553bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return statement
55406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
55506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
55606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)CPP_VALUE_TO_V8_VALUE = {
55751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    # Built-in types
55806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'Date': 'v8DateOrNull({cpp_value}, {isolate})',
559a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    'DOMString': 'v8String({isolate}, {cpp_value})',
56006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'boolean': 'v8Boolean({cpp_value}, {isolate})',
561a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    'int': 'v8::Integer::New({isolate}, {cpp_value})',
562a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    'unsigned': 'v8::Integer::NewFromUnsigned({isolate}, {cpp_value})',
56351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'float': 'v8::Number::New({isolate}, {cpp_value})',
56451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'double': 'v8::Number::New({isolate}, {cpp_value})',
56506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'void': 'v8Undefined()',
5661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    # Special cases
5671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    'EventHandler': '{cpp_value} ? v8::Handle<v8::Value>(V8AbstractEventListener::cast({cpp_value})->getListenerObject(imp->executionContext())) : v8::Handle<v8::Value>(v8::Null({isolate}))',
56851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'ScriptValue': '{cpp_value}.v8Value()',
56951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'SerializedScriptValue': '{cpp_value} ? {cpp_value}->deserialize() : v8::Handle<v8::Value>(v8::Null({isolate}))',
57006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    # General
57106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    'array': 'v8Array({cpp_value}, {isolate})',
57251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    'DOMWrapper': 'toV8({cpp_value}, {creation_context}, {isolate})',
57306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)}
57406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
57506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
57651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)def cpp_value_to_v8_value(idl_type, cpp_value, isolate='info.GetIsolate()', creation_context='', extended_attributes=None):
57706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    """Returns an expression that converts a C++ value to a V8 value."""
57819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    # the isolate parameter is needed for callback interfaces
579bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    idl_type, cpp_value = preprocess_idl_type_and_value(idl_type, cpp_value, extended_attributes)
580f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    this_v8_conversion_type = v8_conversion_type(idl_type, extended_attributes)
581bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    format_string = CPP_VALUE_TO_V8_VALUE[this_v8_conversion_type]
58251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    statement = format_string.format(cpp_value=cpp_value, isolate=isolate, creation_context=creation_context)
583bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return statement
584