| Index: src/spaces-inl.h | 
| diff --git a/src/spaces-inl.h b/src/spaces-inl.h | 
| index 862d5bee5a7da482728cd62056b17ca28848f0b0..d49c2075188fe7714563c45c0eb223974d05b1f8 100644 | 
| --- a/src/spaces-inl.h | 
| +++ b/src/spaces-inl.h | 
| @@ -152,6 +152,33 @@ uint32_t Page::GetRegionMaskForAddress(Address addr) { | 
| } | 
|  | 
|  | 
| +uint32_t Page::GetRegionMaskForSpan(Address start, int length_in_bytes) { | 
| +  uint32_t result = 0; | 
| +  if (length_in_bytes >= kPageSize) { | 
| +    result = kAllRegionsDirtyMarks; | 
| +  } else if (length_in_bytes > 0) { | 
| +    int start_region = GetRegionNumberForAddress(start); | 
| +    int end_region = | 
| +        GetRegionNumberForAddress(start + length_in_bytes - kPointerSize); | 
| +    uint32_t start_mask = (~0) << start_region; | 
| +    uint32_t end_mask = ~((~1) << end_region); | 
| +    result = start_mask & end_mask; | 
| +    // if end_region < start_region, the mask is ored. | 
| +    if (result == 0) result = start_mask | end_mask; | 
| +  } | 
| +#ifdef DEBUG | 
| +  if (FLAG_enable_slow_asserts) { | 
| +    uint32_t expected = 0; | 
| +    for (Address a = start; a < start + length_in_bytes; a += kPointerSize) { | 
| +      expected |= GetRegionMaskForAddress(a); | 
| +    } | 
| +    ASSERT(expected == result); | 
| +  } | 
| +#endif | 
| +  return result; | 
| +} | 
| + | 
| + | 
| void Page::MarkRegionDirty(Address address) { | 
| SetRegionMarks(GetRegionMarks() | GetRegionMaskForAddress(address)); | 
| } | 
|  |