Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(458)

Unified Diff: Source/core/css/CSSValue.h

Issue 1310603004: WIP: Reduce sizeof(CSSValue) by 8 byte Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.cpp ('k') | Source/core/css/CSSValue.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
« no previous file with comments | « Source/core/css/CSSPrimitiveValue.cpp ('k') | Source/core/css/CSSValue.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698