0100ce6faf6285d64ce5e2f22e6bc3a83712c7d5
[WebKit-https.git] / Source / WebCore / bindings / v8 / V8PerIsolateData.cpp
1 /*
2  * Copyright (C) 2009 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "V8PerIsolateData.h"
28
29 #include "ScriptGCEvent.h"
30 #include "ScriptProfiler.h"
31 #include "V8Binding.h"
32 #include <wtf/MemoryInstrumentationHashMap.h>
33 #include <wtf/MemoryInstrumentationVector.h>
34
35 namespace WTF {
36
37 // WrapperTypeInfo are statically allocated, don't count them.
38 template<> struct SequenceMemoryInstrumentationTraits<WebCore::WrapperTypeInfo*> {
39     template <typename I> static void reportMemoryUsage(I, I, MemoryClassInfo&) { }
40 };
41
42 }
43
44 namespace WebCore {
45
46 V8PerIsolateData::V8PerIsolateData(v8::Isolate* isolate)
47     : m_stringCache(adoptPtr(new StringCache()))
48     , m_integerCache(adoptPtr(new IntegerCache()))
49     , m_domDataStore(0)
50     , m_hiddenPropertyName(adoptPtr(new V8HiddenPropertyName()))
51     , m_constructorMode(ConstructorMode::CreateNewObject)
52     , m_recursionLevel(0)
53 #ifndef NDEBUG
54     , m_internalScriptRecursionLevel(0)
55 #endif
56     , m_gcEventData(adoptPtr(new GCEventData()))
57     , m_shouldCollectGarbageSoon(false)
58 {
59     m_v8Null.set(v8::Null(isolate));
60 }
61
62 V8PerIsolateData::~V8PerIsolateData()
63 {
64 }
65
66 V8PerIsolateData* V8PerIsolateData::create(v8::Isolate* isolate)
67 {
68     ASSERT(isolate);
69     ASSERT(!isolate->GetData());
70     V8PerIsolateData* data = new V8PerIsolateData(isolate);
71     isolate->SetData(data);
72     return data;
73 }
74
75 void V8PerIsolateData::ensureInitialized(v8::Isolate* isolate) 
76 {
77     ASSERT(isolate);
78     if (!isolate->GetData()) 
79         create(isolate);
80 }
81
82 v8::Persistent<v8::Value> V8PerIsolateData::ensureLiveRoot()
83 {
84     if (m_liveRoot.isEmpty())
85         m_liveRoot.set(v8::Null());
86     return m_liveRoot.get();
87 }
88
89 void V8PerIsolateData::dispose(v8::Isolate* isolate)
90 {
91     void* data = isolate->GetData();
92     delete static_cast<V8PerIsolateData*>(data);
93     isolate->SetData(0);
94 }
95
96 v8::Handle<v8::FunctionTemplate> V8PerIsolateData::toStringTemplate()
97 {
98     if (m_toStringTemplate.isEmpty())
99         m_toStringTemplate.set(v8::FunctionTemplate::New(constructorOfToString));
100     return v8::Local<v8::FunctionTemplate>::New(m_toStringTemplate.get());
101 }
102
103 void V8PerIsolateData::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
104 {
105     MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::Binding);
106     info.addMember(m_rawTemplates, "rawTemplates");
107     info.addMember(m_templates, "templates");
108     info.addMember(m_stringCache, "stringCache");
109     info.addMember(m_integerCache, "integerCache");
110     info.addMember(m_domDataList, "domDataList");
111     info.addMember(m_domDataStore, "domDataStore");
112     info.addMember(m_hiddenPropertyName, "hiddenPropertyName");
113     info.addMember(m_gcEventData, "gcEventData");
114
115     info.addPrivateBuffer(ScriptProfiler::profilerSnapshotsSize(), WebCoreMemoryTypes::InspectorProfilerAgent, "HeapSnapshots", "snapshots");
116
117     info.ignoreMember(m_toStringTemplate);
118     info.ignoreMember(m_lazyEventListenerToStringTemplate);
119     info.ignoreMember(m_v8Null);
120     info.ignoreMember(m_liveRoot);
121     info.ignoreMember(m_auxiliaryContext);
122 }
123
124 #if ENABLE(INSPECTOR)
125 void V8PerIsolateData::visitExternalStrings(ExternalStringVisitor* visitor)
126 {
127     v8::HandleScope handleScope;
128     class VisitorImpl : public v8::ExternalResourceVisitor {
129     public:
130         VisitorImpl(ExternalStringVisitor* visitor) : m_visitor(visitor) { }
131         virtual ~VisitorImpl() { }
132         virtual void VisitExternalString(v8::Handle<v8::String> string)
133         {
134             WebCoreStringResourceBase* resource = WebCoreStringResourceBase::toWebCoreStringResourceBase(string);
135             if (resource)
136                 resource->visitStrings(m_visitor);
137         }
138     private:
139         ExternalStringVisitor* m_visitor;
140     } v8Visitor(visitor);
141     v8::V8::VisitExternalResources(&v8Visitor);
142 }
143 #endif
144
145 v8::Handle<v8::Value> V8PerIsolateData::constructorOfToString(const v8::Arguments& args)
146 {
147     // The DOM constructors' toString functions grab the current toString
148     // for Functions by taking the toString function of itself and then
149     // calling it with the constructor as its receiver. This means that
150     // changes to the Function prototype chain or toString function are
151     // reflected when printing DOM constructors. The only wart is that
152     // changes to a DOM constructor's toString's toString will cause the
153     // toString of the DOM constructor itself to change. This is extremely
154     // obscure and unlikely to be a problem.
155     v8::Handle<v8::Value> value = args.Callee()->Get(v8::String::NewSymbol("toString"));
156     if (!value->IsFunction()) 
157         return v8::String::Empty(args.GetIsolate());
158     return v8::Handle<v8::Function>::Cast(value)->Call(args.This(), 0, 0);
159 }
160
161 } // namespace WebCore