2006-09-15 Nikolas Zimmermann <zimmermann@kde.org>
authorbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Sep 2006 23:55:41 +0000 (23:55 +0000)
committerbdash <bdash@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 15 Sep 2006 23:55:41 +0000 (23:55 +0000)
        Reviewed by Eric.

Fixes: http://bugzilla.opendarwin.org/show_bug.cgi?id=10835
        Fix svg memory leaks.

        Reworked SVGList to deal with RefPtr's for ptr types
        which makes manual refcounting unnecessary, and is much safer.

        Removing all virtual functions (nullItem) from SVGList, and
        also remove SVGListBase. Switch to a similar concept like
        Vector/VectorTraits (see new file SVGListTraits.h).

        Credits go to Eric/Maciej for the inspiration.

        * CMakeLists.txt: Add SVGListTraits.cpp to build
        * WebCore.xcodeproj/project.pbxproj: Ditto.
        * bindings/scripts/CodeGeneratorJS.pm: Generator changes for SVGTransform/PathSeg/LengthList (now RefPtr based)
        * kcanvas/RenderSVGText.cpp: Add some get() methods, as SVGLengthList is RefPtr based now.
        (WebCore::RenderSVGText::translationForAttributes):
        * ksvg2/svg/SVGAnimateTransformElement.cpp: Add some get() methods, as SVGTransformList is RefPtr based now.
        (WebCore::SVGAnimateTransformElement::handleTimerEvent):
        * ksvg2/svg/SVGElementInstanceList.cpp: Be RefPtr based.
        (WebCore::SVGElementInstanceList::SVGElementInstanceList):
        * ksvg2/svg/SVGElementInstanceList.h:
        * ksvg2/svg/SVGLengthList.cpp: Ditto.
        (WebCore::SVGLengthList::SVGLengthList):
        * ksvg2/svg/SVGLengthList.h: Ditto.
        * ksvg2/svg/SVGList.h: Rewrote, as described above.
        (WebCore::SVGListTypeOperations::nullItem):
        (WebCore::SVGList::SVGList):
        (WebCore::SVGList::~SVGList):
        (WebCore::SVGList::clear):
        (WebCore::SVGList::getFirst):
        (WebCore::SVGList::getLast):
        (WebCore::SVGList::getItem):
        (WebCore::SVGList::replaceItem):
        (WebCore::SVGList::removeItem):
        * ksvg2/svg/SVGListTraits.cpp: Added.
        * ksvg2/svg/SVGListTraits.h: Added.
        (WebCore::):
        * ksvg2/svg/SVGPathElement.cpp: Add some get() methods, as SVGPathSegList is RefPtr based now.
        (WebCore::SVGPathElement::toPathData):
        * ksvg2/svg/SVGPathSegList.cpp: Be RefPtr based.
        (WebCore::SVGPathSegList::SVGPathSegList):
        * ksvg2/svg/SVGPathSegList.h: Ditto.
        * ksvg2/svg/SVGTransform.cpp: Style cleanup.
        (SVGTransform::SVGTransform):
        * ksvg2/svg/SVGTransformList.cpp: Be RefPtr based.
        (SVGTransformList::SVGTransformList):
        (SVGTransformList::createSVGTransformFromMatrix):
        (SVGTransformList::consolidate):
        * ksvg2/svg/SVGTransformList.h: Ditto.
        * ksvg2/svg/SVGTransformable.cpp: Fix RefPtr usage of SVGTransform.
        (SVGTransformable::parseTransformAttribute):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16378 268f45cc-cd09-0410-ab3c-d52691b4dbfc

