OLD | NEW |
---|---|
1 {##############################################################################} | 1 {##############################################################################} |
2 {% macro generate_method(method, world_suffix) %} | 2 {% macro generate_method(method, world_suffix) %} |
3 {% filter conditional(method.conditional_string) %} | 3 {% filter conditional(method.conditional_string) %} |
4 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) | 4 static void {{method.name}}{{method.overload_index}}Method{{world_suffix}}(const v8::FunctionCallbackInfo<v8::Value>& info) |
5 { | 5 { |
6 {# Local variables #} | 6 {# Local variables #} |
7 {% if method.has_exception_state %} | 7 {% if method.has_exception_state %} |
8 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); | 8 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{method.na me}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); |
9 {% endif %} | 9 {% endif %} |
10 {# Overloaded methods have length checked during overload resolution #} | 10 {# Overloaded methods have length checked during overload resolution #} |
11 {% if method.number_of_required_arguments and not method.overload_index %} | 11 {% if method.number_of_required_arguments and not method.overload_index %} |
12 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { | 12 if (UNLIKELY(info.Length() < {{method.number_of_required_arguments}})) { |
13 {{throw_minimum_arity_type_error(method, method.number_of_required_argum ents)}}; | 13 {{throw_minimum_arity_type_error(method, method.number_of_required_argum ents) | indent(8)}} |
14 return; | 14 return; |
15 } | 15 } |
16 {% endif %} | 16 {% endif %} |
17 {% if not method.is_static %} | 17 {% if not method.is_static %} |
18 {{cpp_class}}* impl = {{v8_class}}::toNative(info.Holder()); | 18 {{cpp_class}}* impl = {{v8_class}}::toNative(info.Holder()); |
19 {% endif %} | 19 {% endif %} |
20 {% if method.is_custom_element_callbacks %} | 20 {% if method.is_custom_element_callbacks %} |
21 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope; | 21 CustomElementCallbackDispatcher::CallbackDeliveryScope deliveryScope; |
22 {% endif %} | 22 {% endif %} |
23 {# Security checks #} | 23 {# Security checks #} |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
315 v8SetReturnValueNull(info); | 315 v8SetReturnValueNull(info); |
316 {% endmacro %} | 316 {% endmacro %} |
317 | 317 |
318 | 318 |
319 {######################################} | 319 {######################################} |
320 {% macro throw_type_error(method, error_message) %} | 320 {% macro throw_type_error(method, error_message) %} |
321 {% if method.has_exception_state %} | 321 {% if method.has_exception_state %} |
322 exceptionState.throwTypeError({{error_message}}); | 322 exceptionState.throwTypeError({{error_message}}); |
323 {{throw_from_exception_state(method)}}; | 323 {{throw_from_exception_state(method)}}; |
324 {% elif method.is_constructor %} | 324 {% elif method.is_constructor %} |
325 {% if method.idl_type == 'Promise' %} | 325 {% if method.idl_type == 'Promise' %} |
Jens Widell
2014/08/12 07:18:03
This if/else block is repeated twice in this macro
yhirano
2014/08/12 07:43:19
Done.
Jens Widell
2014/08/12 08:42:26
I meant the "if promise, set return value, else th
| |
326 {# FIXME: reduce code duplication between sync / async exception handling. #} | 326 {# FIXME: reduce code duplication between sync / async exception handling. #} |
327 v8SetReturnValue(info, ScriptPromise::rejectWithTypeError(ScriptState::current(i nfo.GetIsolate()), ExceptionMessages::failedToConstruct("{{interface_name}}", {{ error_message}})).v8Value()); | 327 v8SetReturnValue(info, ScriptPromise::rejecRaw(info.GetIsolate(), V8ThrowExcepti on::createTypeError(ExceptionMessages::failedToConstruct("{{interface_name}}", { {error_message}}), info.GetIsolate()))); |
328 {% else %} | 328 {% else %} |
329 V8ThrowException::throwTypeError(ExceptionMessages::failedToConstruct("{{interfa ce_name}}", {{error_message}}), info.GetIsolate()); | 329 V8ThrowException::throwTypeError(ExceptionMessages::failedToConstruct("{{interfa ce_name}}", {{error_message}}), info.GetIsolate()); |
330 {% endif %} | 330 {% endif %} |
331 {% else %}{# method.has_exception_state #} | 331 {% else %}{# method.has_exception_state #} |
332 {% if method.idl_type == 'Promise' %} | 332 {% if method.idl_type == 'Promise' %} |
333 v8SetReturnValue(info, ScriptPromise::rejectWithTypeError(ScriptState::current(i nfo.GetIsolate()), ExceptionMessages::failedToExecute("{{method.name}}", "{{inte rface_name}}", {{error_message}})).v8Value()); | 333 v8SetReturnValue(info, ScriptPromise::rejectRaw(info.GetIsolate(), V8ThrowExcept ion::createTypeError(ExceptionMessages::failedToExecute("{{method.name}}", "{{in terface_name}}", {{error_message}}), info.GetIsolate()))); |
334 {% else %} | 334 {% else %} |
335 V8ThrowException::throwTypeError(ExceptionMessages::failedToExecute("{{method.na me}}", "{{interface_name}}", {{error_message}}), info.GetIsolate()); | 335 V8ThrowException::throwTypeError(ExceptionMessages::failedToExecute("{{method.na me}}", "{{interface_name}}", {{error_message}}), info.GetIsolate()); |
336 {% endif %} | 336 {% endif %} |
337 {% endif %}{# method.has_exception_state #} | 337 {% endif %}{# method.has_exception_state #} |
338 {% endmacro %} | 338 {% endmacro %} |
339 | 339 |
340 | 340 |
341 {######################################} | 341 {######################################} |
342 {% macro throw_from_exception_state(method) %} | 342 {% macro throw_from_exception_state(method) %} |
343 {% if method.idl_type == 'Promise' %} | 343 {% if method.idl_type == 'Promise' %} |
344 v8SetReturnValue(info, exceptionState.reject(ScriptState::current(info.GetIsolat e())).v8Value()) | 344 v8SetReturnValue(info, exceptionState.reject(ScriptState::current(info.GetIsolat e())).v8Value()) |
345 {%- else %} | 345 {%- else %} |
346 exceptionState.throwIfNeeded() | 346 exceptionState.throwIfNeeded() |
347 {%- endif %} | 347 {%- endif %} |
348 {%- endmacro %} | 348 {%- endmacro %} |
349 | 349 |
350 | 350 |
351 {######################################} | 351 {######################################} |
352 {% macro throw_arity_type_error(method, valid_arities) %} | 352 {% macro create_minimum_arity_type_error_without_exception_state(method, number_ of_required_arguments) %} |
353 {% if method.idl_type == 'Promise' %} | 353 {% if method.is_constructor %} |
354 {% if method.has_exception_state %} | 354 createMinimumArityTypeErrorForConstructor("{{interface_name}}", {{number_of_requ ired_arguments}}, info.Length(), info.GetIsolate()) |
355 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeError(ScriptState::curr ent(info.GetIsolate()), exceptionState, {{valid_arities}}, info.Length()).v8Valu e()) | |
356 {%- elif method.is_constructor %} | |
357 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeErrorForConstructor(Scr iptState::current(info.GetIsolate()), "{{interface_name}}", {{valid_arities}}, i nfo.Length()).v8Value()) | |
358 {%- else %} | 355 {%- else %} |
359 v8SetReturnValue(info, ScriptPromise::rejectWithArityTypeErrorForMethod(ScriptSt ate::current(info.GetIsolate()), "{{method.name}}", "{{interface_name}}", {{vali d_arities}}, info.Length()).v8Value()) | 356 createMinimumArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{ number_of_required_arguments}}, info.Length(), info.GetIsolate()) |
360 {%- endif %} | 357 {%- endif %} |
361 {%- else %}{# methods.idl_type == 'Promise' #} | 358 {%- endmacro %} |
362 {% if method.has_exception_state %} | |
363 throwArityTypeError(exceptionState, {{valid_arities}}, info.Length()) | |
364 {%- elif method.is_constructor %} | |
365 throwArityTypeErrorForConstructor("{{interface_name}}", {{valid_arities}}, info. Length(), info.GetIsolate()) | |
366 {%- else %} | |
367 throwArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{valid_ar ities}}, info.Length(), info.GetIsolate()) | |
368 {%- endif %} | |
369 {%- endif %}{# methods.idl_type == 'Promise' #} | |
370 {% endmacro %} | |
371 | 359 |
372 | 360 |
373 {######################################} | 361 {######################################} |
374 {% macro throw_minimum_arity_type_error(method, number_of_required_arguments) %} | 362 {% macro throw_minimum_arity_type_error(method, number_of_required_arguments) %} |
363 {% if method.has_exception_state %} | |
364 setMinimumArityTypeError(exceptionState, {{number_of_required_arguments}}, info. Length()); | |
365 {{throw_from_exception_state(method)}}; | |
366 {%- else %} | |
375 {% if method.idl_type == 'Promise' %} | 367 {% if method.idl_type == 'Promise' %} |
376 {% if method.has_exception_state %} | 368 v8SetReturnValue(info, ScriptPromise::rejectRaw(info.GetIsolate(), {{create_mini mum_arity_type_error_without_exception_state(method, number_of_required_argument s)}})); |
377 v8SetReturnValue(info, ScriptPromise::rejectWithMinimumArityTypeError(ScriptStat e::current(info.GetIsolate()), exceptionState, {{number_of_required_arguments}}, info.Length()).v8Value()) | |
378 {%- elif method.is_constructor %} | |
379 v8SetReturnValue(info, ScriptPromise::rejectWithMinimumArityTypeErrorForConstruc tor(ScriptState::current(info.GetIsolate()), "{{interface_name}}", {{number_of_r equired_arguments}}, info.Length()).v8Value()) | |
380 {%- else %} | 369 {%- else %} |
381 v8SetReturnValue(info, ScriptPromise::rejectWithMinimumArityTypeErrorForMethod(S criptState::current(info.GetIsolate()), "{{method.name}}", "{{interface_name}}", {{number_of_required_arguments}}, info.Length()).v8Value()) | 370 V8ThrowException::throwException({{create_minimum_arity_type_error_without_excep tion_state(method, number_of_required_arguments)}}, info.GetIsolate()); |
382 {%- endif %} | 371 {%- endif %}{# method.idl_type == 'Promise' #} |
383 {%- else %}{# methods.idl_type == 'Promise' #} | 372 {%- endif %}{# method.has_exception_state #} |
384 {% if method.has_exception_state %} | 373 {%- endmacro %} |
385 throwMinimumArityTypeError(exceptionState, {{number_of_required_arguments}}, inf o.Length()) | |
386 {%- elif method.is_constructor %} | |
387 throwMinimumArityTypeErrorForConstructor("{{interface_name}}", {{number_of_requi red_arguments}}, info.Length(), info.GetIsolate()) | |
388 {%- else %} | |
389 throwMinimumArityTypeErrorForMethod("{{method.name}}", "{{interface_name}}", {{n umber_of_required_arguments}}, info.Length(), info.GetIsolate()) | |
390 {%- endif %} | |
391 {%- endif %}{# methods.idl_type == 'Promise' #} | |
392 {% endmacro %} | |
393 | 374 |
394 | 375 |
395 {##############################################################################} | 376 {##############################################################################} |
396 {% macro overload_resolution_method(overloads, world_suffix) %} | 377 {% macro overload_resolution_method(overloads, world_suffix) %} |
397 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) | 378 static void {{overloads.name}}Method{{world_suffix}}(const v8::FunctionCallbackI nfo<v8::Value>& info) |
398 { | 379 { |
399 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{overloads .name}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); | 380 ExceptionState exceptionState(ExceptionState::ExecutionContext, "{{overloads .name}}", "{{interface_name}}", info.Holder(), info.GetIsolate()); |
400 {% if overloads.measure_all_as %} | 381 {% if overloads.measure_all_as %} |
401 UseCounter::count(callingExecutionContext(info.GetIsolate()), UseCounter::{{ overloads.measure_all_as}}); | 382 UseCounter::count(callingExecutionContext(info.GetIsolate()), UseCounter::{{ overloads.measure_all_as}}); |
402 {% endif %} | 383 {% endif %} |
(...skipping 23 matching lines...) Expand all Loading... | |
426 } | 407 } |
427 {% endfilter %} | 408 {% endfilter %} |
428 {% endfor %} | 409 {% endfor %} |
429 break; | 410 break; |
430 {% endfor %} | 411 {% endfor %} |
431 default: | 412 default: |
432 {# Invalid arity, throw error #} | 413 {# Invalid arity, throw error #} |
433 {# Report full list of valid arities if gaps and above minimum #} | 414 {# Report full list of valid arities if gaps and above minimum #} |
434 {% if overloads.valid_arities %} | 415 {% if overloads.valid_arities %} |
435 if (info.Length() >= {{overloads.minarg}}) { | 416 if (info.Length() >= {{overloads.minarg}}) { |
436 throwArityTypeError(exceptionState, "{{overloads.valid_arities}}", i nfo.Length()); | 417 {# FIXME: We should return a rejected Promise here and the |
Jens Widell
2014/08/12 07:18:03
This FIXME applies to the code immediately followi
yhirano
2014/08/12 07:43:19
This function has three blocks and all should be a
| |
418 the following throwIfNeeded when ALL methods return Promise. In | |
419 order to do so, we must ensure either ALL or NO methods in this | |
420 overload return Promise #} | |
421 setArityTypeError(exceptionState, "{{overloads.valid_arities}}", inf o.Length()); | |
422 exceptionState.throwIfNeeded(); | |
437 return; | 423 return; |
438 } | 424 } |
439 {% endif %} | 425 {% endif %} |
440 {# Otherwise just report "not enough arguments" #} | 426 {# Otherwise just report "not enough arguments" #} |
441 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{ov erloads.minarg}}, info.Length())); | 427 exceptionState.throwTypeError(ExceptionMessages::notEnoughArguments({{ov erloads.minarg}}, info.Length())); |
442 exceptionState.throwIfNeeded(); | 428 exceptionState.throwIfNeeded(); |
443 return; | 429 return; |
444 } | 430 } |
445 {# No match, throw error #} | 431 {# No match, throw error #} |
446 exceptionState.throwTypeError("No function was found that matched the signat ure provided."); | 432 exceptionState.throwTypeError("No function was found that matched the signat ure provided."); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
607 v8SetReturnValue(info, info.Holder()); | 593 v8SetReturnValue(info, info.Holder()); |
608 return; | 594 return; |
609 } | 595 } |
610 {% endif %} | 596 {% endif %} |
611 {% if constructor.has_exception_state %} | 597 {% if constructor.has_exception_state %} |
612 ExceptionState exceptionState(ExceptionState::ConstructionContext, "{{interf ace_name}}", info.Holder(), info.GetIsolate()); | 598 ExceptionState exceptionState(ExceptionState::ConstructionContext, "{{interf ace_name}}", info.Holder(), info.GetIsolate()); |
613 {% endif %} | 599 {% endif %} |
614 {# Overloaded constructors have length checked during overload resolution #} | 600 {# Overloaded constructors have length checked during overload resolution #} |
615 {% if constructor.number_of_required_arguments and not constructor.overload_ index %} | 601 {% if constructor.number_of_required_arguments and not constructor.overload_ index %} |
616 if (UNLIKELY(info.Length() < {{constructor.number_of_required_arguments}})) { | 602 if (UNLIKELY(info.Length() < {{constructor.number_of_required_arguments}})) { |
617 {{throw_minimum_arity_type_error(constructor, constructor.number_of_requ ired_arguments)}}; | 603 {{throw_minimum_arity_type_error(constructor, constructor.number_of_requ ired_arguments) | indent(8)}} |
618 return; | 604 return; |
619 } | 605 } |
620 {% endif %} | 606 {% endif %} |
621 {% if constructor.arguments %} | 607 {% if constructor.arguments %} |
622 {{generate_arguments(constructor) | indent}} | 608 {{generate_arguments(constructor) | indent}} |
623 {% endif %} | 609 {% endif %} |
624 {{cpp_method_call(constructor, constructor.v8_set_return_value, constructor. cpp_value) | indent}} | 610 {{cpp_method_call(constructor, constructor.v8_set_return_value, constructor. cpp_value) | indent}} |
625 } | 611 } |
626 {% endmacro %} | 612 {% endmacro %} |
627 | 613 |
628 | 614 |
629 {##############################################################################} | 615 {##############################################################################} |
630 {% macro generate_constructor_wrapper(constructor) %} | 616 {% macro generate_constructor_wrapper(constructor) %} |
631 {% if has_custom_wrap %} | 617 {% if has_custom_wrap %} |
632 v8::Handle<v8::Object> wrapper = wrap(impl.get(), info.Holder(), info.GetIsolate ()); | 618 v8::Handle<v8::Object> wrapper = wrap(impl.get(), info.Holder(), info.GetIsolate ()); |
633 {% else %} | 619 {% else %} |
634 {% set constructor_class = v8_class + ('Constructor' | 620 {% set constructor_class = v8_class + ('Constructor' |
635 if constructor.is_named_constructor else | 621 if constructor.is_named_constructor else |
636 '') %} | 622 '') %} |
637 v8::Handle<v8::Object> wrapper = info.Holder(); | 623 v8::Handle<v8::Object> wrapper = info.Holder(); |
638 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{constr uctor_class}}::wrapperTypeInfo, wrapper, info.GetIsolate(), {{wrapper_configurat ion}}); | 624 V8DOMWrapper::associateObjectWithWrapper<{{v8_class}}>(impl.release(), &{{constr uctor_class}}::wrapperTypeInfo, wrapper, info.GetIsolate(), {{wrapper_configurat ion}}); |
639 {% endif %} | 625 {% endif %} |
640 v8SetReturnValue(info, wrapper); | 626 v8SetReturnValue(info, wrapper); |
641 {% endmacro %} | 627 {% endmacro %} |
OLD | NEW |