| OLD | NEW | 
|    1 # Copyright (C) 2013 Google Inc. All rights reserved. |    1 # Copyright (C) 2013 Google Inc. All rights reserved. | 
|    2 # |    2 # | 
|    3 # Redistribution and use in source and binary forms, with or without |    3 # Redistribution and use in source and binary forms, with or without | 
|    4 # modification, are permitted provided that the following conditions are |    4 # modification, are permitted provided that the following conditions are | 
|    5 # met: |    5 # met: | 
|    6 # |    6 # | 
|    7 #     * Redistributions of source code must retain the above copyright |    7 #     * Redistributions of source code must retain the above copyright | 
|    8 # notice, this list of conditions and the following disclaimer. |    8 # notice, this list of conditions and the following disclaimer. | 
|    9 #     * Redistributions in binary form must reproduce the above |    9 #     * Redistributions in binary form must reproduce the above | 
|   10 # copyright notice, this list of conditions and the following disclaimer |   10 # copyright notice, this list of conditions and the following disclaimer | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|   38 import sys |   38 import sys | 
|   39  |   39  | 
|   40 # jinja2 is in chromium's third_party directory. |   40 # jinja2 is in chromium's third_party directory. | 
|   41 module_path, module_name = os.path.split(__file__) |   41 module_path, module_name = os.path.split(__file__) | 
|   42 third_party = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pard
     ir) |   42 third_party = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pard
     ir) | 
|   43 sys.path.append(third_party) |   43 sys.path.append(third_party) | 
|   44 import jinja2 |   44 import jinja2 | 
|   45  |   45  | 
|   46 templates_dir = os.path.join(module_path, os.pardir, 'templates') |   46 templates_dir = os.path.join(module_path, os.pardir, 'templates') | 
|   47  |   47  | 
 |   48 ACRONYMS = ['CSS', 'HTML', 'IME', 'JS', 'SVG', 'URL', 'XML', 'XSLT'] | 
|   48 CALLBACK_INTERFACE_CPP_INCLUDES = set([ |   49 CALLBACK_INTERFACE_CPP_INCLUDES = set([ | 
|   49     'core/dom/ScriptExecutionContext.h', |   50     'core/dom/ScriptExecutionContext.h', | 
|   50     'bindings/v8/V8Binding.h', |   51     'bindings/v8/V8Binding.h', | 
|   51     'bindings/v8/V8Callback.h', |   52     'bindings/v8/V8Callback.h', | 
|   52     'wtf/Assertions.h', |   53     'wtf/Assertions.h', | 
|   53 ]) |   54 ]) | 
|   54  |  | 
|   55  |  | 
|   56 CALLBACK_INTERFACE_H_INCLUDES = set([ |   55 CALLBACK_INTERFACE_H_INCLUDES = set([ | 
|   57     'bindings/v8/ActiveDOMCallback.h', |   56     'bindings/v8/ActiveDOMCallback.h', | 
|   58     'bindings/v8/DOMWrapperWorld.h', |   57     'bindings/v8/DOMWrapperWorld.h', | 
|   59     'bindings/v8/ScopedPersistent.h', |   58     'bindings/v8/ScopedPersistent.h', | 
|   60 ]) |   59 ]) | 
|   61  |  | 
|   62  |  | 
|   63 INTERFACE_CPP_INCLUDES = set([ |   60 INTERFACE_CPP_INCLUDES = set([ | 
|   64     'RuntimeEnabledFeatures.h', |   61     'RuntimeEnabledFeatures.h', | 
|   65     'bindings/v8/ScriptController.h', |   62     'bindings/v8/ScriptController.h', | 
|   66     'bindings/v8/V8Binding.h', |   63     'bindings/v8/V8Binding.h', | 
|   67     'bindings/v8/V8DOMConfiguration.h', |   64     'bindings/v8/V8DOMConfiguration.h',  # FIXME: necessary? | 
|   68     'bindings/v8/V8DOMWrapper.h', |   65     'bindings/v8/V8DOMWrapper.h',  # FIXME: necessary? | 
|   69     'core/dom/ContextFeatures.h', |   66     'core/dom/ContextFeatures.h', | 
|   70     'core/dom/Document.h', |   67     'core/dom/Document.h', | 
|   71     'core/page/Frame.h', |   68     'core/page/Frame.h', | 
|   72     'core/platform/chromium/TraceEvent.h', |   69     'core/platform/chromium/TraceEvent.h', | 
|   73     'wtf/UnusedParam.h', |   70     'wtf/UnusedParam.h', | 
|   74 ]) |   71 ]) | 
|   75  |  | 
|   76  |  | 
|   77 INTERFACE_H_INCLUDES = set([ |   72 INTERFACE_H_INCLUDES = set([ | 
|   78     'bindings/v8/V8Binding.h', |   73     'bindings/v8/V8Binding.h', | 
|   79     'bindings/v8/V8DOMWrapper.h', |   74     'bindings/v8/V8DOMWrapper.h',  # FIXME: necessary? | 
|   80     'bindings/v8/WrapperTypeInfo.h', |   75     'bindings/v8/WrapperTypeInfo.h',  # FIXME: necessary? | 
|   81 ]) |   76 ]) | 
|   82  |  | 
|   83  |  | 
|   84 CPP_TYPE_SPECIAL_CONVERSION_RULES = { |   77 CPP_TYPE_SPECIAL_CONVERSION_RULES = { | 
|   85     'float': 'float', |   78     'float': 'float', | 
|   86     'double': 'double', |   79     'double': 'double', | 
|   87     'long long': 'long long', |   80     'long long': 'long long', | 
|   88     'unsigned long long': 'unsigned long long', |   81     'unsigned long long': 'unsigned long long', | 
|   89     'long': 'int', |   82     'long': 'int', | 
|   90     'short': 'int', |   83     'short': 'int', | 
|   91     'byte': 'int', |   84     'byte': 'int', | 
|   92     'boolean': 'bool', |   85     'boolean': 'bool', | 
|   93     'DOMString': 'const String&', |   86     'DOMString': 'const String&', | 
|   94 } |   87 } | 
|   95  |   88 CPP_UNSIGNED_TYPES = set([ | 
|   96  |   89     'octet', | 
 |   90     'unsigned int', | 
 |   91     'unsigned long', | 
 |   92     'unsigned short', | 
 |   93 ]) | 
