Title: [201690] trunk/Source/WebCore
Revision
201690
Author
[email protected]
Date
2016-06-04 16:02:48 -0700 (Sat, 04 Jun 2016)

Log Message

leaks seen in fast/css/variables tests
https://bugs.webkit.org/show_bug.cgi?id=150728

Reviewed by Anders Carlsson.

Fixes leaks seen running fast/css/variables tests with leak checking turned on.

* css/CSSPrimitiveValue.cpp:
(WebCore::isStringType): Added. For debugging purposes so we catch cases where we
are not treating strings consistently between construction and destruction.
(WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Assert isStringType returns true.
(WebCore::CSSPrimitiveValue::cleanup): Added CSS_DIMENSION and CSS_PARSER_IDENTIFIER
to the list of types that have to decrement the reference count of the string we own.
Both types are passed to the string constructor above.

* css/CSSValueList.cpp:
(WebCore::CSSValueList::buildParserValueListSubstitutingVariables): Restructured the
code so we destroy any CSSParserValue that we don't use. This is needed because of the
peculiar requirements of CSSParserValue: it has a be a struct without a destructor so
it can be used in the CSS grammar, so we have to destroy it explicitly. Ideally we would
minimize any use of it outside the CSSParser itself, but as long as we are using it, we
need to do this explicit destruction.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (201689 => 201690)


--- trunk/Source/WebCore/ChangeLog	2016-06-04 22:48:07 UTC (rev 201689)
+++ trunk/Source/WebCore/ChangeLog	2016-06-04 23:02:48 UTC (rev 201690)
@@ -1,3 +1,28 @@
+2016-06-04  Darin Adler  <[email protected]>
+
+        leaks seen in fast/css/variables tests
+        https://bugs.webkit.org/show_bug.cgi?id=150728
+
+        Reviewed by Anders Carlsson.
+
+        Fixes leaks seen running fast/css/variables tests with leak checking turned on.
+
+        * css/CSSPrimitiveValue.cpp:
+        (WebCore::isStringType): Added. For debugging purposes so we catch cases where we
+        are not treating strings consistently between construction and destruction.
+        (WebCore::CSSPrimitiveValue::CSSPrimitiveValue): Assert isStringType returns true.
+        (WebCore::CSSPrimitiveValue::cleanup): Added CSS_DIMENSION and CSS_PARSER_IDENTIFIER
+        to the list of types that have to decrement the reference count of the string we own.
+        Both types are passed to the string constructor above.
+
+        * css/CSSValueList.cpp:
+        (WebCore::CSSValueList::buildParserValueListSubstitutingVariables): Restructured the
+        code so we destroy any CSSParserValue that we don't use. This is needed because of the
+        peculiar requirements of CSSParserValue: it has a be a struct without a destructor so
+        it can be used in the CSS grammar, so we have to destroy it explicitly. Ideally we would
+        minimize any use of it outside the CSSParser itself, but as long as we are using it, we
+        need to do this explicit destruction.
+
 2016-06-04  Anders Carlsson  <[email protected]>
 
         32-bit build fix

Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (201689 => 201690)


--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2016-06-04 22:48:07 UTC (rev 201689)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp	2016-06-04 23:02:48 UTC (rev 201690)
@@ -64,18 +64,15 @@
 {
     switch (unitType) {
     case CSSPrimitiveValue::CSS_CALC:
+    case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH:
     case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER:
-    case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH:
+    case CSSPrimitiveValue::CSS_CHS:
     case CSSPrimitiveValue::CSS_CM:
     case CSSPrimitiveValue::CSS_DEG:
     case CSSPrimitiveValue::CSS_DIMENSION:
-#if ENABLE(CSS_IMAGE_RESOLUTION) || ENABLE(RESOLUTION_MEDIA_QUERY)
-    case CSSPrimitiveValue::CSS_DPPX:
-    case CSSPrimitiveValue::CSS_DPI:
-    case CSSPrimitiveValue::CSS_DPCM:
-#endif
     case CSSPrimitiveValue::CSS_EMS:
     case CSSPrimitiveValue::CSS_EXS:
+    case CSSPrimitiveValue::CSS_FR:
     case CSSPrimitiveValue::CSS_GRAD:
     case CSSPrimitiveValue::CSS_HZ:
     case CSSPrimitiveValue::CSS_IN:
@@ -83,53 +80,126 @@
     case CSSPrimitiveValue::CSS_MM:
     case CSSPrimitiveValue::CSS_MS:
     case CSSPrimitiveValue::CSS_NUMBER:
+    case CSSPrimitiveValue::CSS_PC:
     case CSSPrimitiveValue::CSS_PERCENTAGE:
-    case CSSPrimitiveValue::CSS_PC:
     case CSSPrimitiveValue::CSS_PT:
     case CSSPrimitiveValue::CSS_PX:
     case CSSPrimitiveValue::CSS_RAD:
     case CSSPrimitiveValue::CSS_REMS:
-    case CSSPrimitiveValue::CSS_CHS:
     case CSSPrimitiveValue::CSS_S:
     case CSSPrimitiveValue::CSS_TURN:
-    case CSSPrimitiveValue::CSS_VW:
     case CSSPrimitiveValue::CSS_VH:
+    case CSSPrimitiveValue::CSS_VMAX:
     case CSSPrimitiveValue::CSS_VMIN:
-    case CSSPrimitiveValue::CSS_VMAX:
-    case CSSPrimitiveValue::CSS_FR:
+    case CSSPrimitiveValue::CSS_VW:
         return true;
+    case CSSPrimitiveValue::CSS_DPCM:
+    case CSSPrimitiveValue::CSS_DPI:
+    case CSSPrimitiveValue::CSS_DPPX:
+#if ENABLE(CSS_IMAGE_RESOLUTION) || ENABLE(RESOLUTION_MEDIA_QUERY)
+        return true;
+#else
+        return false;
+#endif
     case CSSPrimitiveValue::CSS_ATTR:
     case CSSPrimitiveValue::CSS_COUNTER:
     case CSSPrimitiveValue::CSS_COUNTER_NAME:
-#if ENABLE(DASHBOARD_SUPPORT)
-    case CSSPrimitiveValue::CSS_DASHBOARD_REGION:
-#endif
-#if !ENABLE(CSS_IMAGE_RESOLUTION) && !ENABLE(RESOLUTION_MEDIA_QUERY)
-    case CSSPrimitiveValue::CSS_DPPX:
-    case CSSPrimitiveValue::CSS_DPI:
-    case CSSPrimitiveValue::CSS_DPCM:
-#endif
+    case CSSPrimitiveValue::CSS_FONT_FAMILY:
     case CSSPrimitiveValue::CSS_IDENT:
-    case CSSPrimitiveValue::CSS_PROPERTY_ID:
-    case CSSPrimitiveValue::CSS_VALUE_ID:
     case CSSPrimitiveValue::CSS_PAIR:
     case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR:
     case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER:
     case CSSPrimitiveValue::CSS_PARSER_INTEGER:
     case CSSPrimitiveValue::CSS_PARSER_OPERATOR:
     case CSSPrimitiveValue::CSS_PARSER_WHITESPACE:
+    case CSSPrimitiveValue::CSS_PROPERTY_ID:
+    case CSSPrimitiveValue::CSS_QUAD:
     case CSSPrimitiveValue::CSS_RECT:
-    case CSSPrimitiveValue::CSS_QUAD:
+    case CSSPrimitiveValue::CSS_RGBCOLOR:
+    case CSSPrimitiveValue::CSS_SHAPE:
+    case CSSPrimitiveValue::CSS_STRING:
+    case CSSPrimitiveValue::CSS_UNICODE_RANGE:
+    case CSSPrimitiveValue::CSS_UNKNOWN:
+    case CSSPrimitiveValue::CSS_URI:
+    case CSSPrimitiveValue::CSS_VALUE_ID:
 #if ENABLE(CSS_SCROLL_SNAP)
     case CSSPrimitiveValue::CSS_LENGTH_REPEAT:
 #endif
+#if ENABLE(DASHBOARD_SUPPORT)
+    case CSSPrimitiveValue::CSS_DASHBOARD_REGION:
+#endif
+        return false;
+    }
+
+    ASSERT_NOT_REACHED();
+    return false;
+}
+
+#if !ASSERT_DISABLED
+
+static inline bool isStringType(CSSPrimitiveValue::UnitTypes type)
+{
+    switch (type) {
+    case CSSPrimitiveValue::CSS_STRING:
+    case CSSPrimitiveValue::CSS_URI:
+    case CSSPrimitiveValue::CSS_ATTR:
+    case CSSPrimitiveValue::CSS_COUNTER_NAME:
+    case CSSPrimitiveValue::CSS_DIMENSION:
+    case CSSPrimitiveValue::CSS_PARSER_HEXCOLOR:
+    case CSSPrimitiveValue::CSS_PARSER_IDENTIFIER:
+    case CSSPrimitiveValue::CSS_PARSER_WHITESPACE:
+        return true;
+    case CSSPrimitiveValue::CSS_CALC:
+    case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_LENGTH:
+    case CSSPrimitiveValue::CSS_CALC_PERCENTAGE_WITH_NUMBER:
+    case CSSPrimitiveValue::CSS_CHS:
+    case CSSPrimitiveValue::CSS_CM:
+    case CSSPrimitiveValue::CSS_COUNTER:
+    case CSSPrimitiveValue::CSS_DEG:
+    case CSSPrimitiveValue::CSS_DPCM:
+    case CSSPrimitiveValue::CSS_DPI:
+    case CSSPrimitiveValue::CSS_DPPX:
+    case CSSPrimitiveValue::CSS_EMS:
+    case CSSPrimitiveValue::CSS_EXS:
+    case CSSPrimitiveValue::CSS_FONT_FAMILY:
+    case CSSPrimitiveValue::CSS_FR:
+    case CSSPrimitiveValue::CSS_GRAD:
+    case CSSPrimitiveValue::CSS_HZ:
+    case CSSPrimitiveValue::CSS_IDENT:
+    case CSSPrimitiveValue::CSS_IN:
+    case CSSPrimitiveValue::CSS_KHZ:
+    case CSSPrimitiveValue::CSS_MM:
+    case CSSPrimitiveValue::CSS_MS:
+    case CSSPrimitiveValue::CSS_NUMBER:
+    case CSSPrimitiveValue::CSS_PAIR:
+    case CSSPrimitiveValue::CSS_PARSER_INTEGER:
+    case CSSPrimitiveValue::CSS_PARSER_OPERATOR:
+    case CSSPrimitiveValue::CSS_PC:
+    case CSSPrimitiveValue::CSS_PERCENTAGE:
+    case CSSPrimitiveValue::CSS_PROPERTY_ID:
+    case CSSPrimitiveValue::CSS_PT:
+    case CSSPrimitiveValue::CSS_PX:
+    case CSSPrimitiveValue::CSS_QUAD:
+    case CSSPrimitiveValue::CSS_RAD:
+    case CSSPrimitiveValue::CSS_RECT:
+    case CSSPrimitiveValue::CSS_REMS:
     case CSSPrimitiveValue::CSS_RGBCOLOR:
+    case CSSPrimitiveValue::CSS_S:
     case CSSPrimitiveValue::CSS_SHAPE:
-    case CSSPrimitiveValue::CSS_STRING:
-    case CSSPrimitiveValue::CSS_FONT_FAMILY:
+    case CSSPrimitiveValue::CSS_TURN:
     case CSSPrimitiveValue::CSS_UNICODE_RANGE:
     case CSSPrimitiveValue::CSS_UNKNOWN:
-    case CSSPrimitiveValue::CSS_URI:
+    case CSSPrimitiveValue::CSS_VALUE_ID:
+    case CSSPrimitiveValue::CSS_VH:
+    case CSSPrimitiveValue::CSS_VMAX:
+    case CSSPrimitiveValue::CSS_VMIN:
+    case CSSPrimitiveValue::CSS_VW:
+#if ENABLE(DASHBOARD_SUPPORT)
+    case CSSPrimitiveValue::CSS_DASHBOARD_REGION:
+#endif
+#if ENABLE(CSS_SCROLL_SNAP)
+    case CSSPrimitiveValue::CSS_LENGTH_REPEAT:
+#endif
         return false;
     }
 
@@ -137,6 +207,8 @@
     return false;
 }
 
+#endif // !ASSERT_DISABLED
+
 CSSPrimitiveValue::UnitCategory CSSPrimitiveValue::unitCategory(CSSPrimitiveValue::UnitTypes type)
 {
     // Here we violate the spec (http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSPrimitiveValue) and allow conversions
@@ -267,11 +339,12 @@
     m_value.num = num;
 }
 
-CSSPrimitiveValue::CSSPrimitiveValue(const String& str, UnitTypes type)
+CSSPrimitiveValue::CSSPrimitiveValue(const String& string, UnitTypes type)
     : CSSValue(PrimitiveClass)
 {
+    ASSERT(isStringType(type));
     m_primitiveUnitType = type;
-    if ((m_value.string = str.impl()))
+    if ((m_value.string = string.impl()))
         m_value.string->ref();
 }
 
@@ -447,13 +520,17 @@
 
 void CSSPrimitiveValue::cleanup()
 {
-    switch (static_cast<UnitTypes>(m_primitiveUnitType)) {
+    auto type = static_cast<UnitTypes>(m_primitiveUnitType);
+    switch (type) {
     case CSS_STRING:
     case CSS_URI:
     case CSS_ATTR:
     case CSS_COUNTER_NAME:
+    case CSS_DIMENSION:
     case CSS_PARSER_HEXCOLOR:
+    case CSS_PARSER_IDENTIFIER:
     case CSS_PARSER_WHITESPACE:
+        ASSERT(isStringType(type));
         if (m_value.string)
             m_value.string->deref();
         break;
@@ -526,13 +603,12 @@
     case CSS_FR:
     case CSS_IDENT:
     case CSS_RGBCOLOR:
-    case CSS_DIMENSION:
     case CSS_UNKNOWN:
     case CSS_UNICODE_RANGE:
     case CSS_PARSER_OPERATOR:
-    case CSS_PARSER_IDENTIFIER:
     case CSS_PROPERTY_ID:
     case CSS_VALUE_ID:
+        ASSERT(!isStringType(type));
         break;
     }
     m_primitiveUnitType = 0;

Modified: trunk/Source/WebCore/css/CSSValueList.cpp (201689 => 201690)


--- trunk/Source/WebCore/css/CSSValueList.cpp	2016-06-04 22:48:07 UTC (rev 201689)
+++ trunk/Source/WebCore/css/CSSValueList.cpp	2016-06-04 23:02:48 UTC (rev 201690)
@@ -247,33 +247,45 @@
 
 bool CSSValueList::buildParserValueListSubstitutingVariables(CSSParserValueList* parserList, const CustomPropertyValueMap& customProperties) const
 {
-    for (unsigned i = 0; i < m_values.size(); ++i) {
-        CSSParserValue result;
-        result.id = CSSValueInvalid;
-        switch (m_values[i]->classType()) {
-        case FunctionClass:
-            if (!downcast<CSSFunctionValue>(*m_values[i].ptr()).buildParserValueSubstitutingVariables(&result, customProperties))
+    for (auto& value : m_values) {
+        switch (value.get().classType()) {
+        case FunctionClass: {
+            CSSParserValue result;
+            result.id = CSSValueInvalid;
+            if (!downcast<CSSFunctionValue>(value.get()).buildParserValueSubstitutingVariables(&result, customProperties)) {
+                WebCore::destroy(result);
                 return false;
+            }
             parserList->addValue(result);
             break;
-        case ValueListClass:
-            if (!downcast<CSSValueList>(*m_values[i].ptr()).buildParserValueSubstitutingVariables(&result, customProperties))
+        }
+        case ValueListClass: {
+            CSSParserValue result;
+            result.id = CSSValueInvalid;
+            if (!downcast<CSSValueList>(value.get()).buildParserValueSubstitutingVariables(&result, customProperties)) {
+                WebCore::destroy(result);
                 return false;
+            }
             parserList->addValue(result);
             break;
+        }
         case VariableClass: {
-            if (!downcast<CSSVariableValue>(*m_values[i].ptr()).buildParserValueListSubstitutingVariables(parserList, customProperties))
+            if (!downcast<CSSVariableValue>(value.get()).buildParserValueListSubstitutingVariables(parserList, customProperties))
                 return false;
             break;
         }
-        case PrimitiveClass:
+        case PrimitiveClass: {
             // FIXME: Will have to change this if we start preserving invalid tokens.
-            if (downcast<CSSPrimitiveValue>(*m_values[i].ptr()).buildParserValue(&result))
+            CSSParserValue result;
+            result.id = CSSValueInvalid;
+            if (downcast<CSSPrimitiveValue>(value.get()).buildParserValue(&result))
                 parserList->addValue(result);
+            else
+                WebCore::destroy(result);
             break;
+        }
         default:
             ASSERT_NOT_REACHED();
-            break;
             return false;
         }
     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to