Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 0cb3d423f3740ce66cf767c0d50a4a0bb68a8f9c..f7a4eaaf4aa3234b5b517fb9bea79b6b6db57290 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -83,7 +83,9 @@ namespace internal { |
V(TransitionElementsKind) \ |
V(StoreArrayLiteralElement) \ |
V(StubFailureTrampoline) \ |
- V(ProfileEntryHook) |
+ V(ProfileEntryHook) \ |
+ /* IC Handler stubs */ \ |
+ V(LoadField) |
// List of code stubs only used on ARM platforms. |
#ifdef V8_TARGET_ARCH_ARM |
@@ -188,6 +190,9 @@ class CodeStub BASE_EMBEDDED { |
virtual Code::ExtraICState GetExtraICState() { |
return Code::kNoExtraICState; |
} |
+ virtual Code::StubType GetStubType() { |
+ return Code::NORMAL; |
+ } |
// Returns whether the code generated for this stub needs to be allocated as |
// a fixed (non-moveable) code object. |
@@ -611,6 +616,7 @@ class StringLengthStub: public ICStub { |
virtual void Generate(MacroAssembler* masm); |
private: |
+ STATIC_ASSERT(KindBits::kSize == 4); |
class WrapperModeBits: public BitField<bool, 4, 1> {}; |
virtual CodeStub::Major MajorKey() { return StringLength; } |
virtual int MinorKey() { |
@@ -632,6 +638,7 @@ class StoreICStub: public ICStub { |
} |
private: |
+ STATIC_ASSERT(KindBits::kSize == 4); |
class StrictModeBits: public BitField<bool, 4, 1> {}; |
virtual int MinorKey() { |
return KindBits::encode(kind()) | StrictModeBits::encode(strict_mode_); |
@@ -652,6 +659,48 @@ class StoreArrayLengthStub: public StoreICStub { |
}; |
+class HandlerStub: public ICStub { |
+ public: |
+ explicit HandlerStub(Code::Kind kind) : ICStub(kind) { } |
+ |
+ protected: |
+ virtual Code::ExtraICState GetExtraICState() { |
+ return Code::HANDLER_FRAGMENT; |
+ } |
+}; |
+ |
+ |
+class LoadFieldStub: public HandlerStub { |
+ public: |
+ LoadFieldStub(Register reg, bool inobject, int index) |
+ : HandlerStub(Code::LOAD_IC), |
+ reg_(reg), |
+ inobject_(inobject), |
+ index_(index) { } |
+ virtual void Generate(MacroAssembler* masm); |
+ |
+ protected: |
+ virtual Code::StubType GetStubType() { return Code::FIELD; } |
+ |
+ private: |
+ STATIC_ASSERT(KindBits::kSize == 4); |
+ class RegisterBits: public BitField<int, 4, 6> {}; |
+ class InobjectBits: public BitField<bool, 10, 1> {}; |
+ class IndexBits: public BitField<int, 11, 11> {}; |
+ virtual CodeStub::Major MajorKey() { return LoadField; } |
+ virtual int MinorKey() { |
+ return KindBits::encode(kind()) |
+ | RegisterBits::encode(reg_.code()) |
+ | InobjectBits::encode(inobject_) |
+ | IndexBits::encode(index_); |
+ } |
+ |
+ Register reg_; |
+ bool inobject_; |
+ int index_; |
+}; |
+ |
+ |
class BinaryOpStub: public PlatformCodeStub { |
public: |
BinaryOpStub(Token::Value op, OverwriteMode mode) |