Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 8cba9661917c64c9745ec44a9a494a5ec7ba3ae9..7e2ebe4d52730bb7527284523cc310d54f22bd8a 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -47,6 +47,7 @@ namespace internal { |
V(Compare) \ |
V(CompareIC) \ |
V(MathPow) \ |
+ V(StringLength) \ |
V(RecordWrite) \ |
V(StoreBufferOverflow) \ |
V(RegExpExec) \ |
@@ -539,6 +540,45 @@ class MathPowStub: public PlatformCodeStub { |
}; |
+class ICStub: public PlatformCodeStub { |
+ public: |
+ explicit ICStub(Code::Kind kind) : kind_(kind) { } |
+ virtual int GetCodeKind() { return kind_; } |
+ virtual InlineCacheState GetICState() { return MONOMORPHIC; } |
+ |
+ bool Describes(Code* code) { |
+ return GetMajorKey(code) == MajorKey() && code->stub_info() == MinorKey(); |
+ } |
+ |
+ protected: |
+ class KindBits: public BitField<Code::Kind, 0, 4> {}; |
+ virtual void FinishCode(Handle<Code> code) { |
+ code->set_stub_info(MinorKey()); |
+ } |
+ Code::Kind kind() { return kind_; } |
+ |
+ private: |
+ Code::Kind kind_; |
+}; |
+ |
+ |
+class StringLengthStub: public ICStub { |
+ public: |
+ StringLengthStub(Code::Kind kind, bool support_wrapper) |
+ : ICStub(kind), support_wrapper_(support_wrapper) { } |
+ virtual void Generate(MacroAssembler* masm); |
+ |
+ private: |
+ class WrapperModeBits: public BitField<bool, 4, 1> {}; |
+ virtual CodeStub::Major MajorKey() { return StringLength; } |
+ virtual int MinorKey() { |
+ return KindBits::encode(kind()) | WrapperModeBits::encode(support_wrapper_); |
+ } |
+ |
+ bool support_wrapper_; |
+}; |
+ |
+ |
class BinaryOpStub: public PlatformCodeStub { |
public: |
BinaryOpStub(Token::Value op, OverwriteMode mode) |