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

Side by Side Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

Issue 2188143002: Move generated Mojo C++ error reporting code out of line (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@before-sharing
Patch Set: Use public destructor instead of friend class Created 4 years, 4 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 {%- import "interface_macros.tmpl" as interface_macros %} 1 {%- import "interface_macros.tmpl" as interface_macros %}
2 {%- import "struct_macros.tmpl" as struct_macros %} 2 {%- import "struct_macros.tmpl" as struct_macros %}
3 3
4 {%- set class_name = interface.name %} 4 {%- set class_name = interface.name %}
5 {%- set proxy_name = interface.name ~ "Proxy" %} 5 {%- set proxy_name = interface.name ~ "Proxy" %}
6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} 6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
7 7
8 {%- macro alloc_params(struct, params, message, serialization_context, 8 {%- macro alloc_params(struct, params, message, serialization_context,
9 description) %} 9 description) %}
10 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles()); 10 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles());
11 bool success = true; 11 bool success = true;
12 {%- for param in struct.packed.packed_fields_in_ordinal_order %} 12 {%- for param in struct.packed.packed_fields_in_ordinal_order %}
13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; 13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{};
14 {%- endfor %} 14 {%- endfor %}
15 {{struct.name}}DataView input_data_view({{params}}, 15 {{struct.name}}DataView input_data_view({{params}},
16 {{serialization_context}}); 16 {{serialization_context}});
17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} 17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
18 if (!success) { 18 if (!success) {
19 mojo::internal::ValidationContext validation_context( 19 ReportValidationErrorForMessage(
20 {{message}}->data(), {{message}}->data_num_bytes(), 20 {{message}},
21 {{message}}->handles()->size(), {{message}}, 21 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED,
22 "{{description}} deserializer"); 22 "{{description}} deserializer");
23 ReportValidationError(
24 &validation_context,
25 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED);
26 return false; 23 return false;
27 } 24 }
28 {%- endmacro %} 25 {%- endmacro %}
29 26
30 {%- macro pass_params(parameters) %} 27 {%- macro pass_params(parameters) %}
31 {%- for param in parameters %} 28 {%- for param in parameters %}
32 std::move(p_{{param.name}}) 29 std::move(p_{{param.name}})
33 {%- if not loop.last %}, {% endif %} 30 {%- if not loop.last %}, {% endif %}
34 {%- endfor %} 31 {%- endfor %}
35 {%- endmacro %} 32 {%- endmacro %}
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_; 90 {{param.kind|cpp_wrapper_type}}* out_{{param.name}}_;
94 {%- endfor -%} 91 {%- endfor -%}
95 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); 92 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
96 }; 93 };
97 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( 94 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
98 mojo::Message* message) { 95 mojo::Message* message) {
99 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = 96 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
100 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( 97 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
101 message->mutable_payload()); 98 message->mutable_payload());
102 99
100 {%- set desc = class_name~"::"~method.name~" response" %}
yzshen1 2016/07/31 07:16:32 :D good catch. One thing may be worth considering
tibell 2016/07/31 23:50:29 Agreed. It's on my list.
103 {{alloc_params(method.response_param_struct, "params", "message", 101 {{alloc_params(method.response_param_struct, "params", "message",
104 "&serialization_context_", 102 "&serialization_context_", desc)}}
105 "{{class_name}}::{{method.name}} response")}}
106 103
107 {%- for param in method.response_parameters %} 104 {%- for param in method.response_parameters %}
108 *out_{{param.name}}_ = std::move(p_{{param.name}}); 105 *out_{{param.name}}_ = std::move(p_{{param.name}});
109 {%- endfor %} 106 {%- endfor %}
110 *result_ = true; 107 *result_ = true;
111 return true; 108 return true;
112 } 109 }
113 {%- endif %} 110 {%- endif %}
114 111
115 class {{class_name}}_{{method.name}}_ForwardToCallback 112 class {{class_name}}_{{method.name}}_ForwardToCallback
(...skipping 10 matching lines...) Expand all
126 {{class_name}}::{{method.name}}Callback callback_; 123 {{class_name}}::{{method.name}}Callback callback_;
127 mojo::internal::SerializationContext serialization_context_; 124 mojo::internal::SerializationContext serialization_context_;
128 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); 125 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
129 }; 126 };
130 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( 127 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
131 mojo::Message* message) { 128 mojo::Message* message) {
132 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = 129 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
133 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( 130 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
134 message->mutable_payload()); 131 message->mutable_payload());
135 132
133 {%- set desc = class_name~"::"~method.name~" response" %}
136 {{alloc_params(method.response_param_struct, "params", "message", 134 {{alloc_params(method.response_param_struct, "params", "message",
137 "&serialization_context_", 135 "&serialization_context_", desc)}}
138 "{{class_name}}_{{method.name}} response")}}
139 if (!callback_.is_null()) 136 if (!callback_.is_null())
140 callback_.Run({{pass_params(method.response_parameters)}}); 137 callback_.Run({{pass_params(method.response_parameters)}});
141 return true; 138 return true;
142 } 139 }
143 {%- endif %} 140 {%- endif %}
144 {%- endfor %} 141 {%- endfor %}
145 142
146 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) 143 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
147 : ControlMessageProxy(receiver) { 144 : ControlMessageProxy(receiver) {
148 } 145 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 {%- endfor %} 207 {%- endfor %}
211 208
212 {#--- ProxyToResponder definition #} 209 {#--- ProxyToResponder definition #}
213 {%- for method in interface.methods -%} 210 {%- for method in interface.methods -%}
214 {%- if method.response_parameters != None %} 211 {%- if method.response_parameters != None %}
215 {%- set message_name = 212 {%- set message_name =
216 "internal::k%s_%s_Name"|format(interface.name, method.name) %} 213 "internal::k%s_%s_Name"|format(interface.name, method.name) %}
217 {%- set response_params_struct = method.response_param_struct %} 214 {%- set response_params_struct = method.response_param_struct %}
218 {%- set params_description = 215 {%- set params_description =
219 "%s.%s response"|format(interface.name, method.name) %} 216 "%s.%s response"|format(interface.name, method.name) %}
220 class {{class_name}}_{{method.name}}_ProxyToResponder 217 class {{class_name}}_{{method.name}}_ProxyToResponder {
221 : public base::RefCountedThreadSafe<
222 {{class_name}}_{{method.name}}_ProxyToResponder> {
223 public: 218 public:
224 static {{class_name}}::{{method.name}}Callback CreateCallback( 219 static {{class_name}}::{{method.name}}Callback CreateCallback(
225 uint64_t request_id, 220 uint64_t request_id,
226 bool is_sync, 221 bool is_sync,
227 mojo::MessageReceiverWithStatus* responder, 222 mojo::MessageReceiverWithStatus* responder,
228 scoped_refptr<mojo::AssociatedGroupController> 223 scoped_refptr<mojo::AssociatedGroupController>
229 group_controller) { 224 group_controller) {
230 scoped_refptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy 225 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy(
231 = new {{class_name}}_{{method.name}}_ProxyToResponder( 226 new {{class_name}}_{{method.name}}_ProxyToResponder(
232 request_id, is_sync, responder, group_controller); 227 request_id, is_sync, responder, group_controller));
233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, 228 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run,
234 proxy); 229 base::Passed(&proxy));
235 }
236
237 private:
238 friend class base::RefCountedThreadSafe<
239 {{class_name}}_{{method.name}}_ProxyToResponder>;
240
241 {{class_name}}_{{method.name}}_ProxyToResponder(
242 uint64_t request_id,
243 bool is_sync,
244 mojo::MessageReceiverWithStatus* responder,
245 scoped_refptr<mojo::AssociatedGroupController> group_controller)
246 : request_id_(request_id),
247 is_sync_(is_sync),
248 responder_(responder),
249 serialization_context_(std::move(group_controller)) {
250 } 230 }
251 231
252 ~{{class_name}}_{{method.name}}_ProxyToResponder() { 232 ~{{class_name}}_{{method.name}}_ProxyToResponder() {
253 #if DCHECK_IS_ON() 233 #if DCHECK_IS_ON()
254 if (responder_) { 234 if (responder_) {
255 // Is the Mojo application destroying the callback without running it 235 // Is the Mojo application destroying the callback without running it
256 // and without first closing the pipe? 236 // and without first closing the pipe?
257 responder_->DCheckInvalid("The callback passed to " 237 responder_->DCheckInvalid("The callback passed to "
258 "{{class_name}}::{{method.name}}() was never run."); 238 "{{class_name}}::{{method.name}}() was never run.");
259 } 239 }
260 #endif 240 #endif
261 // If the Callback was dropped then deleting the responder will close 241 // If the Callback was dropped then deleting the responder will close
262 // the pipe so the calling application knows to stop waiting for a reply. 242 // the pipe so the calling application knows to stop waiting for a reply.
263 delete responder_; 243 delete responder_;
264 } 244 }
265 245
246 private:
247 {{class_name}}_{{method.name}}_ProxyToResponder(
248 uint64_t request_id,
249 bool is_sync,
250 mojo::MessageReceiverWithStatus* responder,
251 scoped_refptr<mojo::AssociatedGroupController> group_controller)
252 : request_id_(request_id),
253 is_sync_(is_sync),
254 responder_(responder),
255 serialization_context_(std::move(group_controller)) {
256 }
257
266 void Run( 258 void Run(
267 {{interface_macros.declare_responder_params( 259 {{interface_macros.declare_responder_params(
268 "in_", method.response_parameters, for_blink, 260 "in_", method.response_parameters, for_blink,
269 use_new_wrapper_types)}}); 261 use_new_wrapper_types)}});
270 262
271 uint64_t request_id_; 263 uint64_t request_id_;
272 bool is_sync_; 264 bool is_sync_;
273 mojo::MessageReceiverWithStatus* responder_; 265 mojo::MessageReceiverWithStatus* responder_;
274 // TODO(yzshen): maybe I should use a ref to the original one? 266 // TODO(yzshen): maybe I should use a ref to the original one?
275 mojo::internal::SerializationContext serialization_context_; 267 mojo::internal::SerializationContext serialization_context_;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 return control_message_handler_.Accept(message); 305 return control_message_handler_.Accept(message);
314 {%- if interface.methods %} 306 {%- if interface.methods %}
315 switch (message->header()->name) { 307 switch (message->header()->name) {
316 {%- for method in interface.methods %} 308 {%- for method in interface.methods %}
317 case internal::k{{class_name}}_{{method.name}}_Name: { 309 case internal::k{{class_name}}_{{method.name}}_Name: {
318 {%- if method.response_parameters == None %} 310 {%- if method.response_parameters == None %}
319 internal::{{class_name}}_{{method.name}}_Params_Data* params = 311 internal::{{class_name}}_{{method.name}}_Params_Data* params =
320 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 312 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
321 message->mutable_payload()); 313 message->mutable_payload());
322 314
315 {%- set desc = class_name~"::"~method.name %}
323 {{alloc_params(method.param_struct, "params", "message", 316 {{alloc_params(method.param_struct, "params", "message",
324 "&serialization_context_", "{{class_name}}::{{method.name}}") 317 "&serialization_context_", desc)
325 |indent(4)}} 318 |indent(4)}}
yzshen1 2016/07/31 07:16:32 nit: now this line could be merged with the one ab
tibell 2016/07/31 23:50:29 Done.
326 // A null |sink_| means no implementation was bound. 319 // A null |sink_| means no implementation was bound.
327 assert(sink_); 320 assert(sink_);
328 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); 321 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
329 sink_->{{method.name}}({{pass_params(method.parameters)}}); 322 sink_->{{method.name}}({{pass_params(method.parameters)}});
330 return true; 323 return true;
331 {%- else %} 324 {%- else %}
332 break; 325 break;
333 {%- endif %} 326 {%- endif %}
334 } 327 }
335 {%- endfor %} 328 {%- endfor %}
336 } 329 }
337 {%- endif %} 330 {%- endif %}
338 return false; 331 return false;
339 } 332 }
340 333
341 bool {{class_name}}Stub::AcceptWithResponder( 334 bool {{class_name}}Stub::AcceptWithResponder(
342 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) { 335 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
343 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) 336 if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
344 return control_message_handler_.AcceptWithResponder(message, responder); 337 return control_message_handler_.AcceptWithResponder(message, responder);
345 {%- if interface.methods %} 338 {%- if interface.methods %}
346 switch (message->header()->name) { 339 switch (message->header()->name) {
347 {%- for method in interface.methods %} 340 {%- for method in interface.methods %}
348 case internal::k{{class_name}}_{{method.name}}_Name: { 341 case internal::k{{class_name}}_{{method.name}}_Name: {
349 {%- if method.response_parameters != None %} 342 {%- if method.response_parameters != None %}
350 internal::{{class_name}}_{{method.name}}_Params_Data* params = 343 internal::{{class_name}}_{{method.name}}_Params_Data* params =
351 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 344 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
352 message->mutable_payload()); 345 message->mutable_payload());
353 346
347 {%- set desc = class_name~"::"~method.name %}
354 {{alloc_params(method.param_struct, "params", "message", 348 {{alloc_params(method.param_struct, "params", "message",
355 "&serialization_context_", "{{class_name}}::{{method.name}}")| 349 "&serialization_context_", desc)|
356 indent(4)}} 350 indent(4)}}
357 {{class_name}}::{{method.name}}Callback callback = 351 {{class_name}}::{{method.name}}Callback callback =
358 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( 352 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback(
359 message->request_id(), 353 message->request_id(),
360 message->has_flag(mojo::Message::kFlagIsSync), 354 message->has_flag(mojo::Message::kFlagIsSync),
361 responder, 355 responder,
362 serialization_context_.group_controller); 356 serialization_context_.group_controller);
363 // A null |sink_| means no implementation was bound. 357 // A null |sink_| means no implementation was bound.
364 assert(sink_); 358 assert(sink_);
365 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); 359 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 break; 458 break;
465 } 459 }
466 460
467 // Unrecognized message. 461 // Unrecognized message.
468 ReportValidationError( 462 ReportValidationError(
469 &validation_context, 463 &validation_context,
470 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); 464 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
471 return false; 465 return false;
472 } 466 }
473 {%- endif -%} 467 {%- endif -%}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698