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