| Index: src/field-index-inl.h | 
| diff --git a/src/field-index-inl.h b/src/field-index-inl.h | 
| index 2e6693ce388c32c175bb20643afbaed87e9f75c8..6811891d4852a9d5785076a9fbbfe950724c083b 100644 | 
| --- a/src/field-index-inl.h | 
| +++ b/src/field-index-inl.h | 
| @@ -39,8 +39,7 @@ inline FieldIndex FieldIndex::ForPropertyIndex(Map* map, | 
| is_double, inobject_properties, first_inobject_offset); | 
| } | 
|  | 
| - | 
| -// Takes an index as computed by GetLoadFieldByIndex and reconstructs a | 
| +// Takes an index as computed by GetLoadByFieldIndex and reconstructs a | 
| // FieldIndex object from it. | 
| inline FieldIndex FieldIndex::ForLoadByFieldIndex(Map* map, int orig_index) { | 
| int field_index = orig_index; | 
| @@ -85,6 +84,42 @@ inline int FieldIndex::GetLoadByFieldIndex() const { | 
| return is_double() ? (result | 1) : result; | 
| } | 
|  | 
| +// Takes an offset as computed by GetLoadByFieldOffset and reconstructs a | 
| +// FieldIndex object from it. | 
| +inline FieldIndex FieldIndex::ForLoadByFieldOffset(Map* map, int offset) { | 
| +  bool is_double = offset & 1; | 
| +  int field_index = (offset >> 1) / kPointerSize; | 
| +  int is_inobject = true; | 
| +  int first_inobject_offset = 0; | 
| +  if (field_index < 0) { | 
| +    field_index = -field_index; | 
| +    is_inobject = false; | 
| +    first_inobject_offset = FixedArray::kHeaderSize; | 
| +  } else { | 
| +    first_inobject_offset = | 
| +        map->IsJSObjectMap() ? map->GetInObjectPropertyOffset(0) : 0; | 
| +  } | 
| +  int inobject_properties = | 
| +      map->IsJSObjectMap() ? map->GetInObjectProperties() : 0; | 
| +  FieldIndex result(is_inobject, field_index, is_double, inobject_properties, | 
| +                    first_inobject_offset); | 
| +  DCHECK(result.GetLoadByFieldOffset() == offset); | 
| +  return result; | 
| +} | 
| + | 
| +// Returns the offset format consumed by TurboFan stubs: | 
| +// In-object: zero-based from object start, | 
| +// out-of-object: zero-based from FixedArray start. | 
| +inline int FieldIndex::GetLoadByFieldOffset() const { | 
| +  // For efficiency, stubs consume an offset that is optimized for quick | 
| +  // access. If the property is in-object, the offset is positive. | 
| +  // If it's out-of-object, the encoded offset is -raw_offset. | 
| +  // In either case, the offset 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() << kPointerSizeLog2; | 
| +  if (!is_inobject()) result = -result; | 
| +  return (result << 1) | (is_double() ? 1 : 0); | 
| +} | 
|  | 
| inline FieldIndex FieldIndex::ForDescriptor(Map* map, int descriptor_index) { | 
| PropertyDetails details = | 
|  |