From bd55524b78b2f0dc54d58371ac1592ff59e4aac0 Mon Sep 17 00:00:00 2001 From: Hannes Verschore Date: Thu, 20 Nov 2014 17:44:02 +0100 Subject: [PATCH] Bug 1072906 - TraceLogger: Part 2: Improve the interface to setup the tracelogger, r=bbouvier --- js/src/moz.build | 1 + js/src/vm/Debugger.cpp | 64 ++++++++++++++++++++++++++++----- js/src/vm/Debugger.h | 2 +- js/src/vm/TraceLoggingTypes.cpp | 20 +++++++++++ js/src/vm/TraceLoggingTypes.h | 4 +++ 5 files changed, 82 insertions(+), 9 deletions(-) create mode 100644 js/src/vm/TraceLoggingTypes.cpp diff --git a/js/src/moz.build b/js/src/moz.build index 16cbc8fcab1..da90a9494cd 100644 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -313,6 +313,7 @@ if CONFIG['ENABLE_TRACE_LOGGING']: SOURCES += [ 'vm/TraceLogging.cpp', 'vm/TraceLoggingGraph.cpp', + 'vm/TraceLoggingTypes.cpp', ] if not CONFIG['ENABLE_ION']: diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index 96d392a9de0..a0f770104ec 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -3772,20 +3772,68 @@ Debugger::makeGlobalObjectReference(JSContext *cx, unsigned argc, Value *vp) } bool -Debugger::enableTraceItem(JSContext *cx, unsigned argc, Value *vp) +Debugger::setupTraceLogger(JSContext *cx, unsigned argc, Value *vp) { - THIS_DEBUGGER(cx, argc, vp, "enableTraceItem", args, dbg); - if (!args.requireAtLeast(cx, "Debugger.enableTraceItem", 1)) + THIS_DEBUGGER(cx, argc, vp, "setupTraceLogger", args, dbg); + if (!args.requireAtLeast(cx, "Debugger.setupTraceLogger", 1)) return false; - uint32_t id = args[0].toInt32(); + RootedObject obj(cx, ToObject(cx, args[0])); + if (!obj) + return false; - if (!TLTextIdIsToggable(id)) { - args.rval().setBoolean(false); + AutoIdVector ids(cx); + if (!GetPropertyKeys(cx, obj, JSITER_OWNONLY, &ids)) + return false; + + if (ids.length() == 0) { + args.rval().setBoolean(true); return true; } - TraceLogEnableTextId(cx, id); + Vector textIds(cx); + if (!textIds.reserve(ids.length())) + return false; + + Vector values(cx); + if (!values.reserve(ids.length())) + return false; + + for (size_t i = 0; i < ids.length(); i++) { + if (!JSID_IS_STRING(ids[i])) { + args.rval().setBoolean(false); + return true; + } + + JSString *id = JSID_TO_STRING(ids[i]); + JSLinearString *linear = id->ensureLinear(cx); + if (!linear) + return false; + + uint32_t textId = TLStringToTextId(linear); + + if (!TLTextIdIsToggable(textId)) { + args.rval().setBoolean(false); + return true; + } + + RootedValue v(cx); + if (!JSObject::getGeneric(cx, obj, obj, ids[i], &v)) + return false; + + textIds.append(textId); + values.append(ToBoolean(v)); + } + + MOZ_ASSERT(ids.length() == textIds.length()); + MOZ_ASSERT(textIds.length() == values.length()); + + for (size_t i = 0; i < textIds.length(); i++) { + if (values[i]) + TraceLogEnableTextId(cx, textIds[i]); + else + TraceLogDisableTextId(cx, textIds[i]); + } args.rval().setBoolean(true); return true; @@ -3820,7 +3868,7 @@ const JSFunctionSpec Debugger::methods[] = { JS_FN("findObjects", Debugger::findObjects, 1, 0), JS_FN("findAllGlobals", Debugger::findAllGlobals, 0, 0), JS_FN("makeGlobalObjectReference", Debugger::makeGlobalObjectReference, 1, 0), - JS_FN("enableTraceItem", Debugger::enableTraceItem, 1, 0), + JS_FN("setupTraceLogger", Debugger::setupTraceLogger, 1, 0), JS_FS_END }; diff --git a/js/src/vm/Debugger.h b/js/src/vm/Debugger.h index 0e8340d2687..d7869e7aefd 100644 --- a/js/src/vm/Debugger.h +++ b/js/src/vm/Debugger.h @@ -394,7 +394,7 @@ class Debugger : private mozilla::LinkedListElement static bool findObjects(JSContext *cx, unsigned argc, Value *vp); static bool findAllGlobals(JSContext *cx, unsigned argc, Value *vp); static bool makeGlobalObjectReference(JSContext *cx, unsigned argc, Value *vp); - static bool enableTraceItem(JSContext *cx, unsigned argc, Value *vp); + static bool setupTraceLogger(JSContext *cx, unsigned argc, Value *vp); static bool construct(JSContext *cx, unsigned argc, Value *vp); static const JSPropertySpec properties[]; static const JSFunctionSpec methods[]; diff --git a/js/src/vm/TraceLoggingTypes.cpp b/js/src/vm/TraceLoggingTypes.cpp new file mode 100644 index 00000000000..8fd42e737ec --- /dev/null +++ b/js/src/vm/TraceLoggingTypes.cpp @@ -0,0 +1,20 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + * 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/. */ + +#include "vm/TraceLoggingTypes.h" + +class JSLinearString; + +uint32_t +TLStringToTextId(JSLinearString *str) +{ +#define NAME(textId) if (js::StringEqualsAscii(str, #textId)) return TraceLogger_ ## textId; + TRACELOGGER_TREE_ITEMS(NAME) + TRACELOGGER_LOG_ITEMS(NAME) +#undef NAME + return TraceLogger_Error; +} + diff --git a/js/src/vm/TraceLoggingTypes.h b/js/src/vm/TraceLoggingTypes.h index 4c8ac0ed920..d9253d2d5d0 100644 --- a/js/src/vm/TraceLoggingTypes.h +++ b/js/src/vm/TraceLoggingTypes.h @@ -8,6 +8,7 @@ #define TraceLoggingTypes_h #include "jsalloc.h" +#include "jsstr.h" #define TRACELOGGER_TREE_ITEMS(_) \ _(Baseline) \ @@ -88,6 +89,9 @@ TLTextIdString(TraceLoggerTextId id) } } +uint32_t +TLStringToTextId(JSLinearString *str); + inline bool TLTextIdIsToggable(uint32_t id) {