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

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

Issue 1226273002: CSSValue Immediates: Make CSSPrimitiveValue store a tagged pointer (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@cssvalue_patch_2_attempt_2
Patch Set: Rebase Created 5 years, 5 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/CSSPrimitiveValueTest.cpp ('k') | Source/core/css/CSSValueObject.h » ('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 ac7df50a004ea2b8914057e1cfcd39f5a06dba76..b2f0a4ef382f1e1c301ec9e2f4a9503e59ef061c 100644
--- a/Source/core/css/CSSValue.h
+++ b/Source/core/css/CSSValue.h
@@ -41,6 +41,7 @@ public:
: m_data(const_cast<CSSValueObject*>(&cssValueObject))
{
ASSERT(m_data);
+ ASSERT(isObject());
ref();
}
@@ -50,6 +51,7 @@ public:
: m_data(cssValueObject.leakRef())
{
static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must be a container for CSSValueObject");
+ ASSERT(isObject());
ASSERT(m_data);
}
@@ -58,6 +60,7 @@ public:
: m_data(cssValueObject.release().leakRef())
{
static_assert(WTF::IsSubclass<T, CSSValueObject>::value, "Parameter must be a container for CSSValueObject");
+ ASSERT(isObject());
ASSERT(m_data);
}
#endif
@@ -90,12 +93,20 @@ public:
bool operator==(const CSSValue& other) const
{
+ if (m_data == other.m_data)
+ return true;
+ if (!isObject() || !other.isObject())
+ return false;
return m_data->equals(*other.m_data);
}
// TODO: Remove this and update callsites to use operator== instead.
bool equals(const CSSValue& other) const
{
+ if (m_data == other.m_data)
+ return true;
+ if (!isObject() || !other.isObject())
+ return false;
return m_data->equals(*other.m_data);
}
@@ -105,46 +116,53 @@ public:
}
// Methods that proxy to CSSValueObject.
- String cssText() const { return m_data->cssText(); }
- bool hasFailedOrCanceledSubresources() const { return m_data->hasFailedOrCanceledSubresources(); };
- bool isPrimitiveValue() const { return m_data->isPrimitiveValue(); }
- bool isValueList() const { return m_data->isValueList(); }
- bool isBaseValueList() const { return m_data->isBaseValueList(); }
- bool isBorderImageSliceValue() const { return m_data->isBorderImageSliceValue(); }
- bool isCanvasValue() const { return m_data->isCanvasValue(); }
- bool isCursorImageValue() const { return m_data->isCursorImageValue(); }
- bool isCrossfadeValue() const { return m_data->isCrossfadeValue(); }
- bool isFontFeatureValue() const { return m_data->isFontFeatureValue(); }
- bool isFontFaceSrcValue() const { return m_data->isFontFaceSrcValue(); }
- bool isFunctionValue() const { return m_data->isFunctionValue(); }
- bool isImageGeneratorValue() const { return m_data->isImageGeneratorValue(); }
- bool isGradientValue() const { return m_data->isGradientValue(); }
- bool isImageSetValue() const { return m_data->isImageSetValue(); }
- bool isImageValue() const { return m_data->isImageValue(); }
- bool isImplicitInitialValue() const { return m_data->isImplicitInitialValue(); };
- bool isInheritedValue() const { return m_data->isInheritedValue(); };
- bool isInitialValue() const { return m_data->isInitialValue(); };
- bool isUnsetValue() const { return m_data->isUnsetValue(); };
- bool isCSSWideKeyword() const { return m_data->isCSSWideKeyword(); };
- bool isLinearGradientValue() const { return m_data->isLinearGradientValue(); };
- bool isPathValue() const { return m_data->isPathValue(); };
- bool isRadialGradientValue() const { return m_data->isRadialGradientValue(); };
- bool isReflectValue() const { return m_data->isReflectValue(); };
- bool isShadowValue() const { return m_data->isShadowValue(); };
- bool isCubicBezierTimingFunctionValue() const { return m_data->isCubicBezierTimingFunctionValue(); };
- bool isStepsTimingFunctionValue() const { return m_data->isStepsTimingFunctionValue(); };
- bool isLineBoxContainValue() const { return m_data->isLineBoxContainValue(); };
- bool isCalcValue() const { return m_data->isCalcValue(); };
- bool isGridTemplateAreasValue() const { return m_data->isGridTemplateAreasValue(); };
- bool isSVGDocumentValue() const { return m_data->isSVGDocumentValue(); };
- bool isContentDistributionValue() const { return m_data->isContentDistributionValue(); };
- bool isUnicodeRangeValue() const { return m_data->isUnicodeRangeValue(); };
- bool isGridLineNamesValue() const { return m_data->isGridLineNamesValue(); };
+ String cssText() const
+ {
+ if (isObject())
+ return m_data->cssText();
+ return CSSPrimitiveValue(reinterpret_cast<CSSPrimitiveValue::CSSLargePrimitiveValue*>(m_data.get())).cssText();
+ }
+
+ bool hasFailedOrCanceledSubresources() const { return isObject() ? m_data->hasFailedOrCanceledSubresources() : false; };
+ bool isPrimitiveValue() const { return isObject() ? m_data->isPrimitiveValue() : true; }
+ bool isValueList() const { return isObject() ? m_data->isValueList() : false; }
+ bool isBaseValueList() const { return isObject() ? m_data->isBaseValueList() : false; }
+ bool isBorderImageSliceValue() const { return isObject() ? m_data->isBorderImageSliceValue() : false; }
+ bool isCanvasValue() const { return isObject() ? m_data->isCanvasValue() : false; }
+ bool isCursorImageValue() const { return isObject() ? m_data->isCursorImageValue() : false; }
+ bool isCrossfadeValue() const { return isObject() ? m_data->isCrossfadeValue() : false; }
+ bool isFontFeatureValue() const { return isObject() ? m_data->isFontFeatureValue(): false; }
+ bool isFontFaceSrcValue() const { return isObject() ? m_data->isFontFaceSrcValue(): false; }
+ bool isFunctionValue() const { return isObject() ? m_data->isFunctionValue(): false; }
+ bool isImageGeneratorValue() const { return isObject() ? m_data->isImageGeneratorValue(): false; }
+ bool isGradientValue() const { return isObject() ? m_data->isGradientValue(): false; }
+ bool isImageSetValue() const { return isObject() ? m_data->isImageSetValue(): false; }
+ bool isImageValue() const { return isObject() ? m_data->isImageValue(): false; }
+ bool isImplicitInitialValue() const { return isObject() ? m_data->isImplicitInitialValue(): false; }
+ bool isInheritedValue() const { return isObject() ? m_data->isInheritedValue(): false; }
+ bool isInitialValue() const { return isObject() ? m_data->isInitialValue(): false; }
+ bool isUnsetValue() const { return isObject() ? m_data->isUnsetValue(): false; }
+ bool isCSSWideKeyword() const { return isObject() ? m_data->isCSSWideKeyword(): false; }
+ bool isLinearGradientValue() const { return isObject() ? m_data->isLinearGradientValue(): false; }
+ bool isPathValue() const { return isObject() ? m_data->isPathValue(): false; }
+ bool isRadialGradientValue() const { return isObject() ? m_data->isRadialGradientValue(): false; }
+ bool isReflectValue() const { return isObject() ? m_data->isReflectValue(): false; }
+ bool isShadowValue() const { return isObject() ? m_data->isShadowValue(): false; }
+ bool isCubicBezierTimingFunctionValue() const { return isObject() ? m_data->isCubicBezierTimingFunctionValue(): false; }
+ bool isStepsTimingFunctionValue() const { return isObject() ? m_data->isStepsTimingFunctionValue(): false; }
+ bool isLineBoxContainValue() const { return isObject() ? m_data->isLineBoxContainValue(): false; }
+ bool isCalcValue() const { return isObject() ? m_data->isCalcValue(): false; }
+ bool isGridTemplateAreasValue() const { return isObject() ? m_data->isGridTemplateAreasValue(): false; }
+ bool isSVGDocumentValue() const { return isObject() ? m_data->isSVGDocumentValue(): false; }
+ bool isContentDistributionValue() const { return isObject() ? m_data->isContentDistributionValue(): false; }
+ bool isUnicodeRangeValue() const { return isObject() ? m_data->isUnicodeRangeValue(): false; }
+ bool isGridLineNamesValue() const { return isObject() ? m_data->isGridLineNamesValue(): false; }
DEFINE_INLINE_TRACE()
{
ASSERT(m_data);
- visitor->trace(m_data);
+ if (isObject())
+ visitor->trace(m_data);
}
// Only for use by the toFooCSSValue() macros. Don't use this.
@@ -162,7 +180,7 @@ private:
void ref() const
{
#if !ENABLE(OILPAN)
- if (m_data)
+ if (m_data && isObject())
m_data->ref();
#endif
}
@@ -170,11 +188,16 @@ private:
void deref() const
{
#if !ENABLE(OILPAN)
- if (m_data)
+ if (m_data && isObject())
m_data->deref();
#endif
}
+ bool isObject() const
+ {
+ return !(*reinterpret_cast<const uintptr_t*>(&m_data) & 1);
+ }
+
RawPtrWillBeMember<CSSValueObject> m_data;
};
@@ -256,6 +279,10 @@ public:
bool operator==(const NullableCSSValue& rhs) const
{
+ if (m_data == rhs.m_data)
+ return true;
+ if (!isObject() || (rhs && !rhs.isObject()))
+ return false;
return m_data ? rhs.m_data && m_data->equals(*rhs.m_data) : !bool(rhs.m_data);
}
@@ -296,7 +323,8 @@ public:
DEFINE_INLINE_TRACE()
{
- visitor->trace(m_data);
+ if (isObject())
+ visitor->trace(m_data);
}
// Only for use by the toFooCSSValue() macros. Don't use this.
@@ -311,7 +339,7 @@ private:
void ref() const
{
#if !ENABLE(OILPAN)
- if (m_data)
+ if (m_data && isObject())
m_data->ref();
#endif
}
@@ -319,11 +347,16 @@ private:
void deref() const
{
#if !ENABLE(OILPAN)
- if (m_data)
+ if (m_data && isObject())
m_data->deref();
#endif
}
+ bool isObject() const
+ {
+ return !(*reinterpret_cast<const uintptr_t*>(&m_data) & 1);
+ }
+
RawPtrWillBeMember<CSSValueObject> m_data;
};
« no previous file with comments | « Source/core/css/CSSPrimitiveValueTest.cpp ('k') | Source/core/css/CSSValueObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698