19 files changed:
WebCore/ChangeLog
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/kcanvas/RenderSVGText.cpp
WebCore/ksvg2/svg/SVGAnimateTransformElement.cpp
WebCore/ksvg2/svg/SVGElementInstanceList.cpp
WebCore/ksvg2/svg/SVGElementInstanceList.h
WebCore/ksvg2/svg/SVGLengthList.cpp
WebCore/ksvg2/svg/SVGLengthList.h
WebCore/ksvg2/svg/SVGList.h
WebCore/ksvg2/svg/SVGListTraits.h [new file with mode: 0644]
WebCore/ksvg2/svg/SVGNumberList.cpp
WebCore/ksvg2/svg/SVGNumberList.h
WebCore/ksvg2/svg/SVGPathElement.cpp
WebCore/ksvg2/svg/SVGPathSegList.cpp
WebCore/ksvg2/svg/SVGPathSegList.h
WebCore/ksvg2/svg/SVGTransform.cpp
WebCore/ksvg2/svg/SVGTransformList.cpp
WebCore/ksvg2/svg/SVGTransformList.h
WebCore/ksvg2/svg/SVGTransformable.cpp

index df07079b46646fc9f7632f3c85da81d075042c73..ef5992472b2d636e5067aaed85dc517dcbbf5413 100644 (file)
@@ -1,3 +1,60 @@
+2006-09-15  Nikolas Zimmermann  <zimmermann@kde.org>
+
+        Reviewed by Eric.
+
+        Fixes: http://bugzilla.opendarwin.org/show_bug.cgi?id=10835
+        Fix svg memory leaks.
+
+        Reworked SVGList to deal with RefPtr's for ptr types
+        which makes manual refcounting unnecessary, and is much safer.
+
+        Removing all virtual functions (nullItem) from SVGList, and
+        also remove SVGListBase. Switch to a similar concept like
+        Vector/VectorTraits (see new file SVGListTraits.h).
+
+        Credits go to Eric/Maciej for the inspiration.
+
+        * CMakeLists.txt: Add SVGListTraits.cpp to build
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * bindings/scripts/CodeGeneratorJS.pm: Generator changes for SVGTransform/PathSeg/LengthList (now RefPtr based)
+        * kcanvas/RenderSVGText.cpp: Add some get() methods, as SVGLengthList is RefPtr based now.
+        (WebCore::RenderSVGText::translationForAttributes):
+        * ksvg2/svg/SVGAnimateTransformElement.cpp: Add some get() methods, as SVGTransformList is RefPtr based now.
+        (WebCore::SVGAnimateTransformElement::handleTimerEvent):
+        * ksvg2/svg/SVGElementInstanceList.cpp: Be RefPtr based.
+        (WebCore::SVGElementInstanceList::SVGElementInstanceList):
+        * ksvg2/svg/SVGElementInstanceList.h:
+        * ksvg2/svg/SVGLengthList.cpp: Ditto.
+        (WebCore::SVGLengthList::SVGLengthList):
+        * ksvg2/svg/SVGLengthList.h: Ditto.
+        * ksvg2/svg/SVGList.h: Rewrote, as described above.
+        (WebCore::SVGListTypeOperations::nullItem):
+        (WebCore::SVGList::SVGList):
+        (WebCore::SVGList::~SVGList):
+        (WebCore::SVGList::clear):
+        (WebCore::SVGList::getFirst):
+        (WebCore::SVGList::getLast):
+        (WebCore::SVGList::getItem):
+        (WebCore::SVGList::replaceItem):
+        (WebCore::SVGList::removeItem):
+        * ksvg2/svg/SVGListTraits.cpp: Added.
+        * ksvg2/svg/SVGListTraits.h: Added.
+        (WebCore::):
+        * ksvg2/svg/SVGPathElement.cpp: Add some get() methods, as SVGPathSegList is RefPtr based now.
+        (WebCore::SVGPathElement::toPathData):
+        * ksvg2/svg/SVGPathSegList.cpp: Be RefPtr based.
+        (WebCore::SVGPathSegList::SVGPathSegList):
+        * ksvg2/svg/SVGPathSegList.h: Ditto.
+        * ksvg2/svg/SVGTransform.cpp: Style cleanup.
+        (SVGTransform::SVGTransform):
+        * ksvg2/svg/SVGTransformList.cpp: Be RefPtr based.
+        (SVGTransformList::SVGTransformList):
+        (SVGTransformList::createSVGTransformFromMatrix):
+        (SVGTransformList::consolidate):
+        * ksvg2/svg/SVGTransformList.h: Ditto.
+        * ksvg2/svg/SVGTransformable.cpp: Fix RefPtr usage of SVGTransform.
+        (SVGTransformable::parseTransformAttribute):
+
 2006-09-15  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by eseidel.  Landed by eseidel.
