Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 55d8b885c842326f219eb816289bb42e3f36c965..4a93f9920ad7409b70448c216a789864264a6ada 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -897,9 +897,11 @@ class HandlerStub: public HICStub { |
class LoadFieldStub: public HandlerStub { |
public: |
- LoadFieldStub(Isolate* isolate, FieldIndex index) |
- : HandlerStub(isolate), index_(index) { |
- Initialize(Code::LOAD_IC); |
+ LoadFieldStub(Isolate* isolate, |
+ bool inobject, |
+ int index, Representation representation) |
+ : HandlerStub(isolate) { |
+ Initialize(Code::LOAD_IC, inobject, index, representation); |
} |
virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
@@ -916,30 +918,42 @@ class LoadFieldStub: public HandlerStub { |
return KindBits::decode(bit_field_); |
} |
- FieldIndex index() const { return index_; } |
+ bool is_inobject() { |
+ return InobjectBits::decode(bit_field_); |
+ } |
+ |
+ int offset() { |
+ int index = IndexBits::decode(bit_field_); |
+ int offset = index * kPointerSize; |
+ if (is_inobject()) return offset; |
+ return FixedArray::kHeaderSize + offset; |
+ } |
bool unboxed_double() { |
- return index_.is_double(); |
+ return UnboxedDoubleBits::decode(bit_field_); |
} |
virtual Code::StubType GetStubType() { return Code::FAST; } |
protected: |
- explicit LoadFieldStub(Isolate* isolate); |
+ explicit LoadFieldStub(Isolate* isolate) : HandlerStub(isolate) { } |
- void Initialize(Code::Kind kind) { |
- int property_index_key = index_.GetLoadFieldStubKey(); |
- // Save a copy of the essence of the property index into the bit field to |
- // make sure that hashing of unique stubs works correctly.. |
- bit_field_ = KindBits::encode(kind) | |
- EncodedLoadFieldByIndexBits::encode(property_index_key); |
+ void Initialize(Code::Kind kind, |
+ bool inobject, |
+ int index, |
+ Representation representation) { |
+ bit_field_ = KindBits::encode(kind) |
+ | InobjectBits::encode(inobject) |
+ | IndexBits::encode(index) |
+ | UnboxedDoubleBits::encode(representation.IsDouble()); |
} |
private: |
STATIC_ASSERT(KindBits::kSize == 4); |
- class EncodedLoadFieldByIndexBits: public BitField<int, 4, 13> {}; |
+ class InobjectBits: public BitField<bool, 4, 1> {}; |
+ class IndexBits: public BitField<int, 5, 11> {}; |
+ class UnboxedDoubleBits: public BitField<bool, 16, 1> {}; |
virtual CodeStub::Major MajorKey() { return LoadField; } |
- FieldIndex index_; |
}; |
@@ -1084,9 +1098,11 @@ class CallApiGetterStub : public PlatformCodeStub { |
class KeyedLoadFieldStub: public LoadFieldStub { |
public: |
- KeyedLoadFieldStub(Isolate* isolate, FieldIndex index) |
- : LoadFieldStub(isolate, index) { |
- Initialize(Code::KEYED_LOAD_IC); |
+ KeyedLoadFieldStub(Isolate* isolate, |
+ bool inobject, |
+ int index, Representation representation) |
+ : LoadFieldStub(isolate) { |
+ Initialize(Code::KEYED_LOAD_IC, inobject, index, representation); |
} |
virtual void InitializeInterfaceDescriptor( |