// 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.
#include "src/ic/access-compiler.h"
#include "src/objects-inl.h"
namespace v8 {
namespace internal {
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) {
CodeTracer::Scope trace_scope(isolate()->GetCodeTracer());
OFStream os(trace_scope.file());
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);
}
void PropertyAccessCompiler::TailCallBuiltin(MacroAssembler* masm,
Builtins::Name name) {
Handle<Code> code(masm->isolate()->builtins()->builtin(name));
GenerateTailCall(masm, code);
}
Register* PropertyAccessCompiler::GetCallingConvention(Isolate* isolate,
Code::Kind kind) {
AccessCompilerData* data = isolate->access_compiler_data();
if (!data->IsInitialized()) {
InitializePlatformSpecific(data);
}
if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
return data->load_calling_convention();
}
DCHECK(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
return data->store_calling_convention();
}
Register PropertyAccessCompiler::slot() const {
if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) {
return LoadDescriptor::SlotRegister();
}
DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC);
return StoreWithVectorDescriptor::SlotRegister();
}
Register PropertyAccessCompiler::vector() const {
if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) {
return LoadWithVectorDescriptor::VectorRegister();
}
DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC);
return StoreWithVectorDescriptor::VectorRegister();
}
} // namespace internal
} // namespace v8