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

Side by Side Diff: Source/bindings/scripts/v8_dictionary.py

Issue 590443002: IDL: object type support for IDL dictionary (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 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
OLDNEW
1 # Copyright 2014 The Chromium Authors. All rights reserved. 1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 """Generate template contexts of dictionaries for both v8 bindings and 5 """Generate template contexts of dictionaries for both v8 bindings and
6 implementation classes that are used by blink's core/modules. 6 implementation classes that are used by blink's core/modules.
7 """ 7 """
8 8
9 import operator 9 import operator
10 from v8_globals import includes 10 from v8_globals import includes
(...skipping 14 matching lines...) Expand all
25 25
26 26
27 def setter_name_for_dictionary_member(member): 27 def setter_name_for_dictionary_member(member):
28 return 'set%s' % v8_utilities.capitalize(member.name) 28 return 'set%s' % v8_utilities.capitalize(member.name)
29 29
30 30
31 def has_method_name_for_dictionary_member(member): 31 def has_method_name_for_dictionary_member(member):
32 return 'has%s' % v8_utilities.capitalize(member.name) 32 return 'has%s' % v8_utilities.capitalize(member.name)
33 33
34 34
35 def unwrap_nullable_if_needed(idl_type):
36 if idl_type.is_nullable:
37 return idl_type.inner_type
38 return idl_type
39
40
35 # Context for V8 bindings 41 # Context for V8 bindings
36 42
37 def dictionary_context(dictionary): 43 def dictionary_context(dictionary):
38 includes.clear() 44 includes.clear()
39 includes.update(DICTIONARY_CPP_INCLUDES) 45 includes.update(DICTIONARY_CPP_INCLUDES)
40 return { 46 return {
41 'cpp_class': v8_utilities.cpp_name(dictionary), 47 'cpp_class': v8_utilities.cpp_name(dictionary),
42 'header_includes': set(DICTIONARY_H_INCLUDES), 48 'header_includes': set(DICTIONARY_H_INCLUDES),
43 'members': [member_context(member) 49 'members': [member_context(member)
44 for member in sorted(dictionary.members, 50 for member in sorted(dictionary.members,
45 key=operator.attrgetter('name'))], 51 key=operator.attrgetter('name'))],
46 'v8_class': v8_utilities.v8_class_name(dictionary), 52 'v8_class': v8_utilities.v8_class_name(dictionary),
47 } 53 }
48 54
49 55
50 def member_context(member): 56 def member_context(member):
51 idl_type = member.idl_type 57 idl_type = member.idl_type
52 idl_type.add_includes_for_type() 58 idl_type.add_includes_for_type()
53 59 idl_type = unwrap_nullable_if_needed(idl_type)
54 def idl_type_for_default_value():
55 if idl_type.is_nullable:
56 return idl_type.inner_type
57 return idl_type
58 60
59 def default_values(): 61 def default_values():
60 if not member.default_value: 62 if not member.default_value:
61 return None, None 63 return None, None
62 if member.default_value.is_null: 64 if member.default_value.is_null:
63 return None, 'v8::Null(isolate)' 65 return None, 'v8::Null(isolate)'
64 cpp_default_value = str(member.default_value) 66 cpp_default_value = str(member.default_value)
65 v8_default_value = idl_type_for_default_value().cpp_value_to_v8_value( 67 v8_default_value = idl_type.cpp_value_to_v8_value(
66 cpp_value=cpp_default_value, isolate='isolate', 68 cpp_value=cpp_default_value, isolate='isolate',
67 creation_context='creationContext') 69 creation_context='creationContext')
68 return cpp_default_value, v8_default_value 70 return cpp_default_value, v8_default_value
69 71
70 cpp_default_value, v8_default_value = default_values() 72 cpp_default_value, v8_default_value = default_values()
71 73
72 return { 74 return {
73 'cpp_default_value': cpp_default_value, 75 'cpp_default_value': cpp_default_value,
74 'cpp_type': idl_type.cpp_type, 76 'cpp_type': idl_type.cpp_type,
75 'cpp_value_to_v8_value': idl_type.cpp_value_to_v8_value( 77 'cpp_value_to_v8_value': idl_type.cpp_value_to_v8_value(
76 cpp_value='impl->%s()' % member.name, isolate='isolate', 78 cpp_value='impl->%s()' % member.name, isolate='isolate',
77 creation_context='creationContext', 79 creation_context='creationContext',
78 extended_attributes=member.extended_attributes), 80 extended_attributes=member.extended_attributes),
79 'enum_validation_expression': idl_type.enum_validation_expression, 81 'enum_validation_expression': idl_type.enum_validation_expression,
80 'has_method_name': has_method_name_for_dictionary_member(member), 82 'has_method_name': has_method_name_for_dictionary_member(member),
83 'is_object': idl_type.name == 'Object',
81 'name': member.name, 84 'name': member.name,
82 'setter_name': setter_name_for_dictionary_member(member), 85 'setter_name': setter_name_for_dictionary_member(member),
83 'v8_default_value': v8_default_value, 86 'v8_default_value': v8_default_value,
84 } 87 }
85 88
86 89
87 # Context for implementation classes 90 # Context for implementation classes
88 91
89 def dictionary_impl_context(dictionary, interfaces_info): 92 def dictionary_impl_context(dictionary, interfaces_info):
90 includes.clear() 93 includes.clear()
91 header_includes = set(['platform/heap/Handle.h']) 94 header_includes = set(['platform/heap/Handle.h'])
92 return { 95 return {
93 'header_includes': header_includes, 96 'header_includes': header_includes,
94 'cpp_class': v8_utilities.cpp_name(dictionary), 97 'cpp_class': v8_utilities.cpp_name(dictionary),
95 'members': [member_impl_context(member, interfaces_info, 98 'members': [member_impl_context(member, interfaces_info,
96 header_includes) 99 header_includes)
97 for member in dictionary.members], 100 for member in dictionary.members],
98 } 101 }
99 102
100 103
101 def member_impl_context(member, interfaces_info, header_includes): 104 def member_impl_context(member, interfaces_info, header_includes):
102 idl_type = member.idl_type 105 idl_type = unwrap_nullable_if_needed(member.idl_type)
106 is_object = idl_type.name == 'Object'
103 107
104 def getter_expression(): 108 def getter_expression():
105 if idl_type.impl_should_use_nullable_container: 109 if idl_type.impl_should_use_nullable_container:
106 return 'm_%s.get()' % member.name 110 return 'm_%s.get()' % member.name
107 return 'm_%s' % member.name 111 return 'm_%s' % member.name
108 112
109 def has_method_expression(): 113 def has_method_expression():
110 if idl_type.impl_should_use_nullable_container or idl_type.is_enum or id l_type.is_string_type: 114 if idl_type.impl_should_use_nullable_container or idl_type.is_enum or id l_type.is_string_type:
111 return '!m_%s.isNull()' % member.name 115 return '!m_%s.isNull()' % member.name
116 elif is_object:
117 return '!(m_{0}.isEmpty() || m_{0}.isNull() || m_{0}.isUndefined())' .format(member.name)
haraken 2014/09/24 04:08:56 Just help me understand: Why do we need to check a
bashi 2014/09/24 05:28:55 - Need to check isEmpty() before calling isNull()
112 else: 118 else:
113 return 'm_%s' % member.name 119 return 'm_%s' % member.name
114 120
115 def member_cpp_type(): 121 def member_cpp_type():
116 member_cpp_type = idl_type.cpp_type_args(used_in_cpp_sequence=True) 122 member_cpp_type = idl_type.cpp_type_args(used_in_cpp_sequence=True)
117 if idl_type.impl_should_use_nullable_container: 123 if idl_type.impl_should_use_nullable_container:
118 return v8_types.cpp_template_type('Nullable', member_cpp_type) 124 return v8_types.cpp_template_type('Nullable', member_cpp_type)
119 return member_cpp_type 125 return member_cpp_type
120 126
121 cpp_default_value = None 127 cpp_default_value = None
122 if member.default_value and not member.default_value.is_null: 128 if member.default_value and not member.default_value.is_null:
123 cpp_default_value = str(member.default_value) 129 cpp_default_value = str(member.default_value)
124 130
125 header_includes.update(idl_type.impl_includes_for_type(interfaces_info)) 131 header_includes.update(idl_type.impl_includes_for_type(interfaces_info))
126 return { 132 return {
127 'cpp_default_value': cpp_default_value, 133 'cpp_default_value': cpp_default_value,
128 'getter_expression': getter_expression(), 134 'getter_expression': getter_expression(),
129 'has_method_expression': has_method_expression(), 135 'has_method_expression': has_method_expression(),
130 'has_method_name': has_method_name_for_dictionary_member(member), 136 'has_method_name': has_method_name_for_dictionary_member(member),
137 'is_object': is_object,
131 'is_traceable': (idl_type.is_garbage_collected or 138 'is_traceable': (idl_type.is_garbage_collected or
132 idl_type.is_will_be_garbage_collected), 139 idl_type.is_will_be_garbage_collected),
133 'member_cpp_type': member_cpp_type(), 140 'member_cpp_type': member_cpp_type(),
134 'name': member.name, 141 'name': member.name,
135 'rvalue_cpp_type': idl_type.cpp_type_args(used_as_rvalue_type=True), 142 'rvalue_cpp_type': idl_type.cpp_type_args(used_as_rvalue_type=True),
136 'setter_name': setter_name_for_dictionary_member(member), 143 'setter_name': setter_name_for_dictionary_member(member),
137 } 144 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698