blob: 8698dea94f5a5c78827ae49b5696bb457c891731 [file] [log] [blame]
Avi Drissmandfd880852022-09-15 20:11:091// Copyright 2015 The Chromium Authors
yutak4d2f1c7f2015-09-16 10:29:362// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef TOOLS_BLINK_GC_PLUGIN_CHECK_FIELDS_VISITOR_H_
6#define TOOLS_BLINK_GC_PLUGIN_CHECK_FIELDS_VISITOR_H_
7
8#include <vector>
9
sigbjornf55a04e9c2017-05-24 18:37:2310#include "BlinkGCPluginOptions.h"
yutak4d2f1c7f2015-09-16 10:29:3611#include "Edge.h"
12
yutak4d2f1c7f2015-09-16 10:29:3613class FieldPoint;
14
15// This visitor checks that the fields of a class are "well formed".
Anton Bikineev547e6732020-04-01 16:53:5816// - unique_ptr, scoped_refptr and WeakPtr must not point to a GC derived type.
sigbjornf1465e9952016-04-19 12:24:4017// - Part objects must not be a GC derived type.
yutak4d2f1c7f2015-09-16 10:29:3618// - An on-heap class must never contain GC roots.
19// - Only stack-allocated types may point to stack-allocated types.
20
21class CheckFieldsVisitor : public RecursiveEdgeVisitor {
22 public:
23 enum Error {
24 kRawPtrToGCManaged,
yutak4d2f1c7f2015-09-16 10:29:3625 kRefPtrToGCManaged,
26 kReferencePtrToGCManaged,
sigbjornf163954b2016-06-20 11:24:5727 kUniquePtrToGCManaged,
yutak4d2f1c7f2015-09-16 10:29:3628 kMemberToGCUnmanaged,
29 kMemberInUnmanaged,
Omer Katzb4a61dd2023-11-09 09:09:2030 kPtrToMemberInUnmanaged,
yutak4d2f1c7f2015-09-16 10:29:3631 kPtrFromHeapToStack,
sigbjornf1fb76ab12016-12-20 13:22:1532 kGCDerivedPartObject,
33 kIteratorToGCManaged,
Anton Bikineev1f34a192020-01-23 10:22:5534 kMemberInStackAllocated,
Anton Bikineev91bb1a52023-10-30 15:35:1935 kTraceablePartObjectInUnmanaged,
Omer Katzdf57e412024-03-12 17:54:1636 kRawPtrToTraceable,
37 kRefPtrToTraceable,
38 kReferencePtrToTraceable,
39 kUniquePtrToTraceable,
yutak4d2f1c7f2015-09-16 10:29:3640 };
41
sigbjornfadf651b2016-04-28 12:06:4742 using Errors = std::vector<std::pair<FieldPoint*, Error>>;
yutak4d2f1c7f2015-09-16 10:29:3643
sigbjornf55a04e9c2017-05-24 18:37:2344 explicit CheckFieldsVisitor(const BlinkGCPluginOptions&);
yutak4d2f1c7f2015-09-16 10:29:3645
46 Errors& invalid_fields();
47
48 bool ContainsInvalidFields(RecordInfo* info);
49
sigbjornf55a04e9c2017-05-24 18:37:2350 void AtMember(Member*) override;
51 void AtWeakMember(WeakMember*) override;
52 void AtValue(Value*) override;
53 void AtCollection(Collection*) override;
sigbjornf1fb76ab12016-12-20 13:22:1554 void AtIterator(Iterator*) override;
yutak4d2f1c7f2015-09-16 10:29:3655
yutak4d2f1c7f2015-09-16 10:29:3656 private:
sigbjornf55a04e9c2017-05-24 18:37:2357 const BlinkGCPluginOptions& options_;
58
yutak4d2f1c7f2015-09-16 10:29:3659 FieldPoint* current_;
60 bool stack_allocated_host_;
61 bool managed_host_;
62 Errors invalid_fields_;
63};
64
65#endif // TOOLS_BLINK_GC_PLUGIN_CHECK_FIELDS_VISITOR_H_