1 // Copyright 2017 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_
6 #define V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_
7 
8 #include <vector>
9 
10 #include "src/codegen/machine-type.h"
11 #include "src/compiler/js-heap-broker.h"
12 #include "src/compiler/node.h"
13 #include "src/handles/handles.h"
14 #include "src/objects/map.h"
15 #include "src/zone/zone-containers.h"
16 
17 namespace v8 {
18 namespace internal {
19 namespace compiler {
20 
21 class CommonOperatorBuilder;
22 class CompilationDependencies;
23 class Graph;
24 class JSGraph;
25 class JSHeapBroker;
26 class PropertyAccessInfo;
27 class SimplifiedOperatorBuilder;
28 struct FieldAccess;
29 
30 class PropertyAccessBuilder {
31  public:
PropertyAccessBuilder(JSGraph * jsgraph,JSHeapBroker * broker,CompilationDependencies * dependencies)32   PropertyAccessBuilder(JSGraph* jsgraph, JSHeapBroker* broker,
33                         CompilationDependencies* dependencies)
34       : jsgraph_(jsgraph), broker_(broker), dependencies_(dependencies) {}
35 
36   // Builds the appropriate string check if the maps are only string
37   // maps.
38   bool TryBuildStringCheck(JSHeapBroker* broker,
39                            ZoneVector<Handle<Map>> const& maps, Node** receiver,
40                            Node** effect, Node* control);
41   // Builds a number check if all maps are number maps.
42   bool TryBuildNumberCheck(JSHeapBroker* broker,
43                            ZoneVector<Handle<Map>> const& maps, Node** receiver,
44                            Node** effect, Node* control);
45 
46   // TODO(jgruber): Remove the untyped version once all uses are
47   // updated.
48   void BuildCheckMaps(Node* object, Node** effect, Node* control,
49                       ZoneVector<Handle<Map>> const& maps);
BuildCheckMaps(Node * object,Effect * effect,Control control,ZoneVector<Handle<Map>> const & maps)50   void BuildCheckMaps(Node* object, Effect* effect, Control control,
51                       ZoneVector<Handle<Map>> const& maps) {
52     Node* e = *effect;
53     Node* c = control;
54     BuildCheckMaps(object, &e, c, maps);
55     *effect = e;
56   }
57   Node* BuildCheckValue(Node* receiver, Effect* effect, Control control,
58                         Handle<HeapObject> value);
59 
60   // Builds the actual load for data-field and data-constant-field
61   // properties (without heap-object or map checks).
62   Node* BuildLoadDataField(NameRef const& name,
63                            PropertyAccessInfo const& access_info,
64                            Node* lookup_start_object, Node** effect,
65                            Node** control);
66 
67   // Builds the load for data-field access for minimorphic loads that use
68   // dynamic map checks. These cannot depend on any information from the maps.
69   Node* BuildMinimorphicLoadDataField(
70       NameRef const& name, MinimorphicLoadPropertyAccessInfo const& access_info,
71       Node* lookup_start_object, Node** effect, Node** control);
72 
73   static MachineRepresentation ConvertRepresentation(
74       Representation representation);
75 
76  private:
jsgraph()77   JSGraph* jsgraph() const { return jsgraph_; }
broker()78   JSHeapBroker* broker() const { return broker_; }
dependencies()79   CompilationDependencies* dependencies() const { return dependencies_; }
80   Graph* graph() const;
81   Isolate* isolate() const;
82   CommonOperatorBuilder* common() const;
83   SimplifiedOperatorBuilder* simplified() const;
84 
85   Node* TryBuildLoadConstantDataField(NameRef const& name,
86                                       PropertyAccessInfo const& access_info,
87                                       Node* lookup_start_object);
88   // Returns a node with the holder for the property access described by
89   // {access_info}.
90   Node* ResolveHolder(PropertyAccessInfo const& access_info,
91                       Node* lookup_start_object);
92 
93   Node* BuildLoadDataField(NameRef const& name, Node* holder,
94                            FieldAccess& field_access, bool is_inobject,
95                            Node** effect, Node** control);
96 
97   JSGraph* jsgraph_;
98   JSHeapBroker* broker_;
99   CompilationDependencies* dependencies_;
100 };
101 
102 bool HasOnlyStringMaps(JSHeapBroker* broker,
103                        ZoneVector<Handle<Map>> const& maps);
104 
105 }  // namespace compiler
106 }  // namespace internal
107 }  // namespace v8
108 
109 #endif  // V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_
110