Devirtualize CSSValue.
<http://webkit.org/b/71666>

Reviewed by Antti Koivisto.

Make the CSSValue destructor non-virtual (along with all the subclasses.)
This removes the vtables, and the pointers thereto in each value instance,
shrinking each object by one CPU word (4 or 8 bytes.)

We use the same trick as CSSRule to implement destruction; providing our
own deref() instead of RefCounted's, and performing a statically typed
delete in a destroy() method called when the ref count reaches 0.

Also made all the empty subclass destructors inline.

* css/CSSAspectRatioValue.cpp:
* css/CSSAspectRatioValue.h:
(WebCore::CSSAspectRatioValue::~CSSAspectRatioValue):
* css/CSSBorderImageSliceValue.cpp:
* css/CSSBorderImageSliceValue.h:
(WebCore::CSSBorderImageSliceValue::~CSSBorderImageSliceValue):
* css/CSSBorderImageValue.cpp:
* css/CSSBorderImageValue.h:
(WebCore::CSSBorderImageValue::~CSSBorderImageValue):
* css/CSSCanvasValue.h:
* css/CSSCrossfadeValue.cpp:
* css/CSSCrossfadeValue.h:
(WebCore::CSSCrossfadeValue::~CSSCrossfadeValue):
* css/CSSCursorImageValue.h:
* css/CSSFlexValue.cpp:
* css/CSSFlexValue.h:
(WebCore::CSSFlexValue::~CSSFlexValue):
* css/CSSFontFaceSrcValue.cpp:
* css/CSSFontFaceSrcValue.h:
(WebCore::CSSFontFaceSrcValue::~CSSFontFaceSrcValue):
* css/CSSFunctionValue.cpp:
* css/CSSFunctionValue.h:
(WebCore::CSSFunctionValue::~CSSFunctionValue):
* css/CSSImageGeneratorValue.h:
* css/CSSImageValue.h:
* css/CSSMutableValue.h:
(WebCore::CSSMutableValue::~CSSMutableValue):
* css/CSSParserValues.h:
* css/CSSPrimitiveValue.h:
* css/CSSUnicodeRangeValue.cpp:
* css/CSSUnicodeRangeValue.h:
(WebCore::CSSUnicodeRangeValue::~CSSUnicodeRangeValue):
* css/CSSValue.cpp:
(WebCore::CSSValue::destroy):
* css/CSSValue.h:
(WebCore::CSSValue::deref):
(WebCore::CSSValue::~CSSValue):
* css/CSSValueList.cpp:
* css/CSSValueList.h:
(WebCore::CSSValueList::~CSSValueList):
* css/WebKitCSSFilterValue.cpp:
* css/WebKitCSSFilterValue.h:
(WebCore::WebKitCSSFilterValue::~WebKitCSSFilterValue):
* css/WebKitCSSTransformValue.cpp:
* css/WebKitCSSTransformValue.h:
(WebCore::WebKitCSSTransformValue::~WebKitCSSTransformValue):


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@99592 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/css/CSSAspectRatioValue.cpp b/Source/WebCore/css/CSSAspectRatioValue.cpp
index 713a136..18b0ded 100644
--- a/Source/WebCore/css/CSSAspectRatioValue.cpp
+++ b/Source/WebCore/css/CSSAspectRatioValue.cpp
@@ -33,10 +33,6 @@
 
 namespace WebCore {
 
-CSSAspectRatioValue::~CSSAspectRatioValue()
-{
-}
-
 String CSSAspectRatioValue::customCssText() const
 {
     StringBuilder result;
diff --git a/Source/WebCore/css/CSSAspectRatioValue.h b/Source/WebCore/css/CSSAspectRatioValue.h
index 5ea1404..7567979 100644
--- a/Source/WebCore/css/CSSAspectRatioValue.h
+++ b/Source/WebCore/css/CSSAspectRatioValue.h
@@ -41,7 +41,7 @@
         return adoptRef(new CSSAspectRatioValue(numeratorValue, denominatorValue));
     }
 
-    virtual ~CSSAspectRatioValue();
+    ~CSSAspectRatioValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSBorderImageSliceValue.cpp b/Source/WebCore/css/CSSBorderImageSliceValue.cpp
index b543e03..04ef2d3 100644
--- a/Source/WebCore/css/CSSBorderImageSliceValue.cpp
+++ b/Source/WebCore/css/CSSBorderImageSliceValue.cpp
@@ -38,10 +38,6 @@
 {
 }
 
-CSSBorderImageSliceValue::~CSSBorderImageSliceValue()
-{
-}
-
 String CSSBorderImageSliceValue::customCssText() const
 {
     // Dump the slices first.
diff --git a/Source/WebCore/css/CSSBorderImageSliceValue.h b/Source/WebCore/css/CSSBorderImageSliceValue.h
index af120ac..45c9f97 100644
--- a/Source/WebCore/css/CSSBorderImageSliceValue.h
+++ b/Source/WebCore/css/CSSBorderImageSliceValue.h
@@ -40,7 +40,7 @@
     {
         return adoptRef(new CSSBorderImageSliceValue(slices, fill));
     }
-    virtual ~CSSBorderImageSliceValue();
+    ~CSSBorderImageSliceValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSBorderImageValue.cpp b/Source/WebCore/css/CSSBorderImageValue.cpp
index 8ff6bc8..846ea6d 100644
--- a/Source/WebCore/css/CSSBorderImageValue.cpp
+++ b/Source/WebCore/css/CSSBorderImageValue.cpp
@@ -37,10 +37,6 @@
 {
 }
 
-CSSBorderImageValue::~CSSBorderImageValue()
-{
-}
-
 String CSSBorderImageValue::customCssText() const
 {
     // Image first.
diff --git a/Source/WebCore/css/CSSBorderImageValue.h b/Source/WebCore/css/CSSBorderImageValue.h
index 1b80d6b..406c994 100644
--- a/Source/WebCore/css/CSSBorderImageValue.h
+++ b/Source/WebCore/css/CSSBorderImageValue.h
@@ -36,7 +36,7 @@
     {
         return adoptRef(new CSSBorderImageValue(image, imageSlice, borderSlice, outset, repeat));
     }
-    virtual ~CSSBorderImageValue();
+    ~CSSBorderImageValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSCanvasValue.h b/Source/WebCore/css/CSSCanvasValue.h
index 101b580..232a525 100644
--- a/Source/WebCore/css/CSSCanvasValue.h
+++ b/Source/WebCore/css/CSSCanvasValue.h
@@ -36,7 +36,7 @@
 class CSSCanvasValue : public CSSImageGeneratorValue {
 public:
     static PassRefPtr<CSSCanvasValue> create() { return adoptRef(new CSSCanvasValue); }
-    virtual ~CSSCanvasValue();
+    ~CSSCanvasValue();
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSCrossfadeValue.cpp b/Source/WebCore/css/CSSCrossfadeValue.cpp
index 14c250c..b77069f 100644
--- a/Source/WebCore/css/CSSCrossfadeValue.cpp
+++ b/Source/WebCore/css/CSSCrossfadeValue.cpp
@@ -28,11 +28,6 @@
 
 namespace WebCore {
 
-CSSCrossfadeValue::~CSSCrossfadeValue()
-{
-
-}
-
 String CSSCrossfadeValue::customCssText() const
 {
     String result = "-webkit-cross-fade(";
diff --git a/Source/WebCore/css/CSSCrossfadeValue.h b/Source/WebCore/css/CSSCrossfadeValue.h
index f2a4ad7..9bb4bb6 100644
--- a/Source/WebCore/css/CSSCrossfadeValue.h
+++ b/Source/WebCore/css/CSSCrossfadeValue.h
@@ -38,7 +38,7 @@
 class CSSCrossfadeValue : public CSSImageGeneratorValue {
 public:
     static PassRefPtr<CSSCrossfadeValue> create(PassRefPtr<CSSImageValue> fromImage, PassRefPtr<CSSImageValue> toImage) { return adoptRef(new CSSCrossfadeValue(fromImage, toImage)); }
-    virtual ~CSSCrossfadeValue();
+    ~CSSCrossfadeValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSCursorImageValue.h b/Source/WebCore/css/CSSCursorImageValue.h
index 3c03413..cb26919 100644
--- a/Source/WebCore/css/CSSCursorImageValue.h
+++ b/Source/WebCore/css/CSSCursorImageValue.h
@@ -37,7 +37,7 @@
         return adoptRef(new CSSCursorImageValue(url, hotSpot));
     }
 
-    virtual ~CSSCursorImageValue();
+    ~CSSCursorImageValue();
 
     IntPoint hotSpot() const { return m_hotSpot; }
 
diff --git a/Source/WebCore/css/CSSFlexValue.cpp b/Source/WebCore/css/CSSFlexValue.cpp
index 6bd312c..c2bc53c 100644
--- a/Source/WebCore/css/CSSFlexValue.cpp
+++ b/Source/WebCore/css/CSSFlexValue.cpp
@@ -35,10 +35,6 @@
 
 namespace WebCore {
 
-CSSFlexValue::~CSSFlexValue()
-{
-}
-
 String CSSFlexValue::customCssText() const
 {
     StringBuilder result;
diff --git a/Source/WebCore/css/CSSFlexValue.h b/Source/WebCore/css/CSSFlexValue.h
index 99099d9..3e568e4 100644
--- a/Source/WebCore/css/CSSFlexValue.h
+++ b/Source/WebCore/css/CSSFlexValue.h
@@ -43,7 +43,7 @@
         return adoptRef(new CSSFlexValue(positiveFlex, negativeFlex, preferredSize));
     }
 
-    virtual ~CSSFlexValue();
+    ~CSSFlexValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSFontFaceSrcValue.cpp b/Source/WebCore/css/CSSFontFaceSrcValue.cpp
index 0567ff4..57300ef 100644
--- a/Source/WebCore/css/CSSFontFaceSrcValue.cpp
+++ b/Source/WebCore/css/CSSFontFaceSrcValue.cpp
@@ -31,10 +31,6 @@
 
 namespace WebCore {
 
-CSSFontFaceSrcValue::~CSSFontFaceSrcValue()
-{
-}
-
 #if ENABLE(SVG_FONTS)
 bool CSSFontFaceSrcValue::isSVGFontFaceSrc() const
 {
diff --git a/Source/WebCore/css/CSSFontFaceSrcValue.h b/Source/WebCore/css/CSSFontFaceSrcValue.h
index f036978..8303290 100644
--- a/Source/WebCore/css/CSSFontFaceSrcValue.h
+++ b/Source/WebCore/css/CSSFontFaceSrcValue.h
@@ -45,7 +45,7 @@
         return adoptRef(new CSSFontFaceSrcValue(resource, true));
     }
 
-    virtual ~CSSFontFaceSrcValue();
+    ~CSSFontFaceSrcValue() { }
 
     const String& resource() const { return m_resource; }
     const String& format() const { return m_format; }
diff --git a/Source/WebCore/css/CSSFunctionValue.cpp b/Source/WebCore/css/CSSFunctionValue.cpp
index c31ab0a..522ad9f 100644
--- a/Source/WebCore/css/CSSFunctionValue.cpp
+++ b/Source/WebCore/css/CSSFunctionValue.cpp
@@ -40,10 +40,6 @@
         m_args = CSSValueList::createFromParserValueList(function->args.get());
 }
 
-CSSFunctionValue::~CSSFunctionValue()
-{
-}
-
 String CSSFunctionValue::customCssText() const
 {
     String result = m_name; // Includes the '('
diff --git a/Source/WebCore/css/CSSFunctionValue.h b/Source/WebCore/css/CSSFunctionValue.h
index 4505093..6cc5947 100644
--- a/Source/WebCore/css/CSSFunctionValue.h
+++ b/Source/WebCore/css/CSSFunctionValue.h
@@ -40,7 +40,7 @@
         return adoptRef(new CSSFunctionValue(function));
     }
 
-    virtual ~CSSFunctionValue();
+    ~CSSFunctionValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/CSSImageGeneratorValue.h b/Source/WebCore/css/CSSImageGeneratorValue.h
index a4c29ae..d0eb65b 100644
--- a/Source/WebCore/css/CSSImageGeneratorValue.h
+++ b/Source/WebCore/css/CSSImageGeneratorValue.h
@@ -52,7 +52,7 @@
 
 class CSSImageGeneratorValue : public CSSValue {
 public:
-    virtual ~CSSImageGeneratorValue();
+    ~CSSImageGeneratorValue();
 
     void addClient(RenderObject*, const IntSize&);
     void removeClient(RenderObject*);
diff --git a/Source/WebCore/css/CSSImageValue.h b/Source/WebCore/css/CSSImageValue.h
index ffe0076..328b6c9 100644
--- a/Source/WebCore/css/CSSImageValue.h
+++ b/Source/WebCore/css/CSSImageValue.h
@@ -35,7 +35,7 @@
 public:
     static PassRefPtr<CSSImageValue> create() { return adoptRef(new CSSImageValue); }
     static PassRefPtr<CSSImageValue> create(const String& url) { return adoptRef(new CSSImageValue(url)); }
-    virtual ~CSSImageValue();
+    ~CSSImageValue();
 
     StyleCachedImage* cachedImage(CachedResourceLoader*);
     // Returns a StyleCachedImage if the image is cached already, otherwise a StylePendingImage.
diff --git a/Source/WebCore/css/CSSMutableValue.h b/Source/WebCore/css/CSSMutableValue.h
index 74ea5ee..f2631b1 100644
--- a/Source/WebCore/css/CSSMutableValue.h
+++ b/Source/WebCore/css/CSSMutableValue.h
@@ -27,7 +27,7 @@
 
 class CSSMutableValue : public CSSValue {
 public:
-    virtual ~CSSMutableValue() { }
+    ~CSSMutableValue() { }
 
     Node* node() const { return m_node; }
     void setNode(Node* node) { m_node = node; }
diff --git a/Source/WebCore/css/CSSParserValues.h b/Source/WebCore/css/CSSParserValues.h
index cb5c903..90d26a4 100644
--- a/Source/WebCore/css/CSSParserValues.h
+++ b/Source/WebCore/css/CSSParserValues.h
@@ -22,6 +22,7 @@
 #define CSSParserValues_h
 
 #include "CSSSelector.h"
+#include "CSSValueList.h"
 #include <wtf/text/AtomicString.h>
 
 namespace WebCore {
diff --git a/Source/WebCore/css/CSSPrimitiveValue.h b/Source/WebCore/css/CSSPrimitiveValue.h
index 180de6d..fedab8c 100644
--- a/Source/WebCore/css/CSSPrimitiveValue.h
+++ b/Source/WebCore/css/CSSPrimitiveValue.h
@@ -143,7 +143,7 @@
         return adoptRef(quirkValue);
     }
 
-    virtual ~CSSPrimitiveValue();
+    ~CSSPrimitiveValue();
 
     void cleanup();
 
diff --git a/Source/WebCore/css/CSSUnicodeRangeValue.cpp b/Source/WebCore/css/CSSUnicodeRangeValue.cpp
index a1a2b82..2c2c44d 100644
--- a/Source/WebCore/css/CSSUnicodeRangeValue.cpp
+++ b/Source/WebCore/css/CSSUnicodeRangeValue.cpp
@@ -30,10 +30,6 @@
 
 namespace WebCore {
 
-CSSUnicodeRangeValue::~CSSUnicodeRangeValue()
-{
-}
-
 String CSSUnicodeRangeValue::customCssText() const
 {
     String result;
diff --git a/Source/WebCore/css/CSSUnicodeRangeValue.h b/Source/WebCore/css/CSSUnicodeRangeValue.h
index a8b4a38..2895db0 100644
--- a/Source/WebCore/css/CSSUnicodeRangeValue.h
+++ b/Source/WebCore/css/CSSUnicodeRangeValue.h
@@ -39,7 +39,7 @@
         return adoptRef(new CSSUnicodeRangeValue(from, to));
     }
 
-    virtual ~CSSUnicodeRangeValue();
+    ~CSSUnicodeRangeValue() { }
 
     UChar32 from() const { return m_from; }
     UChar32 to() const { return m_to; }
diff --git a/Source/WebCore/css/CSSValue.cpp b/Source/WebCore/css/CSSValue.cpp
index ea94e1e..3c92bd9 100644
--- a/Source/WebCore/css/CSSValue.cpp
+++ b/Source/WebCore/css/CSSValue.cpp
@@ -160,4 +160,108 @@
     return String();
 }
 
+void CSSValue::destroy()
+{
+    switch (classType()) {
+    case AspectRatioClass:
+        delete static_cast<CSSAspectRatioValue*>(this);
+        return;
+    case BorderImageClass:
+        delete static_cast<CSSBorderImageValue*>(this);
+        return;
+    case BorderImageSliceClass:
+        delete static_cast<CSSBorderImageSliceValue*>(this);
+        return;
+    case CanvasClass:
+        delete static_cast<CSSCanvasValue*>(this);
+        return;
+    case CursorImageClass:
+        delete static_cast<CSSCursorImageValue*>(this);
+        return;
+    case FontClass:
+        delete static_cast<FontValue*>(this);
+        return;
+    case FontFaceSrcClass:
+        delete static_cast<CSSFontFaceSrcValue*>(this);
+        return;
+    case FontFamilyClass:
+        delete static_cast<FontFamilyValue*>(this);
+        return;
+    case FontFeatureClass:
+        delete static_cast<FontFeatureValue*>(this);
+        return;
+    case FunctionClass:
+        delete static_cast<CSSFunctionValue*>(this);
+        return;
+    case LinearGradientClass:
+        delete static_cast<CSSLinearGradientValue*>(this);
+        return;
+    case RadialGradientClass:
+        delete static_cast<CSSRadialGradientValue*>(this);
+        return;
+    case CrossfadeClass:
+        delete static_cast<CSSCrossfadeValue*>(this);
+        return;
+    case ImageClass:
+        delete static_cast<CSSImageValue*>(this);
+        return;
+    case InheritedClass:
+        delete static_cast<CSSInheritedValue*>(this);
+        return;
+    case InitialClass:
+    case ImplicitInitialClass:
+        delete static_cast<CSSInitialValue*>(this);
+        return;
+    case PrimitiveClass:
+        delete static_cast<CSSPrimitiveValue*>(this);
+        return;
+    case ReflectClass:
+        delete static_cast<CSSReflectValue*>(this);
+        return;
+    case ShadowClass:
+        delete static_cast<ShadowValue*>(this);
+        return;
+    case LinearTimingFunctionClass:
+        delete static_cast<CSSLinearTimingFunctionValue*>(this);
+        return;
+    case CubicBezierTimingFunctionClass:
+        delete static_cast<CSSCubicBezierTimingFunctionValue*>(this);
+        return;
+    case StepsTimingFunctionClass:
+        delete static_cast<CSSStepsTimingFunctionValue*>(this);
+        return;
+    case UnicodeRangeClass:
+        delete static_cast<CSSUnicodeRangeValue*>(this);
+        return;
+    case ValueListClass:
+        delete static_cast<CSSValueList*>(this);
+        return;
+    case WebKitCSSTransformClass:
+        delete static_cast<WebKitCSSTransformValue*>(this);
+        return;
+    case LineBoxContainClass:
+        delete static_cast<CSSLineBoxContainValue*>(this);
+        return;
+#if ENABLE(CSS3_FLEXBOX)
+    case FlexClass:
+        delete static_cast<CSSFlexValue*>(this);
+        return;
+#endif
+#if ENABLE(CSS_FILTERS)
+    case WebKitCSSFilterClass:
+        delete static_cast<WebKitCSSFilterValue*>(this);
+        return;
+#endif
+#if ENABLE(SVG)
+    case SVGColorClass:
+        delete static_cast<SVGColor*>(this);
+        return;
+    case SVGPaintClass:
+        delete static_cast<SVGPaint*>(this);
+        return;
+#endif
+    }
+    ASSERT_NOT_REACHED();
+}
+
 }
diff --git a/Source/WebCore/css/CSSValue.h b/Source/WebCore/css/CSSValue.h
index 26530d1..41d545a 100644
--- a/Source/WebCore/css/CSSValue.h
+++ b/Source/WebCore/css/CSSValue.h
@@ -40,9 +40,16 @@
         CSS_VALUE_LIST = 2,
         CSS_CUSTOM = 3,
         CSS_INITIAL = 4
+
     };
 
-    virtual ~CSSValue() { }
+    // Override RefCounted's deref() to ensure operator delete is called on
+    // the appropriate subclass type.
+    void deref()
+    {
+        if (derefBase())
+            destroy();
+    }
 
     Type cssValueType() const;
 
@@ -136,6 +143,11 @@
     {
     }
 
+    // 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!
+
+    ~CSSValue() { }
+
 private:
     static bool isPrimitiveType(ClassType type)
     {
@@ -175,6 +187,8 @@
         return type == InitialClass || type == ImplicitInitialClass;
     }
 
+    void destroy();
+
     // FIXME: This class is currently a little bloated, but that will change.
     //        See <http://webkit.org/b/71666> for more information.
     unsigned m_classType : 5; // ClassType
diff --git a/Source/WebCore/css/CSSValueList.cpp b/Source/WebCore/css/CSSValueList.cpp
index 7a288b6..8b821c6 100644
--- a/Source/WebCore/css/CSSValueList.cpp
+++ b/Source/WebCore/css/CSSValueList.cpp
@@ -50,10 +50,6 @@
     }
 }
 
-CSSValueList::~CSSValueList()
-{
-}
-
 void CSSValueList::append(PassRefPtr<CSSValue> val)
 {
     m_values.append(val);
diff --git a/Source/WebCore/css/CSSValueList.h b/Source/WebCore/css/CSSValueList.h
index 22abf3b2..7f1b99b 100644
--- a/Source/WebCore/css/CSSValueList.h
+++ b/Source/WebCore/css/CSSValueList.h
@@ -44,7 +44,7 @@
         return adoptRef(new CSSValueList(list));
     }
 
-    virtual ~CSSValueList();
+    ~CSSValueList() { }
 
     size_t length() const { return m_values.size(); }
     CSSValue* item(size_t index) { return index < m_values.size() ? m_values[index].get() : 0; }
diff --git a/Source/WebCore/css/WebKitCSSFilterValue.cpp b/Source/WebCore/css/WebKitCSSFilterValue.cpp
index 71ec327..64feb8c 100644
--- a/Source/WebCore/css/WebKitCSSFilterValue.cpp
+++ b/Source/WebCore/css/WebKitCSSFilterValue.cpp
@@ -40,10 +40,6 @@
 {
 }
 
-WebKitCSSFilterValue::~WebKitCSSFilterValue()
-{
-}
-
 String WebKitCSSFilterValue::customCssText() const
 {
     String result;
diff --git a/Source/WebCore/css/WebKitCSSFilterValue.h b/Source/WebCore/css/WebKitCSSFilterValue.h
index cfb4c8b..fb86bd5 100644
--- a/Source/WebCore/css/WebKitCSSFilterValue.h
+++ b/Source/WebCore/css/WebKitCSSFilterValue.h
@@ -57,7 +57,7 @@
         return adoptRef(new WebKitCSSFilterValue(type));
     }
 
-    virtual ~WebKitCSSFilterValue();
+    ~WebKitCSSFilterValue() { }
 
     String customCssText() const;
 
diff --git a/Source/WebCore/css/WebKitCSSTransformValue.cpp b/Source/WebCore/css/WebKitCSSTransformValue.cpp
index 6e0cdd5..6a391ac 100644
--- a/Source/WebCore/css/WebKitCSSTransformValue.cpp
+++ b/Source/WebCore/css/WebKitCSSTransformValue.cpp
@@ -38,10 +38,6 @@
 {
 }
 
-WebKitCSSTransformValue::~WebKitCSSTransformValue()
-{
-}
-
 String WebKitCSSTransformValue::customCssText() const
 {
     String result;
diff --git a/Source/WebCore/css/WebKitCSSTransformValue.h b/Source/WebCore/css/WebKitCSSTransformValue.h
index 8a5e6d8..db0688b 100644
--- a/Source/WebCore/css/WebKitCSSTransformValue.h
+++ b/Source/WebCore/css/WebKitCSSTransformValue.h
@@ -65,7 +65,7 @@
         return adoptRef(new WebKitCSSTransformValue(type));
     }
 
-    virtual ~WebKitCSSTransformValue();
+    ~WebKitCSSTransformValue() { }
 
     String customCssText() const;