|   97 PRIMITIVE_TYPES = set([ |   94 PRIMITIVE_TYPES = set([ | 
|   98     'boolean', |   95     'boolean', | 
|   99     'void', |   96     'void', | 
|  100     'Date', |   97     'Date', | 
|  101     'byte', |   98     'byte', | 
|  102     'octet', |   99     'octet', | 
|  103     'short', |  100     'short', | 
|  104     'long', |  101     'long', | 
|  105     'long long', |  102     'long long', | 
|  106     'unsigned short', |  103     'unsigned short', | 
|  107     'unsigned long', |  104     'unsigned long', | 
|  108     'unsigned long long', |  105     'unsigned long long', | 
|  109     'float', |  106     'float', | 
|  110     'double', |  107     'double', | 
|  111 ]) |  108 ]) | 
 |  109 V8_SET_RETURN_VALUE_DICT = { | 
 |  110     'unsigned': 'v8SetReturnValueUnsigned({callback_info}, {cpp_value});', | 
 |  111 } | 
|  112  |  112  | 
|  113  |  113  | 
|  114 def apply_template(basename, contents): |  114 def apply_template(basename, contents): | 
|  115     jinja_env = jinja2.Environment(trim_blocks=True, loader=jinja2.FileSystemLoa
     der(templates_dir)) |  115     jinja_env = jinja2.Environment(trim_blocks=True, loader=jinja2.FileSystemLoa
     der(templates_dir)) | 
|  116     template = jinja_env.get_template(basename) |  116     template = jinja_env.get_template(basename) | 
|  117     return template.render(contents) |  117     return template.render(contents) | 
|  118  |  118  | 
|  119  |  119  | 
|  120 def cpp_value_to_js_value(data_type, cpp_value, isolate, creation_context=''): |  120 def cpp_value_to_v8_value(data_type, cpp_value, isolate, creation_context=''): | 
|  121     """Returns a expression that represent JS value corresponding to a C++ value
     .""" |  121     """Return an expression converting a C++ value to a V8 value.""" | 