index cd9f5b97233e9d04d8527bc5f56fdd13bd00ff13..75da7698dd3c7d0d5bad3cb668b5aab1693395cf 100644 (file)
@@ -878,6 +878,16 @@ sub GenerateImplementation
       my $numParameters = @{$function->parameters};
       my $hasOptionalArguments = 0;
 
+      # Special case for SVGLengthList / SVGTransformList / SVGPathSegList.
+      # These lists still use RefPtr objects, which will be changed in future.
+      # For now they need special treatment in the generation.
+      my $isRefPtr = 0;
+      if ($interfaceName eq "SVGLengthList" or
+          $interfaceName eq "SVGTransformList" or
+          $interfaceName eq "SVGPathSegList") {
+        $isRefPtr = 1;
+      }
+
       foreach my $parameter (@{$function->parameters}) {
         if (!$hasOptionalArguments && $parameter->extendedAttributes->{"Optional"}) {
           push(@implContent, "\n        int argsCount = args.size();\n");
@@ -886,7 +896,7 @@ sub GenerateImplementation
 
         if ($hasOptionalArguments) {
           push(@implContent, "        if (argsCount < " . ($paramIndex + 1) . ") {\n");
-          GenerateImplementationFunctionCall($function, $functionString, $paramIndex, "    " x 3);
+          GenerateImplementationFunctionCall($function, $functionString, $paramIndex, "    " x 3, $isRefPtr);
           push(@implContent, "        }\n\n");
         }
 
@@ -915,7 +925,7 @@ sub GenerateImplementation
       }
 
       push(@implContent, "\n");
-      GenerateImplementationFunctionCall($function, $functionString, $paramIndex, "    " x 2);
+      GenerateImplementationFunctionCall($function, $functionString, $paramIndex, "    " x 2, $isRefPtr);
 
       push(@implContent, "    }\n"); # end case
     }
@@ -970,6 +980,7 @@ sub GenerateImplementationFunctionCall()
     my $functionString = shift;
     my $paramIndex = shift;
     my $indent = shift;
+    my $isRefPtr = shift;
 
     if (@{$function->raisesExceptions}) {
         $functionString .= ", " if $paramIndex;
@@ -982,7 +993,7 @@ sub GenerateImplementationFunctionCall()
         push(@implContent, $indent . "setDOMException(exec, ec);\n") if @{$function->raisesExceptions};
         push(@implContent, $indent . "return jsUndefined();\n");
     } else {
-        push(@implContent, "\n" . $indent . "KJS::JSValue* result = " . NativeToJSValue($function->signature, $functionString) . ";\n");
+        push(@implContent, "\n" . $indent . "KJS::JSValue* result = " . NativeToJSValue($function->signature, $functionString, $isRefPtr) . ";\n");
         push(@implContent, $indent . "setDOMException(exec, ec);\n") if @{$function->raisesExceptions};
         push(@implContent, $indent . "return result;\n");
     }
