| Index: src/ic/ic-compiler.cc
|
| diff --git a/src/ic/ic-compiler.cc b/src/ic/ic-compiler.cc
|
| index f31a5c1ac3ebc9a0b46a85e46a7f6e96e752ca22..f555517a2443e989eb3f4ab5b8f52afcf8059a97 100644
|
| --- a/src/ic/ic-compiler.cc
|
| +++ b/src/ic/ic-compiler.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "src/v8.h"
|
|
|
| +#include "src/ic/call-optimization.h"
|
| #include "src/ic/ic-inl.h"
|
| #include "src/ic/ic-compiler.h"
|
|
|
| @@ -178,9 +179,6 @@ Handle<Code> PropertyICCompiler::ComputeKeyedStoreMonomorphic(
|
| }
|
|
|
|
|
| -#define CALL_LOGGER_TAG(kind, type) (Logger::KEYED_##type)
|
| -
|
| -
|
| Code* PropertyICCompiler::FindPreMonomorphic(Isolate* isolate, Code::Kind kind,
|
| ExtraICState state) {
|
| Code::Flags flags = Code::ComputeFlags(kind, PREMONOMORPHIC, state);
|
| @@ -402,35 +400,6 @@ Handle<Code> PropertyICCompiler::CompileStoreMegamorphic(Code::Flags flags) {
|
| }
|
|
|
|
|
| -#undef CALL_LOGGER_TAG
|
| -
|
| -
|
| -Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
|
| - const char* name) {
|
| - // Create code object in the heap.
|
| - CodeDesc desc;
|
| - masm()->GetCode(&desc);
|
| - Handle<Code> code = factory()->NewCode(desc, flags, masm()->CodeObject());
|
| - if (code->IsCodeStubOrIC()) code->set_stub_key(CodeStub::NoCacheKey());
|
| -#ifdef ENABLE_DISASSEMBLER
|
| - if (FLAG_print_code_stubs) {
|
| - OFStream os(stdout);
|
| - code->Disassemble(name, os);
|
| - }
|
| -#endif
|
| - return code;
|
| -}
|
| -
|
| -
|
| -Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
|
| - Handle<Name> name) {
|
| - return (FLAG_print_code_stubs && !name.is_null() && name->IsString())
|
| - ? GetCodeWithFlags(flags,
|
| - Handle<String>::cast(name)->ToCString().get())
|
| - : GetCodeWithFlags(flags, NULL);
|
| -}
|
| -
|
| -
|
| #define __ ACCESS_MASM(masm())
|
|
|
|
|
| @@ -755,22 +724,6 @@ Handle<Code> PropertyICCompiler::CompileKeyedStoreMonomorphic(
|
| #undef __
|
|
|
|
|
| -void PropertyAccessCompiler::TailCallBuiltin(MacroAssembler* masm,
|
| - Builtins::Name name) {
|
| - Handle<Code> code(masm->isolate()->builtins()->builtin(name));
|
| - GenerateTailCall(masm, code);
|
| -}
|
| -
|
| -
|
| -Register* PropertyAccessCompiler::GetCallingConvention(Code::Kind kind) {
|
| - if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
|
| - return load_calling_convention();
|
| - }
|
| - DCHECK(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
|
| - return store_calling_convention();
|
| -}
|
| -
|
| -
|
| Handle<Code> PropertyICCompiler::GetCode(Code::Kind kind, Code::StubType type,
|
| Handle<Name> name,
|
| InlineCacheState state) {
|
| @@ -880,104 +833,5 @@ void ElementHandlerCompiler::GenerateStoreDictionaryElement(
|
| }
|
|
|
|
|
| -CallOptimization::CallOptimization(Handle<JSFunction> function) {
|
| - Initialize(function);
|
| -}
|
| -
|
| -
|
| -Handle<JSObject> CallOptimization::LookupHolderOfExpectedType(
|
| - Handle<Map> object_map, HolderLookup* holder_lookup) const {
|
| - DCHECK(is_simple_api_call());
|
| - if (!object_map->IsJSObjectMap()) {
|
| - *holder_lookup = kHolderNotFound;
|
| - return Handle<JSObject>::null();
|
| - }
|
| - if (expected_receiver_type_.is_null() ||
|
| - expected_receiver_type_->IsTemplateFor(*object_map)) {
|
| - *holder_lookup = kHolderIsReceiver;
|
| - return Handle<JSObject>::null();
|
| - }
|
| - while (true) {
|
| - if (!object_map->prototype()->IsJSObject()) break;
|
| - Handle<JSObject> prototype(JSObject::cast(object_map->prototype()));
|
| - if (!prototype->map()->is_hidden_prototype()) break;
|
| - object_map = handle(prototype->map());
|
| - if (expected_receiver_type_->IsTemplateFor(*object_map)) {
|
| - *holder_lookup = kHolderFound;
|
| - return prototype;
|
| - }
|
| - }
|
| - *holder_lookup = kHolderNotFound;
|
| - return Handle<JSObject>::null();
|
| -}
|
| -
|
| -
|
| -bool CallOptimization::IsCompatibleReceiver(Handle<Object> receiver,
|
| - Handle<JSObject> holder) const {
|
| - DCHECK(is_simple_api_call());
|
| - if (!receiver->IsJSObject()) return false;
|
| - Handle<Map> map(JSObject::cast(*receiver)->map());
|
| - HolderLookup holder_lookup;
|
| - Handle<JSObject> api_holder = LookupHolderOfExpectedType(map, &holder_lookup);
|
| - switch (holder_lookup) {
|
| - case kHolderNotFound:
|
| - return false;
|
| - case kHolderIsReceiver:
|
| - return true;
|
| - case kHolderFound:
|
| - if (api_holder.is_identical_to(holder)) return true;
|
| - // Check if holder is in prototype chain of api_holder.
|
| - {
|
| - JSObject* object = *api_holder;
|
| - while (true) {
|
| - Object* prototype = object->map()->prototype();
|
| - if (!prototype->IsJSObject()) return false;
|
| - if (prototype == *holder) return true;
|
| - object = JSObject::cast(prototype);
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - UNREACHABLE();
|
| - return false;
|
| -}
|
| -
|
| -
|
| -void CallOptimization::Initialize(Handle<JSFunction> function) {
|
| - constant_function_ = Handle<JSFunction>::null();
|
| - is_simple_api_call_ = false;
|
| - expected_receiver_type_ = Handle<FunctionTemplateInfo>::null();
|
| - api_call_info_ = Handle<CallHandlerInfo>::null();
|
| -
|
| - if (function.is_null() || !function->is_compiled()) return;
|
| -
|
| - constant_function_ = function;
|
| - AnalyzePossibleApiFunction(function);
|
| -}
|
| -
|
| -
|
| -void CallOptimization::AnalyzePossibleApiFunction(Handle<JSFunction> function) {
|
| - if (!function->shared()->IsApiFunction()) return;
|
| - Handle<FunctionTemplateInfo> info(function->shared()->get_api_func_data());
|
| -
|
| - // Require a C++ callback.
|
| - if (info->call_code()->IsUndefined()) return;
|
| - api_call_info_ =
|
| - Handle<CallHandlerInfo>(CallHandlerInfo::cast(info->call_code()));
|
| -
|
| - // Accept signatures that either have no restrictions at all or
|
| - // only have restrictions on the receiver.
|
| - if (!info->signature()->IsUndefined()) {
|
| - Handle<SignatureInfo> signature =
|
| - Handle<SignatureInfo>(SignatureInfo::cast(info->signature()));
|
| - if (!signature->args()->IsUndefined()) return;
|
| - if (!signature->receiver()->IsUndefined()) {
|
| - expected_receiver_type_ = Handle<FunctionTemplateInfo>(
|
| - FunctionTemplateInfo::cast(signature->receiver()));
|
| - }
|
| - }
|
| -
|
| - is_simple_api_call_ = true;
|
| -}
|
| }
|
| } // namespace v8::internal
|
|
|