Index: src/field-index-inl.h |
diff --git a/src/field-index-inl.h b/src/field-index-inl.h |
index d3bf94aec8e726d5d79ec05ed21a449c1d46944d..f1591af50967f0b46b70e201cf74f79f4ab0ac56 100644 |
--- a/src/field-index-inl.h |
+++ b/src/field-index-inl.h |
@@ -45,6 +45,8 @@ inline FieldIndex FieldIndex::ForPropertyIndex(Map* map, |
} |
+// Takes an index as computed by GetLoadFieldByIndex and reconstructs a |
+// FieldIndex object from it. |
inline FieldIndex FieldIndex::ForLoadByFieldIndex(Map* map, int orig_index) { |
int field_index = orig_index; |
int is_inobject = true; |
@@ -60,8 +62,32 @@ inline FieldIndex FieldIndex::ForLoadByFieldIndex(Map* map, int orig_index) { |
first_inobject_offset = map->GetInObjectPropertyOffset(0); |
field_index += JSObject::kHeaderSize / kPointerSize; |
} |
- return FieldIndex(is_inobject, field_index, is_double, |
+ FieldIndex result(is_inobject, field_index, is_double, |
map->inobject_properties(), first_inobject_offset); |
+ ASSERT(result.GetLoadByFieldIndex() == orig_index); |
+ return result; |
+} |
+ |
+ |
+// Returns the index format accepted by the HLoadFieldByIndex instruction. |
+// (In-object: zero-based from (object start + JSObject::kHeaderSize), |
+// out-of-object: zero-based from FixedArray::kHeaderSize.) |
+inline int FieldIndex::GetLoadByFieldIndex() const { |
+ // For efficiency, the LoadByFieldIndex instruction takes an index that is |
+ // optimized for quick access. If the property is inline, the index is |
+ // positive. If it's out-of-line, the encoded index is -raw_index - 1 to |
+ // disambiguate the zero out-of-line index from the zero inobject case. |
+ // The index itself is shifted up by one bit, the lower-most bit |
+ // signifying if the field is a mutable double box (1) or not (0). |
+ int result = index(); |
+ if (is_inobject()) { |
+ result -= JSObject::kHeaderSize / kPointerSize; |
+ } else { |
+ result -= FixedArray::kHeaderSize / kPointerSize; |
+ result = -result - 1; |
+ } |
+ result <<= 1; |
+ return is_double() ? (result | 1) : result; |
} |