1304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
2304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// Redistribution and use in source and binary forms, with or without
3304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// modification, are permitted provided that the following conditions are
4304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// met:
5304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//
6304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//     * Redistributions of source code must retain the above copyright
7304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//       notice, this list of conditions and the following disclaimer.
8304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//     * Redistributions in binary form must reproduce the above
9304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//       copyright notice, this list of conditions and the following
10304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//       disclaimer in the documentation and/or other materials provided
11304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//       with the distribution.
12304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//     * Neither the name of Google Inc. nor the names of its
13304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//       contributors may be used to endorse or promote products derived
14304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//       from this software without specific prior written permission.
15304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org//
16304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
28304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#include "statistics-extension.h"
29304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
30304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgnamespace v8 {
31304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgnamespace internal {
32304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
33304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgconst char* const StatisticsExtension::kSource =
34304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    "native function getV8Statistics();";
35304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
36304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
37304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgv8::Handle<v8::FunctionTemplate> StatisticsExtension::GetNativeFunction(
38304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    v8::Handle<v8::String> str) {
39906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  ASSERT(strcmp(*v8::String::Utf8Value(str), "getV8Statistics") == 0);
40304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  return v8::FunctionTemplate::New(StatisticsExtension::GetCounters);
41304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
42304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
43304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
44471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgstatic void AddCounter(v8::Local<v8::Object> object,
45471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                       StatsCounter* counter,
46471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                       const char* name) {
47471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  if (counter->Enabled()) {
48471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    object->Set(v8::String::New(name),
49471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                v8::Number::New(*counter->GetInternalPointer()));
50471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
51471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
52471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
53471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgstatic void AddNumber(v8::Local<v8::Object> object,
54471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                      intptr_t value,
55471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org                      const char* name) {
56471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  object->Set(v8::String::New(name),
57471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org              v8::Number::New(static_cast<double>(value)));
58471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
59471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
60471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
61d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid StatisticsExtension::GetCounters(
62d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    const v8::FunctionCallbackInfo<v8::Value>& args) {
63304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  Isolate* isolate = Isolate::Current();
64304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  Heap* heap = isolate->heap();
65471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
66304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  if (args.Length() > 0) {  // GC if first argument evaluates to true.
67304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    if (args[0]->IsBoolean() && args[0]->ToBoolean()->Value()) {
68304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org      heap->CollectAllGarbage(Heap::kNoGCFlags, "counters extension");
69304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org    }
70304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  }
71304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
72304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  Counters* counters = isolate->counters();
73304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  v8::Local<v8::Object> result = v8::Object::New();
74304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
75471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#define ADD_COUNTER(name, caption)                                            \
76471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->name(), #name);
77304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
78304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  STATS_COUNTER_LIST_1(ADD_COUNTER)
79304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  STATS_COUNTER_LIST_2(ADD_COUNTER)
80304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#undef ADD_COUNTER
81471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#define ADD_COUNTER(name)                                                     \
82471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->count_of_##name(), "count_of_" #name);         \
83471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->size_of_##name(),  "size_of_" #name);
84304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
85304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  INSTANCE_TYPE_LIST(ADD_COUNTER)
86304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#undef ADD_COUNTER
87471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#define ADD_COUNTER(name)                                                     \
88471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->count_of_CODE_TYPE_##name(),                   \
89471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             "count_of_CODE_TYPE_" #name);                                    \
90471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->size_of_CODE_TYPE_##name(),                    \
91471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             "size_of_CODE_TYPE_" #name);
92304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
93304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  CODE_KIND_LIST(ADD_COUNTER)
94304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#undef ADD_COUNTER
95471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org#define ADD_COUNTER(name)                                                     \
96471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->count_of_FIXED_ARRAY_##name(),                 \
97471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             "count_of_FIXED_ARRAY_" #name);                                  \
98471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddCounter(result, counters->size_of_FIXED_ARRAY_##name(),                  \
99471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org             "size_of_FIXED_ARRAY_" #name);
100304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
101304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  FIXED_ARRAY_SUB_INSTANCE_TYPE_LIST(ADD_COUNTER)
102304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org#undef ADD_COUNTER
103304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
104471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, isolate->memory_allocator()->Size(),
105471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "total_committed_bytes");
106471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->new_space()->Size(),
107471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "new_space_live_bytes");
108471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->new_space()->Available(),
109471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "new_space_available_bytes");
110471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->new_space()->CommittedMemory(),
111471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "new_space_commited_bytes");
112471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->old_pointer_space()->Size(),
113471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "old_pointer_space_live_bytes");
114471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->old_pointer_space()->Available(),
115471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "old_pointer_space_available_bytes");
116471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->old_pointer_space()->CommittedMemory(),
117471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "old_pointer_space_commited_bytes");
118471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->old_data_space()->Size(),
119471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "old_data_space_live_bytes");
120471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->old_data_space()->Available(),
121471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "old_data_space_available_bytes");
122471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->old_data_space()->CommittedMemory(),
123471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "old_data_space_commited_bytes");
124471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->code_space()->Size(),
125471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "code_space_live_bytes");
126471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->code_space()->Available(),
127471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "code_space_available_bytes");
128471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->code_space()->CommittedMemory(),
129471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "code_space_commited_bytes");
130471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->cell_space()->Size(),
131471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "cell_space_live_bytes");
132471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->cell_space()->Available(),
133471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "cell_space_available_bytes");
134471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->cell_space()->CommittedMemory(),
135471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "cell_space_commited_bytes");
13641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  AddNumber(result, heap->property_cell_space()->Size(),
13741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org            "property_cell_space_live_bytes");
13841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  AddNumber(result, heap->property_cell_space()->Available(),
13941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org            "property_cell_space_available_bytes");
14041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  AddNumber(result, heap->property_cell_space()->CommittedMemory(),
14141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org            "property_cell_space_commited_bytes");
142471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->lo_space()->Size(),
143471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "lo_space_live_bytes");
144471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->lo_space()->Available(),
145471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "lo_space_available_bytes");
146471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->lo_space()->CommittedMemory(),
147471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "lo_space_commited_bytes");
148471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  AddNumber(result, heap->amount_of_external_allocated_memory(),
149471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org            "amount_of_external_allocated_memory");
150d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  args.GetReturnValue().Set(result);
151304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
152304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
153304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
154304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.orgvoid StatisticsExtension::Register() {
155304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  static StatisticsExtension statistics_extension;
156304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org  static v8::DeclareExtension declaration(&statistics_extension);
157304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org}
158304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org
159304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org} }  // namespace v8::internal
160