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