| Index: Source/core/css/CSSValue.h
 | 
| diff --git a/Source/core/css/CSSValue.h b/Source/core/css/CSSValue.h
 | 
| index f5f7bac0274d156da50b3e5806bf0f8a82b157b5..cc6daebdb1d5b856b8fbc996b75911c397566f0f 100644
 | 
| --- a/Source/core/css/CSSValue.h
 | 
| +++ b/Source/core/css/CSSValue.h
 | 
| @@ -31,6 +31,12 @@
 | 
|  
 | 
|  namespace blink {
 | 
|  
 | 
| +#if ENABLE(OILPAN) && USE_4BYTE_HEADER_PADDING
 | 
| +#define BIT_FIELD reinterpret_cast<HeapObjectHeader*>(reinterpret_cast<uint8_t*>(static_cast<CSSValue*>(const_cast<CSSValue*>(this))) - sizeof(HeapObjectHeader))->m_padding
 | 
| +#else
 | 
| +#define BIT_FIELD m_bitField
 | 
| +#endif
 | 
| +
 | 
|  class CORE_EXPORT CSSValue : public RefCountedWillBeGarbageCollectedFinalized<CSSValue> {
 | 
|  public:
 | 
|  #if ENABLE(OILPAN)
 | 
| @@ -39,7 +45,9 @@ public:
 | 
|      GC_PLUGIN_IGNORE("crbug.com/443854")
 | 
|      void* operator new(size_t size)
 | 
|      {
 | 
| -        return allocateObject(size, false);
 | 
| +        void* result = allocateObject(size, false);
 | 
| +        // fprintf(stderr, "%p %ld\n", result, size);
 | 
| +        return result;
 | 
|      }
 | 
|      static void* allocateObject(size_t size, bool isEager)
 | 
|      {
 | 
| @@ -58,41 +66,41 @@ public:
 | 
|  
 | 
|      String cssText() const;
 | 
|  
 | 
| -    bool isPrimitiveValue() const { return m_classType == PrimitiveClass; }
 | 
| -    bool isValueList() const { return m_classType >= ValueListClass; }
 | 
| -
 | 
| -    bool isBaseValueList() const { return m_classType == ValueListClass; }
 | 
| -
 | 
| -    bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
 | 
| -    bool isCanvasValue() const { return m_classType == CanvasClass; }
 | 
| -    bool isCounterValue() const { return m_classType == CounterClass; }
 | 
| -    bool isCursorImageValue() const { return m_classType == CursorImageClass; }
 | 
| -    bool isCrossfadeValue() const { return m_classType == CrossfadeClass; }
 | 
| -    bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
 | 
| -    bool isFontFaceSrcValue() const { return m_classType == FontFaceSrcClass; }
 | 
| -    bool isFunctionValue() const { return m_classType == FunctionClass; }
 | 
| -    bool isImageGeneratorValue() const { return m_classType >= CanvasClass && m_classType <= RadialGradientClass; }
 | 
| -    bool isGradientValue() const { return m_classType >= LinearGradientClass && m_classType <= RadialGradientClass; }
 | 
| -    bool isImageSetValue() const { return m_classType == ImageSetClass; }
 | 
| -    bool isImageValue() const { return m_classType == ImageClass; }
 | 
| +    bool isPrimitiveValue() const { return classType() == PrimitiveClass; }
 | 
| +    bool isValueList() const { return classType() >= ValueListClass; }
 | 
| +
 | 
| +    bool isBaseValueList() const { return classType() == ValueListClass; }
 | 
| +
 | 
| +    bool isBorderImageSliceValue() const { return classType() == BorderImageSliceClass; }
 | 
| +    bool isCanvasValue() const { return classType() == CanvasClass; }
 | 
| +    bool isCounterValue() const { return classType() == CounterClass; }
 | 
| +    bool isCursorImageValue() const { return classType() == CursorImageClass; }
 | 
| +    bool isCrossfadeValue() const { return classType() == CrossfadeClass; }
 | 
| +    bool isFontFeatureValue() const { return classType() == FontFeatureClass; }
 | 
| +    bool isFontFaceSrcValue() const { return classType() == FontFaceSrcClass; }
 | 
| +    bool isFunctionValue() const { return classType() == FunctionClass; }
 | 
| +    bool isImageGeneratorValue() const { return classType() >= CanvasClass && classType() <= RadialGradientClass; }
 | 
| +    bool isGradientValue() const { return classType() >= LinearGradientClass && classType() <= RadialGradientClass; }
 | 
| +    bool isImageSetValue() const { return classType() == ImageSetClass; }
 | 
| +    bool isImageValue() const { return classType() == ImageClass; }
 | 
|      bool isImplicitInitialValue() const;
 | 
| -    bool isInheritedValue() const { return m_classType == InheritedClass; }
 | 
| -    bool isInitialValue() const { return m_classType == InitialClass; }
 | 
| -    bool isUnsetValue() const { return m_classType == UnsetClass; }
 | 
| -    bool isCSSWideKeyword() const { return m_classType >= InheritedClass && m_classType <= UnsetClass; }
 | 
| -    bool isLinearGradientValue() const { return m_classType == LinearGradientClass; }
 | 
| -    bool isPathValue() const { return m_classType == PathClass; }
 | 
| -    bool isRadialGradientValue() const { return m_classType == RadialGradientClass; }
 | 
| -    bool isReflectValue() const { return m_classType == ReflectClass; }
 | 
| -    bool isShadowValue() const { return m_classType == ShadowClass; }
 | 
| -    bool isCubicBezierTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass; }
 | 
| -    bool isStepsTimingFunctionValue() const { return m_classType == StepsTimingFunctionClass; }
 | 
| -    bool isLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
 | 
| -    bool isGridTemplateAreasValue() const { return m_classType == GridTemplateAreasClass; }
 | 
| -    bool isSVGDocumentValue() const { return m_classType == CSSSVGDocumentClass; }
 | 
| -    bool isContentDistributionValue() const { return m_classType == CSSContentDistributionClass; }
 | 
| -    bool isUnicodeRangeValue() const { return m_classType == UnicodeRangeClass; }
 | 
| -    bool isGridLineNamesValue() const { return m_classType == GridLineNamesClass; }
 | 
| +    bool isInheritedValue() const { return classType() == InheritedClass; }
 | 
| +    bool isInitialValue() const { return classType() == InitialClass; }
 | 
| +    bool isUnsetValue() const { return classType() == UnsetClass; }
 | 
| +    bool isCSSWideKeyword() const { return classType() >= InheritedClass && classType() <= UnsetClass; }
 | 
| +    bool isLinearGradientValue() const { return classType() == LinearGradientClass; }
 | 
| +    bool isPathValue() const { return classType() == PathClass; }
 | 
| +    bool isRadialGradientValue() const { return classType() == RadialGradientClass; }
 | 
| +    bool isReflectValue() const { return classType() == ReflectClass; }
 | 
| +    bool isShadowValue() const { return classType() == ShadowClass; }
 | 
| +    bool isCubicBezierTimingFunctionValue() const { return classType() == CubicBezierTimingFunctionClass; }
 | 
| +    bool isStepsTimingFunctionValue() const { return classType() == StepsTimingFunctionClass; }
 | 
| +    bool isLineBoxContainValue() const { return classType() == LineBoxContainClass; }
 | 
| +    bool isGridTemplateAreasValue() const { return classType() == GridTemplateAreasClass; }
 | 
| +    bool isSVGDocumentValue() const { return classType() == CSSSVGDocumentClass; }
 | 
| +    bool isContentDistributionValue() const { return classType() == CSSContentDistributionClass; }
 | 
| +    bool isUnicodeRangeValue() const { return classType() == UnicodeRangeClass; }
 | 
| +    bool isGridLineNamesValue() const { return classType() == GridLineNamesClass; }
 | 
|  
 | 
|      bool hasFailedOrCanceledSubresources() const;
 | 
|  
 | 
| @@ -165,36 +173,59 @@ protected:
 | 
|          SlashSeparator
 | 
|      };
 | 
|  
 | 
| -    ClassType classType() const { return static_cast<ClassType>(m_classType); }
 | 
| -
 | 
|      explicit CSSValue(ClassType classType)
 | 
| -        : m_primitiveUnitType(0)
 | 
| -        , m_hasCachedCSSText(false)
 | 
| -        , m_isQuirkValue(false)
 | 
| -        , m_valueListSeparator(SpaceSeparator)
 | 
| -        , m_classType(classType)
 | 
|      {
 | 
| +        setClassType(classType);
 | 
| +        setValueListSeparator(SpaceSeparator);
 | 
| +        setHasCachedCSSText(false);
 | 
| +        setPrimitiveUnitType(0);
 | 
| +        setIsQuirkValue(false);
 | 
|      }
 | 
|  
 | 
|      // NOTE: This class is non-virtual for memory and performance reasons.
 | 
|      // Don't go making it virtual again unless you know exactly what you're doing!
 | 
|  
 | 
| +public:
 | 
| +    unsigned primitiveUnitType() const { return getBitField(10, 7); }
 | 
| +    void setPrimitiveUnitType(unsigned value) { setBitField(10, 7, value); }
 | 
| +    bool isQuirkValue() const { return getBitField(9, 1); }
 | 
| +    void setIsQuirkValue(bool value) { setBitField(9, 1, value); }
 | 
| +    bool hasCachedCSSText() const { return getBitField(8, 1); }
 | 
| +    void setHasCachedCSSText(bool value) { setBitField(8, 1, value); }
 | 
| +    unsigned valueListSeparator() const { return getBitField(6, 2); }
 | 
| +    void setValueListSeparator(unsigned value) { setBitField(6, 2, value); }
 | 
| +    ClassType classType() const { return static_cast<ClassType>(getBitField(0, 6)); }
 | 
| +    void setClassType(ClassType value) { setBitField(0, 6, value); }
 | 
| +
 | 
|  private:
 | 
| +    unsigned getBitField(unsigned offset, unsigned length) const
 | 
| +    {
 | 
| +        return (BIT_FIELD >> offset) & ((1 << length) - 1);
 | 
| +    }
 | 
| +    void setBitField(unsigned offset, unsigned length, unsigned value)
 | 
| +    {
 | 
| +        unsigned lower = getBitField(0, offset);
 | 
| +        unsigned higher = getBitField(length + offset, 32 - length - offset);
 | 
| +        BIT_FIELD = (higher << (length + offset)) | (value << offset) | lower;
 | 
| +    }
 | 
| +
 | 
|      void destroy();
 | 
|  
 | 
| -protected:
 | 
|      // The bits in this section are only used by specific subclasses but kept here
 | 
|      // to maximize struct packing.
 | 
|  
 | 
| +#if !(ENABLE(OILPAN) && USE_4BYTE_HEADER_PADDING)
 | 
|      // CSSPrimitiveValue bits:
 | 
| +    unsigned m_bitField;
 | 
| +#endif
 | 
| +
 | 
| +    /*
 | 
|      unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitType
 | 
| -    mutable unsigned m_hasCachedCSSText : 1;
 | 
| +    unsigned m_hasCachedCSSText : 1;
 | 
|      unsigned m_isQuirkValue : 1;
 | 
| -
 | 
| -    unsigned m_valueListSeparator : ValueListSeparatorBits;
 | 
| -
 | 
| -private:
 | 
| -    unsigned m_classType : ClassTypeBits; // ClassType
 | 
| +    unsigned m_valueListSeparator : 2;
 | 
| +    unsigned m_classType : 6; // ClassType
 | 
| +    */
 | 
|  };
 | 
|  
 | 
|  template<typename CSSValueType, size_t inlineCapacity>
 | 
| 
 |