Index: src/code-stubs.h |
diff --git a/src/code-stubs.h b/src/code-stubs.h |
index 4a93f9920ad7409b70448c216a789864264a6ada..55d8b885c842326f219eb816289bb42e3f36c965 100644 |
--- a/src/code-stubs.h |
+++ b/src/code-stubs.h |
@@ -897,11 +897,9 @@ class HandlerStub: public HICStub { |
class LoadFieldStub: public HandlerStub { |
public: |
- LoadFieldStub(Isolate* isolate, |
- bool inobject, |
- int index, Representation representation) |
- : HandlerStub(isolate) { |
- Initialize(Code::LOAD_IC, inobject, index, representation); |
+ LoadFieldStub(Isolate* isolate, FieldIndex index) |
+ : HandlerStub(isolate), index_(index) { |
+ Initialize(Code::LOAD_IC); |
} |
virtual Handle<Code> GenerateCode() V8_OVERRIDE; |
@@ -918,42 +916,30 @@ class LoadFieldStub: public HandlerStub { |
return KindBits::decode(bit_field_); |
} |
- 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; |
- } |
+ FieldIndex index() const { return index_; } |
bool unboxed_double() { |
- return UnboxedDoubleBits::decode(bit_field_); |
+ return index_.is_double(); |
} |
virtual Code::StubType GetStubType() { return Code::FAST; } |
protected: |
- explicit LoadFieldStub(Isolate* isolate) : HandlerStub(isolate) { } |
+ explicit LoadFieldStub(Isolate* isolate); |
- 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()); |
+ 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); |
} |
private: |
STATIC_ASSERT(KindBits::kSize == 4); |
- class InobjectBits: public BitField<bool, 4, 1> {}; |
- class IndexBits: public BitField<int, 5, 11> {}; |
- class UnboxedDoubleBits: public BitField<bool, 16, 1> {}; |
+ class EncodedLoadFieldByIndexBits: public BitField<int, 4, 13> {}; |
virtual CodeStub::Major MajorKey() { return LoadField; } |
+ FieldIndex index_; |
}; |
@@ -1098,11 +1084,9 @@ class CallApiGetterStub : public PlatformCodeStub { |
class KeyedLoadFieldStub: public LoadFieldStub { |
public: |
- KeyedLoadFieldStub(Isolate* isolate, |
- bool inobject, |
- int index, Representation representation) |
- : LoadFieldStub(isolate) { |
- Initialize(Code::KEYED_LOAD_IC, inobject, index, representation); |
+ KeyedLoadFieldStub(Isolate* isolate, FieldIndex index) |
+ : LoadFieldStub(isolate, index) { |
+ Initialize(Code::KEYED_LOAD_IC); |
} |
virtual void InitializeInterfaceDescriptor( |