10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file.
40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "src/v8.h"
60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "src/ic/access-compiler.h"
80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace v8 {
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace internal {
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
140529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochHandle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                      const char* name) {
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Create code object in the heap.
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CodeDesc desc;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  masm()->GetCode(&desc);
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Handle<Code> code = factory()->NewCode(desc, flags, masm()->CodeObject());
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (code->IsCodeStubOrIC()) code->set_stub_key(CodeStub::NoCacheKey());
210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifdef ENABLE_DISASSEMBLER
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (FLAG_print_code_stubs) {
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    OFStream os(stdout);
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    code->Disassemble(name, os);
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return code;
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
310529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochHandle<Code> PropertyAccessCompiler::GetCodeWithFlags(Code::Flags flags,
320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                      Handle<Name> name) {
330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return (FLAG_print_code_stubs && !name.is_null() && name->IsString())
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch             ? GetCodeWithFlags(flags,
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                Handle<String>::cast(name)->ToCString().get())
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch             : GetCodeWithFlags(flags, NULL);
370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid PropertyAccessCompiler::TailCallBuiltin(MacroAssembler* masm,
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                             Builtins::Name name) {
420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Handle<Code> code(masm->isolate()->builtins()->builtin(name));
430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GenerateTailCall(masm, code);
440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
470529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRegister* PropertyAccessCompiler::GetCallingConvention(Code::Kind kind) {
480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (kind == Code::LOAD_IC || kind == Code::KEYED_LOAD_IC) {
490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return load_calling_convention();
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return store_calling_convention();
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}  // namespace v8::internal
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch