• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "config.h"
6 
7 #include "platform/TracedValue.h"
8 
9 #include "platform/JSONValues.h"
10 
11 namespace blink {
12 
13 namespace {
14 
threadSafeCopy(const String & string)15 String threadSafeCopy(const String& string)
16 {
17     RefPtr<StringImpl> copy(string.impl());
18     if (string.isSafeToSendToAnotherThread())
19         return string;
20     return string.isolatedCopy();
21 }
22 
23 }
24 
create()25 PassRefPtr<TracedValue> TracedValue::create()
26 {
27     return adoptRef(new TracedValue());
28 }
29 
TracedValue()30 TracedValue::TracedValue()
31 {
32     m_stack.append(JSONObject::create());
33 }
34 
~TracedValue()35 TracedValue::~TracedValue()
36 {
37     ASSERT(m_stack.size() == 1);
38 }
39 
setInteger(const char * name,int value)40 void TracedValue::setInteger(const char* name, int value)
41 {
42     currentDictionary()->setNumber(name, value);
43 }
44 
setDouble(const char * name,double value)45 void TracedValue::setDouble(const char* name, double value)
46 {
47     currentDictionary()->setNumber(name, value);
48 }
49 
setBoolean(const char * name,bool value)50 void TracedValue::setBoolean(const char* name, bool value)
51 {
52     currentDictionary()->setBoolean(name, value);
53 }
54 
setString(const char * name,const String & value)55 void TracedValue::setString(const char* name, const String& value)
56 {
57     currentDictionary()->setString(name, threadSafeCopy(value));
58 }
59 
beginDictionary(const char * name)60 void TracedValue::beginDictionary(const char* name)
61 {
62     RefPtr<JSONObject> dictionary = JSONObject::create();
63     currentDictionary()->setObject(name, dictionary);
64     m_stack.append(dictionary);
65 }
66 
beginArray(const char * name)67 void TracedValue::beginArray(const char* name)
68 {
69     RefPtr<JSONArray> array = JSONArray::create();
70     currentDictionary()->setArray(name, array);
71     m_stack.append(array);
72 }
73 
endDictionary()74 void TracedValue::endDictionary()
75 {
76     ASSERT(m_stack.size() > 1);
77     ASSERT(currentDictionary());
78     m_stack.removeLast();
79 }
80 
pushInteger(int value)81 void TracedValue::pushInteger(int value)
82 {
83     currentArray()->pushInt(value);
84 }
85 
pushDouble(double value)86 void TracedValue::pushDouble(double value)
87 {
88     currentArray()->pushNumber(value);
89 }
90 
pushBoolean(bool value)91 void TracedValue::pushBoolean(bool value)
92 {
93     currentArray()->pushBoolean(value);
94 }
95 
pushString(const String & value)96 void TracedValue::pushString(const String& value)
97 {
98     currentArray()->pushString(threadSafeCopy(value));
99 }
100 
beginArray()101 void TracedValue::beginArray()
102 {
103     RefPtr<JSONArray> array = JSONArray::create();
104     currentArray()->pushArray(array);
105     m_stack.append(array);
106 }
107 
beginDictionary()108 void TracedValue::beginDictionary()
109 {
110     RefPtr<JSONObject> dictionary = JSONObject::create();
111     currentArray()->pushObject(dictionary);
112     m_stack.append(dictionary);
113 }
114 
endArray()115 void TracedValue::endArray()
116 {
117     ASSERT(m_stack.size() > 1);
118     ASSERT(currentArray());
119     m_stack.removeLast();
120 }
121 
asTraceFormat() const122 String TracedValue::asTraceFormat() const
123 {
124     ASSERT(m_stack.size() == 1);
125     return m_stack.first()->toJSONString();
126 }
127 
currentDictionary() const128 JSONObject* TracedValue::currentDictionary() const
129 {
130     ASSERT(!m_stack.isEmpty());
131     ASSERT(m_stack.last()->type() == JSONValue::TypeObject);
132     return static_cast<JSONObject*>(m_stack.last().get());
133 }
134 
currentArray() const135 JSONArray* TracedValue::currentArray() const
136 {
137     ASSERT(!m_stack.isEmpty());
138     ASSERT(m_stack.last()->type() == JSONValue::TypeArray);
139     return static_cast<JSONArray*>(m_stack.last().get());
140 }
141 
142 }
143