| // Copyright 2014 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_IC_CALL_OPTIMIZATION_H_ | 
 | #define V8_IC_CALL_OPTIMIZATION_H_ | 
 |  | 
 | #include "src/api/api-arguments.h" | 
 | #include "src/objects/objects.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 | // Holds information about possible function call optimizations. | 
 | class CallOptimization { | 
 |  public: | 
 |   CallOptimization(Isolate* isolate, Handle<Object> function); | 
 |  | 
 |   Context GetAccessorContext(Map holder_map) const; | 
 |   bool IsCrossContextLazyAccessorPair(Context native_context, | 
 |                                       Map holder_map) const; | 
 |  | 
 |   bool is_constant_call() const { return !constant_function_.is_null(); } | 
 |  | 
 |   Handle<JSFunction> constant_function() const { | 
 |     DCHECK(is_constant_call()); | 
 |     return constant_function_; | 
 |   } | 
 |  | 
 |   bool is_simple_api_call() const { return is_simple_api_call_; } | 
 |  | 
 |   Handle<FunctionTemplateInfo> expected_receiver_type() const { | 
 |     DCHECK(is_simple_api_call()); | 
 |     return expected_receiver_type_; | 
 |   } | 
 |  | 
 |   Handle<CallHandlerInfo> api_call_info() const { | 
 |     DCHECK(is_simple_api_call()); | 
 |     return api_call_info_; | 
 |   } | 
 |  | 
 |   enum HolderLookup { kHolderNotFound, kHolderIsReceiver, kHolderFound }; | 
 |   Handle<JSObject> LookupHolderOfExpectedType( | 
 |       Handle<Map> receiver_map, HolderLookup* holder_lookup) const; | 
 |  | 
 |   // Check if the api holder is between the receiver and the holder. | 
 |   bool IsCompatibleReceiver(Handle<Object> receiver, | 
 |                             Handle<JSObject> holder) const; | 
 |  | 
 |   // Check if the api holder is between the receiver and the holder. | 
 |   bool IsCompatibleReceiverMap(Handle<Map> receiver_map, | 
 |                                Handle<JSObject> holder) const; | 
 |  | 
 |  private: | 
 |   void Initialize(Isolate* isolate, Handle<JSFunction> function); | 
 |   void Initialize(Isolate* isolate, | 
 |                   Handle<FunctionTemplateInfo> function_template_info); | 
 |  | 
 |   // Determines whether the given function can be called using the | 
 |   // fast api call builtin. | 
 |   void AnalyzePossibleApiFunction(Isolate* isolate, | 
 |                                   Handle<JSFunction> function); | 
 |  | 
 |   Handle<JSFunction> constant_function_; | 
 |   bool is_simple_api_call_; | 
 |   Handle<FunctionTemplateInfo> expected_receiver_type_; | 
 |   Handle<CallHandlerInfo> api_call_info_; | 
 | }; | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_IC_CALL_OPTIMIZATION_H_ |