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

Side by Side Diff: content/public/common/common_param_traits.cc

Issue 9447084: Refactor Pickle Read methods to use higher performance PickleIterator. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: jar feedback Created 8 years, 9 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 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "content/public/common/common_param_traits.h" 5 #include "content/public/common/common_param_traits.h"
6 6
7 #include "content/public/common/content_constants.h" 7 #include "content/public/common/content_constants.h"
8 #include "net/base/host_port_pair.h" 8 #include "net/base/host_port_pair.h"
9 #include "net/base/upload_data.h" 9 #include "net/base/upload_data.h"
10 #include "net/http/http_response_headers.h" 10 #include "net/http/http_response_headers.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 } // namespace 48 } // namespace
49 49
50 namespace IPC { 50 namespace IPC {
51 51
52 void ParamTraits<GURL>::Write(Message* m, const GURL& p) { 52 void ParamTraits<GURL>::Write(Message* m, const GURL& p) {
53 DCHECK(p.possibly_invalid_spec().length() <= content::kMaxURLChars); 53 DCHECK(p.possibly_invalid_spec().length() <= content::kMaxURLChars);
54 m->WriteString(p.possibly_invalid_spec()); 54 m->WriteString(p.possibly_invalid_spec());
55 // TODO(brettw) bug 684583: Add encoding for query params. 55 // TODO(brettw) bug 684583: Add encoding for query params.
56 } 56 }
57 57
58 bool ParamTraits<GURL>::Read(const Message* m, void** iter, GURL* p) { 58 bool ParamTraits<GURL>::Read(const Message* m, PickleReader* iter, GURL* p) {
59 std::string s; 59 std::string s;
60 if (!m->ReadString(iter, &s) || s.length() > content::kMaxURLChars) { 60 if (!m->ReadString(iter, &s) || s.length() > content::kMaxURLChars) {
61 *p = GURL(); 61 *p = GURL();
62 return false; 62 return false;
63 } 63 }
64 *p = GURL(s); 64 *p = GURL(s);
65 return true; 65 return true;
66 } 66 }
67 67
68 void ParamTraits<GURL>::Log(const GURL& p, std::string* l) { 68 void ParamTraits<GURL>::Log(const GURL& p, std::string* l) {
69 l->append(p.spec()); 69 l->append(p.spec());
70 } 70 }
71 71
72 void ParamTraits<ResourceType::Type>::Write(Message* m, const param_type& p) { 72 void ParamTraits<ResourceType::Type>::Write(Message* m, const param_type& p) {
73 m->WriteInt(p); 73 m->WriteInt(p);
74 } 74 }
75 75
76 bool ParamTraits<ResourceType::Type>::Read(const Message* m, 76 bool ParamTraits<ResourceType::Type>::Read(const Message* m,
77 void** iter, 77 PickleReader* iter,
78 param_type* p) { 78 param_type* p) {
79 int type; 79 int type;
80 if (!m->ReadInt(iter, &type) || !ResourceType::ValidType(type)) 80 if (!m->ReadInt(iter, &type) || !ResourceType::ValidType(type))
81 return false; 81 return false;
82 *p = ResourceType::FromInt(type); 82 *p = ResourceType::FromInt(type);
83 return true; 83 return true;
84 } 84 }
85 85
86 void ParamTraits<ResourceType::Type>::Log(const param_type& p, std::string* l) { 86 void ParamTraits<ResourceType::Type>::Log(const param_type& p, std::string* l) {
87 std::string type; 87 std::string type;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 138
139 LogParam(type, l); 139 LogParam(type, l);
140 } 140 }
141 141
142 void ParamTraits<net::URLRequestStatus>::Write(Message* m, 142 void ParamTraits<net::URLRequestStatus>::Write(Message* m,
143 const param_type& p) { 143 const param_type& p) {
144 WriteParam(m, static_cast<int>(p.status())); 144 WriteParam(m, static_cast<int>(p.status()));
145 WriteParam(m, p.error()); 145 WriteParam(m, p.error());
146 } 146 }
147 147
148 bool ParamTraits<net::URLRequestStatus>::Read(const Message* m, void** iter, 148 bool ParamTraits<net::URLRequestStatus>::Read(const Message* m,
149 PickleReader* iter,
149 param_type* r) { 150 param_type* r) {
150 int status, error; 151 int status, error;
151 if (!ReadParam(m, iter, &status) || !ReadParam(m, iter, &error)) 152 if (!ReadParam(m, iter, &status) || !ReadParam(m, iter, &error))
152 return false; 153 return false;
153 r->set_status(static_cast<net::URLRequestStatus::Status>(status)); 154 r->set_status(static_cast<net::URLRequestStatus::Status>(status));
154 r->set_error(error); 155 r->set_error(error);
155 return true; 156 return true;
156 } 157 }
157 158
158 void ParamTraits<net::URLRequestStatus>::Log(const param_type& p, 159 void ParamTraits<net::URLRequestStatus>::Log(const param_type& p,
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 WriteParam(m, p.file_range_length()); 231 WriteParam(m, p.file_range_length());
231 WriteParam(m, p.expected_file_modification_time()); 232 WriteParam(m, p.expected_file_modification_time());
232 break; 233 break;
233 } 234 }
234 default: { 235 default: {
235 WriteParam(m, p.blob_url()); 236 WriteParam(m, p.blob_url());
236 break; 237 break;
237 } 238 }
238 } 239 }
239 } 240 }
240 static bool Read(const Message* m, void** iter, param_type* r) { 241 static bool Read(const Message* m, PickleReader* iter, param_type* r) {
241 int type; 242 int type;
242 if (!ReadParam(m, iter, &type)) 243 if (!ReadParam(m, iter, &type))
243 return false; 244 return false;
244 switch (type) { 245 switch (type) {
245 case net::UploadData::TYPE_BYTES: { 246 case net::UploadData::TYPE_BYTES: {
246 const char* data; 247 const char* data;
247 int len; 248 int len;
248 if (!m->ReadData(iter, &data, &len)) 249 if (!m->ReadData(iter, &data, &len))
249 return false; 250 return false;
250 r->SetToBytes(data, len); 251 r->SetToBytes(data, len);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 const param_type& p) { 302 const param_type& p) {
302 WriteParam(m, p.get() != NULL); 303 WriteParam(m, p.get() != NULL);
303 if (p) { 304 if (p) {
304 WriteParam(m, *p->elements()); 305 WriteParam(m, *p->elements());
305 WriteParam(m, p->identifier()); 306 WriteParam(m, p->identifier());
306 WriteParam(m, p->is_chunked()); 307 WriteParam(m, p->is_chunked());
307 } 308 }
308 } 309 }
309 310
310 bool ParamTraits<scoped_refptr<net::UploadData> >::Read(const Message* m, 311 bool ParamTraits<scoped_refptr<net::UploadData> >::Read(const Message* m,
311 void** iter, 312 PickleReader* iter,
312 param_type* r) { 313 param_type* r) {
313 bool has_object; 314 bool has_object;
314 if (!ReadParam(m, iter, &has_object)) 315 if (!ReadParam(m, iter, &has_object))
315 return false; 316 return false;
316 if (!has_object) 317 if (!has_object)
317 return true; 318 return true;
318 std::vector<net::UploadData::Element> elements; 319 std::vector<net::UploadData::Element> elements;
319 if (!ReadParam(m, iter, &elements)) 320 if (!ReadParam(m, iter, &elements))
320 return false; 321 return false;
321 int64 identifier; 322 int64 identifier;
(...skipping 12 matching lines...) Expand all
334 void ParamTraits<scoped_refptr<net::UploadData> >::Log(const param_type& p, 335 void ParamTraits<scoped_refptr<net::UploadData> >::Log(const param_type& p,
335 std::string* l) { 336 std::string* l) {
336 l->append("<net::UploadData>"); 337 l->append("<net::UploadData>");
337 } 338 }
338 339
339 void ParamTraits<net::HostPortPair>::Write(Message* m, const param_type& p) { 340 void ParamTraits<net::HostPortPair>::Write(Message* m, const param_type& p) {
340 WriteParam(m, p.host()); 341 WriteParam(m, p.host());
341 WriteParam(m, p.port()); 342 WriteParam(m, p.port());
342 } 343 }
343 344
344 bool ParamTraits<net::HostPortPair>::Read(const Message* m, void** iter, 345 bool ParamTraits<net::HostPortPair>::Read(const Message* m, PickleReader* iter,
345 param_type* r) { 346 param_type* r) {
346 std::string host; 347 std::string host;
347 uint16 port; 348 uint16 port;
348 if (!ReadParam(m, iter, &host) || !ReadParam(m, iter, &port)) 349 if (!ReadParam(m, iter, &host) || !ReadParam(m, iter, &port))
349 return false; 350 return false;
350 351
351 r->set_host(host); 352 r->set_host(host);
352 r->set_port(port); 353 r->set_port(port);
353 return true; 354 return true;
354 } 355 }
355 356
356 void ParamTraits<net::HostPortPair>::Log(const param_type& p, std::string* l) { 357 void ParamTraits<net::HostPortPair>::Log(const param_type& p, std::string* l) {
357 l->append(p.ToString()); 358 l->append(p.ToString());
358 } 359 }
359 360
360 void ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Write( 361 void ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Write(
361 Message* m, const param_type& p) { 362 Message* m, const param_type& p) {
362 WriteParam(m, p.get() != NULL); 363 WriteParam(m, p.get() != NULL);
363 if (p) { 364 if (p) {
364 // Do not disclose Set-Cookie headers over IPC. 365 // Do not disclose Set-Cookie headers over IPC.
365 p->Persist(m, net::HttpResponseHeaders::PERSIST_SANS_COOKIES); 366 p->Persist(m, net::HttpResponseHeaders::PERSIST_SANS_COOKIES);
366 } 367 }
367 } 368 }
368 369
369 bool ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Read( 370 bool ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Read(
370 const Message* m, void** iter, param_type* r) { 371 const Message* m, PickleReader* iter, param_type* r) {
371 bool has_object; 372 bool has_object;
372 if (!ReadParam(m, iter, &has_object)) 373 if (!ReadParam(m, iter, &has_object))
373 return false; 374 return false;
374 if (has_object) 375 if (has_object)
375 *r = new net::HttpResponseHeaders(*m, iter); 376 *r = new net::HttpResponseHeaders(*m, iter);
376 return true; 377 return true;
377 } 378 }
378 379
379 void ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Log( 380 void ParamTraits<scoped_refptr<net::HttpResponseHeaders> >::Log(
380 const param_type& p, std::string* l) { 381 const param_type& p, std::string* l) {
381 l->append("<HttpResponseHeaders>"); 382 l->append("<HttpResponseHeaders>");
382 } 383 }
383 384
384 void ParamTraits<net::IPEndPoint>::Write(Message* m, const param_type& p) { 385 void ParamTraits<net::IPEndPoint>::Write(Message* m, const param_type& p) {
385 WriteParam(m, p.address()); 386 WriteParam(m, p.address());
386 WriteParam(m, p.port()); 387 WriteParam(m, p.port());
387 } 388 }
388 389
389 bool ParamTraits<net::IPEndPoint>::Read(const Message* m, void** iter, 390 bool ParamTraits<net::IPEndPoint>::Read(const Message* m, PickleReader* iter,
390 param_type* p) { 391 param_type* p) {
391 net::IPAddressNumber address; 392 net::IPAddressNumber address;
392 int port; 393 int port;
393 if (!ReadParam(m, iter, &address) || !ReadParam(m, iter, &port)) 394 if (!ReadParam(m, iter, &address) || !ReadParam(m, iter, &port))
394 return false; 395 return false;
395 *p = net::IPEndPoint(address, port); 396 *p = net::IPEndPoint(address, port);
396 return true; 397 return true;
397 } 398 }
398 399
399 void ParamTraits<net::IPEndPoint>::Log(const param_type& p, std::string* l) { 400 void ParamTraits<net::IPEndPoint>::Log(const param_type& p, std::string* l) {
400 LogParam("IPEndPoint:" + p.ToString(), l); 401 LogParam("IPEndPoint:" + p.ToString(), l);
401 } 402 }
402 403
403 void ParamTraits<base::PlatformFileInfo>::Write( 404 void ParamTraits<base::PlatformFileInfo>::Write(
404 Message* m, const param_type& p) { 405 Message* m, const param_type& p) {
405 WriteParam(m, p.size); 406 WriteParam(m, p.size);
406 WriteParam(m, p.is_directory); 407 WriteParam(m, p.is_directory);
407 WriteParam(m, p.last_modified.ToDoubleT()); 408 WriteParam(m, p.last_modified.ToDoubleT());
408 WriteParam(m, p.last_accessed.ToDoubleT()); 409 WriteParam(m, p.last_accessed.ToDoubleT());
409 WriteParam(m, p.creation_time.ToDoubleT()); 410 WriteParam(m, p.creation_time.ToDoubleT());
410 } 411 }
411 412
412 bool ParamTraits<base::PlatformFileInfo>::Read( 413 bool ParamTraits<base::PlatformFileInfo>::Read(
413 const Message* m, void** iter, param_type* p) { 414 const Message* m, PickleReader* iter, param_type* p) {
414 double last_modified; 415 double last_modified;
415 double last_accessed; 416 double last_accessed;
416 double creation_time; 417 double creation_time;
417 bool result = 418 bool result =
418 ReadParam(m, iter, &p->size) && 419 ReadParam(m, iter, &p->size) &&
419 ReadParam(m, iter, &p->is_directory) && 420 ReadParam(m, iter, &p->is_directory) &&
420 ReadParam(m, iter, &last_modified) && 421 ReadParam(m, iter, &last_modified) &&
421 ReadParam(m, iter, &last_accessed) && 422 ReadParam(m, iter, &last_accessed) &&
422 ReadParam(m, iter, &creation_time); 423 ReadParam(m, iter, &creation_time);
423 if (result) { 424 if (result) {
(...skipping 17 matching lines...) Expand all
441 l->append(","); 442 l->append(",");
442 LogParam(p.creation_time.ToDoubleT(), l); 443 LogParam(p.creation_time.ToDoubleT(), l);
443 l->append(")"); 444 l->append(")");
444 } 445 }
445 446
446 void ParamTraits<gfx::Point>::Write(Message* m, const gfx::Point& p) { 447 void ParamTraits<gfx::Point>::Write(Message* m, const gfx::Point& p) {
447 m->WriteInt(p.x()); 448 m->WriteInt(p.x());
448 m->WriteInt(p.y()); 449 m->WriteInt(p.y());
449 } 450 }
450 451
451 bool ParamTraits<gfx::Point>::Read(const Message* m, void** iter, 452 bool ParamTraits<gfx::Point>::Read(const Message* m, PickleReader* iter,
452 gfx::Point* r) { 453 gfx::Point* r) {
453 int x, y; 454 int x, y;
454 if (!m->ReadInt(iter, &x) || 455 if (!m->ReadInt(iter, &x) ||
455 !m->ReadInt(iter, &y)) 456 !m->ReadInt(iter, &y))
456 return false; 457 return false;
457 r->set_x(x); 458 r->set_x(x);
458 r->set_y(y); 459 r->set_y(y);
459 return true; 460 return true;
460 } 461 }
461 462
462 void ParamTraits<gfx::Point>::Log(const gfx::Point& p, std::string* l) { 463 void ParamTraits<gfx::Point>::Log(const gfx::Point& p, std::string* l) {
463 l->append(base::StringPrintf("(%d, %d)", p.x(), p.y())); 464 l->append(base::StringPrintf("(%d, %d)", p.x(), p.y()));
464 } 465 }
465 466
466 void ParamTraits<gfx::Size>::Write(Message* m, const gfx::Size& p) { 467 void ParamTraits<gfx::Size>::Write(Message* m, const gfx::Size& p) {
467 m->WriteInt(p.width()); 468 m->WriteInt(p.width());
468 m->WriteInt(p.height()); 469 m->WriteInt(p.height());
469 } 470 }
470 471
471 bool ParamTraits<gfx::Size>::Read(const Message* m, void** iter, gfx::Size* r) { 472 bool ParamTraits<gfx::Size>::Read(const Message* m,
473 PickleReader* iter,
474 gfx::Size* r) {
472 int w, h; 475 int w, h;
473 if (!m->ReadInt(iter, &w) || 476 if (!m->ReadInt(iter, &w) ||
474 !m->ReadInt(iter, &h)) 477 !m->ReadInt(iter, &h))
475 return false; 478 return false;
476 r->set_width(w); 479 r->set_width(w);
477 r->set_height(h); 480 r->set_height(h);
478 return true; 481 return true;
479 } 482 }
480 483
481 void ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::string* l) { 484 void ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::string* l) {
482 l->append(base::StringPrintf("(%d, %d)", p.width(), p.height())); 485 l->append(base::StringPrintf("(%d, %d)", p.width(), p.height()));
483 } 486 }
484 487
485 void ParamTraits<gfx::Rect>::Write(Message* m, const gfx::Rect& p) { 488 void ParamTraits<gfx::Rect>::Write(Message* m, const gfx::Rect& p) {
486 m->WriteInt(p.x()); 489 m->WriteInt(p.x());
487 m->WriteInt(p.y()); 490 m->WriteInt(p.y());
488 m->WriteInt(p.width()); 491 m->WriteInt(p.width());
489 m->WriteInt(p.height()); 492 m->WriteInt(p.height());
490 } 493 }
491 494
492 bool ParamTraits<gfx::Rect>::Read(const Message* m, void** iter, gfx::Rect* r) { 495 bool ParamTraits<gfx::Rect>::Read(const Message* m,
496 PickleReader* iter,
497 gfx::Rect* r) {
493 int x, y, w, h; 498 int x, y, w, h;
494 if (!m->ReadInt(iter, &x) || 499 if (!m->ReadInt(iter, &x) ||
495 !m->ReadInt(iter, &y) || 500 !m->ReadInt(iter, &y) ||
496 !m->ReadInt(iter, &w) || 501 !m->ReadInt(iter, &w) ||
497 !m->ReadInt(iter, &h)) 502 !m->ReadInt(iter, &h))
498 return false; 503 return false;
499 r->set_x(x); 504 r->set_x(x);
500 r->set_y(y); 505 r->set_y(y);
501 r->set_width(w); 506 r->set_width(w);
502 r->set_height(h); 507 r->set_height(h);
503 return true; 508 return true;
504 } 509 }
505 510
506 void ParamTraits<gfx::Rect>::Log(const gfx::Rect& p, std::string* l) { 511 void ParamTraits<gfx::Rect>::Log(const gfx::Rect& p, std::string* l) {
507 l->append(base::StringPrintf("(%d, %d, %d, %d)", p.x(), p.y(), 512 l->append(base::StringPrintf("(%d, %d, %d, %d)", p.x(), p.y(),
508 p.width(), p.height())); 513 p.width(), p.height()));
509 } 514 }
510 515
511 void ParamTraits<ui::Range>::Write(Message* m, const ui::Range& r) { 516 void ParamTraits<ui::Range>::Write(Message* m, const ui::Range& r) {
512 m->WriteSize(r.start()); 517 m->WriteSize(r.start());
513 m->WriteSize(r.end()); 518 m->WriteSize(r.end());
514 } 519 }
515 520
516 bool ParamTraits<ui::Range>::Read(const Message* m, void** iter, ui::Range* r) { 521 bool ParamTraits<ui::Range>::Read(const Message* m,
522 PickleReader* iter,
523 ui::Range* r) {
517 size_t start, end; 524 size_t start, end;
518 if (!m->ReadSize(iter, &start) || !m->ReadSize(iter, &end)) 525 if (!m->ReadSize(iter, &start) || !m->ReadSize(iter, &end))
519 return false; 526 return false;
520 r->set_start(start); 527 r->set_start(start);
521 r->set_end(end); 528 r->set_end(end);
522 return true; 529 return true;
523 } 530 }
524 531
525 void ParamTraits<ui::Range>::Log(const ui::Range& r, std::string* l) { 532 void ParamTraits<ui::Range>::Log(const ui::Range& r, std::string* l) {
526 l->append(base::StringPrintf("(%"PRIuS", %"PRIuS")", r.start(), r.end())); 533 l->append(base::StringPrintf("(%"PRIuS", %"PRIuS")", r.start(), r.end()));
527 } 534 }
528 535
529 void ParamTraits<SkBitmap>::Write(Message* m, const SkBitmap& p) { 536 void ParamTraits<SkBitmap>::Write(Message* m, const SkBitmap& p) {
530 size_t fixed_size = sizeof(SkBitmap_Data); 537 size_t fixed_size = sizeof(SkBitmap_Data);
531 SkBitmap_Data bmp_data; 538 SkBitmap_Data bmp_data;
532 bmp_data.InitSkBitmapDataForTransfer(p); 539 bmp_data.InitSkBitmapDataForTransfer(p);
533 m->WriteData(reinterpret_cast<const char*>(&bmp_data), 540 m->WriteData(reinterpret_cast<const char*>(&bmp_data),
534 static_cast<int>(fixed_size)); 541 static_cast<int>(fixed_size));
535 size_t pixel_size = p.getSize(); 542 size_t pixel_size = p.getSize();
536 SkAutoLockPixels p_lock(p); 543 SkAutoLockPixels p_lock(p);
537 m->WriteData(reinterpret_cast<const char*>(p.getPixels()), 544 m->WriteData(reinterpret_cast<const char*>(p.getPixels()),
538 static_cast<int>(pixel_size)); 545 static_cast<int>(pixel_size));
539 } 546 }
540 547
541 bool ParamTraits<SkBitmap>::Read(const Message* m, void** iter, SkBitmap* r) { 548 bool ParamTraits<SkBitmap>::Read(const Message* m,
549 PickleReader* iter,
550 SkBitmap* r) {
542 const char* fixed_data; 551 const char* fixed_data;
543 int fixed_data_size = 0; 552 int fixed_data_size = 0;
544 if (!m->ReadData(iter, &fixed_data, &fixed_data_size) || 553 if (!m->ReadData(iter, &fixed_data, &fixed_data_size) ||
545 (fixed_data_size <= 0)) { 554 (fixed_data_size <= 0)) {
546 NOTREACHED(); 555 NOTREACHED();
547 return false; 556 return false;
548 } 557 }
549 if (fixed_data_size != sizeof(SkBitmap_Data)) 558 if (fixed_data_size != sizeof(SkBitmap_Data))
550 return false; // Message is malformed. 559 return false; // Message is malformed.
551 560
552 const char* variable_data; 561 const char* variable_data;
553 int variable_data_size = 0; 562 int variable_data_size = 0;
554 if (!m->ReadData(iter, &variable_data, &variable_data_size) || 563 if (!m->ReadData(iter, &variable_data, &variable_data_size) ||
555 (variable_data_size < 0)) { 564 (variable_data_size < 0)) {
556 NOTREACHED(); 565 NOTREACHED();
557 return false; 566 return false;
558 } 567 }
559 const SkBitmap_Data* bmp_data = 568 const SkBitmap_Data* bmp_data =
560 reinterpret_cast<const SkBitmap_Data*>(fixed_data); 569 reinterpret_cast<const SkBitmap_Data*>(fixed_data);
561 return bmp_data->InitSkBitmapFromData(r, variable_data, variable_data_size); 570 return bmp_data->InitSkBitmapFromData(r, variable_data, variable_data_size);
562 } 571 }
563 572
564 void ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) { 573 void ParamTraits<SkBitmap>::Log(const SkBitmap& p, std::string* l) {
565 l->append("<SkBitmap>"); 574 l->append("<SkBitmap>");
566 } 575 }
567 576
568 } // namespace IPC 577 } // namespace IPC
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698