Index: src/ic/access-compiler.h |
diff --git a/src/ic/access-compiler.h b/src/ic/access-compiler.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..928b70b7499278e14b4ba4e7aa696faddb358cd2 |
--- /dev/null |
+++ b/src/ic/access-compiler.h |
@@ -0,0 +1,83 @@ |
+// 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. |
+ |
+#ifndef V8_IC_ACCESS_COMPILER_H_ |
+#define V8_IC_ACCESS_COMPILER_H_ |
+ |
+#include "src/code-stubs.h" |
+#include "src/macro-assembler.h" |
+#include "src/objects.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+ |
+class PropertyAccessCompiler BASE_EMBEDDED { |
+ public: |
+ static Builtins::Name MissBuiltin(Code::Kind kind) { |
+ switch (kind) { |
+ case Code::LOAD_IC: |
+ return Builtins::kLoadIC_Miss; |
+ case Code::STORE_IC: |
+ return Builtins::kStoreIC_Miss; |
+ case Code::KEYED_LOAD_IC: |
+ return Builtins::kKeyedLoadIC_Miss; |
+ case Code::KEYED_STORE_IC: |
+ return Builtins::kKeyedStoreIC_Miss; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return Builtins::kLoadIC_Miss; |
+ } |
+ |
+ static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name); |
+ |
+ protected: |
+ PropertyAccessCompiler(Isolate* isolate, Code::Kind kind, |
+ CacheHolderFlag cache_holder) |
+ : registers_(GetCallingConvention(kind)), |
+ kind_(kind), |
+ cache_holder_(cache_holder), |
+ isolate_(isolate), |
+ masm_(isolate, NULL, 256) {} |
+ |
+ Code::Kind kind() const { return kind_; } |
+ CacheHolderFlag cache_holder() const { return cache_holder_; } |
+ MacroAssembler* masm() { return &masm_; } |
+ Isolate* isolate() const { return isolate_; } |
+ Heap* heap() const { return isolate()->heap(); } |
+ Factory* factory() const { return isolate()->factory(); } |
+ |
+ Register receiver() const { return registers_[0]; } |
+ Register name() const { return registers_[1]; } |
+ Register scratch1() const { return registers_[2]; } |
+ Register scratch2() const { return registers_[3]; } |
+ Register scratch3() const { return registers_[4]; } |
+ |
+ // Calling convention between indexed store IC and handler. |
+ Register transition_map() const { return scratch1(); } |
+ |
+ static Register* GetCallingConvention(Code::Kind); |
+ static Register* load_calling_convention(); |
+ static Register* store_calling_convention(); |
+ static Register* keyed_store_calling_convention(); |
+ |
+ Register* registers_; |
+ |
+ static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); |
+ |
+ Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); |
+ Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name); |
+ |
+ private: |
+ Code::Kind kind_; |
+ CacheHolderFlag cache_holder_; |
+ |
+ Isolate* isolate_; |
+ MacroAssembler masm_; |
+}; |
+} |
+} // namespace v8::internal |
+ |
+#endif // V8_IC_ACCESS_COMPILER_H_ |