Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: Source/bindings/dart/scripts/templates/methods_cpp.template

Issue 668733002: C++ overload resolution in bindings layer (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/dartium
Patch Set: Rebase fixups Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 {##############################################################################} 1 {##############################################################################}
2 {# FIXME: We should return a rejected Promise if an error occurs in this
3 function when ALL methods in this overload return Promise. In order to do so,
4 we must ensure either ALL or NO methods in this overload return Promise #}
5 {% macro overload_resolution_method(method) %}
6 {% set overloads = method.overloads %}
7 {% if method.is_static %}
8 {% set offset = 0 %}
9 {% else %}
10 {% set offset = 1 %}
11 {% endif %}
12 static void {{static_method_name(overloads.name)}}Dispatcher(Dart_NativeArgument s args)
13 {
14 Dart_Handle exception = 0;
15 const int argOffset = {{offset}};
16 int argCount = Dart_GetNativeArgumentCount(args) - argOffset;
17
18 {# First resolve by length #}
19 {# 2. Initialize argcount to be min(maxarg, n). #}
20 switch (std::min({{overloads.maxarg}}, argCount)) {
21 {# 3. Remove from S all entries whose type list is not of length argcount. # }
22 {% for length, tests_methods in overloads.length_tests_methods %}
23 {# 10. If i = d, then: #}
24 case {{length}}:
25 {# Then resolve by testing argument #}
26 {% for test, method in tests_methods %}
27 {% filter runtime_enabled(not overloads.runtime_enabled_function_all and
28 method.runtime_enabled_function) %}
29 if ({{test}}) {
30 {% if method.is_custom %}
31 {{static_method_name(method.name)}}(args);
32 {% else %}
33 {{static_method_name(method.name, method.overload_index)}}(args);
34 {% endif %}
35 return;
36 }
37 {% endfilter %}
38 {% endfor %}
39 break;
40 {% endfor %}
41 default:
42 {# Invalid arity, throw error #}
43 {# Report full list of valid arities if gaps and above minimum #}
44 {% if overloads.valid_arities %}
45 if (argCount >= {{overloads.minarg}}) {
46 const String message = "Wrong arity, expected one of {{overloads.val id_arities}}";
47 exception = DartUtilities::coreArgumentErrorException(message);
48 goto fail;
49 }
50 {% endif %}
51 {# Otherwise just report "not enough arguments" #}
52 {
53 const String message = "Not enough arguments (at least {{overloads.m inarg}} required)";
54 exception = DartUtilities::coreArgumentErrorException(message);
55 goto fail;
56 }
57 return;
58 }
59 {
60 const String message = "No function was found that matched the signature provided.";
61 exception = DartUtilities::coreArgumentErrorException(message);
62 goto fail;
63 }
64 return;
65 fail:
66 Dart_ThrowException(exception);
67 ASSERT_NOT_REACHED();
68 }
69 {% endmacro %}
70
71
72 {##############################################################################}
2 {# arguments_count is normal method.number_of_arguments however for optional #} 73 {# arguments_count is normal method.number_of_arguments however for optional #}
3 {# arguments then number_of_required_arguments is passed (sans optional). #} 74 {# arguments then number_of_required_arguments is passed (sans optional). #}
4 {# overload in the index if overloaded. #} 75 {# overload in the index if overloaded. #}
5 {# interface is specified signals that it's a constructor being called the #} 76 {# interface is specified signals that it's a constructor being called the #}
6 {# delegation to the create is emitted. 77 {# delegation to the create is emitted.
7 {##############################################################################} 78 {##############################################################################}
8 {% macro generate_method(method, arguments_count, overload='', constructor=False ) %} 79 {% macro generate_method(method, arguments_count) %}
9 {% if overload == '' %} 80 {% set overload_index = method.overload_index %}
10 {% set overload_index = method.overload_index %}
11 {% else %}
12 {% set overload_index = overload %}
13 {% endif %}
14 static void {{static_method_name(method.name, overload_index)}}(Dart_NativeArgum ents args) 81 static void {{static_method_name(method.name, overload_index)}}(Dart_NativeArgum ents args)
15 { 82 {
16 {% if not method.is_static %} 83 {% if not method.is_static %}
17 {% if cpp_class == "EventTarget" %} 84 {% if cpp_class == "EventTarget" %}
18 {{cpp_class}}* receiver = DartDOMWrapper::receiverToEventTarget(args); 85 {{cpp_class}}* receiver = DartDOMWrapper::receiverToEventTarget(args);
19 {% else %} 86 {% else %}
20 {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = DartDO MWrapper::receiver< {{cpp_class}} >(args); 87 {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = DartDO MWrapper::receiver< {{cpp_class}} >(args);
21 {% endif %} 88 {% endif %}
22 {% endif %} 89 {% endif %}
23 {% if method.is_custom_element_callbacks %} 90 {% if method.is_custom_element_callbacks %}
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 not argument.is_callback_interface %} 189 not argument.is_callback_interface %}
123 {# Optional arguments without a default value generate an early call with 190 {# Optional arguments without a default value generate an early call with
124 fewer arguments if they are omitted. #} 191 fewer arguments if they are omitted. #}
125 if (UNLIKELY(argCount <= {{argument.arg_index}})) { 192 if (UNLIKELY(argCount <= {{argument.arg_index}})) {
126 {{callback_return(method, argument.dart_set_return_value, argument.cpp_value )}} 193 {{callback_return(method, argument.dart_set_return_value, argument.cpp_value )}}
127 if (exception) 194 if (exception)
128 goto fail; 195 goto fail;
129 return; 196 return;
130 } 197 }
131 {% endif %} 198 {% endif %}
199 {% if argument.is_callback_interface %}
200 {# Callback functions must be functions:
201 http://www.w3.org/TR/WebIDL/#es-callback-function #}
202 {% if argument.is_optional %}
203 {{argument.local_cpp_type}} {{argument.name}};
204 if (argCount > {{argument.arg_index}}) {
205 {{argument.name}} = Dart{{argument.idl_type}}::createWithNullCheck(args, {{a rgument.arg_index}}, exception);
206 }
207 {% else %}{# argument.is_optional #}
208 {{argument.local_cpp_type}} {{argument.name}} = Dart{{argument.idl_type}}::creat eWithNullCheck(args, {{argument.arg_index}}, exception);
209 {% endif %}{# argument.is_optional #}
210 {% else %}{# argument.is_callback_interface #}
132 {% if argument.is_optional and argument.default_value -%} 211 {% if argument.is_optional and argument.default_value -%}
133 {{argument.local_cpp_type}} {{argument.name}} = 212 {{argument.local_cpp_type}} {{argument.name}} =
134 (argCount <= {{argument.arg_index}}) ? ({{argument.default_value}}) : {{argu ment.dart_value_to_local_cpp_value}}; 213 (argCount <= {{argument.arg_index}}) ? ({{argument.default_value}}) : {{argu ment.dart_value_to_local_cpp_value}};
135 {% elif argument.is_optional and argument.idl_type == 'Dictionary' %} 214 {% elif argument.is_optional and argument.idl_type == 'Dictionary' %}
136 {{argument.local_cpp_type}} {{argument.name}}; 215 {{argument.local_cpp_type}} {{argument.name}};
137 if (UNLIKELY(argCount <= {{argument.arg_index}})) { 216 if (UNLIKELY(argCount <= {{argument.arg_index}})) {
138 {{argument.name}} = Dictionary(); 217 {{argument.name}} = Dictionary();
139 } else { 218 } else {
140 {{argument.name}} = {{argument.dart_value_to_local_cpp_value}}; 219 {{argument.name}} = {{argument.dart_value_to_local_cpp_value}};
141 } 220 }
142 {% elif argument.is_array_or_sequence_type %} 221 {% elif argument.is_array_or_sequence_type %}
143 {{argument.local_cpp_type}} {{argument.name}}; 222 {{argument.local_cpp_type}} {{argument.name}};
144 {{argument.dart_value_to_local_cpp_value}}; 223 {{argument.dart_value_to_local_cpp_value}};
145 {% else %} 224 {% else %}
146 {{argument.local_cpp_type}} {{argument.name}} = {{argument.dart_value_to_local_c pp_value}}; 225 {{argument.local_cpp_type}} {{argument.name}} = {{argument.dart_value_to_local_c pp_value}};
147 {% endif %} 226 {% endif %}
227 {% endif %}{# argument.is_callback_interface #}
148 if (exception) 228 if (exception)
149 goto fail; 229 goto fail;
150 {% endmacro %} 230 {% endmacro %}
151 231
152 232
153 {######################################} 233 {######################################}
154 {% macro generate_arguments(method) %} 234 {% macro generate_arguments(method) %}
155 {%- for argument in method.arguments -%} 235 {%- for argument in method.arguments -%}
156 {{generate_argument(method, argument)}} 236 {{generate_argument(method, argument)}}
157 {%- endfor -%} 237 {%- endfor -%}
158 {% endmacro %} 238 {% endmacro %}
159 239
160 {##############################################################################} 240 {##############################################################################}
161 {% macro static_method_name(name, overload_index) %} 241 {% macro static_method_name(name, overload_index) %}
162 {% set name = 'constructor' if not name else name -%} 242 {% set name = 'constructor' if not name else name -%}
163 {% if overload_index -%} 243 {% if overload_index -%}
164 {{name}}Callback_{{overload_index}} 244 {{name}}Callback_{{overload_index}}
165 {%- else -%} 245 {%- else -%}
166 {{name}}Callback 246 {{name}}Callback
167 {%- endif %} 247 {%- endif %}
168 {% endmacro -%} 248 {% endmacro -%}
169 249
170 250
171 {##############################################################################} 251 {##############################################################################}
172 {% macro generate_resolver_body(dart_class, class_name, method) %} 252 {% macro generate_resolver_body(dart_class, class_name, method) %}
173 {% for native_entry in method.native_entries %} 253 {% for native_entry in method.native_entries %}
174 {% set uses_script_args = method.is_call_with_script_arguments %} 254 {% set uses_script_args = method.is_call_with_script_arguments %}
255 {% if method.overload_index %}
256 {% set method_name = static_method_name(method.name) + "Dispatcher" %}
257 {% else %}
258 {% set method_name = static_method_name(method.name) %}
259 {% endif %}
175 {% if method.is_custom %} 260 {% if method.is_custom %}
176 {% set method_name = static_method_name(method.name) %}
177 // FIXME: we are missing changes from dart.idl so we don't always know how many 261 // FIXME: we are missing changes from dart.idl so we don't always know how many
178 // args custom methods will take so we ignore that check which could hurt perf 262 // args custom methods will take so we ignore that check which could hurt perf
179 // and security but lets us get everything running quicker. 263 // and security but lets us get everything running quicker.
180 if (name == "{{native_entry.resolver_string}}") { 264 if (name == "{{native_entry.resolver_string}}") {
181 *autoSetupScope = {{method.auto_scope}}; 265 *autoSetupScope = {{method.auto_scope}};
182 return {{dart_class}}Internal::{{method_name}}; 266 return {{dart_class}}Internal::{{method_name}};
183 } 267 }
184 {% else %} 268 {% else %}
185 {% set method_name = static_method_name(method.name, method.overload_index) %}
186 {% set args_one_based = method.number_of_arguments %} 269 {% set args_one_based = method.number_of_arguments %}
187 {% set args_required_one_based = method.number_of_required_arguments %} 270 {% set args_required_one_based = method.number_of_required_arguments %}
188 {% if not method.is_static %} 271 {% if not method.is_static %}
189 {% set args_one_based = args_one_based + 1 %} 272 {% set args_one_based = args_one_based + 1 %}
190 {% set args_required_one_based = args_required_one_based + 1 %} 273 {% set args_required_one_based = args_required_one_based + 1 %}
191 {% endif %} 274 {% endif %}
192 275
193 {% if uses_script_args %} 276 {% if uses_script_args %}
194 {# FIXME(vsm): At least one script argument is expected. Generalize? #} 277 {# FIXME(vsm): At least one script argument is expected. Generalize? #}
195 {% set args_one_based = args_one_based + 1 %} 278 {% set args_one_based = args_one_based + 1 %}
(...skipping 13 matching lines...) Expand all
209 {% endif %} 292 {% endif %}
210 {% endif %} 293 {% endif %}
211 {% endfor %} 294 {% endfor %}
212 {% endmacro %} 295 {% endmacro %}
213 296
214 297
215 {##############################################################################} 298 {##############################################################################}
216 {% macro generate_symbolizer_body(dart_class, class_name, method) %} 299 {% macro generate_symbolizer_body(dart_class, class_name, method) %}
217 {% for native_entry in method.native_entries %} 300 {% for native_entry in method.native_entries %}
218 {% set uses_script_args = method.is_call_with_script_arguments %} 301 {% set uses_script_args = method.is_call_with_script_arguments %}
219 {% if method.is_custom %} 302 {% if method.overload_index %}
220 {% set method_name = static_method_name(method.name) %} 303 {% set method_name = static_method_name(method.name) + "Dispatcher" %}
304 {% else %}
305 {% set method_name = static_method_name(method.name) %}
306 {% endif %}
221 if (nf == {{dart_class}}Internal::{{method_name}}) { 307 if (nf == {{dart_class}}Internal::{{method_name}}) {
222 return reinterpret_cast<const uint8_t*>("{{native_entry.resolver_string}}"); 308 return reinterpret_cast<const uint8_t*>("{{native_entry.resolver_string}}");
223 } 309 }
224 {% else %}
225 {% set method_name = static_method_name(method.name, method.overload_index) %}
226 if (nf == {{dart_class}}Internal::{{method_name}}) {
227 return reinterpret_cast<const uint8_t*>("{{native_entry.resolver_string}}");
228 }
229 {% endif %}
230 {% endfor %} 310 {% endfor %}
231 {% endmacro %} 311 {% endmacro %}
232 312
233 313
234 {##############################################################################} 314 {##############################################################################}
235 {% macro generate_constructor(constructor, arguments_count, overload='') %} 315 {% macro generate_constructor(constructor, arguments_count, overload='') %}
236 {% if overload == '' %} 316 {% if overload == '' %}
237 {% set overload_index = constructor.overload_index %} 317 {% set overload_index = constructor.overload_index %}
238 {% else %} 318 {% else %}
239 {% set overload_index = overload %} 319 {% set overload_index = overload %}
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 {% endif %} 446 {% endif %}
367 {{dart_class}}::returnToDart(args, event.get()); 447 {{dart_class}}::returnToDart(args, event.get());
368 return; 448 return;
369 } 449 }
370 fail: 450 fail:
371 Dart_ThrowException(exception); 451 Dart_ThrowException(exception);
372 ASSERT_NOT_REACHED(); 452 ASSERT_NOT_REACHED();
373 } 453 }
374 {% endmacro %} 454 {% endmacro %}
375 455
376 456 ,
377 {##############################################################################} 457 {##############################################################################}
378 {% macro generate_resolver_constructor(dart_class, class_name, constructor) %} 458 {% macro generate_resolver_constructor(dart_class, class_name, constructor) %}
379 {% for native_entry in constructor.native_entries %} 459 {% for native_entry in constructor.native_entries %}
380 {% set resolver_string = native_entry.resolver_string %} 460 {% set resolver_string = native_entry.resolver_string %}
461 {% if constructor.overload_index %}
462 {% set constructor_name = static_method_name(constructor.name) + "Dispatcher" %}
463 {% else %}
464 {% set constructor_name = static_method_name(constructor.name) %}
465 {% endif %}
381 {% if has_custom_constructor %} 466 {% if has_custom_constructor %}
382 if (name == "{{resolver_string}}") { 467 if (name == "{{resolver_string}}") {
383 {% elif constructor.number_of_arguments == constructor.number_of_required_argume nts %} 468 {% elif constructor.number_of_arguments == constructor.number_of_required_argume nts %}
384 if (argumentCount == {{constructor.number_of_arguments}} && name == "{{resolver_ string}}") { 469 if (argumentCount == {{constructor.number_of_arguments}} && name == "{{resolver_ string}}") {
385 {% else %} 470 {% else %}
386 if (argumentCount >= {{constructor.number_of_required_arguments}} && argumentCou nt <= {{constructor.number_of_arguments}} && name == "{{resolver_string}}") { 471 if (argumentCount >= {{constructor.number_of_required_arguments}} && argumentCou nt <= {{constructor.number_of_arguments}} && name == "{{resolver_string}}") {
387 {% endif %} 472 {% endif %}
388 *autoSetupScope = {{constructor.auto_scope}}; 473 *autoSetupScope = {{constructor.auto_scope}};
389 return {{dart_class}}Internal::{{static_method_name(constructor.name, constr uctor.overload_index)}}; 474 return {{dart_class}}Internal::{{constructor_name}};
390 } 475 }
391 {% endfor %} 476 {% endfor %}
392 {% endmacro %} 477 {% endmacro %}
393 478
394 {##############################################################################} 479 {##############################################################################}
395 {% macro generate_resolver_event_constructor(dart_class, class_name) %} 480 {% macro generate_resolver_event_constructor(dart_class, class_name) %}
396 {% set resolver_string = interface_name + "_constructorCallback" %} 481 {% set resolver_string = interface_name + "_constructorCallback" %}
397 if (argumentCount == 2 && name == "{{resolver_string}}") { 482 if (argumentCount == 2 && name == "{{resolver_string}}") {
398 *autoSetupScope = 1; 483 *autoSetupScope = 1;
399 return {{dart_class}}Internal::eventConstructorCallback; 484 return {{dart_class}}Internal::eventConstructorCallback;
400 } 485 }
401 {% endmacro %} 486 {% endmacro %}
402 487
403 {##############################################################################} 488 {##############################################################################}
404 {% macro generate_symbolizer_constructor(dart_class, class_name, constructor) %} 489 {% macro generate_symbolizer_constructor(dart_class, class_name, constructor) %}
405 {% for native_entry in constructor.native_entries %} 490 {% for native_entry in constructor.native_entries %}
406 {% set resolver_string = native_entry.resolver_string %} 491 {% set resolver_string = native_entry.resolver_string %}
407 if (nf == {{dart_class}}Internal::{{static_method_name(constructor.name, constru ctor.overload_index)}}) { 492 if (nf == {{dart_class}}Internal::{{static_method_name(constructor.name, constru ctor.overload_index)}}) {
408 return reinterpret_cast<const uint8_t*>("{{resolver_string}}"); 493 return reinterpret_cast<const uint8_t*>("{{resolver_string}}");
409 } 494 }
410 {% endfor %} 495 {% endfor %}
411 {% endmacro %} 496 {% endmacro %}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698