Chromium Code Reviews| 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 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 558 expression_format = 'toImplArray<{cpp_type}>({v8_value}, {index}, {isola te}, exceptionState)' | 558 expression_format = 'toImplArray<{cpp_type}>({v8_value}, {index}, {isola te}, exceptionState)' |
| 559 expression = expression_format.format(native_array_element_type=native_array _element_type.name, cpp_type=this_cpp_type, index=index, ref_ptr_type=ref_ptr_ty pe, v8_value=v8_value, isolate=isolate) | 559 expression = expression_format.format(native_array_element_type=native_array _element_type.name, cpp_type=this_cpp_type, index=index, ref_ptr_type=ref_ptr_ty pe, v8_value=v8_value, isolate=isolate) |
| 560 return expression | 560 return expression |
| 561 | 561 |
| 562 | 562 |
| 563 def v8_value_to_local_cpp_value(idl_type, extended_attributes, v8_value, variabl e_name, index=None, declare_variable=True, isolate='info.GetIsolate()', used_in_ private_script=False, return_promise=False): | 563 def v8_value_to_local_cpp_value(idl_type, extended_attributes, v8_value, variabl e_name, index=None, declare_variable=True, isolate='info.GetIsolate()', used_in_ private_script=False, return_promise=False): |
| 564 """Returns an expression that converts a V8 value to a C++ value and stores it as a local value.""" | 564 """Returns an expression that converts a V8 value to a C++ value and stores it as a local value.""" |
| 565 | 565 |
| 566 # FIXME: Support union type. | 566 # FIXME: Support union type. |
| 567 if idl_type.is_union_type: | 567 if idl_type.is_union_type: |
| 568 return '' | 568 return '/* no V8 -> C++ conversion for IDL union type: %s */' % idl_type .name |
|
haraken
2014/09/26 09:49:29
Can we raise an exception instead?
| |
| 569 | 569 |
| 570 this_cpp_type = idl_type.cpp_type_args(extended_attributes=extended_attribut es, raw_type=True) | 570 this_cpp_type = idl_type.cpp_type_args(extended_attributes=extended_attribut es, raw_type=True) |
| 571 idl_type = idl_type.preprocessed_type | |
| 571 | 572 |
| 572 idl_type = idl_type.preprocessed_type | 573 if idl_type.base_type in ('void', 'object', 'EventHandler', 'EventListener') : |
|
Jens Widell
2014/09/26 09:45:57
These are IDL types where we don't have meaningful
| |
| 574 return '/* no V8 -> C++ conversion for IDL type: %s */' % idl_type.name | |
| 575 | |
| 573 cpp_value = v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, i ndex, isolate) | 576 cpp_value = v8_value_to_cpp_value(idl_type, extended_attributes, v8_value, i ndex, isolate) |
| 574 args = [variable_name, cpp_value] | 577 if idl_type.is_string_type or idl_type.v8_conversion_needs_exception_state: |
| 575 if idl_type.base_type == 'DOMString': | 578 # Types that need error handling and use one of a group of (C++) macros |
| 576 if return_promise: | 579 # to take care of this. |
| 580 | |
| 581 args = [variable_name, cpp_value] | |
| 582 | |
| 583 if idl_type.v8_conversion_needs_exception_state: | |
| 584 macro = 'TONATIVE_DEFAULT_EXCEPTIONSTATE' if used_in_private_script else 'TONATIVE_VOID_EXCEPTIONSTATE' | |
| 585 elif return_promise: | |
| 577 macro = 'TOSTRING_VOID_EXCEPTIONSTATE' | 586 macro = 'TOSTRING_VOID_EXCEPTIONSTATE' |
| 578 else: | 587 else: |
| 579 macro = 'TOSTRING_DEFAULT' if used_in_private_script else 'TOSTRING_ VOID' | 588 macro = 'TOSTRING_DEFAULT' if used_in_private_script else 'TOSTRING_ VOID' |
| 580 elif idl_type.v8_conversion_needs_exception_state: | 589 |
| 581 macro = 'TONATIVE_DEFAULT_EXCEPTIONSTATE' if used_in_private_script else 'TONATIVE_VOID_EXCEPTIONSTATE' | 590 if macro.endswith('_EXCEPTIONSTATE'): |
| 582 elif idl_type.v8_conversion_is_trivial: | 591 args.append('exceptionState') |
| 583 assignment = '%s = %s' % (variable_name, cpp_value) | 592 |
| 593 if used_in_private_script: | |
| 594 args.append('false') | |
| 595 | |
| 596 suffix = '' | |
| 597 | |
| 598 if return_promise: | |
| 599 suffix += '_PROMISE' | |
| 600 args.append('info') | |
| 601 if macro.endswith('_EXCEPTIONSTATE'): | |
| 602 args.append('ScriptState::current(%s)' % isolate) | |
| 603 | |
| 584 if declare_variable: | 604 if declare_variable: |
| 585 return '%s %s' % (this_cpp_type, assignment) | 605 args.insert(0, this_cpp_type) |
| 586 return assignment | 606 else: |
| 587 else: | 607 suffix += '_INTERNAL' |
| 588 macro = 'TONATIVE_DEFAULT' if used_in_private_script else 'TONATIVE_VOID ' | |
| 589 | 608 |
| 590 if macro.endswith('_EXCEPTIONSTATE'): | 609 return '%s(%s)' % (macro + suffix, ', '.join(args)) |
| 591 args.append('exceptionState') | |
| 592 | 610 |
| 593 if used_in_private_script: | 611 # Types that don't need error handling, and simply assign a value to the |
| 594 args.append('false') | 612 # local variable. |
| 595 | 613 |
| 596 # Macros come in several variants, to minimize expensive creation of | 614 if not idl_type.v8_conversion_is_trivial: |
| 597 # v8::TryCatch. | 615 raise Exception('unclassified V8 -> C++ conversion for IDL type: %s' % i dl_type.name) |
| 598 suffix = '' | |
| 599 | 616 |
| 600 if return_promise: | 617 assignment = '%s = %s' % (variable_name, cpp_value) |
| 601 suffix += '_PROMISE' | 618 if declare_variable: |
| 602 args.append('info') | 619 return '%s %s' % (this_cpp_type, assignment) |
| 603 if macro.endswith('_EXCEPTIONSTATE'): | 620 return assignment |
| 604 args.append('ScriptState::current(%s)' % isolate) | |
| 605 | 621 |
| 606 if declare_variable: | |
| 607 args.insert(0, this_cpp_type) | |
| 608 else: | |
| 609 suffix += '_INTERNAL' | |
| 610 | |
| 611 return '%s(%s)' % (macro + suffix, ', '.join(args)) | |
| 612 | 622 |
| 613 IdlTypeBase.v8_value_to_local_cpp_value = v8_value_to_local_cpp_value | 623 IdlTypeBase.v8_value_to_local_cpp_value = v8_value_to_local_cpp_value |
| 614 | 624 |
| 615 | 625 |
| 616 ################################################################################ | 626 ################################################################################ |
| 617 # C++ -> V8 | 627 # C++ -> V8 |
| 618 ################################################################################ | 628 ################################################################################ |
| 619 | 629 |
| 620 def preprocess_idl_type(idl_type): | 630 def preprocess_idl_type(idl_type): |
| 621 if idl_type.is_enum: | 631 if idl_type.is_enum: |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 854 | 864 |
| 855 | 865 |
| 856 def is_explicit_nullable(idl_type): | 866 def is_explicit_nullable(idl_type): |
| 857 # Nullable type that isn't implicit nullable (see above.) For such types, | 867 # Nullable type that isn't implicit nullable (see above.) For such types, |
| 858 # we use Nullable<T> or similar explicit ways to represent a null value. | 868 # we use Nullable<T> or similar explicit ways to represent a null value. |
| 859 return idl_type.is_nullable and not idl_type.is_implicit_nullable | 869 return idl_type.is_nullable and not idl_type.is_implicit_nullable |
| 860 | 870 |
| 861 IdlTypeBase.is_implicit_nullable = property(is_implicit_nullable) | 871 IdlTypeBase.is_implicit_nullable = property(is_implicit_nullable) |
| 862 IdlUnionType.is_implicit_nullable = False | 872 IdlUnionType.is_implicit_nullable = False |
| 863 IdlTypeBase.is_explicit_nullable = property(is_explicit_nullable) | 873 IdlTypeBase.is_explicit_nullable = property(is_explicit_nullable) |
| OLD | NEW |