| // Copyright 2019 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_MAP_INFERENCE_H_ | 
 | #define V8_COMPILER_MAP_INFERENCE_H_ | 
 |  | 
 | #include "include/v8config.h" | 
 | #include "src/compiler/graph-reducer.h" | 
 | #include "src/objects/instance-type.h" | 
 | #include "src/objects/map.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 |  | 
 |  | 
 | namespace compiler { | 
 |  | 
 | class CompilationDependencies; | 
 | struct FeedbackSource; | 
 | class JSGraph; | 
 | class JSHeapBroker; | 
 | class Node; | 
 |  | 
 | // The MapInference class provides access to the "inferred" maps of an | 
 | // {object}. This information can be either "reliable", meaning that the object | 
 | // is guaranteed to have one of these maps at runtime, or "unreliable", meaning | 
 | // that the object is guaranteed to have HAD one of these maps. | 
 | // | 
 | // The MapInference class does not expose whether or not the information is | 
 | // reliable. A client is expected to eventually make the information reliable by | 
 | // calling one of several methods that will either insert map checks, or record | 
 | // stability dependencies (or do nothing if the information was already | 
 | // reliable). | 
 | class MapInference { | 
 |  public: | 
 |   MapInference(JSHeapBroker* broker, Node* object, Node* effect); | 
 |  | 
 |   // The destructor checks that the information has been made reliable (if | 
 |   // necessary) and force-crashes if not. | 
 |   ~MapInference(); | 
 |  | 
 |   // Is there any information at all? | 
 |   V8_WARN_UNUSED_RESULT bool HaveMaps() const; | 
 |  | 
 |   // These queries don't require a guard. | 
 |   // | 
 |   V8_WARN_UNUSED_RESULT bool AllOfInstanceTypesAreJSReceiver() const; | 
 |   // Here, {type} must not be a String type. | 
 |   V8_WARN_UNUSED_RESULT bool AllOfInstanceTypesAre(InstanceType type) const; | 
 |   V8_WARN_UNUSED_RESULT bool AnyOfInstanceTypesAre(InstanceType type) const; | 
 |  | 
 |   // These queries require a guard. (Even instance types are generally not | 
 |   // reliable because of how the representation of a string can change.) | 
 |   V8_WARN_UNUSED_RESULT MapHandles const& GetMaps(); | 
 |   V8_WARN_UNUSED_RESULT bool AllOfInstanceTypes( | 
 |       std::function<bool(InstanceType)> f); | 
 |   V8_WARN_UNUSED_RESULT bool Is(Handle<Map> expected_map); | 
 |  | 
 |   // These methods provide a guard. | 
 |   // | 
 |   // Returns true iff maps were already reliable or stability dependencies were | 
 |   // successfully recorded. | 
 |   V8_WARN_UNUSED_RESULT bool RelyOnMapsViaStability( | 
 |       CompilationDependencies* dependencies); | 
 |   // Records stability dependencies if possible, otherwise it inserts map | 
 |   // checks. Does nothing if maps were already reliable. Returns true iff | 
 |   // dependencies were taken. | 
 |   bool RelyOnMapsPreferStability(CompilationDependencies* dependencies, | 
 |                                  JSGraph* jsgraph, Effect* effect, | 
 |                                  Control control, | 
 |                                  const FeedbackSource& feedback); | 
 |   // Inserts map checks even if maps were already reliable. | 
 |   void InsertMapChecks(JSGraph* jsgraph, Effect* effect, Control control, | 
 |                        const FeedbackSource& feedback); | 
 |  | 
 |   // Internally marks the maps as reliable (thus bypassing the safety check) and | 
 |   // returns the NoChange reduction. USE THIS ONLY WHEN RETURNING, e.g.: | 
 |   //   if (foo) return inference.NoChange(); | 
 |   V8_WARN_UNUSED_RESULT Reduction NoChange(); | 
 |  | 
 |  private: | 
 |   JSHeapBroker* const broker_; | 
 |   Node* const object_; | 
 |  | 
 |   MapHandles maps_; | 
 |   enum { | 
 |     kReliableOrGuarded, | 
 |     kUnreliableDontNeedGuard, | 
 |     kUnreliableNeedGuard | 
 |   } maps_state_; | 
 |  | 
 |   bool Safe() const; | 
 |   void SetNeedGuardIfUnreliable(); | 
 |   void SetGuarded(); | 
 |  | 
 |   V8_WARN_UNUSED_RESULT bool AllOfInstanceTypesUnsafe( | 
 |       std::function<bool(InstanceType)> f) const; | 
 |   V8_WARN_UNUSED_RESULT bool AnyOfInstanceTypesUnsafe( | 
 |       std::function<bool(InstanceType)> f) const; | 
 |   V8_WARN_UNUSED_RESULT bool RelyOnMapsHelper( | 
 |       CompilationDependencies* dependencies, JSGraph* jsgraph, Effect* effect, | 
 |       Control control, const FeedbackSource& feedback); | 
 | }; | 
 |  | 
 | }  // namespace compiler | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_COMPILER_MAP_INFERENCE_H_ |