1 // Copyright 2014 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/ic/access-compiler.h" 6 #include "src/objects-inl.h" 7 8 namespace v8 { 9 namespace internal { 10 11 12 Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags, 13 const char* name) { 14 // Create code object in the heap. 15 CodeDesc desc; 16 masm()->GetCode(&desc); 17 Handle<Code> code = factory()->NewCode(desc, flags, masm()->CodeObject()); 18 if (code->IsCodeStubOrIC()) code->set_stub_key(CodeStub::NoCacheKey()); 19 #ifdef ENABLE_DISASSEMBLER 20 if (FLAG_print_code_stubs) { 21 CodeTracer::Scope trace_scope(isolate()->GetCodeTracer()); 22 OFStream os(trace_scope.file()); 23 code->Disassemble(name, os); 24 } 25 #endif 26 return code; 27 } 28 29 30 Handle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags, 31 Handle<Name> name) { 32 return (FLAG_print_code_stubs && !name.is_null() && name->IsString()) 33 ? GetCodeWithFlags(flags, 34 Handle<String>::cast(name)->ToCString().get()) 35 : GetCodeWithFlags(flags, NULL); 36 } 37 38 39 void PropertyAccessCompiler::TailCallBuiltin(MacroAssembler* masm, 40 Builtins::Name name) { 41 Handle<Code> code(masm->isolate()->builtins()->builtin(name)); 42 GenerateTailCall(masm, code); 43 } 44 45 Register* PropertyAccessCompiler::GetCallingConvention(Isolate* isolate, 46 Code::Kind kind) { 47 AccessCompilerData* data = isolate->access_compiler_data(); 48 if (!data->IsInitialized()) { 49 InitializePlatformSpecific(data); 50 } 51 if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) { 52 return data->load_calling_convention(); 53 } 54 DCHECK(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC); 55 return data->store_calling_convention(); 56 } 57 58 59 Register PropertyAccessCompiler::slot() const { 60 if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) { 61 return LoadDescriptor::SlotRegister(); 62 } 63 DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC); 64 return StoreWithVectorDescriptor::SlotRegister(); 65 } 66 67 68 Register PropertyAccessCompiler::vector() const { 69 if (kind() == Code::LOAD_IC || kind() == Code::KEYED_LOAD_IC) { 70 return LoadWithVectorDescriptor::VectorRegister(); 71 } 72 DCHECK(kind() == Code::STORE_IC || kind() == Code::KEYED_STORE_IC); 73 return StoreWithVectorDescriptor::VectorRegister(); 74 } 75 } // namespace internal 76 } // namespace v8 77