| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "CheckFieldsVisitor.h" | 5 #include "CheckFieldsVisitor.h" |
| 6 | 6 |
| 7 #include <cassert> | 7 #include <cassert> |
| 8 | 8 |
| 9 #include "BlinkGCPluginOptions.h" | |
| 10 #include "RecordInfo.h" | 9 #include "RecordInfo.h" |
| 11 | 10 |
| 12 CheckFieldsVisitor::CheckFieldsVisitor() | 11 CheckFieldsVisitor::CheckFieldsVisitor(const BlinkGCPluginOptions& options) |
| 13 : current_(0), | 12 : options_(options), current_(0), stack_allocated_host_(false) {} |
| 14 stack_allocated_host_(false) { | |
| 15 } | |
| 16 | 13 |
| 17 CheckFieldsVisitor::Errors& CheckFieldsVisitor::invalid_fields() { | 14 CheckFieldsVisitor::Errors& CheckFieldsVisitor::invalid_fields() { |
| 18 return invalid_fields_; | 15 return invalid_fields_; |
| 19 } | 16 } |
| 20 | 17 |
| 21 bool CheckFieldsVisitor::ContainsInvalidFields(RecordInfo* info) { | 18 bool CheckFieldsVisitor::ContainsInvalidFields(RecordInfo* info) { |
| 22 stack_allocated_host_ = info->IsStackAllocated(); | 19 stack_allocated_host_ = info->IsStackAllocated(); |
| 23 managed_host_ = stack_allocated_host_ || | 20 managed_host_ = stack_allocated_host_ || |
| 24 info->IsGCAllocated() || | 21 info->IsGCAllocated() || |
| 25 info->IsNonNewable() || | 22 info->IsNonNewable() || |
| 26 info->IsOnlyPlacementNewable(); | 23 info->IsOnlyPlacementNewable(); |
| 27 for (RecordInfo::Fields::iterator it = info->GetFields().begin(); | 24 for (RecordInfo::Fields::iterator it = info->GetFields().begin(); |
| 28 it != info->GetFields().end(); | 25 it != info->GetFields().end(); |
| 29 ++it) { | 26 ++it) { |
| 30 context().clear(); | 27 context().clear(); |
| 31 current_ = &it->second; | 28 current_ = &it->second; |
| 32 current_->edge()->Accept(this); | 29 current_->edge()->Accept(this); |
| 33 } | 30 } |
| 34 return !invalid_fields_.empty(); | 31 return !invalid_fields_.empty(); |
| 35 } | 32 } |
| 36 | 33 |
| 37 void CheckFieldsVisitor::AtMember(Member* edge) { | 34 void CheckFieldsVisitor::AtMember(Member*) { |
| 38 if (managed_host_) | 35 if (managed_host_) |
| 39 return; | 36 return; |
| 40 // A member is allowed to appear in the context of a root. | 37 // A member is allowed to appear in the context of a root. |
| 41 for (Context::iterator it = context().begin(); | 38 for (Context::iterator it = context().begin(); |
| 42 it != context().end(); | 39 it != context().end(); |
| 43 ++it) { | 40 ++it) { |
| 44 if ((*it)->Kind() == Edge::kRoot) | 41 if ((*it)->Kind() == Edge::kRoot) |
| 45 return; | 42 return; |
| 46 } | 43 } |
| 47 invalid_fields_.push_back(std::make_pair(current_, kMemberInUnmanaged)); | 44 invalid_fields_.push_back(std::make_pair(current_, kMemberInUnmanaged)); |
| 48 } | 45 } |
| 49 | 46 |
| 47 void CheckFieldsVisitor::AtWeakMember(WeakMember*) { |
| 48 // TODO(sof): remove this once crbug.com/724418's change |
| 49 // has safely been rolled out. |
| 50 if (options_.enable_weak_members_in_unmanaged_classes) |
| 51 return; |
| 52 AtMember(nullptr); |
| 53 } |
| 54 |
| 50 void CheckFieldsVisitor::AtIterator(Iterator* edge) { | 55 void CheckFieldsVisitor::AtIterator(Iterator* edge) { |
| 51 if (!managed_host_) | 56 if (!managed_host_) |
| 52 return; | 57 return; |
| 53 | 58 |
| 54 if (edge->IsUnsafe()) | 59 if (edge->IsUnsafe()) |
| 55 invalid_fields_.push_back(std::make_pair(current_, kIteratorToGCManaged)); | 60 invalid_fields_.push_back(std::make_pair(current_, kIteratorToGCManaged)); |
| 56 } | 61 } |
| 57 | 62 |
| 58 void CheckFieldsVisitor::AtValue(Value* edge) { | 63 void CheckFieldsVisitor::AtValue(Value* edge) { |
| 59 // TODO: what should we do to check unions? | 64 // TODO: what should we do to check unions? |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 return kRawPtrToGCManaged; | 129 return kRawPtrToGCManaged; |
| 125 } | 130 } |
| 126 if (ptr->IsRefPtr()) | 131 if (ptr->IsRefPtr()) |
| 127 return kRefPtrToGCManaged; | 132 return kRefPtrToGCManaged; |
| 128 if (ptr->IsOwnPtr()) | 133 if (ptr->IsOwnPtr()) |
| 129 return kOwnPtrToGCManaged; | 134 return kOwnPtrToGCManaged; |
| 130 if (ptr->IsUniquePtr()) | 135 if (ptr->IsUniquePtr()) |
| 131 return kUniquePtrToGCManaged; | 136 return kUniquePtrToGCManaged; |
| 132 assert(false && "Unknown smart pointer kind"); | 137 assert(false && "Unknown smart pointer kind"); |
| 133 } | 138 } |
| OLD | NEW |