/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * vim: set ts=8 sts=2 et sw=2 tw=80: * * Tests the stack-based instrumentation profiler on a JSRuntime
*/ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
EXEC("function g() { var p = new Prof(); p.test_fn(); }");
EXEC("function f() { g(); }");
EXEC("function e() { f(); }");
EXEC("function d() { e(); }");
EXEC("function c() { d(); }");
EXEC("function b() { c(); }");
EXEC("function a() { b(); }");
EXEC("function check() { var p = new Prof(); p.test_fn(); a(); }");
EXEC("function check2() { var p = new Prof(); p.test_fn2(); }");
reset(cx);
{
JS::RootedValue rval(cx); /* Make sure the stack resets and we have an entry for each stack */
CHECK(JS_CallFunctionName(cx, global, "check",
JS::HandleValueArray::empty(), &rval));
CHECK(profilingStack.stackPointer == 0);
CHECK(peakStackPointer >= 8);
/* Make sure the stack resets and we added no new entries */
uint32_t cnt = cx->runtime()->geckoProfiler().stringsCount();
peakStackPointer = 0;
CHECK(JS_CallFunctionName(cx, global, "check",
JS::HandleValueArray::empty(), &rval));
CHECK(profilingStack.stackPointer == 0);
CHECK(cx->runtime()->geckoProfiler().stringsCount() == cnt);
CHECK(peakStackPointer >= 8);
}
reset(cx);
{
JS::RootedValue rval(cx); /* Make sure the stack resets and we have an entry for each stack */ bool ok = JS_CallFunctionName(cx, global, "check2",
JS::HandleValueArray::empty(), &rval);
CHECK(!ok);
CHECK(profilingStack.stackPointer == 0);
CHECK(cx->runtime()->geckoProfiler().stringsCount() == 1);
EXEC("function b(p) { p.test_fn(); }");
EXEC("function a() { var p = new Prof(); p.enable(); b(p); }");
reset(cx);
js::EnableContextProfilingStack(cx, false);
{ /* enable it in the middle of JS and make sure things check out */
JS::RootedValue rval(cx);
JS_CallFunctionName(cx, global, "a", JS::HandleValueArray::empty(), &rval);
CHECK(profilingStack.stackPointer == 0);
CHECK(peakStackPointer >= 1);
CHECK(cx->runtime()->geckoProfiler().stringsCount() == 1);
}
EXEC("function d(p) { p.disable(); }");
EXEC("function c() { var p = new Prof(); d(p); }");
reset(cx);
{ /* now disable in the middle of js */
JS::RootedValue rval(cx);
JS_CallFunctionName(cx, global, "c", JS::HandleValueArray::empty(), &rval);
CHECK(profilingStack.stackPointer == 0);
}
EXEC("function e() { var p = new Prof(); d(p); p.enable(); b(p); }");
reset(cx);
{ /* now disable in the middle of js, but re-enable before final exit */
JS::RootedValue rval(cx);
JS_CallFunctionName(cx, global, "e", JS::HandleValueArray::empty(), &rval);
CHECK(profilingStack.stackPointer == 0);
CHECK(peakStackPointer >= 3);
}
EXEC("function h() { }");
EXEC("function g(p) { p.disable(); for (var i = 0; i < 100; i++) i++; }");
EXEC("function f() { g(new Prof()); }");
reset(cx);
cx->runtime()->geckoProfiler().enableSlowAssertions(false);
{
JS::RootedValue rval(cx); /* disable, and make sure that if we try to re-enter the JIT the pop
* will still happen */
JS_CallFunctionName(cx, global, "f", JS::HandleValueArray::empty(), &rval);
CHECK(profilingStack.stackPointer == 0);
} returntrue;
}
END_TEST(testProfileStrings_worksWhenEnabledOnTheFly)
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.