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/compiler/js-heap-broker.h"
11#include "src/handles.h"
12#include "src/objects/map.h"
13#include "src/zone/zone-containers.h"
14
15namespace v8 {
16namespace internal {
17namespace compiler {
18
19class CommonOperatorBuilder;
20class CompilationDependencies;
21class Graph;
22class JSGraph;
23class JSHeapBroker;
24class Node;
25class PropertyAccessInfo;
26class SimplifiedOperatorBuilder;
27
28class PropertyAccessBuilder {
29 public:
30 PropertyAccessBuilder(JSGraph* jsgraph, JSHeapBroker* broker,
31 CompilationDependencies* dependencies)
32 : jsgraph_(jsgraph), broker_(broker), dependencies_(dependencies) {}
33
34 // Builds the appropriate string check if the maps are only string
35 // maps.
36 bool TryBuildStringCheck(JSHeapBroker* broker, MapHandles const& maps,
37 Node** receiver, Node** effect, Node* control);
38 // Builds a number check if all maps are number maps.
39 bool TryBuildNumberCheck(JSHeapBroker* broker, MapHandles const& maps,
40 Node** receiver, Node** effect, Node* control);
41
42 Node* BuildCheckHeapObject(Node* receiver, Node** effect, Node* control);
43 void BuildCheckMaps(Node* receiver, Node** effect, Node* control,
44 std::vector<Handle<Map>> const& receiver_maps);
45 Node* BuildCheckValue(Node* receiver, Node** effect, Node* control,
46 Handle<HeapObject> value);
47
48 // Builds the actual load for data-field and data-constant-field
49 // properties (without heap-object or map checks).
50 Node* BuildLoadDataField(NameRef const& name,
51 PropertyAccessInfo const& access_info,
52 Node* receiver, Node** effect, Node** control);
53
54 private:
55 JSGraph* jsgraph() const { return jsgraph_; }
56 JSHeapBroker* broker() const { return broker_; }
57 CompilationDependencies* dependencies() const { return dependencies_; }
58 Graph* graph() const;
59 Isolate* isolate() const;
60 CommonOperatorBuilder* common() const;
61 SimplifiedOperatorBuilder* simplified() const;
62
63 Node* TryBuildLoadConstantDataField(NameRef const& name,
64 PropertyAccessInfo const& access_info,
65 Node* receiver);
66 // Returns a node with the holder for the property access described by
67 // {access_info}.
68 Node* ResolveHolder(PropertyAccessInfo const& access_info, Node* receiver);
69
70 JSGraph* jsgraph_;
71 JSHeapBroker* broker_;
72 CompilationDependencies* dependencies_;
73};
74
75bool HasOnlyStringMaps(JSHeapBroker* broker, MapHandles const& maps);
76
77} // namespace compiler
78} // namespace internal
79} // namespace v8
80
81#endif // V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_
82