|  122     if data_type == 'boolean': |  122     if data_type == 'boolean': | 
|  123         return 'v8Boolean(%s, %s)' % (cpp_value, isolate) |  123         return 'v8Boolean(%s, %s)' % (cpp_value, isolate) | 
|  124     if data_type in ['long long', 'unsigned long long', 'DOMTimeStamp']: |  124     if data_type in ['long long', 'unsigned long long', 'DOMTimeStamp']: | 
|  125         # long long and unsigned long long are not representable in ECMAScript. |  125         # long long and unsigned long long are not representable in ECMAScript. | 
|  126         return 'v8::Number::New(static_cast<double>(%s))' % cpp_value |  126         return 'v8::Number::New(static_cast<double>(%s))' % cpp_value | 
|  127     if primitive_type(data_type): |  127     if primitive_type(data_type): | 
|  128         if data_type not in ['float', 'double']: |  128         if data_type not in ['float', 'double']: | 
|  129             raise Exception('unexpected data_type %s' % data_type) |  129             raise Exception('unexpected data_type %s' % data_type) | 
|  130         return 'v8::Number::New(%s)' % cpp_value |  130         return 'v8::Number::New(%s)' % cpp_value | 
|  131     if data_type == 'DOMString': |  131     if data_type == 'DOMString': | 
|  132         return 'v8String(%s, %s)' % (cpp_value, isolate) |  132         return 'v8String(%s, %s)' % (cpp_value, isolate) | 
|  133     if array_or_sequence_type(data_type): |  133     if array_or_sequence_type(data_type): | 
|  134         return 'v8Array(%s, %s)' % (cpp_value, isolate) |  134         return 'v8Array(%s, %s)' % (cpp_value, isolate) | 
|  135     return 'toV8(%s, %s, %s)' % (cpp_value, creation_context, isolate) |  135     return 'toV8(%s, %s, %s)' % (cpp_value, creation_context, isolate) | 
|  136  |  136  | 
|  137  |  137  | 
 |  138 def v8_set_return_value(data_type, cpp_value, callback_info=''): | 
 |  139     """Return an statement converting a C++ value to a V8 value and setting it a
     s a return value.""" | 
 |  140     this_cpp_type = cpp_type(data_type) | 
 |  141     if this_cpp_type in V8_SET_RETURN_VALUE_DICT: | 
 |  142         expression_format_string = V8_SET_RETURN_VALUE_DICT[this_cpp_type] | 
 |  143     else: | 
 |  144         raise Exception('unexpected data_type %s' % data_type) | 
 |  145     return expression_format_string.format(callback_info=callback_info, cpp_valu
     e=cpp_value) | 
 |  146  | 
 |  147  | 
|  138 def generate_conditional_string(interface_or_attribute_or_operation): |  148 def generate_conditional_string(interface_or_attribute_or_operation): | 
|  139     if 'Conditional' not in interface_or_attribute_or_operation.extended_attribu
     tes: |  149     if 'Conditional' not in interface_or_attribute_or_operation.extended_attribu
     tes: | 
