| // Copyright 2015 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_JS_CALL_REDUCER_H_ | 
 | #define V8_COMPILER_JS_CALL_REDUCER_H_ | 
 |  | 
 | #include "src/base/flags.h" | 
 | #include "src/compiler/graph-reducer.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 | namespace compiler { | 
 |  | 
 | // Forward declarations. | 
 | class CommonOperatorBuilder; | 
 | class JSGraph; | 
 | class JSOperatorBuilder; | 
 |  | 
 |  | 
 | // Performs strength reduction on {JSCallConstruct} and {JSCallFunction} nodes, | 
 | // which might allow inlining or other optimizations to be performed afterwards. | 
 | class JSCallReducer final : public Reducer { | 
 |  public: | 
 |   // Flags that control the mode of operation. | 
 |   enum Flag { | 
 |     kNoFlags = 0u, | 
 |     kDeoptimizationEnabled = 1u << 0, | 
 |   }; | 
 |   typedef base::Flags<Flag> Flags; | 
 |  | 
 |   JSCallReducer(JSGraph* jsgraph, Flags flags, | 
 |                 MaybeHandle<Context> native_context) | 
 |       : jsgraph_(jsgraph), flags_(flags), native_context_(native_context) {} | 
 |  | 
 |   Reduction Reduce(Node* node) final; | 
 |  | 
 |  private: | 
 |   Reduction ReduceArrayConstructor(Node* node); | 
 |   Reduction ReduceNumberConstructor(Node* node); | 
 |   Reduction ReduceFunctionPrototypeApply(Node* node); | 
 |   Reduction ReduceFunctionPrototypeCall(Node* node); | 
 |   Reduction ReduceJSCallConstruct(Node* node); | 
 |   Reduction ReduceJSCallFunction(Node* node); | 
 |  | 
 |   MaybeHandle<Context> GetNativeContext(Node* node); | 
 |  | 
 |   Graph* graph() const; | 
 |   Flags flags() const { return flags_; } | 
 |   JSGraph* jsgraph() const { return jsgraph_; } | 
 |   Isolate* isolate() const; | 
 |   MaybeHandle<Context> native_context() const { return native_context_; } | 
 |   CommonOperatorBuilder* common() const; | 
 |   JSOperatorBuilder* javascript() const; | 
 |  | 
 |   JSGraph* const jsgraph_; | 
 |   Flags const flags_; | 
 |   MaybeHandle<Context> const native_context_; | 
 | }; | 
 |  | 
 | DEFINE_OPERATORS_FOR_FLAGS(JSCallReducer::Flags) | 
 |  | 
 | }  // namespace compiler | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_COMPILER_JS_CALL_REDUCER_H_ |