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

Side by Side Diff: tools/clang/blink_gc_plugin/RecordInfo.cpp

Issue 988693005: Chromium roll (https://codereview.chromium.org/976353002) (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: fixed bad android build patch Created 5 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
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 #include "Config.h" 5 #include "Config.h"
6 #include "RecordInfo.h" 6 #include "RecordInfo.h"
7 7
8 using namespace clang; 8 using namespace clang;
9 using std::string; 9 using std::string;
10 10
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 return fields; 420 return fields;
421 } 421 }
422 422
423 void RecordInfo::DetermineTracingMethods() { 423 void RecordInfo::DetermineTracingMethods() {
424 if (determined_trace_methods_) 424 if (determined_trace_methods_)
425 return; 425 return;
426 determined_trace_methods_ = true; 426 determined_trace_methods_ = true;
427 if (Config::IsGCBase(name_)) 427 if (Config::IsGCBase(name_))
428 return; 428 return;
429 CXXMethodDecl* trace = nullptr; 429 CXXMethodDecl* trace = nullptr;
430 CXXMethodDecl* trace_impl = nullptr;
430 CXXMethodDecl* trace_after_dispatch = nullptr; 431 CXXMethodDecl* trace_after_dispatch = nullptr;
431 bool has_adjust_and_mark = false; 432 bool has_adjust_and_mark = false;
432 bool has_is_heap_object_alive = false; 433 bool has_is_heap_object_alive = false;
433 for (CXXRecordDecl::method_iterator it = record_->method_begin(); 434 for (Decl* decl : record_->decls()) {
434 it != record_->method_end(); 435 CXXMethodDecl* method = dyn_cast<CXXMethodDecl>(decl);
435 ++it) { 436 if (!method) {
436 switch (Config::GetTraceMethodType(*it)) { 437 if (FunctionTemplateDecl* func_template =
438 dyn_cast<FunctionTemplateDecl>(decl))
439 method = dyn_cast<CXXMethodDecl>(func_template->getTemplatedDecl());
440 }
441 if (!method)
442 continue;
443
444 switch (Config::GetTraceMethodType(method)) {
437 case Config::TRACE_METHOD: 445 case Config::TRACE_METHOD:
438 trace = *it; 446 trace = method;
439 break; 447 break;
440 case Config::TRACE_AFTER_DISPATCH_METHOD: 448 case Config::TRACE_AFTER_DISPATCH_METHOD:
441 trace_after_dispatch = *it; 449 trace_after_dispatch = method;
442 break; 450 break;
443 case Config::TRACE_IMPL_METHOD: 451 case Config::TRACE_IMPL_METHOD:
452 trace_impl = method;
453 break;
444 case Config::TRACE_AFTER_DISPATCH_IMPL_METHOD: 454 case Config::TRACE_AFTER_DISPATCH_IMPL_METHOD:
445 break; 455 break;
446 case Config::NOT_TRACE_METHOD: 456 case Config::NOT_TRACE_METHOD:
447 if (it->getNameAsString() == kFinalizeName) { 457 if (method->getNameAsString() == kFinalizeName) {
448 finalize_dispatch_method_ = *it; 458 finalize_dispatch_method_ = method;
449 } else if (it->getNameAsString() == kAdjustAndMarkName) { 459 } else if (method->getNameAsString() == kAdjustAndMarkName) {
450 has_adjust_and_mark = true; 460 has_adjust_and_mark = true;
451 } else if (it->getNameAsString() == kIsHeapObjectAliveName) { 461 } else if (method->getNameAsString() == kIsHeapObjectAliveName) {
452 has_is_heap_object_alive = true; 462 has_is_heap_object_alive = true;
453 } 463 }
454 break; 464 break;
455 } 465 }
456 } 466 }
467
457 // Record if class defines the two GCMixin methods. 468 // Record if class defines the two GCMixin methods.
458 has_gc_mixin_methods_ = 469 has_gc_mixin_methods_ =
459 has_adjust_and_mark && has_is_heap_object_alive ? kTrue : kFalse; 470 has_adjust_and_mark && has_is_heap_object_alive ? kTrue : kFalse;
460 if (trace_after_dispatch) { 471 if (trace_after_dispatch) {
461 trace_method_ = trace_after_dispatch; 472 trace_method_ = trace_after_dispatch;
462 trace_dispatch_method_ = trace; 473 trace_dispatch_method_ = trace_impl ? trace_impl : trace;
463 } else { 474 } else {
464 // TODO: Can we never have a dispatch method called trace without the same 475 // TODO: Can we never have a dispatch method called trace without the same
465 // class defining a traceAfterDispatch method? 476 // class defining a traceAfterDispatch method?
466 trace_method_ = trace; 477 trace_method_ = trace;
467 trace_dispatch_method_ = nullptr; 478 trace_dispatch_method_ = nullptr;
468 } 479 }
469 if (trace_dispatch_method_ && finalize_dispatch_method_) 480 if (trace_dispatch_method_ && finalize_dispatch_method_)
470 return; 481 return;
471 // If this class does not define dispatching methods inherit them. 482 // If this class does not define dispatching methods inherit them.
472 for (Bases::iterator it = GetBases().begin(); it != GetBases().end(); ++it) { 483 for (Bases::iterator it = GetBases().begin(); it != GetBases().end(); ++it) {
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 edge->members().push_back(member); 642 edge->members().push_back(member);
632 } 643 }
633 // TODO: Handle the case where we fail to create an edge (eg, if the 644 // TODO: Handle the case where we fail to create an edge (eg, if the
634 // argument is a primitive type or just not fully known yet). 645 // argument is a primitive type or just not fully known yet).
635 } 646 }
636 return edge; 647 return edge;
637 } 648 }
638 649
639 return new Value(info); 650 return new Value(info);
640 } 651 }
OLDNEW
« no previous file with comments | « tools/clang/blink_gc_plugin/RecordInfo.h ('k') | tools/clang/blink_gc_plugin/tests/heap/stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698