@@ -1155,7 +1166,8 @@ sub NativeToJSValue
 {
     my $signature = shift;
     my $value = shift;
-    
+    my $isRefPtr = shift;
     my $type = $codeGenerator->StripModule($signature->type);
 
     if ($type eq "boolean") {
@@ -1251,6 +1263,11 @@ sub NativeToJSValue
         $implIncludes{"kjs_html.h"} = 1;
         $implIncludes{"HTMLCollection.h"} = 1;
         return "getHTMLCollection(exec, $value.get())";
+    } elsif (($type eq "SVGLength" or
+              $type eq "SVGTransform") and $isRefPtr eq 1) {
+       $implIncludes{"JS$type.h"} = 1;
+       $implIncludes{"$type.h"} = 1;
+       return "toJS(exec, $value.get())";
     } elsif ($type eq "SVGRect" or
              $type eq "SVGPoint" or
              $type eq "SVGNumber") {
@@ -1261,7 +1278,12 @@ sub NativeToJSValue
         $joinedName = $type;
         $joinedName =~ s/Abs|Rel//;
         $implIncludes{"$joinedName.h"} = 1;
-        return "toJS(exec, $value)";
+
+        if ($isRefPtr eq 1) {
+            return "toJS(exec, $value.get())";
+        } else {
+            return "toJS(exec, $value)";
+        }
     } elsif ($codeGenerator->IsSVGAnimatedType($type)) {
         $implIncludes{"JS$type.h"} = 1;
         $implIncludes{"$type.h"} = 1;
index 27a1746a44f8d97c42a2d957ac03894aac6ed119..bff2b98f8733106061f65474d4d261f9b7adb771 100644 (file)
@@ -49,8 +49,8 @@ AffineTransform RenderSVGText::translationForAttributes()
 {
     SVGTextElement *text = static_cast<SVGTextElement *>(element());
 
-    SVGLength* xOffset = text->x()->getFirst();
-    SVGLength* yOffset = text->y()->getFirst();
+    SVGLength* xOffset = text->x()->getFirst().get();
+    SVGLength* yOffset = text->y()->getFirst().get();
 
     return AffineTransform().translate(xOffset ? xOffset->value() : 0,
                                        yOffset ? yOffset->value() : 0);
index df11d7a0c9c94442d951c126cbbec67f15c76d87..28f511bd12799a7450db5da82fbb5de7af444520 100644 (file)
@@ -89,7 +89,7 @@ void SVGAnimateTransformElement::handleTimerEvent(double timePercentage)
             if (transformList) {
                 ExceptionCode ec = 0;
                 for (unsigned long i = 0; i < transformList->numberOfItems(); i++) {
-                    SVGTransform *value = transformList->getItem(i, ec);
+                    SVGTransform *value = transformList->getItem(i, ec).get();;
                     if (!value)
                         continue;
                         
index ec125288fcd2d2a669cd63015d49d489aec4bff7..d0f352c43836cd3d3ade2c88e94a150cb70ddbe1 100644 (file)
@@ -29,7 +29,7 @@
 namespace WebCore {
 
 SVGElementInstanceList::SVGElementInstanceList()
-    : SVGList<SVGElementInstance*>()
+    : SVGList<RefPtr<SVGElementInstance> >()
 {
 }
 
index 9b0cd710db34d3ba883c85a060aad6469edd4f88..ef032b0c9b48ff4aee9f005ca5b98c8c117eb417 100644 (file)
@@ -30,7 +30,7 @@
 
 namespace WebCore
 {
-    class SVGElementInstanceList : public SVGList<SVGElementInstance*>
+    class SVGElementInstanceList : public SVGList<RefPtr<SVGElementInstance> >
     {
     public:
         SVGElementInstanceList();
index 0fb2124d995ea881fb71c247e66aa34809fcde08..59036458465ff48923ace98f3930138098fec21b 100644 (file)
@@ -33,7 +33,7 @@
 namespace WebCore {
 
 SVGLengthList::SVGLengthList()
-    : SVGList<SVGLength*>()
+    : SVGList<RefPtr<SVGLength> >()
 {
 }
 
index f747bf79a7ac92458ed5c82542aa13681f3ac052..9a746b8e5dc74c99e93f314368b2ce1a80ce809f 100644 (file)
@@ -30,7 +30,7 @@
 
 namespace WebCore
 {
-    class SVGLengthList : public SVGList<SVGLength*>
+    class SVGLengthList : public SVGList<RefPtr<SVGLength> >
     {
     public:
         SVGLengthList();
index 8497c85385abc929dc7b97e3858abf05a3879233..37caf6d84d21374955953116ec794241e27088c8 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2004, 2005 Nikolas Zimmermann <wildfox@kde.org>
+    Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005 Rob Buis <buis@kde.org>
 
     This file is part of the KDE project
     Boston, MA 02111-1307, USA.
 */
 
-#ifndef KSVG_SVGList_H
-#define KSVG_SVGList_H
+#ifndef SVGList_H
+#define SVGList_H
 
 #ifdef SVG_SUPPORT
 
 #include <wtf/Vector.h>
 
 #include "Shared.h"
-#include "FloatPoint.h"
+#include "SVGListTraits.h"
 #include "ExceptionCode.h"
-#include "PlatformString.h"
 
 namespace WebCore {
 
-    template<class Item>
-    class SVGListBase : public Shared<SVGListBase<Item> >
+    template<typename Item>
+    struct SVGListTypeOperations
     {
-    public:
-        SVGListBase() { }
-        virtual ~SVGListBase() { clearVector(m_vector); }
+        static Item nullItem()
+        {
+            return SVGListTraits<UsesDefaultInitializer<Item>::value, Item>::nullItem();
+        }
+    };
 
-        // To be implemented by the SVGList specializations!
-        virtual Item nullItem() const = 0;
-        virtual void clearVector(Vector<Item>& vector) const { vector.clear(); }
+    template<typename Item>
+    class SVGList : public Shared<SVGList<Item> >
+    {
+    private:
+        typedef SVGListTypeOperations<Item> TypeOperations;
+
+    public:
+        SVGList() { }
+        virtual ~SVGList() { m_vector.clear(); }
 
         unsigned int numberOfItems() const { return m_vector.size(); }
-        void clear(ExceptionCode &) { clearVector(m_vector); }
+        void clear(ExceptionCode &) { m_vector.clear(); }
 
         Item initialize(Item newItem, ExceptionCode& ec)
         {
@@ -57,7 +64,7 @@ namespace WebCore {
         Item getFirst() const
         {
             if (m_vector.isEmpty())
-                return nullItem();
+                return TypeOperations::nullItem();
 
             return m_vector.first();
         }
@@ -65,7 +72,7 @@ namespace WebCore {
         Item getLast() const
         {
             if (m_vector.isEmpty())
-                return nullItem();
+                return TypeOperations::nullItem();
 
             return m_vector.last();
         }
@@ -74,7 +81,7 @@ namespace WebCore {
         {
             if (m_vector.size() < index) {
                 ec = INDEX_SIZE_ERR;
-                return nullItem();
+                return TypeOperations::nullItem();
             }
 
             return m_vector.at(index);
@@ -84,10 +91,10 @@ namespace WebCore {
         {
             if (m_vector.size() < index) {
                 ec = INDEX_SIZE_ERR;
-                return nullItem();
+                return TypeOperations::nullItem();
             }
 
-            return m_vector.at(index);
+            return m_vector[index];
         }
 
         Item insertItemBefore(Item newItem, unsigned int index, ExceptionCode&)
@@ -100,10 +107,10 @@ namespace WebCore {
         {
             if (m_vector.size() < index) {
                 ec = INDEX_SIZE_ERR;
-                return nullItem();
+                return TypeOperations::nullItem();
             }
 
-            m_vector.at(index) = newItem;
+            m_vector[index] = newItem;
             return newItem;
         }
 
@@ -111,10 +118,10 @@ namespace WebCore {
         {
             if (m_vector.size() < index) {
                 ec = INDEX_SIZE_ERR;
-                return nullItem();
+                return TypeOperations::nullItem();
             }
 
-            Item item = m_vector.at(index);
+            Item item = m_vector[index];
             removeItem(index, ec);
             return item;
         }
@@ -134,51 +141,9 @@ namespace WebCore {
         Vector<Item> m_vector;
     };
 
-    template<class Item>
-    class SVGList : public SVGListBase<Item>
-    {
-    public:
-        virtual Item nullItem() const { return 0; }
-
-        virtual void clearVector(Vector<Item>& vector) const
-        {
-            typedef typename Vector<Item>::const_iterator iterator;
-            
-            iterator end = vector.end();
-            for (iterator it = vector.begin(); it != end; ++it)
-                (*it)->deref();
-
-            vector.clear();    
-        }
-    };
-
-    // Specialization for double
-    template<>
-    class SVGList<double> : public SVGListBase<double>
-    {
-    public:
-        virtual double nullItem() const { return 0.0; }
-    };
-
-    // Specialization for String
-    template<>
-    class SVGList<String> : public SVGListBase<String>
-    {
-    public:
-        virtual String nullItem() const { return String(); }
-    };
-
-    // Specialization for FloatPoint
-    template<>
-    class SVGList<FloatPoint> : public SVGListBase<FloatPoint>
-    {
-    public:
-        virtual FloatPoint nullItem() const { return FloatPoint(); }
-    };
-
 } // namespace WebCore
 
 #endif // SVG_SUPPORT
-#endif // KSVG_SVGList_H
+#endif // SVGList_H
 
 // vim:ts=4:noet
diff --git a/WebCore/ksvg2/svg/SVGListTraits.h b/WebCore/ksvg2/svg/SVGListTraits.h
new file mode 100644 (file)
index 0000000..3e57428
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+    Copyright (C) 2006 Nikolas Zimmermann <wildfox@kde.org>
+                  2006 Apple Computer Inc.
+
+    This file is part of the KDE project
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.
+*/
+
+#ifndef SVGListTraits_H
+#define SVGListTraits_H
+
+#ifdef SVG_SUPPORT
+
+namespace WebCore {
+
+    template<typename Item> struct UsesDefaultInitializer { static const bool value = true; };
+    template<> struct UsesDefaultInitializer<double>      { static const bool value = false; };
+
+    template<bool usesDefaultInitializer, typename Item>
+    struct SVGListTraits { };
+
+    template<typename Item>
+    struct SVGListTraits<true, Item>
+    {
+        static Item nullItem() { return Item(); } 
+    };
+
+    template<>
+    struct SVGListTraits<false, double>
+    {
+        static double nullItem() { return 0.0; }
+    };
+
+} // namespace WebCore
+
+#endif // SVG_SUPPORT
+#endif // SVGListTraits_H
+
+// vim:ts=4:noet
index dc99cd50cfb3fe73aa229aaba8d5edccab303ff0..c2e31291d12dc8aa1446cf1908127a96e199f857 100644 (file)
@@ -23,6 +23,8 @@
 #include "config.h"
 
 #ifdef SVG_SUPPORT
+
+#include "DeprecatedString.h"
 #include "DeprecatedStringList.h"
 
 #include "SVGMatrix.h"
index c3b0a43f3dcb4beb59ada44d6011436508cf7fec..e5f37e1ccc6bc25e007f79f9f1061794ec8ef933 100644 (file)
@@ -29,6 +29,8 @@
 
 namespace WebCore
 {
+    class DeprecatedString;
+
     class SVGNumberList : public SVGList<double>
     {
     public:
index aee3640aedcf0c9505110dbdf2c5dd3ed6efa1c4..24d62f3f1923f0d57fdff61e45f32ef8b6d86aa8 100644 (file)
@@ -403,7 +403,7 @@ Path SVGPathElement::toPathData() const
     ExceptionCode ec = 0;
     for(int i = 0; i < len; ++i)
     {
-        SVGPathSeg *p = pathSegList()->getItem(i, ec);
+        SVGPathSeg *p = pathSegList()->getItem(i, ec).get();;
         switch(p->pathSegType())
         {
             case SVGPathSeg::PATHSEG_MOVETO_ABS:
index f5b8f8c1a9c377e337f24fec64e03f231916d586..57de2dd22c7a6cc46bd2ced6b2dac696d1cbe77e 100644 (file)
@@ -30,7 +30,7 @@
 namespace WebCore {
 
 SVGPathSegList::SVGPathSegList()
-    : SVGList<SVGPathSeg*>()
+    : SVGList<RefPtr<SVGPathSeg> >()
 {
 }
 
index 881c2e7d0b5a7d4c129e0f9d6a4cacfc9f4ad224..b722316f98e48aa32f378d27b3355ae802e1d36e 100644 (file)
@@ -30,7 +30,7 @@
 
 namespace WebCore
 {
-    class SVGPathSegList : public SVGList<SVGPathSeg*>
+    class SVGPathSegList : public SVGList<RefPtr<SVGPathSeg> >
     {
     public:
         SVGPathSegList();
index 5013256f74f2c3c5ffcf25bc642aa6e3c6ce2c41..2cd58f6698058e1be38344686419c06406d42c80 100644 (file)
 
 using namespace WebCore;
 
-SVGTransform::SVGTransform() : Shared<SVGTransform>()
+SVGTransform::SVGTransform()
+    : Shared<SVGTransform>()
+    , m_matrix(SVGSVGElement::createSVGMatrix())
 {
-    m_matrix = SVGSVGElement::createSVGMatrix();
-
     m_type = SVG_TRANSFORM_UNKNOWN;
     m_angle = 0;
 }
index 2f870a4c0ba79b5041982a2ca2a5fd118c33c4f4..555233e010876146f8e804f3b5b20286deeb59f9 100644 (file)
@@ -32,7 +32,7 @@
 using namespace WebCore;
 
 SVGTransformList::SVGTransformList()
-    : SVGList<SVGTransform*>()
+    : SVGList<RefPtr<SVGTransform> >()
 {
 }
 
@@ -40,12 +40,12 @@ SVGTransformList::~SVGTransformList()
 {
 }
 
-SVGTransform* SVGTransformList::createSVGTransformFromMatrix(SVGMatrix* matrix) const
+RefPtr<SVGTransform> SVGTransformList::createSVGTransformFromMatrix(SVGMatrix* matrix) const
 {
     return SVGSVGElement::createSVGTransformFromMatrix(matrix);
 }
 
-SVGTransform* SVGTransformList::consolidate()
+RefPtr<SVGTransform> SVGTransformList::consolidate()
 {
     SVGTransform* obj = concatenate();
     if (!obj)
index 3e65e5674686d2684ff556a7074616ddbb72422b..b6cf4e7640f1dce1106329e985406ede20a047fc 100644 (file)
 
 namespace WebCore {
 
-    class SVGTransformList : public SVGList<SVGTransform*>
+    class SVGTransformList : public SVGList<RefPtr<SVGTransform> >
     {
     public:
         SVGTransformList();
         virtual ~SVGTransformList();
 
-        SVGTransform* createSVGTransformFromMatrix(SVGMatrix*) const;
-        SVGTransform* consolidate();
+        RefPtr<SVGTransform> createSVGTransformFromMatrix(SVGMatrix*) const;
+        RefPtr<SVGTransform> consolidate();
 
         // Internal use only
         SVGTransform* concatenate() const;
index 45a02dd1b37c7fede2b2b2712cbfe21d1106c66a..dc325cc80e689a4668039d83dc366ee68cf68fb9 100644 (file)
@@ -81,7 +81,7 @@ void SVGTransformable::parseTransformAttribute(SVGTransformList *list, const Ato
         if (subtransform[0].startsWith(";") || subtransform[0].startsWith(","))
             subtransform[0] = subtransform[0].mid(1).stripWhiteSpace();
 
-        RefPtr<SVGTransform> t(new SVGTransform());
+        SVGTransform* t = new SVGTransform();
 
         if (subtransform[0] == "rotate") {
             if (params.count() == 3)
@@ -118,7 +118,7 @@ void SVGTransformable::parseTransformAttribute(SVGTransformList *list, const Ato
             break; // failed to parse a valid transform, abort.
         
         ExceptionCode ec = 0;
-        list->appendItem(t.release().release(), ec);
+        list->appendItem(t, ec);
     }
 }