| Index: Source/platform/TracedValue.h
 | 
| diff --git a/Source/platform/TracedValue.h b/Source/platform/TracedValue.h
 | 
| index 7f751054ea92aa7eb122d661a48432df1af53eb5..db7cb2062a70e46070612476b82ea9b56ff8d91a 100644
 | 
| --- a/Source/platform/TracedValue.h
 | 
| +++ b/Source/platform/TracedValue.h
 | 
| @@ -14,7 +14,9 @@ namespace WebCore {
 | 
|  class JSONArray;
 | 
|  class JSONObject;
 | 
|  class JSONValue;
 | 
| +class TracedArrayBase;
 | 
|  template<class T> class TracedArray;
 | 
| +template<class T> class TracedDictionary;
 | 
|  
 | 
|  class PLATFORM_EXPORT TracedValueBase {
 | 
|      WTF_MAKE_NONCOPYABLE(TracedValueBase);
 | 
| @@ -44,98 +46,179 @@ protected:
 | 
|      Vector<RefPtr<JSONValue> > m_stack;
 | 
|  };
 | 
|  
 | 
| -template <class OwnerType>
 | 
| -class TracedDictionary : public TracedValueBase {
 | 
| -    WTF_MAKE_NONCOPYABLE(TracedDictionary);
 | 
| +class TracedDictionaryBase : public TracedValueBase {
 | 
| +    WTF_MAKE_NONCOPYABLE(TracedDictionaryBase);
 | 
| +private:
 | 
| +    typedef TracedDictionaryBase SelfType;
 | 
|  public:
 | 
| -    OwnerType& endDictionary()
 | 
| -    {
 | 
| -        ASSERT(m_stack.size() == nestingLevel);
 | 
| -        endCurrentDictionary();
 | 
| -        return *reinterpret_cast<OwnerType*>(this);
 | 
| -    }
 | 
| -
 | 
| -    TracedDictionary<TracedDictionary<OwnerType> >& beginDictionary(const char* name)
 | 
| +    TracedDictionary<SelfType>& beginDictionary(const char* name)
 | 
|      {
 | 
|          beginDictionaryNamed(name);
 | 
| -        return *reinterpret_cast<TracedDictionary<TracedDictionary<OwnerType> >* >(this);
 | 
| +        return *reinterpret_cast<TracedDictionary<SelfType>*>(this);
 | 
|      }
 | 
| -    TracedArray<TracedDictionary<OwnerType> >& beginArray(const char* name)
 | 
| +    TracedArray<SelfType>& beginArray(const char* name)
 | 
|      {
 | 
|          beginArrayNamed(name);
 | 
| -        return *reinterpret_cast<TracedArray<TracedDictionary<OwnerType> >* >(this);
 | 
| +        return *reinterpret_cast<TracedArray<SelfType>*>(this);
 | 
|      }
 | 
| -    TracedDictionary<OwnerType>& setInteger(const char* name, int value)
 | 
| +    SelfType& setInteger(const char* name, int value)
 | 
|      {
 | 
|          TracedValueBase::setInteger(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedDictionary<OwnerType>& setDouble(const char* name, double value)
 | 
| +    SelfType& setDouble(const char* name, double value)
 | 
|      {
 | 
|          TracedValueBase::setDouble(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedDictionary<OwnerType>& setBoolean(const char* name, bool value)
 | 
| +    SelfType& setBoolean(const char* name, bool value)
 | 
|      {
 | 
|          TracedValueBase::setBoolean(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedDictionary<OwnerType>& setString(const char* name, const String& value)
 | 
| +    SelfType& setString(const char* name, const String& value)
 | 
|      {
 | 
|          TracedValueBase::setString(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| +private:
 | 
| +    TracedDictionaryBase();
 | 
| +    ~TracedDictionaryBase();
 | 
| +};
 | 
| +
 | 
| +template <class OwnerType>
 | 
| +class TracedDictionary : public TracedDictionaryBase {
 | 
| +    WTF_MAKE_NONCOPYABLE(TracedDictionary);
 | 
| +private:
 | 
| +    typedef TracedDictionary<OwnerType> SelfType;
 | 
| +public:
 | 
| +    OwnerType& endDictionary()
 | 
| +    {
 | 
| +        TracedValueBase::endCurrentDictionary();
 | 
| +        return *reinterpret_cast<OwnerType*>(this);
 | 
| +    }
 | 
|  
 | 
| -    static const size_t nestingLevel = OwnerType::nestingLevel + 1;
 | 
| +    TracedDictionary<SelfType>& beginDictionary(const char* name)
 | 
| +    {
 | 
| +        TracedDictionaryBase::beginDictionary(name);
 | 
| +        return *reinterpret_cast<TracedDictionary<SelfType>*>(this);
 | 
| +    }
 | 
| +    TracedArray<SelfType>& beginArray(const char* name)
 | 
| +    {
 | 
| +        TracedDictionaryBase::beginArray(name);
 | 
| +        return *reinterpret_cast<TracedArray<SelfType>*>(this);
 | 
| +    }
 | 
| +    SelfType& setInteger(const char* name, int value)
 | 
| +    {
 | 
| +        TracedDictionaryBase::setInteger(name, value);
 | 
| +        return *this;
 | 
| +    }
 | 
| +    SelfType& setDouble(const char* name, double value)
 | 
| +    {
 | 
| +        TracedDictionaryBase::setDouble(name, value);
 | 
| +        return *this;
 | 
| +    }
 | 
| +    SelfType& setBoolean(const char* name, bool value)
 | 
| +    {
 | 
| +        TracedDictionaryBase::setBoolean(name, value);
 | 
| +        return *this;
 | 
| +    }
 | 
| +    SelfType& setString(const char* name, const String& value)
 | 
| +    {
 | 
| +        TracedDictionaryBase::setString(name, value);
 | 
| +        return *this;
 | 
| +    }
 | 
|  
 | 
|  private:
 | 
|      TracedDictionary();
 | 
|      ~TracedDictionary();
 | 
|  };
 | 
|  
 | 
| -template <class OwnerType>
 | 
| -class TracedArray : public TracedValueBase {
 | 
| -    WTF_MAKE_NONCOPYABLE(TracedArray);
 | 
| +class TracedArrayBase : public TracedValueBase {
 | 
| +    WTF_MAKE_NONCOPYABLE(TracedArrayBase);
 | 
| +private:
 | 
| +    typedef TracedArrayBase SelfType;
 | 
|  public:
 | 
| -    TracedDictionary<TracedArray<OwnerType> >& beginDictionary()
 | 
| +    TracedDictionary<SelfType>& beginDictionary()
 | 
|      {
 | 
|          pushDictionary();
 | 
| -        return *reinterpret_cast<TracedDictionary<TracedArray<OwnerType> >* >(this);
 | 
| +        return *reinterpret_cast<TracedDictionary<SelfType>*>(this);
 | 
|      }
 | 
| -    TracedDictionary<TracedArray<OwnerType> >& beginArray()
 | 
| +    TracedArray<SelfType>& beginArray()
 | 
|      {
 | 
|          pushArray();
 | 
| -        return *reinterpret_cast<TracedDictionary<TracedArray<OwnerType> >* >(this);
 | 
| -    }
 | 
| -    OwnerType& endArray()
 | 
| -    {
 | 
| -        ASSERT(m_stack.size() == nestingLevel);
 | 
| -        endCurrentArray();
 | 
| -        return *reinterpret_cast<OwnerType*>(this);
 | 
| +        return *reinterpret_cast<TracedArray<SelfType>*>(this);
 | 
|      }
 | 
|  
 | 
| -    TracedArray<OwnerType>& pushInteger(int value)
 | 
| +    SelfType& pushInteger(int value)
 | 
|      {
 | 
|          TracedValueBase::pushInteger(value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedArray<OwnerType>& pushDouble(double value)
 | 
| +    SelfType& pushDouble(double value)
 | 
|      {
 | 
|          TracedValueBase::pushDouble(value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedArray<OwnerType>& pushBoolean(bool value)
 | 
| +    SelfType& pushBoolean(bool value)
 | 
|      {
 | 
|          TracedValueBase::pushBoolean(value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedArray<OwnerType>& pushString(const String& value)
 | 
| +    SelfType& pushString(const String& value)
 | 
|      {
 | 
|          TracedValueBase::pushString(value);
 | 
|          return *this;
 | 
|      }
 | 
|  
 | 
| -    static const size_t nestingLevel = OwnerType::nestingLevel + 1;
 | 
| +private:
 | 
| +    TracedArrayBase();
 | 
| +    ~TracedArrayBase();
 | 
| +};
 | 
| +
 | 
| +template <class OwnerType>
 | 
| +class TracedArray : public TracedArrayBase {
 | 
| +    WTF_MAKE_NONCOPYABLE(TracedArray);
 | 
| +private:
 | 
| +    typedef TracedArray<OwnerType> SelfType;
 | 
| +public:
 | 
| +    OwnerType& endArray()
 | 
| +    {
 | 
| +        TracedValueBase::endCurrentArray();
 | 
| +        return *reinterpret_cast<OwnerType*>(this);
 | 
| +    }
 | 
| +
 | 
| +    TracedDictionary<SelfType >& beginDictionary()
 | 
| +    {
 | 
| +        TracedArrayBase::beginDictionary();
 | 
| +        return *reinterpret_cast<TracedDictionary<SelfType>*>(this);
 | 
| +    }
 | 
| +    TracedArray<SelfType >& beginArray()
 | 
| +    {
 | 
| +        TracedArrayBase::beginArray();
 | 
| +        return *reinterpret_cast<TracedArray<SelfType>*>(this);
 | 
| +    }
 | 
| +
 | 
| +    SelfType& pushInteger(int value)
 | 
| +    {
 | 
| +        TracedArrayBase::pushInteger(value);
 | 
| +        return *this;
 | 
| +    }
 | 
| +    SelfType& pushDouble(double value)
 | 
| +    {
 | 
| +        TracedArrayBase::pushDouble(value);
 | 
| +        return *this;
 | 
| +    }
 | 
| +    SelfType& pushBoolean(bool value)
 | 
| +    {
 | 
| +        TracedArrayBase::pushBoolean(value);
 | 
| +        return *this;
 | 
| +    }
 | 
| +    SelfType& pushString(const String& value)
 | 
| +    {
 | 
| +        TracedArrayBase::pushString(value);
 | 
| +        return *this;
 | 
| +    }
 | 
|  
 | 
|  private:
 | 
|      TracedArray();
 | 
| @@ -144,35 +227,37 @@ private:
 | 
|  
 | 
|  class PLATFORM_EXPORT TracedValue : public TracedValueBase {
 | 
|      WTF_MAKE_NONCOPYABLE(TracedValue);
 | 
| +private:
 | 
| +    typedef TracedValue SelfType;
 | 
|  public:
 | 
|      TracedValue();
 | 
|      ~TracedValue();
 | 
|  
 | 
| -    TracedDictionary<TracedValue>& beginDictionary(const char* name);
 | 
| -    TracedArray<TracedValue>& beginArray(const char* name);
 | 
| -    TracedValue& setInteger(const char* name, int value)
 | 
| +    TracedDictionary<SelfType>& beginDictionary(const char* name);
 | 
| +    TracedArray<SelfType>& beginArray(const char* name);
 | 
| +
 | 
| +    SelfType& setInteger(const char* name, int value)
 | 
|      {
 | 
|          TracedValueBase::setInteger(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedValue& setDouble(const char* name, double value)
 | 
| +    SelfType& setDouble(const char* name, double value)
 | 
|      {
 | 
|          TracedValueBase::setDouble(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedValue& setBoolean(const char* name, bool value)
 | 
| +    SelfType& setBoolean(const char* name, bool value)
 | 
|      {
 | 
|          TracedValueBase::setBoolean(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    TracedValue& setString(const char* name, const String& value)
 | 
| +    SelfType& setString(const char* name, const String& value)
 | 
|      {
 | 
|          TracedValueBase::setString(name, value);
 | 
|          return *this;
 | 
|      }
 | 
| -    PassRefPtr<TraceEvent::ConvertableToTraceFormat> finish();
 | 
|  
 | 
| -    static const size_t nestingLevel = 1;
 | 
| +    PassRefPtr<TraceEvent::ConvertableToTraceFormat> finish();
 | 
|  };
 | 
|  
 | 
|  } // namespace WebCore
 | 
| 
 |