#ifndef V8_IC_CALL_OPTIMIZATION_H_
#define V8_IC_CALL_OPTIMIZATION_H_
#include <optional>
#include "src/api/api-arguments.h"
#include "src/objects/objects.h"
namespace v8 {
namespace internal {
class CallOptimization {
public:
template <class IsolateT>
CallOptimization(IsolateT* isolate, Handle<Object> function);
std::optional<Tagged<NativeContext>> GetAccessorContext(
Tagged<Map> holder_map) const;
bool IsCrossContextLazyAccessorPair(Tagged<NativeContext> native_context,
Tagged<Map> holder_map) const;
bool is_constant_call() const { return !constant_function_.is_null(); }
bool accept_any_receiver() const { return accept_any_receiver_; }
bool requires_signature_check() const {
return !expected_receiver_type_.is_null();
}
DirectHandle<JSFunction> constant_function() const {
DCHECK(is_constant_call());
return constant_function_;
}
bool is_simple_api_call() const { return is_simple_api_call_; }
DirectHandle<FunctionTemplateInfo> expected_receiver_type() const {
DCHECK(is_simple_api_call());
return expected_receiver_type_;
}
DirectHandle<FunctionTemplateInfo> api_call_info() const {
DCHECK(is_simple_api_call());
return api_call_info_;
}
enum HolderLookup { kHolderNotFound, kHolderIsReceiver, kHolderFound };
template <class IsolateT>
Handle<JSObject> LookupHolderOfExpectedType(
IsolateT* isolate, DirectHandle<Map> receiver_map,
HolderLookup* holder_lookup) const;
bool IsCompatibleReceiverMap(DirectHandle<JSObject> api_holder,
Handle<JSObject> holder, HolderLookup) const;
private:
template <class IsolateT>
void Initialize(IsolateT* isolate, Handle<JSFunction> function);
template <class IsolateT>
void Initialize(IsolateT* isolate,
Handle<FunctionTemplateInfo> function_template_info);
template <class IsolateT>
void AnalyzePossibleApiFunction(IsolateT* isolate,
DirectHandle<JSFunction> function);
Handle<JSFunction> constant_function_;
Handle<FunctionTemplateInfo> expected_receiver_type_;
Handle<FunctionTemplateInfo> api_call_info_;
bool is_simple_api_call_ = false;
bool accept_any_receiver_ = false;
};
}
}
#endif