• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "src/base/optional.h"
9 #include "src/codegen/machine-type.h"
10 #include "src/compiler/js-heap-broker.h"
11 #include "src/compiler/node.h"
12 #include "src/handles/handles.h"
13 #include "src/objects/map.h"
14 #include "src/zone/zone-containers.h"
15 
16 namespace v8 {
17 namespace internal {
18 namespace compiler {
19 
20 class CommonOperatorBuilder;
21 class CompilationDependencies;
22 class Graph;
23 class JSGraph;
24 class JSHeapBroker;
25 class PropertyAccessInfo;
26 class SimplifiedOperatorBuilder;
27 struct FieldAccess;
28 
29 class PropertyAccessBuilder {
30  public:
PropertyAccessBuilder(JSGraph * jsgraph,JSHeapBroker * broker,CompilationDependencies * dependencies)31   PropertyAccessBuilder(JSGraph* jsgraph, JSHeapBroker* broker,
32                         CompilationDependencies* dependencies)
33       : jsgraph_(jsgraph), broker_(broker), dependencies_(dependencies) {}
34 
35   // Builds the appropriate string check if the maps are only string
36   // maps.
37   bool TryBuildStringCheck(JSHeapBroker* broker, ZoneVector<MapRef> const& maps,
38                            Node** receiver, Effect* effect, Control control);
39   // Builds a number check if all maps are number maps.
40   bool TryBuildNumberCheck(JSHeapBroker* broker, ZoneVector<MapRef> const& maps,
41                            Node** receiver, Effect* effect, Control control);
42 
43   void BuildCheckMaps(Node* object, Effect* effect, Control control,
44                       ZoneVector<MapRef> const& maps);
45 
46   Node* BuildCheckValue(Node* receiver, Effect* effect, Control control,
47                         Handle<HeapObject> value);
48 
49   // Builds the actual load for data-field and data-constant-field
50   // properties (without heap-object or map checks).
51   Node* BuildLoadDataField(NameRef const& name,
52                            PropertyAccessInfo const& access_info,
53                            Node* lookup_start_object, Node** effect,
54                            Node** control);
55 
56   // Tries to load a constant value from a prototype object in dictionary mode
57   // and constant-folds it. Returns {} if the constant couldn't be safely
58   // retrieved.
59   base::Optional<Node*> FoldLoadDictPrototypeConstant(
60       PropertyAccessInfo const& access_info);
61 
62   static MachineRepresentation ConvertRepresentation(
63       Representation representation);
64 
65  private:
jsgraph()66   JSGraph* jsgraph() const { return jsgraph_; }
broker()67   JSHeapBroker* broker() const { return broker_; }
dependencies()68   CompilationDependencies* dependencies() const { return dependencies_; }
69   Graph* graph() const;
70   Isolate* isolate() const;
71   CommonOperatorBuilder* common() const;
72   SimplifiedOperatorBuilder* simplified() const;
73 
74   Node* TryFoldLoadConstantDataField(NameRef const& name,
75                                      PropertyAccessInfo const& access_info,
76                                      Node* lookup_start_object);
77   // Returns a node with the holder for the property access described by
78   // {access_info}.
79   Node* ResolveHolder(PropertyAccessInfo const& access_info,
80                       Node* lookup_start_object);
81 
82   Node* BuildLoadDataField(NameRef const& name, Node* holder,
83                            FieldAccess& field_access, bool is_inobject,
84                            Node** effect, Node** control);
85 
86   JSGraph* jsgraph_;
87   JSHeapBroker* broker_;
88   CompilationDependencies* dependencies_;
89 };
90 
91 bool HasOnlyStringMaps(JSHeapBroker* broker, ZoneVector<MapRef> const& maps);
92 
93 }  // namespace compiler
94 }  // namespace internal
95 }  // namespace v8
96 
97 #endif  // V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_
98