| Index: webkit/extensions/v8/heap_profiler_extension.cc
|
| diff --git a/webkit/extensions/v8/heap_profiler_extension.cc b/webkit/extensions/v8/heap_profiler_extension.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..058a5c298a8c20269e2a5a404b097360a21a6ce2
|
| --- /dev/null
|
| +++ b/webkit/extensions/v8/heap_profiler_extension.cc
|
| @@ -0,0 +1,111 @@
|
| +// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "webkit/extensions/v8/heap_profiler_extension.h"
|
| +
|
| +#include "base/basictypes.h"
|
| +
|
| +#if defined(LINUX_USE_TCMALLOC)
|
| +#include "third_party/tcmalloc/tcmalloc/src/google/heap-profiler.h"
|
| +#endif
|
| +
|
| +namespace extensions_v8 {
|
| +
|
| +namespace {
|
| +
|
| +const char kHeapProfilerExtensionName[] = "v8/HeapProfiler";
|
| +
|
| +class HeapProfilerWrapper : public v8::Extension {
|
| + public:
|
| + HeapProfilerWrapper()
|
| + : v8::Extension(kHeapProfilerExtensionName,
|
| + "if (typeof(chromium) == 'undefined') {"
|
| + " chromium = {};"
|
| + "}"
|
| + "(function() {"
|
| + " native function HeapProfilerStart();"
|
| + " native function HeapProfilerStop();"
|
| + " native function HeapProfilerDump();"
|
| + " chromium.HeapProfiler = {};"
|
| + " chromium.HeapProfiler.start = function(opt_prefix) {"
|
| + " var prefix = opt_prefix;"
|
| + " if (!prefix) {"
|
| + " var d = new Date();"
|
| + " prefix = \"chromium-\" + "
|
| + " (1900 + d.getYear()) + "
|
| + " \"-\" + d.getMonth() + "
|
| + " \"-\" + d.getDay() + "
|
| + " \"-\" + d.getTime();"
|
| + " }"
|
| + " HeapProfilerStart(prefix);"
|
| + " };"
|
| + " chromium.HeapProfiler.stop = function() {"
|
| + " HeapProfilerStop();"
|
| + " };"
|
| + " chromium.HeapProfiler.dump = function(opt_reason) {"
|
| + " HeapProfilerDump(opt_reason || \"\");"
|
| + " };"
|
| + "})();") {}
|
| +
|
| + virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
|
| + v8::Handle<v8::String> name) {
|
| + if (name->Equals(v8::String::New("HeapProfilerStart"))) {
|
| + return v8::FunctionTemplate::New(HeapProfilerStart);
|
| + } else if (name->Equals(v8::String::New("HeapProfilerStop"))) {
|
| + return v8::FunctionTemplate::New(HeapProfilerStop);
|
| + } else if (name->Equals(v8::String::New("HeapProfilerDump"))) {
|
| + return v8::FunctionTemplate::New(HeapProfilerDump);
|
| + }
|
| + return v8::Handle<v8::FunctionTemplate>();
|
| + }
|
| +
|
| +#if defined(LINUX_USE_TCMALLOC)
|
| + static v8::Handle<v8::Value> HeapProfilerStart(const v8::Arguments& args) {
|
| + if (args.Length() >= 1 && args[0]->IsString()) {
|
| + v8::Local<v8::String> js_prefix = args[0]->ToString();
|
| + char prefix[256];
|
| + js_prefix->WriteAscii(prefix, 0, arraysize(prefix) - 1);
|
| + ::HeapProfilerStart(prefix);
|
| + }
|
| + return v8::Undefined();
|
| + }
|
| +
|
| + static v8::Handle<v8::Value> HeapProfilerStop(const v8::Arguments& args) {
|
| + ::HeapProfilerStop();
|
| + return v8::Undefined();
|
| + }
|
| +
|
| + static v8::Handle<v8::Value> HeapProfilerDump(const v8::Arguments& args) {
|
| + if (args.Length() >= 1 && args[0]->IsString()) {
|
| + v8::Local<v8::String> js_reason = args[0]->ToString();
|
| + char reason[256];
|
| + js_reason->WriteAscii(reason, 0, arraysize(reason) - 1);
|
| + ::HeapProfilerDump(reason);
|
| + }
|
| + return v8::Undefined();
|
| + }
|
| +
|
| +#else
|
| +
|
| + static v8::Handle<v8::Value> HeapProfilerStart(const v8::Arguments& args) {
|
| + return v8::Undefined();
|
| + }
|
| +
|
| + static v8::Handle<v8::Value> HeapProfilerStop(const v8::Arguments& args) {
|
| + return v8::Undefined();
|
| + }
|
| +
|
| + static v8::Handle<v8::Value> HeapProfilerDump(const v8::Arguments& args) {
|
| + return v8::Undefined();
|
| + }
|
| +#endif
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +v8::Extension* HeapProfilerExtension::Get() {
|
| + return new HeapProfilerWrapper;
|
| +}
|
| +
|
| +} // namespace extensions_v8
|
|
|