// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_ #define V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_ #include #include "src/codegen/machine-type.h" #include "src/compiler/js-heap-broker.h" #include "src/compiler/node.h" #include "src/handles/handles.h" #include "src/objects/map.h" #include "src/zone/zone-containers.h" namespace v8 { namespace internal { namespace compiler { class CommonOperatorBuilder; class CompilationDependencies; class Graph; class JSGraph; class JSHeapBroker; class PropertyAccessInfo; class SimplifiedOperatorBuilder; struct FieldAccess; class PropertyAccessBuilder { public: PropertyAccessBuilder(JSGraph* jsgraph, JSHeapBroker* broker, CompilationDependencies* dependencies) : jsgraph_(jsgraph), broker_(broker), dependencies_(dependencies) {} // Builds the appropriate string check if the maps are only string // maps. bool TryBuildStringCheck(JSHeapBroker* broker, ZoneVector> const& maps, Node** receiver, Node** effect, Node* control); // Builds a number check if all maps are number maps. bool TryBuildNumberCheck(JSHeapBroker* broker, ZoneVector> const& maps, Node** receiver, Node** effect, Node* control); // TODO(jgruber): Remove the untyped version once all uses are // updated. void BuildCheckMaps(Node* object, Node** effect, Node* control, ZoneVector> const& maps); void BuildCheckMaps(Node* object, Effect* effect, Control control, ZoneVector> const& maps) { Node* e = *effect; Node* c = control; BuildCheckMaps(object, &e, c, maps); *effect = e; } Node* BuildCheckValue(Node* receiver, Effect* effect, Control control, Handle value); // Builds the actual load for data-field and data-constant-field // properties (without heap-object or map checks). Node* BuildLoadDataField(NameRef const& name, PropertyAccessInfo const& access_info, Node* lookup_start_object, Node** effect, Node** control); // Builds the load for data-field access for minimorphic loads that use // dynamic map checks. These cannot depend on any information from the maps. Node* BuildMinimorphicLoadDataField( NameRef const& name, MinimorphicLoadPropertyAccessInfo const& access_info, Node* lookup_start_object, Node** effect, Node** control); static MachineRepresentation ConvertRepresentation( Representation representation); private: JSGraph* jsgraph() const { return jsgraph_; } JSHeapBroker* broker() const { return broker_; } CompilationDependencies* dependencies() const { return dependencies_; } Graph* graph() const; Isolate* isolate() const; CommonOperatorBuilder* common() const; SimplifiedOperatorBuilder* simplified() const; Node* TryBuildLoadConstantDataField(NameRef const& name, PropertyAccessInfo const& access_info, Node* lookup_start_object); // Returns a node with the holder for the property access described by // {access_info}. Node* ResolveHolder(PropertyAccessInfo const& access_info, Node* lookup_start_object); Node* BuildLoadDataField(NameRef const& name, Node* holder, FieldAccess& field_access, bool is_inobject, Node** effect, Node** control); JSGraph* jsgraph_; JSHeapBroker* broker_; CompilationDependencies* dependencies_; }; bool HasOnlyStringMaps(JSHeapBroker* broker, ZoneVector> const& maps); } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_COMPILER_PROPERTY_ACCESS_BUILDER_H_