|  140         return '' |  150         return '' | 
|  141     conditional = interface_or_attribute_or_operation.extended_attributes['Condi
     tional'] |  151     conditional = interface_or_attribute_or_operation.extended_attributes['Condi
     tional'] | 
|  142     for operator in ['&', '|']: |  152     for operator in ['&', '|']: | 
|  143         if operator in conditional: |  153         if operator in conditional: | 
|  144             conditions = set(conditional.split(operator)) |  154             conditions = set(conditional.split(operator)) | 
|  145             operator_separator = ' %s%s ' % (operator, operator) |  155             operator_separator = ' %s%s ' % (operator, operator) | 
|  146             return operator_separator.join(['ENABLE(%s)' % expression for expres
     sion in sorted(conditions)]) |  156             return operator_separator.join(['ENABLE(%s)' % expression for expres
     sion in sorted(conditions)]) | 
|  147     return 'ENABLE(%s)' % conditional |  157     return 'ENABLE(%s)' % conditional | 
|  148  |  158  | 
|  149  |  159  | 
 |  160 def generate_constants(interface): | 
 |  161     return [generate_constant(constant) for constant in interface.constants] | 
 |  162  | 
 |  163  | 
 |  164 def generate_constant(constant): | 
 |  165     # Extended Attributes: Conditional, DeprecateAs, EnabledAtRuntime, Reflect | 
 |  166     # FIXME: Conditional only used in tests, so remove | 
 |  167     # (Blink-only) string literals are unquoted in tokenizer, must be re-quoted | 
 |  168     # in C++. | 
 |  169     if constant.data_type == 'DOMString': | 
 |  170         value = '"%s"' % constant.value | 
 |  171     else: | 
 |  172         value = constant.value | 
 |  173     reflected_name = constant.extended_attributes.get('Reflect', constant.name) | 
 |  174  | 
 |  175     constant_parameter = { | 
 |  176         'name': constant.name, | 
 |  177         # FIXME: use 'reflected_name' as correct 'name' | 
 |  178         'reflected_name': reflected_name, | 
 |  179         'value': value, | 
 |  180         # FIXME: remove conditional: only used in tests | 
 |  181         'conditional_string': generate_conditional_string(constant), | 
 |  182         'enabled_at_runtime': 'EnabledAtRuntime' in constant.extended_attributes
     , | 
 |  183         'runtime_enable_function_name': runtime_enable_function_name(constant), | 
 |  184     } | 
 |  185     return constant_parameter | 
 |  186  | 
 |  187  | 
 |  188 def runtime_enable_function_name(definition_or_member): | 
 |  189     """Return the name of the RuntimeEnabledFeatures function. | 
 |  190  | 
 |  191     The returned function checks if a method/attribute is enabled. | 
 |  192     If a parameter is given (e.g. 'EnabledAtRuntime=FeatureName'), return: | 
 |  193         RuntimeEnabledFeatures::{featureName}Enabled | 
 |  194     Otherwise return: | 
 |  195         RuntimeEnabledFeatures::{methodName}Enabled | 
 |  196     """ | 
 |  197     name = definition_or_member.extended_attributes.get('EnabledAtRuntime') or d
     efinition_or_member.name | 
 |  198     return 'RuntimeEnabledFeatures::%sEnabled' % uncapitalize(name) | 
 |  199  | 
 |  200  | 
 |  201 def uncapitalize(name): | 
 |  202     """Uncapitalize first letter or initial acronym (* with some exceptions). | 
 |  203  | 
 |  204     E.g., 'SetURL' becomes 'setURL', but 'URLFoo' becomes 'urlFoo'. | 
 |  205     Used in method names; exceptions differ from capitalize(). | 
 |  206     """ | 
 |  207     for acronym in ACRONYMS: | 
 |  208         if name.startswith(acronym): | 
 |  209             name.replace(acronym, acronym.lower()) | 
 |  210             return name | 
 |  211     return name[0].lower() + name[1:] | 
 |  212  | 
 |  213  | 
|  150 def includes_for_type(data_type): |  214 def includes_for_type(data_type): | 
|  151     if primitive_type(data_type) or data_type == 'DOMString': |  215     if primitive_type(data_type) or data_type == 'DOMString': | 
|  152         return set() |  216         return set() | 
|  153     if array_or_sequence_type(data_type): |  217     if array_or_sequence_type(data_type): | 
|  154         return includes_for_type(array_or_sequence_type(data_type)) |  218         return includes_for_type(array_or_sequence_type(data_type)) | 
|  155     return set(['V8%s.h' % data_type]) |  219     return set(['V8%s.h' % data_type]) | 
|  156  |  220  | 
|  157  |  221  | 
|  158 def includes_for_cpp_class(class_name, relative_dir_posix): |  222 def includes_for_cpp_class(class_name, relative_dir_posix): | 
|  159     return set([posixpath.join(relative_dir_posix, class_name + '.h')]) |  223     return set([posixpath.join(relative_dir_posix, class_name + '.h')]) | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
|  180 def array_type(data_type): |  244 def array_type(data_type): | 
|  181     matched = re.match(r'([\w\d_\s]+)\[\]', data_type) |  245     matched = re.match(r'([\w\d_\s]+)\[\]', data_type) | 
|  182     if not matched: |  246     if not matched: | 
|  183         return None |  247         return None | 
|  184     return matched.group(1) |  248     return matched.group(1) | 
|  185  |  249  | 
|  186  |  250  | 
|  187 def array_or_sequence_type(data_type): |  251 def array_or_sequence_type(data_type): | 
|  188     return array_type(data_type) or sequence_type(data_type) |  252     return array_type(data_type) or sequence_type(data_type) | 
|  189  |  253  | 
|  190 def cpp_type(data_type, pointer_type): |  254  | 
 |  255 def cpp_type(idl_type, pointer_type=None): | 
|  191     """Returns the C++ type corresponding to the IDL type. |  256     """Returns the C++ type corresponding to the IDL type. | 
|  192  |  257  | 
 |  258     If unidentified, fall back to a pointer. | 
 |  259  | 
|  193     Args: |  260     Args: | 
|  194         pointer_type: |  261         idl_type: IDL type | 
|  195             'raw': return raw pointer form (e.g. Foo*) |  262         pointer_type: If specified, return 'pointer_type<idl_type>' | 
|  196             'RefPtr': return RefPtr form (e.g. RefPtr<Foo>) |  263             (e.g. RefPtr<Foo>, PassRefPtr<Foo>) | 
|  197             'PassRefPtr': return PassRefPtr form (e.g. RefPtr<Foo>) |  264             else defaults to returning raw pointer form (e.g. 'Foo*'). | 
|  198     """ |  265     """ | 
|  199     if data_type in CPP_TYPE_SPECIAL_CONVERSION_RULES: |  266     if idl_type in CPP_TYPE_SPECIAL_CONVERSION_RULES: | 
|  200         return CPP_TYPE_SPECIAL_CONVERSION_RULES[data_type] |  267         return CPP_TYPE_SPECIAL_CONVERSION_RULES[idl_type] | 
|  201     if array_or_sequence_type(data_type): |  268     if idl_type in CPP_UNSIGNED_TYPES: | 
|  202         return 'const Vector<%s >&' % cpp_type(array_or_sequence_type(data_type)
     , 'RefPtr') |  269         return 'unsigned' | 
|  203     if pointer_type == 'raw': |  270     if array_or_sequence_type(idl_type): | 
|  204         return data_type + '*' |  271         return 'const Vector<{cpp_type} >&'.format(cpp_type=cpp_type(array_or_se
     quence_type(idl_type), 'RefPtr')) | 
|  205     if pointer_type in ['RefPtr', 'PassRefPtr']: |  272     if pointer_type: | 
|  206         return '%s<%s>' % (pointer_type, data_type) |  273         return '{pointer_type}<{idl_type}>'.format(pointer_type=pointer_type, id
     l_type=idl_type) | 
|  207     raise Exception('Unrecognized pointer type: "%s"' % pointer_type) |  274     return idl_type + '*'  # raw pointer | 
|  208  |  275  | 
|  209  |  276  | 
|  210 def v8_type(data_type): |  277 def v8_type(data_type): | 
|  211     return 'V8' + data_type |  278     return 'V8' + data_type | 
|  212  |  279  | 
|  213  |  280  | 
|  214 def cpp_method_name(attribute_or_operation): |  281 def cpp_method_name(attribute_or_operation): | 
|  215     return attribute_or_operation.extended_attributes.get('ImplementedAs', attri
     bute_or_operation.name) |  282     return attribute_or_operation.extended_attributes.get('ImplementedAs', attri
     bute_or_operation.name) | 
|  216  |  283  | 
|  217  |  284  | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|  233         self.verbose = verbose |  300         self.verbose = verbose | 
|  234         self.interface = None |  301         self.interface = None | 
|  235         self.header_includes = set() |  302         self.header_includes = set() | 
|  236         self.cpp_includes = set() |  303         self.cpp_includes = set() | 
|  237         if definitions:  # FIXME: remove check when remove write_dummy_header_an
     d_cpp |  304         if definitions:  # FIXME: remove check when remove write_dummy_header_an
     d_cpp | 
|  238             try: |  305             try: | 
|  239                 self.interface = definitions.interfaces[interface_name] |  306                 self.interface = definitions.interfaces[interface_name] | 
|  240             except KeyError: |  307             except KeyError: | 
|  241                 raise Exception('%s not in IDL definitions' % interface_name) |  308                 raise Exception('%s not in IDL definitions' % interface_name) | 
|  242  |  309  | 
|  243     def generate_cpp_to_js_conversion(self, data_type, cpp_value, format_string,
      isolate, creation_context=''): |  310     def generate_cpp_to_v8_conversion(self, data_type, cpp_value, format_string,
      isolate, creation_context=''): | 
|  244         """Returns a statement that converts a C++ value to a JS value. |  311         """Returns a statement that converts a C++ value to a V8 value. | 
|  245  |  312  | 
|  246         Also add necessary includes to self.cpp_includes. |  313         Also add necessary includes to self.cpp_includes. | 
|  247         """ |  314         """ | 
|  248         self.cpp_includes |= includes_for_type(data_type) |  315         self.cpp_includes |= includes_for_type(data_type) | 
|  249         js_value = cpp_value_to_js_value(data_type, cpp_value, isolate, creation
     _context) |  316         v8_value = cpp_value_to_v8_value(data_type, cpp_value, isolate, creation
     _context) | 
|  250         return format_string % js_value |  317         return format_string % v8_value | 
|  251  |  318  | 
|  252     def write_dummy_header_and_cpp(self): |  319     def write_dummy_header_and_cpp(self): | 
|  253         # FIXME: fix GYP so these files aren't needed and remove this method |  320         # FIXME: fix GYP so these files aren't needed and remove this method | 
|  254         target_interface_name = self.interface_name |  321         target_interface_name = self.interface_name | 
|  255         header_basename = 'V8%s.h' % target_interface_name |  322         header_basename = 'V8%s.h' % target_interface_name | 
|  256         cpp_basename = 'V8%s.cpp' % target_interface_name |  323         cpp_basename = 'V8%s.cpp' % target_interface_name | 
|  257         contents = """/* |  324         contents = """/* | 
|  258     This file is generated just to tell build scripts that {header_basename} and |  325     This file is generated just to tell build scripts that {header_basename} and | 
|  259     {cpp_basename} are created for {target_interface_name}.idl, and thus |  326     {cpp_basename} are created for {target_interface_name}.idl, and thus | 
|  260     prevent the build scripts from trying to generate {header_basename} and |  327     prevent the build scripts from trying to generate {header_basename} and | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  285         header_filename = os.path.join(self.output_directory, header_basename) |  352         header_filename = os.path.join(self.output_directory, header_basename) | 
|  286         with open(header_filename, 'w') as header_file: |  353         with open(header_filename, 'w') as header_file: | 
|  287             header_file.write(header_file_text) |  354             header_file.write(header_file_text) | 
|  288  |  355  | 
|  289     def write_cpp_code(self, cpp_basename, cpp_file_text): |  356     def write_cpp_code(self, cpp_basename, cpp_file_text): | 
|  290         cpp_filename = os.path.join(self.output_directory, cpp_basename) |  357         cpp_filename = os.path.join(self.output_directory, cpp_basename) | 
|  291         with open(cpp_filename, 'w') as cpp_file: |  358         with open(cpp_filename, 'w') as cpp_file: | 
|  292             cpp_file.write(cpp_file_text) |  359             cpp_file.write(cpp_file_text) | 
|  293  |  360  | 
|  294     def generate_attribute(self, attribute): |  361     def generate_attribute(self, attribute): | 
|  295         self.cpp_includes |= includes_for_type(attribute.data_type) |  362         data_type = attribute.data_type | 
 |  363         # FIXME: need to check should_keep_attribute_alive, but for now | 
 |  364         # sufficient to check if primitive. | 
 |  365         should_keep_attribute_alive = not primitive_type(data_type) | 
 |  366         if should_keep_attribute_alive: | 
 |  367             return_v8_value_statement = None  # unused | 
 |  368             self.cpp_includes |= includes_for_type(data_type) | 
 |  369             self.cpp_includes.add('bindings/v8/V8HiddenPropertyName.h') | 
 |  370         else: | 
 |  371             cpp_value = 'imp->%s()' % uncapitalize(attribute.name) | 
 |  372             return_v8_value_statement = v8_set_return_value(data_type, cpp_value
     , callback_info='info') | 
|  296         return { |  373         return { | 
|  297             'name': attribute.name, |  374             'name': attribute.name, | 
|  298             'conditional_string': generate_conditional_string(attribute), |  375             'conditional_string': generate_conditional_string(attribute), | 
|  299             'cpp_method_name': cpp_method_name(attribute), |  376             'cpp_method_name': cpp_method_name(attribute), | 
|  300             'cpp_type': cpp_type(attribute.data_type, pointer_type='RefPtr'), |  377             'cpp_type': cpp_type(data_type, pointer_type='RefPtr'), | 
|  301             'v8_type': v8_type(attribute.data_type), |  378             'should_keep_attribute_alive': should_keep_attribute_alive, | 
 |  379             'return_v8_value_statement': return_v8_value_statement, | 
 |  380             'v8_type': v8_type(data_type), | 
|  302         } |  381         } | 
|  303  |  382  | 
|  304     def generate_interface(self): |  383     def generate_interface(self): | 
|  305         self.header_includes = INTERFACE_H_INCLUDES |  384         self.header_includes = INTERFACE_H_INCLUDES | 
|  306         self.header_includes |= includes_for_cpp_class(cpp_class_name(self.inter
     face), self.relative_dir_posix) |  385         self.header_includes |= includes_for_cpp_class(cpp_class_name(self.inter
     face), self.relative_dir_posix) | 
|  307         self.cpp_includes = INTERFACE_CPP_INCLUDES |  386         self.cpp_includes = INTERFACE_CPP_INCLUDES | 
|  308  |  387  | 
|  309         template_contents = { |  388         template_contents = { | 
|  310             'interface_name': self.interface.name, |  389             'interface_name': self.interface.name, | 
|  311             'cpp_class_name': cpp_class_name(self.interface), |  390             'cpp_class_name': cpp_class_name(self.interface), | 
|  312             'v8_class_name': v8_class_name(self.interface), |  391             'v8_class_name': v8_class_name(self.interface), | 
|  313             'attributes': [self.generate_attribute(attribute) for attribute in s
     elf.interface.attributes], |  392             'attributes': [self.generate_attribute(attribute) for attribute in s
     elf.interface.attributes], | 
|  314             # Size 0 constant array is not allowed in VC++ |  393             # Size 0 constant array is not allowed in VC++ | 
|  315             'number_of_attributes': 'WTF_ARRAY_LENGTH(%sAttributes)' % v8_class_
     name(self.interface) if self.interface.attributes else '0', |  394             'number_of_attributes': 'WTF_ARRAY_LENGTH(%sAttributes)' % v8_class_
     name(self.interface) if self.interface.attributes else '0', | 
|  316             'attribute_templates': v8_class_name(self.interface) + 'Attributes' 
     if self.interface.attributes else '0', |  395             'attribute_templates': v8_class_name(self.interface) + 'Attributes' 
     if self.interface.attributes else '0', | 
|  317         } |  396         } | 
 |  397         template_contents['constants'] = generate_constants(self.interface) | 
|  318         # Add includes afterwards, as they are modified by generate_attribute et
     c. |  398         # Add includes afterwards, as they are modified by generate_attribute et
     c. | 
|  319         template_contents['header_includes'] = sorted(list(self.header_includes)
     ) |  399         template_contents['header_includes'] = sorted(list(self.header_includes)
     ) | 
|  320         template_contents['cpp_includes'] = sorted(list(self.cpp_includes)) |  400         template_contents['cpp_includes'] = sorted(list(self.cpp_includes)) | 
|  321         return template_contents |  401         return template_contents | 
|  322  |  402  | 
|  323     def generate_callback_interface(self): |  403     def generate_callback_interface(self): | 
|  324         self.header_includes = CALLBACK_INTERFACE_H_INCLUDES |  404         self.header_includes = CALLBACK_INTERFACE_H_INCLUDES | 
|  325         self.header_includes |= includes_for_cpp_class(cpp_class_name(self.inter
     face), self.relative_dir_posix) |  405         self.header_includes |= includes_for_cpp_class(cpp_class_name(self.inter
     face), self.relative_dir_posix) | 
|  326         self.cpp_includes = CALLBACK_INTERFACE_CPP_INCLUDES |  406         self.cpp_includes = CALLBACK_INTERFACE_CPP_INCLUDES | 
|  327  |  407  | 
|  328         def generate_argument(argument): |  408         def generate_argument(argument): | 
|  329             receiver = 'v8::Handle<v8::Value> %sHandle = %%s;' % argument.name |  409             receiver = 'v8::Handle<v8::Value> %sHandle = %%s;' % argument.name | 
|  330             cpp_to_js_conversion = self.generate_cpp_to_js_conversion(argument.d
     ata_type, argument.name, receiver, 'isolate', creation_context='v8::Handle<v8::O
     bject>()') |  410             cpp_to_v8_conversion = self.generate_cpp_to_v8_conversion(argument.d
     ata_type, argument.name, receiver, 'isolate', creation_context='v8::Handle<v8::O
     bject>()') | 
|  331             return { |  411             return { | 
|  332                 'name': argument.name, |  412                 'name': argument.name, | 
|  333                 'cpp_to_js_conversion': cpp_to_js_conversion, |  413                 'cpp_to_v8_conversion': cpp_to_v8_conversion, | 
|  334             } |  414             } | 
|  335  |  415  | 
|  336         def generate_method(operation): |  416         def generate_method(operation): | 
|  337             def argument_declaration(argument): |  417             def argument_declaration(argument): | 
|  338                 return '%s %s' % (cpp_type(argument.data_type, 'raw'), argument.
     name) |  418                 return '%s %s' % (cpp_type(argument.data_type), argument.name) | 
|  339  |  419  | 
|  340             arguments = [] |  420             arguments = [] | 
|  341             custom = 'Custom' in operation.extended_attributes |  421             custom = 'Custom' in operation.extended_attributes | 
|  342             if not custom: |  422             if not custom: | 
|  343                 self.cpp_includes |= includes_for_operation(operation) |  423                 self.cpp_includes |= includes_for_operation(operation) | 
|  344                 if operation.data_type != 'boolean': |  424                 if operation.data_type != 'boolean': | 
|  345                     raise Exception("We don't yet support callbacks that return 
     non-boolean values.") |  425                     raise Exception("We don't yet support callbacks that return 
     non-boolean values.") | 
|  346                 arguments = [generate_argument(argument) for argument in operati
     on.arguments] |  426                 arguments = [generate_argument(argument) for argument in operati
     on.arguments] | 
|  347             method = { |  427             method = { | 
|  348                 'return_cpp_type': cpp_type(operation.data_type, 'RefPtr'), |  428                 'return_cpp_type': cpp_type(operation.data_type, 'RefPtr'), | 
|  349                 'name': operation.name, |  429                 'name': operation.name, | 
|  350                 'arguments': arguments, |  430                 'arguments': arguments, | 
|  351                 'argument_declaration': ', '.join([argument_declaration(argument
     ) for argument in operation.arguments]), |  431                 'argument_declaration': ', '.join([argument_declaration(argument
     ) for argument in operation.arguments]), | 
|  352                 'handles': ', '.join(['%sHandle' % argument.name for argument in
      operation.arguments]), |  432                 'handles': ', '.join(['%sHandle' % argument.name for argument in
      operation.arguments]), | 
|  353                 'custom': custom, |  433                 'custom': custom, | 
|  354             } |  434             } | 
|  355             return method |  435             return method | 
|  356  |  436  | 
|  357         methods = [generate_method(operation) for operation in self.interface.op
     erations] |  437         methods = [generate_method(operation) for operation in self.interface.op
     erations] | 
|  358         template_contents = { |  438         template_contents = { | 
|  359             'cpp_class_name': self.interface.name, |  439             'cpp_class_name': self.interface.name, | 
|  360             'v8_class_name': v8_class_name(self.interface), |  440             'v8_class_name': v8_class_name(self.interface), | 
|  361             'cpp_includes': sorted(list(self.cpp_includes)), |  441             'cpp_includes': sorted(list(self.cpp_includes)), | 
|  362             'header_includes': sorted(list(self.header_includes)), |  442             'header_includes': sorted(list(self.header_includes)), | 
|  363             'methods': methods, |  443             'methods': methods, | 
|  364         } |  444         } | 
|  365         return template_contents |  445         return template_contents | 
| OLD | NEW |