зеркало из https://github.com/mozilla/gecko-dev.git
Merge autoland to m-c on a CLOSED TREE. a=merge
This commit is contained in:
Коммит
75888fe1aa
|
@ -39,12 +39,16 @@ extensions.registerSchemaAPI("windows", "addon_parent", context => {
|
|||
let lastOnFocusChangedWindowId;
|
||||
|
||||
let listener = event => {
|
||||
let window = WindowManager.topWindow;
|
||||
let windowId = window ? WindowManager.getId(window) : WindowManager.WINDOW_ID_NONE;
|
||||
if (windowId !== lastOnFocusChangedWindowId) {
|
||||
fire(windowId);
|
||||
lastOnFocusChangedWindowId = windowId;
|
||||
}
|
||||
// Wait a tick to avoid firing a superfluous WINDOW_ID_NONE
|
||||
// event when switching focus between two Firefox windows.
|
||||
Promise.resolve().then(() => {
|
||||
let window = Services.focus.activeWindow;
|
||||
let windowId = window ? WindowManager.getId(window) : WindowManager.WINDOW_ID_NONE;
|
||||
if (windowId !== lastOnFocusChangedWindowId) {
|
||||
fire(windowId);
|
||||
lastOnFocusChangedWindowId = windowId;
|
||||
}
|
||||
});
|
||||
};
|
||||
AllWindowEvents.addListener("focus", listener);
|
||||
AllWindowEvents.addListener("blur", listener);
|
||||
|
|
|
@ -16,10 +16,15 @@ add_task(function* testWindowsEvents() {
|
|||
browser.test.sendMessage("window-created", window.id);
|
||||
});
|
||||
|
||||
let lastWindowId;
|
||||
let lastWindowId, os;
|
||||
browser.windows.onFocusChanged.addListener(function listener(windowId) {
|
||||
browser.test.log(`onFocusChange: windowId=${windowId} lastWindowId=${lastWindowId}`);
|
||||
|
||||
if (windowId === browser.windows.WINDOW_ID_NONE && os === "linux") {
|
||||
browser.test.log("Ignoring a superfluous WINDOW_ID_NONE (blur) event on Linux");
|
||||
return;
|
||||
}
|
||||
|
||||
browser.test.assertTrue(lastWindowId !== windowId,
|
||||
"onFocusChanged fired once for the given window");
|
||||
lastWindowId = windowId;
|
||||
|
@ -43,7 +48,10 @@ add_task(function* testWindowsEvents() {
|
|||
browser.test.notifyPass("windows.events");
|
||||
});
|
||||
|
||||
browser.test.sendMessage("ready");
|
||||
browser.runtime.getPlatformInfo(info => {
|
||||
os = info.os;
|
||||
browser.test.sendMessage("ready");
|
||||
});
|
||||
}
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
|
|
|
@ -154,8 +154,8 @@ inline void SetPendingExceptionASCII(JSContext *cx, const char *aMsg)
|
|||
|
||||
inline void SetPendingException(JSContext *cx, const char16_t *aMsg)
|
||||
{
|
||||
// FIXME: Need to convert to UTF-8 (bug XXX).
|
||||
JS_ReportErrorLatin1(cx, "%hs", aMsg);
|
||||
NS_ConvertUTF16toUTF8 msg(aMsg);
|
||||
JS_ReportErrorUTF8(cx, "%s", msg.get());
|
||||
}
|
||||
|
||||
// Helper class to get stuff from the ClassInfo and not waste extra time with
|
||||
|
|
|
@ -48,8 +48,9 @@ skip-if = os == "linux" && !debug # Bug 1227792
|
|||
[browser_animation_timeline_currentTime.js]
|
||||
[browser_animation_timeline_header.js]
|
||||
[browser_animation_timeline_iterationStart.js]
|
||||
[browser_animation_timeline_pause_button.js]
|
||||
skip-if = os == "linux" && bits == 32 # Bug 1220974
|
||||
[browser_animation_timeline_pause_button_01.js]
|
||||
[browser_animation_timeline_pause_button_02.js]
|
||||
[browser_animation_timeline_pause_button_03.js]
|
||||
[browser_animation_timeline_rate_selector.js]
|
||||
[browser_animation_timeline_rewind_button.js]
|
||||
[browser_animation_timeline_scrubber_exists.js]
|
||||
|
|
|
@ -1,110 +0,0 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
requestLongerTimeout(2);
|
||||
|
||||
// Check that the timeline toolbar contains a pause button and that this pause
|
||||
// button can be clicked. Check that when it is, the current animations
|
||||
// displayed in the timeline get their playstates changed accordingly, and check
|
||||
// that the scrubber resumes/stops moving.
|
||||
// Also checks that the button goes to the right state when the scrubber has
|
||||
// reached the end of the timeline: continues to be in playing mode for infinite
|
||||
// animations, goes to paused mode otherwise.
|
||||
// And test that clicking the button once the scrubber has reached the end of
|
||||
// the timeline does the right thing.
|
||||
|
||||
add_task(function* () {
|
||||
yield addTab(URL_ROOT + "doc_simple_animation.html");
|
||||
|
||||
let {panel, inspector} = yield openAnimationInspector();
|
||||
let timeline = panel.animationsTimelineComponent;
|
||||
let btn = panel.playTimelineButtonEl;
|
||||
|
||||
ok(btn, "The play/pause button exists");
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"The play/pause button is in its playing state");
|
||||
|
||||
info("Click on the button to pause all timeline animations");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(btn.classList.contains("paused"),
|
||||
"The play/pause button is in its paused state");
|
||||
yield assertScrubberMoving(panel, false);
|
||||
|
||||
info("Click again on the button to play all timeline animations");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"The play/pause button is in its playing state again");
|
||||
yield assertScrubberMoving(panel, true);
|
||||
|
||||
// Some animations on the test page are infinite, so the scrubber won't stop
|
||||
// at the end of the timeline, and the button should remain in play mode.
|
||||
info("Select an infinite animation, reload the page and wait for the " +
|
||||
"animation to complete");
|
||||
yield selectNodeAndWaitForAnimations(".multi", inspector);
|
||||
yield reloadTab(inspector);
|
||||
yield waitForOutOfBoundScrubber(timeline);
|
||||
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"The button is in its playing state still, animations are infinite.");
|
||||
yield assertScrubberMoving(panel, true);
|
||||
|
||||
info("Click on the button after the scrubber has moved out of bounds");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(btn.classList.contains("paused"),
|
||||
"The button can be paused after the scrubber has moved out of bounds");
|
||||
yield assertScrubberMoving(panel, false);
|
||||
|
||||
// For a finite animation though, once the scrubber reaches the end of the
|
||||
// timeline, it should go back to paused mode.
|
||||
info("Select a finite animation, reload the page and wait for the " +
|
||||
"animation to complete");
|
||||
yield selectNodeAndWaitForAnimations(".negative-delay", inspector);
|
||||
|
||||
let onScrubberStopped = waitForScrubberStopped(timeline);
|
||||
yield reloadTab(inspector);
|
||||
yield onScrubberStopped;
|
||||
|
||||
ok(btn.classList.contains("paused"),
|
||||
"The button is in paused state once finite animations are done");
|
||||
yield assertScrubberMoving(panel, false);
|
||||
|
||||
info("Click again on the button to play the animation from the start again");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"Clicking the button once finite animations are done should restart them");
|
||||
yield assertScrubberMoving(panel, true);
|
||||
});
|
||||
|
||||
function waitForOutOfBoundScrubber({win, scrubberEl}) {
|
||||
return new Promise(resolve => {
|
||||
function check() {
|
||||
let pos = scrubberEl.getBoxQuads()[0].bounds.right;
|
||||
let width = win.document.documentElement.offsetWidth;
|
||||
if (pos >= width) {
|
||||
setTimeout(resolve, 50);
|
||||
} else {
|
||||
setTimeout(check, 50);
|
||||
}
|
||||
}
|
||||
check();
|
||||
});
|
||||
}
|
||||
|
||||
function waitForScrubberStopped(timeline) {
|
||||
return new Promise(resolve => {
|
||||
timeline.on("timeline-data-changed",
|
||||
function onTimelineData(e, {isMoving}) {
|
||||
if (!isMoving) {
|
||||
timeline.off("timeline-data-changed", onTimelineData);
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
requestLongerTimeout(2);
|
||||
|
||||
// Check that the timeline toolbar contains a pause button and that this pause button can
|
||||
// be clicked. Check that when it is, the button changes state and the scrubber stops and
|
||||
// resumes.
|
||||
|
||||
add_task(function* () {
|
||||
yield addTab(URL_ROOT + "doc_simple_animation.html");
|
||||
|
||||
let {panel} = yield openAnimationInspector();
|
||||
let btn = panel.playTimelineButtonEl;
|
||||
|
||||
ok(btn, "The play/pause button exists");
|
||||
ok(!btn.classList.contains("paused"), "The play/pause button is in its playing state");
|
||||
|
||||
info("Click on the button to pause all timeline animations");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(btn.classList.contains("paused"), "The play/pause button is in its paused state");
|
||||
yield assertScrubberMoving(panel, false);
|
||||
|
||||
info("Click again on the button to play all timeline animations");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"The play/pause button is in its playing state again");
|
||||
yield assertScrubberMoving(panel, true);
|
||||
});
|
|
@ -0,0 +1,48 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
requestLongerTimeout(2);
|
||||
|
||||
// Checks that the play/pause button goes to the right state when the scrubber has reached
|
||||
// the end of the timeline but there are infinite animations playing.
|
||||
|
||||
add_task(function* () {
|
||||
yield addTab(URL_ROOT + "doc_simple_animation.html");
|
||||
|
||||
let {panel, inspector} = yield openAnimationInspector();
|
||||
let timeline = panel.animationsTimelineComponent;
|
||||
let btn = panel.playTimelineButtonEl;
|
||||
|
||||
info("Select an infinite animation and wait for the scrubber to reach the end");
|
||||
yield selectNodeAndWaitForAnimations(".multi", inspector);
|
||||
yield waitForOutOfBoundScrubber(timeline);
|
||||
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"The button is in its playing state still, animations are infinite.");
|
||||
yield assertScrubberMoving(panel, true);
|
||||
|
||||
info("Click on the button after the scrubber has moved out of bounds");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(btn.classList.contains("paused"),
|
||||
"The button can be paused after the scrubber has moved out of bounds");
|
||||
yield assertScrubberMoving(panel, false);
|
||||
});
|
||||
|
||||
function waitForOutOfBoundScrubber({win, scrubberEl}) {
|
||||
return new Promise(resolve => {
|
||||
function check() {
|
||||
let pos = scrubberEl.getBoxQuads()[0].bounds.right;
|
||||
let width = win.document.documentElement.offsetWidth;
|
||||
if (pos >= width) {
|
||||
setTimeout(resolve, 50);
|
||||
} else {
|
||||
setTimeout(check, 50);
|
||||
}
|
||||
}
|
||||
check();
|
||||
});
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
requestLongerTimeout(2);
|
||||
|
||||
// Also checks that the button goes to the right state when the scrubber has
|
||||
// reached the end of the timeline: continues to be in playing mode for infinite
|
||||
// animations, goes to paused mode otherwise.
|
||||
// And test that clicking the button once the scrubber has reached the end of
|
||||
// the timeline does the right thing.
|
||||
|
||||
add_task(function* () {
|
||||
yield addTab(URL_ROOT + "doc_simple_animation.html");
|
||||
|
||||
let {panel, inspector} = yield openAnimationInspector();
|
||||
let timeline = panel.animationsTimelineComponent;
|
||||
let btn = panel.playTimelineButtonEl;
|
||||
|
||||
// For a finite animation, once the scrubber reaches the end of the timeline, the pause
|
||||
// button should go back to paused mode.
|
||||
info("Select a finite animation and wait for the animation to complete");
|
||||
yield selectNodeAndWaitForAnimations(".negative-delay", inspector);
|
||||
|
||||
let onScrubberStopped = waitForScrubberStopped(timeline);
|
||||
// The page is reloaded to avoid missing the animation.
|
||||
yield reloadTab(inspector);
|
||||
yield onScrubberStopped;
|
||||
|
||||
ok(btn.classList.contains("paused"),
|
||||
"The button is in paused state once finite animations are done");
|
||||
yield assertScrubberMoving(panel, false);
|
||||
|
||||
info("Click again on the button to play the animation from the start again");
|
||||
yield clickTimelinePlayPauseButton(panel);
|
||||
|
||||
ok(!btn.classList.contains("paused"),
|
||||
"Clicking the button once finite animations are done should restart them");
|
||||
yield assertScrubberMoving(panel, true);
|
||||
});
|
||||
|
||||
function waitForScrubberStopped(timeline) {
|
||||
return new Promise(resolve => {
|
||||
timeline.on("timeline-data-changed",
|
||||
function onTimelineData(e, {isMoving}) {
|
||||
if (!isMoving) {
|
||||
timeline.off("timeline-data-changed", onTimelineData);
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
|
@ -105,24 +105,6 @@ window {
|
|||
flex: unset;
|
||||
}
|
||||
|
||||
/* TODO: bug 1265759: should apply to .devtools-searchinput once all searchbox
|
||||
is converted to html*/
|
||||
#inspector-searchbox {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* Make sure the text is vertically centered in Inspector's
|
||||
search box. This can be removed when the search box is
|
||||
switched to HTML.
|
||||
See also: https://bugzilla.mozilla.org/show_bug.cgi?id=1265759 */
|
||||
.theme-dark #inspector-searchbox,
|
||||
.theme-light #inspector-searchbox {
|
||||
line-height: 19px;
|
||||
}
|
||||
.theme-firebug #inspector-searchbox {
|
||||
line-height: 17px;
|
||||
}
|
||||
|
||||
/* Eyedropper toolbar button */
|
||||
|
||||
#inspector-eyedropper-toggle {
|
||||
|
|
|
@ -638,7 +638,7 @@ ThrowJSExceptionASCII(JSContext *cx, const char *message)
|
|||
|
||||
PopException();
|
||||
} else {
|
||||
::JS_ReportErrorASCII(cx, message);
|
||||
::JS_ReportErrorASCII(cx, "%s", message);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2250,7 +2250,7 @@ class MOZ_STACK_CLASS ModuleValidator
|
|||
return false;
|
||||
}
|
||||
|
||||
bool failfOffset(uint32_t offset, const char* fmt, ...) {
|
||||
bool failfOffset(uint32_t offset, const char* fmt, ...) MOZ_FORMAT_PRINTF(3, 4) {
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
failfVAOffset(offset, fmt, ap);
|
||||
|
@ -2258,7 +2258,7 @@ class MOZ_STACK_CLASS ModuleValidator
|
|||
return false;
|
||||
}
|
||||
|
||||
bool failf(ParseNode* pn, const char* fmt, ...) {
|
||||
bool failf(ParseNode* pn, const char* fmt, ...) MOZ_FORMAT_PRINTF(3, 4) {
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
failfVAOffset(pn->pn_pos.begin, fmt, ap);
|
||||
|
@ -2944,7 +2944,7 @@ class MOZ_STACK_CLASS FunctionValidator
|
|||
return m_.fail(pn, str);
|
||||
}
|
||||
|
||||
bool failf(ParseNode* pn, const char* fmt, ...) {
|
||||
bool failf(ParseNode* pn, const char* fmt, ...) MOZ_FORMAT_PRINTF(3, 4) {
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
m_.failfVAOffset(pn->pn_pos.begin, fmt, ap);
|
||||
|
@ -4720,7 +4720,8 @@ static bool
|
|||
CheckSignatureAgainstExisting(ModuleValidator& m, ParseNode* usepn, const Sig& sig, const Sig& existing)
|
||||
{
|
||||
if (sig.args().length() != existing.args().length()) {
|
||||
return m.failf(usepn, "incompatible number of arguments (%u here vs. %u before)",
|
||||
return m.failf(usepn, "incompatible number of arguments (%" PRIuSIZE
|
||||
" here vs. %" PRIuSIZE " before)",
|
||||
sig.args().length(), existing.args().length());
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,8 @@ Decoder::fail(const char* msg, ...) {
|
|||
bool
|
||||
Decoder::fail(UniqueChars msg) {
|
||||
MOZ_ASSERT(error_);
|
||||
UniqueChars strWithOffset(JS_smprintf("at offset %zu: %s", currentOffset(), msg.get()));
|
||||
UniqueChars strWithOffset(JS_smprintf("at offset %" PRIuSIZE ": %s",
|
||||
currentOffset(), msg.get()));
|
||||
if (!strWithOffset)
|
||||
return false;
|
||||
|
||||
|
@ -57,7 +58,7 @@ wasm::DecodePreamble(Decoder& d)
|
|||
return d.fail("failed to match magic number");
|
||||
|
||||
if (!d.readFixedU32(&u32) || u32 != EncodingVersion)
|
||||
return d.fail("binary version 0x%lx does not match expected version 0x%lx",
|
||||
return d.fail("binary version 0x%" PRIx32 " does not match expected version 0x%" PRIx32,
|
||||
u32, EncodingVersion);
|
||||
|
||||
return true;
|
||||
|
@ -151,7 +152,7 @@ wasm::DecodeLimits(Decoder& d, Limits* limits)
|
|||
// TODO (bug 1310149): tighten this check (s/3/1) when the AngryBots demo
|
||||
// gets updated.
|
||||
if (flags & ~uint32_t(0x3))
|
||||
return d.fail("unexpected bits set in flags: %lu", (flags & ~uint32_t(0x3)));
|
||||
return d.fail("unexpected bits set in flags: %" PRIu32, (flags & ~uint32_t(0x3)));
|
||||
|
||||
if (!d.readVarU32(&limits->initial))
|
||||
return d.fail("expected initial length");
|
||||
|
@ -163,7 +164,7 @@ wasm::DecodeLimits(Decoder& d, Limits* limits)
|
|||
|
||||
if (limits->initial > maximum) {
|
||||
return d.fail("memory size minimum must not be greater than maximum; "
|
||||
"maximum length %lu is less than initial length %lu",
|
||||
"maximum length %" PRIu32 " is less than initial length %" PRIu32 ,
|
||||
maximum, limits->initial);
|
||||
}
|
||||
|
||||
|
|
|
@ -778,7 +778,7 @@ class Decoder
|
|||
error_(error)
|
||||
{}
|
||||
|
||||
bool fail(const char* msg, ...);
|
||||
bool fail(const char* msg, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
bool fail(UniqueChars msg);
|
||||
void clearError() {
|
||||
if (error_)
|
||||
|
|
|
@ -725,7 +725,7 @@ template <typename Policy>
|
|||
bool
|
||||
ExprIter<Policy>::fail(const char* msg)
|
||||
{
|
||||
return d_.fail(msg);
|
||||
return d_.fail("%s", msg);
|
||||
}
|
||||
|
||||
template <typename Policy>
|
||||
|
|
|
@ -796,8 +796,10 @@ Code::ensureProfilingState(JSContext* cx, bool newProfilingEnabled)
|
|||
if (!name.append('\0'))
|
||||
return false;
|
||||
|
||||
UniqueChars label(JS_smprintf("%hs (%s:%u)",
|
||||
name.begin(),
|
||||
TwoByteChars chars(name.begin(), name.length());
|
||||
UniqueChars utf8Name(JS::CharsToNewUTF8CharsZ(nullptr, chars).c_str());
|
||||
UniqueChars label(JS_smprintf("%s (%s:%u)",
|
||||
utf8Name.get(),
|
||||
metadata_->filename.get(),
|
||||
codeRange.funcLineOrBytecode()));
|
||||
if (!label) {
|
||||
|
|
|
@ -1488,7 +1488,7 @@ struct WasmParseContext
|
|||
{}
|
||||
|
||||
bool fail(const char* message) {
|
||||
error->reset(JS_smprintf(message));
|
||||
error->reset(js_strdup(message));
|
||||
return false;
|
||||
}
|
||||
~WasmParseContext() {
|
||||
|
@ -3336,12 +3336,9 @@ class Resolver
|
|||
return false;
|
||||
}
|
||||
bool failResolveLabel(const char* kind, AstName name) {
|
||||
Vector<char16_t, 0, SystemAllocPolicy> nameWithNull;
|
||||
if (!nameWithNull.append(name.begin(), name.length()))
|
||||
return false;
|
||||
if (!nameWithNull.append(0))
|
||||
return false;
|
||||
error_->reset(JS_smprintf("%s label '%hs' not found", kind, nameWithNull.begin()));
|
||||
TwoByteChars chars(name.begin(), name.length());
|
||||
UniqueChars utf8Chars(CharsToNewUTF8CharsZ(nullptr, chars).c_str());
|
||||
error_->reset(JS_smprintf("%s label '%s' not found", kind, utf8Chars.get()));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,9 +41,7 @@ static char gLastError[2000];
|
|||
|
||||
#if defined(__APPLE__) || defined(__linux__) || defined(MOZ_CALLGRIND)
|
||||
static void
|
||||
#ifdef __GNUC__
|
||||
__attribute__((format(printf,1,2)))
|
||||
#endif
|
||||
MOZ_FORMAT_PRINTF(1, 2)
|
||||
UnsafeError(const char* format, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
|
|
@ -165,6 +165,7 @@ Array<Array<uint64_t, MaxLifetimeBins>, MaxClasses> finalizedHeapObjectCountByCl
|
|||
std::vector<Array<Array<uint64_t, MaxLifetimeBins>, HeapKinds> > objectCountByTypeHeapAndLifetime;
|
||||
|
||||
static void
|
||||
MOZ_FORMAT_PRINTF(1, 2)
|
||||
die(const char* format, ...)
|
||||
{
|
||||
va_list va;
|
||||
|
|
|
@ -535,7 +535,7 @@ CheckHeapTracer::check(AutoLockForExclusiveAccess& lock)
|
|||
return;
|
||||
|
||||
if (failures) {
|
||||
fprintf(stderr, "Heap check: %zu failure(s) out of %" PRIu32 " pointers checked\n",
|
||||
fprintf(stderr, "Heap check: %" PRIuSIZE " failure(s) out of %" PRIu32 " pointers checked\n",
|
||||
failures, visited.count());
|
||||
}
|
||||
MOZ_RELEASE_ASSERT(failures == 0);
|
||||
|
|
|
@ -1872,7 +1872,7 @@ irregexp::CompilePattern(JSContext* cx, RegExpShared* shared, RegExpCompileData*
|
|||
Analysis analysis(cx, ignore_case, is_ascii, unicode);
|
||||
analysis.EnsureAnalyzed(node);
|
||||
if (analysis.has_failed()) {
|
||||
JS_ReportErrorASCII(cx, analysis.errorMessage());
|
||||
JS_ReportErrorASCII(cx, "%s", analysis.errorMessage());
|
||||
return RegExpCode();
|
||||
}
|
||||
|
||||
|
|
|
@ -1245,7 +1245,7 @@ bool
|
|||
BacktrackingAllocator::processBundle(MIRGenerator* mir, LiveBundle* bundle)
|
||||
{
|
||||
if (JitSpewEnabled(JitSpew_RegAlloc)) {
|
||||
JitSpew(JitSpew_RegAlloc, "Allocating %s [priority %lu] [weight %lu]",
|
||||
JitSpew(JitSpew_RegAlloc, "Allocating %s [priority %" PRIuSIZE "] [weight %" PRIuSIZE "]",
|
||||
bundle->toString().get(), computePriority(bundle), computeSpillWeight(bundle));
|
||||
}
|
||||
|
||||
|
@ -1437,13 +1437,13 @@ BacktrackingAllocator::tryAllocateRegister(PhysicalRegister& r, LiveBundle* bund
|
|||
if (JitSpewEnabled(JitSpew_RegAlloc)) {
|
||||
if (aliasedConflicting.length() == 1) {
|
||||
LiveBundle* existing = aliasedConflicting[0];
|
||||
JitSpew(JitSpew_RegAlloc, " %s collides with %s [weight %lu]",
|
||||
JitSpew(JitSpew_RegAlloc, " %s collides with %s [weight %" PRIuSIZE "]",
|
||||
r.reg.name(), existing->toString().get(), computeSpillWeight(existing));
|
||||
} else {
|
||||
JitSpew(JitSpew_RegAlloc, " %s collides with the following", r.reg.name());
|
||||
for (size_t i = 0; i < aliasedConflicting.length(); i++) {
|
||||
LiveBundle* existing = aliasedConflicting[i];
|
||||
JitSpew(JitSpew_RegAlloc, " %s [weight %lu]",
|
||||
JitSpew(JitSpew_RegAlloc, " %s [weight %" PRIuSIZE "]",
|
||||
existing->toString().get(), computeSpillWeight(existing));
|
||||
}
|
||||
}
|
||||
|
@ -1482,7 +1482,7 @@ bool
|
|||
BacktrackingAllocator::evictBundle(LiveBundle* bundle)
|
||||
{
|
||||
if (JitSpewEnabled(JitSpew_RegAlloc)) {
|
||||
JitSpew(JitSpew_RegAlloc, " Evicting %s [priority %lu] [weight %lu]",
|
||||
JitSpew(JitSpew_RegAlloc, " Evicting %s [priority %" PRIuSIZE "] [weight %" PRIuSIZE "]",
|
||||
bundle->toString().get(), computePriority(bundle), computeSpillWeight(bundle));
|
||||
}
|
||||
|
||||
|
@ -2296,7 +2296,8 @@ LiveBundle::toString() const
|
|||
{
|
||||
AutoEnterOOMUnsafeRegion oomUnsafe;
|
||||
|
||||
char *buf = JS_smprintf("");
|
||||
// Suppress -Wformat warning.
|
||||
char *buf = JS_smprintf("%s", "");
|
||||
|
||||
for (LiveRange::BundleLinkIterator iter = rangesBegin(); buf && iter; iter++) {
|
||||
buf = JS_sprintf_append(buf, "%s %s",
|
||||
|
|
|
@ -230,11 +230,11 @@ struct BaselineStackBuilder
|
|||
if (info) {
|
||||
if (sizeof(size_t) == 4) {
|
||||
JitSpew(JitSpew_BaselineBailouts,
|
||||
" WRITE_WRD %p/%p %-15s %08x",
|
||||
" WRITE_WRD %p/%p %-15s %08" PRIxSIZE,
|
||||
header_->copyStackBottom, virtualPointerAtStackOffset(0), info, w);
|
||||
} else {
|
||||
JitSpew(JitSpew_BaselineBailouts,
|
||||
" WRITE_WRD %p/%p %-15s %016llx",
|
||||
" WRITE_WRD %p/%p %-15s %016" PRIxSIZE,
|
||||
header_->copyStackBottom, virtualPointerAtStackOffset(0), info, w);
|
||||
}
|
||||
}
|
||||
|
@ -246,7 +246,7 @@ struct BaselineStackBuilder
|
|||
return false;
|
||||
if (info) {
|
||||
JitSpew(JitSpew_BaselineBailouts,
|
||||
" WRITE_VAL %p/%p %-15s %016llx",
|
||||
" WRITE_VAL %p/%p %-15s %016" PRIx64,
|
||||
header_->copyStackBottom, virtualPointerAtStackOffset(0), info,
|
||||
*((uint64_t*) &val));
|
||||
}
|
||||
|
@ -637,7 +637,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC,
|
|||
// | ReturnAddr | <-- return into main jitcode after IC
|
||||
// +===============+
|
||||
|
||||
JitSpew(JitSpew_BaselineBailouts, " Unpacking %s:%d", script->filename(), script->lineno());
|
||||
JitSpew(JitSpew_BaselineBailouts, " Unpacking %s:%" PRIuSIZE, script->filename(), script->lineno());
|
||||
JitSpew(JitSpew_BaselineBailouts, " [BASELINE-JS FRAME]");
|
||||
|
||||
// Calculate and write the previous frame pointer value.
|
||||
|
@ -749,7 +749,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC,
|
|||
}
|
||||
JitSpew(JitSpew_BaselineBailouts, " EnvChain=%p", envChain);
|
||||
blFrame->setEnvironmentChain(envChain);
|
||||
JitSpew(JitSpew_BaselineBailouts, " ReturnValue=%016llx", *((uint64_t*) &returnValue));
|
||||
JitSpew(JitSpew_BaselineBailouts, " ReturnValue=%016" PRIx64, *((uint64_t*) &returnValue));
|
||||
blFrame->setReturnValue(returnValue);
|
||||
|
||||
// Do not need to initialize scratchValue field in BaselineFrame.
|
||||
|
@ -764,13 +764,13 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC,
|
|||
// in the calling frame.
|
||||
Value thisv = iter.read();
|
||||
JitSpew(JitSpew_BaselineBailouts, " Is function!");
|
||||
JitSpew(JitSpew_BaselineBailouts, " thisv=%016llx", *((uint64_t*) &thisv));
|
||||
JitSpew(JitSpew_BaselineBailouts, " thisv=%016" PRIx64, *((uint64_t*) &thisv));
|
||||
|
||||
size_t thisvOffset = builder.framePushed() + JitFrameLayout::offsetOfThis();
|
||||
builder.valuePointerAtStackOffset(thisvOffset).set(thisv);
|
||||
|
||||
MOZ_ASSERT(iter.numAllocations() >= CountArgSlots(script, fun));
|
||||
JitSpew(JitSpew_BaselineBailouts, " frame slots %u, nargs %u, nfixed %u",
|
||||
JitSpew(JitSpew_BaselineBailouts, " frame slots %u, nargs %" PRIuSIZE ", nfixed %" PRIuSIZE,
|
||||
iter.numAllocations(), fun->nargs(), script->nfixed());
|
||||
|
||||
if (!callerPC) {
|
||||
|
@ -786,7 +786,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC,
|
|||
|
||||
for (uint32_t i = 0; i < fun->nargs(); i++) {
|
||||
Value arg = iter.read();
|
||||
JitSpew(JitSpew_BaselineBailouts, " arg %d = %016llx",
|
||||
JitSpew(JitSpew_BaselineBailouts, " arg %d = %016" PRIx64,
|
||||
(int) i, *((uint64_t*) &arg));
|
||||
if (callerPC) {
|
||||
size_t argOffset = builder.framePushed() + JitFrameLayout::offsetOfActualArg(i);
|
||||
|
@ -1314,7 +1314,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC,
|
|||
return false;
|
||||
|
||||
// Push callee token (must be a JS Function)
|
||||
JitSpew(JitSpew_BaselineBailouts, " Callee = %016llx", callee.asRawBits());
|
||||
JitSpew(JitSpew_BaselineBailouts, " Callee = %016" PRIx64, callee.asRawBits());
|
||||
|
||||
JSFunction* calleeFun = &callee.toObject().as<JSFunction>();
|
||||
if (!builder.writePtr(CalleeToToken(calleeFun, JSOp(*pc) == JSOP_NEW), "CalleeToken"))
|
||||
|
@ -1494,7 +1494,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter
|
|||
// | ||||| |
|
||||
// +---------------+
|
||||
|
||||
JitSpew(JitSpew_BaselineBailouts, "Bailing to baseline %s:%u (IonScript=%p) (FrameType=%d)",
|
||||
JitSpew(JitSpew_BaselineBailouts, "Bailing to baseline %s:%" PRIuSIZE " (IonScript=%p) (FrameType=%d)",
|
||||
iter.script()->filename(), iter.script()->lineno(), (void*) iter.ionScript(),
|
||||
(int) prevFrameType);
|
||||
|
||||
|
@ -1514,7 +1514,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter
|
|||
propagatingExceptionForDebugMode = false;
|
||||
}
|
||||
|
||||
JitSpew(JitSpew_BaselineBailouts, " Reading from snapshot offset %u size %u",
|
||||
JitSpew(JitSpew_BaselineBailouts, " Reading from snapshot offset %u size %" PRIuSIZE,
|
||||
iter.snapshotOffset(), iter.ionScript()->snapshotsListSize());
|
||||
|
||||
if (!excInfo)
|
||||
|
@ -1540,7 +1540,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter
|
|||
RootedFunction callee(cx, iter.maybeCallee());
|
||||
RootedScript scr(cx, iter.script());
|
||||
if (callee) {
|
||||
JitSpew(JitSpew_BaselineBailouts, " Callee function (%s:%u)",
|
||||
JitSpew(JitSpew_BaselineBailouts, " Callee function (%s:%" PRIuSIZE ")",
|
||||
scr->filename(), scr->lineno());
|
||||
} else {
|
||||
JitSpew(JitSpew_BaselineBailouts, " No callee!");
|
||||
|
@ -1575,7 +1575,7 @@ jit::BailoutIonToBaseline(JSContext* cx, JitActivation* activation, JitFrameIter
|
|||
TraceLogStartEvent(logger, TraceLogger_Baseline);
|
||||
}
|
||||
|
||||
JitSpew(JitSpew_BaselineBailouts, " FrameNo %d", frameNo);
|
||||
JitSpew(JitSpew_BaselineBailouts, " FrameNo %" PRIuSIZE, frameNo);
|
||||
|
||||
// If we are bailing out to a catch or finally block in this frame,
|
||||
// pass excInfo to InitFromBailout and don't unpack any other frames.
|
||||
|
@ -1671,7 +1671,7 @@ InvalidateAfterBailout(JSContext* cx, HandleScript outerScript, const char* reas
|
|||
static void
|
||||
HandleBoundsCheckFailure(JSContext* cx, HandleScript outerScript, HandleScript innerScript)
|
||||
{
|
||||
JitSpew(JitSpew_IonBailouts, "Bounds check failure %s:%d, inlined into %s:%d",
|
||||
JitSpew(JitSpew_IonBailouts, "Bounds check failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE,
|
||||
innerScript->filename(), innerScript->lineno(),
|
||||
outerScript->filename(), outerScript->lineno());
|
||||
|
||||
|
@ -1686,7 +1686,7 @@ HandleBoundsCheckFailure(JSContext* cx, HandleScript outerScript, HandleScript i
|
|||
static void
|
||||
HandleShapeGuardFailure(JSContext* cx, HandleScript outerScript, HandleScript innerScript)
|
||||
{
|
||||
JitSpew(JitSpew_IonBailouts, "Shape guard failure %s:%d, inlined into %s:%d",
|
||||
JitSpew(JitSpew_IonBailouts, "Shape guard failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE,
|
||||
innerScript->filename(), innerScript->lineno(),
|
||||
outerScript->filename(), outerScript->lineno());
|
||||
|
||||
|
@ -1701,7 +1701,7 @@ HandleShapeGuardFailure(JSContext* cx, HandleScript outerScript, HandleScript in
|
|||
static void
|
||||
HandleBaselineInfoBailout(JSContext* cx, HandleScript outerScript, HandleScript innerScript)
|
||||
{
|
||||
JitSpew(JitSpew_IonBailouts, "Baseline info failure %s:%d, inlined into %s:%d",
|
||||
JitSpew(JitSpew_IonBailouts, "Baseline info failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE,
|
||||
innerScript->filename(), innerScript->lineno(),
|
||||
outerScript->filename(), outerScript->lineno());
|
||||
|
||||
|
@ -1711,7 +1711,7 @@ HandleBaselineInfoBailout(JSContext* cx, HandleScript outerScript, HandleScript
|
|||
static void
|
||||
HandleLexicalCheckFailure(JSContext* cx, HandleScript outerScript, HandleScript innerScript)
|
||||
{
|
||||
JitSpew(JitSpew_IonBailouts, "Lexical check failure %s:%d, inlined into %s:%d",
|
||||
JitSpew(JitSpew_IonBailouts, "Lexical check failure %s:%" PRIuSIZE ", inlined into %s:%" PRIuSIZE,
|
||||
innerScript->filename(), innerScript->lineno(),
|
||||
outerScript->filename(), outerScript->lineno());
|
||||
|
||||
|
@ -1754,7 +1754,7 @@ CopyFromRematerializedFrame(JSContext* cx, JitActivation* act, uint8_t* fp, size
|
|||
frame->setHasCachedSavedFrame();
|
||||
|
||||
JitSpew(JitSpew_BaselineBailouts,
|
||||
" Copied from rematerialized frame at (%p,%u)",
|
||||
" Copied from rematerialized frame at (%p,%" PRIuSIZE ")",
|
||||
fp, inlineDepth);
|
||||
|
||||
// Propagate the debuggee frame flag. For the case where the Debugger did
|
||||
|
@ -1891,7 +1891,7 @@ jit::FinishBailoutToBaseline(BaselineBailoutInfo* bailoutInfo)
|
|||
}
|
||||
|
||||
JitSpew(JitSpew_BaselineBailouts,
|
||||
" Restored outerScript=(%s:%u,%u) innerScript=(%s:%u,%u) (bailoutKind=%u)",
|
||||
" Restored outerScript=(%s:%" PRIuSIZE ",%u) innerScript=(%s:%" PRIuSIZE ",%u) (bailoutKind=%u)",
|
||||
outerScript->filename(), outerScript->lineno(), outerScript->getWarmUpCount(),
|
||||
innerScript->filename(), innerScript->lineno(), innerScript->getWarmUpCount(),
|
||||
(unsigned) bailoutKind);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "jit/BaselineCompiler.h"
|
||||
|
||||
#include "mozilla/Casting.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include "jit/BaselineIC.h"
|
||||
#include "jit/BaselineJIT.h"
|
||||
|
@ -82,10 +83,10 @@ BaselineCompiler::addPCMappingEntry(bool addIndexEntry)
|
|||
MethodStatus
|
||||
BaselineCompiler::compile()
|
||||
{
|
||||
JitSpew(JitSpew_BaselineScripts, "Baseline compiling script %s:%d (%p)",
|
||||
JitSpew(JitSpew_BaselineScripts, "Baseline compiling script %s:%" PRIuSIZE " (%p)",
|
||||
script->filename(), script->lineno(), script);
|
||||
|
||||
JitSpew(JitSpew_Codegen, "# Emitting baseline code for script %s:%d",
|
||||
JitSpew(JitSpew_Codegen, "# Emitting baseline code for script %s:%" PRIuSIZE,
|
||||
script->filename(), script->lineno());
|
||||
|
||||
TraceLoggerThread* logger = TraceLoggerForMainThread(cx->runtime());
|
||||
|
@ -217,7 +218,7 @@ BaselineCompiler::compile()
|
|||
baselineScript->setMethod(code);
|
||||
baselineScript->setTemplateEnvironment(templateEnv);
|
||||
|
||||
JitSpew(JitSpew_BaselineScripts, "Created BaselineScript %p (raw %p) for %s:%d",
|
||||
JitSpew(JitSpew_BaselineScripts, "Created BaselineScript %p (raw %p) for %s:%" PRIuSIZE,
|
||||
(void*) baselineScript.get(), (void*) code->raw(),
|
||||
script->filename(), script->lineno());
|
||||
|
||||
|
@ -279,7 +280,7 @@ BaselineCompiler::compile()
|
|||
// Always register a native => bytecode mapping entry, since profiler can be
|
||||
// turned on with baseline jitcode on stack, and baseline jitcode cannot be invalidated.
|
||||
{
|
||||
JitSpew(JitSpew_Profiling, "Added JitcodeGlobalEntry for baseline script %s:%d (%p)",
|
||||
JitSpew(JitSpew_Profiling, "Added JitcodeGlobalEntry for baseline script %s:%" PRIuSIZE " (%p)",
|
||||
script->filename(), script->lineno(), baselineScript.get());
|
||||
|
||||
// Generate profiling string.
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "jit/BaselineDebugModeOSR.h"
|
||||
|
||||
#include "mozilla/DebugOnly.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include "jit/BaselineIC.h"
|
||||
#include "jit/JitcodeMap.h"
|
||||
|
@ -322,7 +323,7 @@ SpewPatchBaselineFrame(uint8_t* oldReturnAddress, uint8_t* newReturnAddress,
|
|||
JSScript* script, ICEntry::Kind frameKind, jsbytecode* pc)
|
||||
{
|
||||
JitSpew(JitSpew_BaselineDebugModeOSR,
|
||||
"Patch return %p -> %p on BaselineJS frame (%s:%d) from %s at %s",
|
||||
"Patch return %p -> %p on BaselineJS frame (%s:%" PRIuSIZE ") from %s at %s",
|
||||
oldReturnAddress, newReturnAddress, script->filename(), script->lineno(),
|
||||
ICEntryKindToString(frameKind), CodeName[(JSOp)*pc]);
|
||||
}
|
||||
|
@ -332,7 +333,7 @@ SpewPatchBaselineFrameFromExceptionHandler(uint8_t* oldReturnAddress, uint8_t* n
|
|||
JSScript* script, jsbytecode* pc)
|
||||
{
|
||||
JitSpew(JitSpew_BaselineDebugModeOSR,
|
||||
"Patch return %p -> %p on BaselineJS frame (%s:%d) from exception handler at %s",
|
||||
"Patch return %p -> %p on BaselineJS frame (%s:%" PRIuSIZE ") from exception handler at %s",
|
||||
oldReturnAddress, newReturnAddress, script->filename(), script->lineno(),
|
||||
CodeName[(JSOp)*pc]);
|
||||
}
|
||||
|
@ -667,7 +668,7 @@ RecompileBaselineScriptForDebugMode(JSContext* cx, JSScript* script,
|
|||
if (oldBaselineScript->hasDebugInstrumentation() == observing)
|
||||
return true;
|
||||
|
||||
JitSpew(JitSpew_BaselineDebugModeOSR, "Recompiling (%s:%d) for %s",
|
||||
JitSpew(JitSpew_BaselineDebugModeOSR, "Recompiling (%s:%" PRIuSIZE ") for %s",
|
||||
script->filename(), script->lineno(), observing ? "DEBUGGING" : "NORMAL EXECUTION");
|
||||
|
||||
script->setBaselineScript(cx->runtime(), nullptr);
|
||||
|
|
|
@ -2586,7 +2586,7 @@ DoSetElemFallback(JSContext* cx, BaselineFrame* frame, ICSetElem_Fallback* stub_
|
|||
{
|
||||
JitSpew(JitSpew_BaselineIC,
|
||||
" Generating SetElem_DenseOrUnboxedArrayAdd stub "
|
||||
"(shape=%p, group=%p, protoDepth=%u)",
|
||||
"(shape=%p, group=%p, protoDepth=%" PRIuSIZE ")",
|
||||
shape.get(), group.get(), protoDepth);
|
||||
ICSetElemDenseOrUnboxedArrayAddCompiler compiler(cx, obj, protoDepth);
|
||||
ICUpdatedStub* newStub = compiler.getStub(compiler.getStubSpace(outerScript));
|
||||
|
|
|
@ -9244,7 +9244,7 @@ CodeGenerator::generateWasm(wasm::SigIdDesc sigId, wasm::TrapOffset trapOffset,
|
|||
bool
|
||||
CodeGenerator::generate()
|
||||
{
|
||||
JitSpew(JitSpew_Codegen, "# Emitting code for script %s:%d",
|
||||
JitSpew(JitSpew_Codegen, "# Emitting code for script %s:%" PRIuSIZE,
|
||||
gen->info().script()->filename(),
|
||||
gen->info().script()->lineno());
|
||||
|
||||
|
|
|
@ -402,7 +402,7 @@ DumpImprovement(MDefinition *load, MDefinitionVector& input, MDefinitionVector&
|
|||
if (JitSpewEnabled(JitSpew_Alias)) {
|
||||
Fprinter &print = JitSpewPrinter();
|
||||
JitSpewHeader(JitSpew_Alias);
|
||||
print.printf(" Improve dependency from ", load->id());
|
||||
print.printf(" Improve dependency from %d", load->id());
|
||||
DumpStoreList(input);
|
||||
print.printf(" to ");
|
||||
DumpStoreList(output);
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
#include "jit/Ion.h"
|
||||
|
||||
#include "mozilla/IntegerPrintfMacros.h"
|
||||
#include "mozilla/MemoryReporting.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
#include "mozilla/ThreadLocal.h"
|
||||
|
@ -2136,7 +2137,7 @@ TrackIonAbort(JSContext* cx, JSScript* script, jsbytecode* pc, const char* messa
|
|||
static void
|
||||
TrackAndSpewIonAbort(JSContext* cx, JSScript* script, const char* message)
|
||||
{
|
||||
JitSpew(JitSpew_IonAbort, message);
|
||||
JitSpew(JitSpew_IonAbort, "%s", message);
|
||||
TrackIonAbort(cx, script, script->code(), message);
|
||||
}
|
||||
|
||||
|
@ -2395,7 +2396,7 @@ CheckScriptSize(JSContext* cx, JSScript* script)
|
|||
numLocalsAndArgs > MAX_MAIN_THREAD_LOCALS_AND_ARGS)
|
||||
{
|
||||
if (!OffThreadCompilationAvailable(cx)) {
|
||||
JitSpew(JitSpew_IonAbort, "Script too large (%u bytes) (%u locals/args)",
|
||||
JitSpew(JitSpew_IonAbort, "Script too large (%" PRIuSIZE " bytes) (%u locals/args)",
|
||||
script->length(), numLocalsAndArgs);
|
||||
TrackIonAbort(cx, script, script->code(), "too large");
|
||||
return Method_CantCompile;
|
||||
|
@ -3012,7 +3013,7 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool
|
|||
#ifdef JS_JITSPEW
|
||||
switch (it.type()) {
|
||||
case JitFrame_Exit:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%d exit frame @ %p", frameno, it.fp());
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " exit frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
case JitFrame_BaselineJS:
|
||||
case JitFrame_IonJS:
|
||||
|
@ -3027,26 +3028,26 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool
|
|||
else if (it.isBailoutJS())
|
||||
type = "Bailing";
|
||||
JitSpew(JitSpew_IonInvalidate,
|
||||
"#%d %s JS frame @ %p, %s:%" PRIuSIZE " (fun: %p, script: %p, pc %p)",
|
||||
"#%" PRIuSIZE " %s JS frame @ %p, %s:%" PRIuSIZE " (fun: %p, script: %p, pc %p)",
|
||||
frameno, type, it.fp(), it.script()->maybeForwardedFilename(),
|
||||
it.script()->lineno(), it.maybeCallee(), (JSScript*)it.script(),
|
||||
it.returnAddressToFp());
|
||||
break;
|
||||
}
|
||||
case JitFrame_IonStub:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%d ion stub frame @ %p", frameno, it.fp());
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " ion stub frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
case JitFrame_BaselineStub:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%d baseline stub frame @ %p", frameno, it.fp());
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " baseline stub frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
case JitFrame_Rectifier:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%d rectifier frame @ %p", frameno, it.fp());
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " rectifier frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
case JitFrame_IonAccessorIC:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%d ion IC getter/setter frame @ %p", frameno, it.fp());
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " ion IC getter/setter frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
case JitFrame_Entry:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%d entry frame @ %p", frameno, it.fp());
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " entry frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
}
|
||||
#endif // JS_JITSPEW
|
||||
|
@ -3141,7 +3142,7 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool
|
|||
CodeLocationLabel osiPatchPoint = SafepointReader::InvalidationPatchPoint(ionScript, si);
|
||||
CodeLocationLabel invalidateEpilogue(ionCode, CodeOffset(ionScript->invalidateEpilogueOffset()));
|
||||
|
||||
JitSpew(JitSpew_IonInvalidate, " ! Invalidate ionScript %p (inv count %u) -> patching osipoint %p",
|
||||
JitSpew(JitSpew_IonInvalidate, " ! Invalidate ionScript %p (inv count %" PRIuSIZE ") -> patching osipoint %p",
|
||||
ionScript, ionScript->invalidationCount(), (void*) osiPatchPoint.raw());
|
||||
Assembler::PatchWrite_NearCall(osiPatchPoint, invalidateEpilogue);
|
||||
}
|
||||
|
@ -3358,7 +3359,7 @@ AutoFlushICache::setRange(uintptr_t start, size_t len)
|
|||
AutoFlushICache* afc = TlsPerThreadData.get()->PerThreadData::autoFlushICache();
|
||||
MOZ_ASSERT(afc);
|
||||
MOZ_ASSERT(!afc->start_);
|
||||
JitSpewCont(JitSpew_CacheFlush, "(%x %x):", start, len);
|
||||
JitSpewCont(JitSpew_CacheFlush, "(%" PRIxPTR " %" PRIxSIZE "):", start, len);
|
||||
|
||||
uintptr_t stop = start + len;
|
||||
afc->start_ = start;
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include "jit/IonAnalysis.h"
|
||||
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include "jit/AliasAnalysis.h"
|
||||
#include "jit/BaselineInspector.h"
|
||||
#include "jit/BaselineJIT.h"
|
||||
|
@ -445,9 +447,10 @@ jit::PruneUnusedBranches(MIRGenerator* mir, MIRGraph& graph)
|
|||
shouldBailout = false;
|
||||
|
||||
JitSpew(JitSpew_Prune, "info: block %d,"
|
||||
" predCount: %lu, domInst: %lu, span: %lu, effectful: %lu, "
|
||||
" isLoopExit: %s, numSuccessorsOfPred: %lu."
|
||||
" (score: %lu, shouldBailout: %s)",
|
||||
" predCount: %" PRIuSIZE ", domInst: %" PRIuSIZE
|
||||
", span: %" PRIuSIZE ", effectful: %" PRIuSIZE ", "
|
||||
" isLoopExit: %s, numSuccessorsOfPred: %" PRIuSIZE "."
|
||||
" (score: %" PRIuSIZE ", shouldBailout: %s)",
|
||||
block->id(), predCount, numDominatedInst, branchSpan, numEffectfulInst,
|
||||
isLoopExit ? "true" : "false", numSuccessorsOfPreds,
|
||||
score, shouldBailout ? "true" : "false");
|
||||
|
|
|
@ -229,7 +229,7 @@ class IonBuilder
|
|||
MOZ_MUST_USE bool inspectOpcode(JSOp op);
|
||||
uint32_t readIndex(jsbytecode* pc);
|
||||
JSAtom* readAtom(jsbytecode* pc);
|
||||
bool abort(const char* message, ...);
|
||||
bool abort(const char* message, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
void trackActionableAbort(const char* message);
|
||||
void spew(const char* message);
|
||||
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
|
||||
#include "jit/JSONSpewer.h"
|
||||
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "jit/BacktrackingAllocator.h"
|
||||
|
@ -146,7 +148,7 @@ JSONSpewer::beginFunction(JSScript* script)
|
|||
{
|
||||
beginObject();
|
||||
if (script)
|
||||
stringProperty("name", "%s:%d", script->filename(), script->lineno());
|
||||
stringProperty("name", "%s:%" PRIuSIZE, script->filename(), script->lineno());
|
||||
else
|
||||
stringProperty("name", "asm.js compilation");
|
||||
beginListProperty("passes");
|
||||
|
@ -156,7 +158,7 @@ void
|
|||
JSONSpewer::beginPass(const char* pass)
|
||||
{
|
||||
beginObject();
|
||||
stringProperty("name", pass);
|
||||
stringProperty("name", "%s", pass);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -36,8 +36,8 @@ class JSONSpewer
|
|||
void beginObject();
|
||||
void beginObjectProperty(const char* name);
|
||||
void beginListProperty(const char* name);
|
||||
void stringValue(const char* format, ...);
|
||||
void stringProperty(const char* name, const char* format, ...);
|
||||
void stringValue(const char* format, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
void stringProperty(const char* name, const char* format, ...) MOZ_FORMAT_PRINTF(3, 4);
|
||||
void beginStringProperty(const char* name);
|
||||
void endStringProperty();
|
||||
void integerValue(int value);
|
||||
|
|
|
@ -172,9 +172,9 @@ class JitSpewIndent
|
|||
~JitSpewIndent();
|
||||
};
|
||||
|
||||
void JitSpew(JitSpewChannel channel, const char* fmt, ...);
|
||||
void JitSpewStart(JitSpewChannel channel, const char* fmt, ...);
|
||||
void JitSpewCont(JitSpewChannel channel, const char* fmt, ...);
|
||||
void JitSpew(JitSpewChannel channel, const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
void JitSpewStart(JitSpewChannel channel, const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
void JitSpewCont(JitSpewChannel channel, const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
void JitSpewFin(JitSpewChannel channel);
|
||||
void JitSpewHeader(JitSpewChannel channel);
|
||||
bool JitSpewEnabled(JitSpewChannel channel);
|
||||
|
|
|
@ -5162,7 +5162,7 @@ void
|
|||
MStoreSlot::printOpcode(GenericPrinter& out) const
|
||||
{
|
||||
PrintOpcodeName(out, op());
|
||||
out.printf(" ", slot());
|
||||
out.printf(" ");
|
||||
getOperand(0)->printName(out);
|
||||
out.printf(" %d ", slot());
|
||||
getOperand(1)->printName(out);
|
||||
|
|
|
@ -72,7 +72,7 @@ class MIRGenerator
|
|||
|
||||
// Set an error state and prints a message. Returns false so errors can be
|
||||
// propagated up.
|
||||
bool abort(const char* message, ...); // always returns false
|
||||
bool abort(const char* message, ...) MOZ_FORMAT_PRINTF(2, 3); // always returns false
|
||||
bool abortFmt(const char* message, va_list ap); // always returns false
|
||||
|
||||
bool errored() const {
|
||||
|
|
|
@ -326,7 +326,7 @@ UniqueTrackedOptimizations::sortByFrequency(JSContext* cx)
|
|||
MOZ_ASSERT(p);
|
||||
p->value().index = sorted_.length();
|
||||
|
||||
JitSpew(JitSpew_OptimizationTracking, " Entry %u has frequency %u",
|
||||
JitSpew(JitSpew_OptimizationTracking, " Entry %" PRIuSIZE " has frequency %" PRIu32,
|
||||
sorted_.length(), p->value().frequency);
|
||||
|
||||
if (!sorted_.append(entries[i]))
|
||||
|
@ -765,14 +765,14 @@ IonTrackedOptimizationsRegion::WriteRun(CompactBufferWriter& writer,
|
|||
const UniqueTrackedOptimizations& unique)
|
||||
{
|
||||
// Write the header, which is the range that this whole run encompasses.
|
||||
JitSpew(JitSpew_OptimizationTracking, " Header: [%u, %u]",
|
||||
JitSpew(JitSpew_OptimizationTracking, " Header: [%" PRIuSIZE ", %" PRIuSIZE "]",
|
||||
start->startOffset.offset(), (end - 1)->endOffset.offset());
|
||||
writer.writeUnsigned(start->startOffset.offset());
|
||||
writer.writeUnsigned((end - 1)->endOffset.offset());
|
||||
|
||||
// Write the first entry of the run, which is not delta-encoded.
|
||||
JitSpew(JitSpew_OptimizationTracking,
|
||||
" [%6u, %6u] vector %3u, offset %4u",
|
||||
" [%6" PRIuSIZE ", %6" PRIuSIZE "] vector %3u, offset %4" PRIuSIZE,
|
||||
start->startOffset.offset(), start->endOffset.offset(),
|
||||
unique.indexOf(start->optimizations), writer.length());
|
||||
uint32_t prevEndOffset = start->endOffset.offset();
|
||||
|
@ -789,7 +789,7 @@ IonTrackedOptimizationsRegion::WriteRun(CompactBufferWriter& writer,
|
|||
uint8_t index = unique.indexOf(entry->optimizations);
|
||||
|
||||
JitSpew(JitSpew_OptimizationTracking,
|
||||
" [%6u, %6u] delta [+%5u, +%5u] vector %3u, offset %4u",
|
||||
" [%6u, %6u] delta [+%5u, +%5u] vector %3u, offset %4" PRIuSIZE,
|
||||
startOffset, endOffset, startDelta, length, index, writer.length());
|
||||
|
||||
WriteDelta(writer, startDelta, length, index);
|
||||
|
@ -825,7 +825,7 @@ WriteOffsetsTable(CompactBufferWriter& writer, const Vector<uint32_t, 16>& offse
|
|||
|
||||
// Write entry offset table.
|
||||
for (size_t i = 0; i < offsets.length(); i++) {
|
||||
JitSpew(JitSpew_OptimizationTracking, " Entry %u reverse offset %u",
|
||||
JitSpew(JitSpew_OptimizationTracking, " Entry %" PRIuSIZE " reverse offset %u",
|
||||
i, tableOffset - padding - offsets[i]);
|
||||
writer.writeNativeEndianUint32_t(tableOffset - padding - offsets[i]);
|
||||
}
|
||||
|
@ -885,7 +885,7 @@ SpewConstructor(TypeSet::Type ty, JSFunction* constructor)
|
|||
Maybe<unsigned> lineno;
|
||||
InterpretedFunctionFilenameAndLineNumber(constructor, &filename, &lineno);
|
||||
|
||||
JitSpew(JitSpew_OptimizationTracking, " Unique type %s has constructor %s (%s:%" PRIuSIZE ")",
|
||||
JitSpew(JitSpew_OptimizationTracking, " Unique type %s has constructor %s (%s:%u)",
|
||||
TypeSet::TypeString(ty), buf, filename, lineno.isSome() ? *lineno : 0);
|
||||
#endif
|
||||
}
|
||||
|
@ -919,7 +919,7 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write
|
|||
if (JitSpewEnabled(JitSpew_OptimizationTracking)) {
|
||||
JitSpewStart(JitSpew_OptimizationTracking, "=> Training data: ");
|
||||
for (const NativeToTrackedOptimizations* entry = start; entry != end; entry++) {
|
||||
JitSpewCont(JitSpew_OptimizationTracking, "%u,%u,%u ",
|
||||
JitSpewCont(JitSpew_OptimizationTracking, "%" PRIuSIZE ",%" PRIuSIZE ",%u ",
|
||||
entry->startOffset.offset(), entry->endOffset.offset(),
|
||||
unique.indexOf(entry->optimizations));
|
||||
}
|
||||
|
@ -934,7 +934,8 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write
|
|||
JitSpew(JitSpew_Profiling, "=> Writing regions");
|
||||
while (entry != end) {
|
||||
uint32_t runLength = IonTrackedOptimizationsRegion::ExpectedRunLength(entry, end);
|
||||
JitSpew(JitSpew_OptimizationTracking, " Run at entry %u, length %u, offset %u",
|
||||
JitSpew(JitSpew_OptimizationTracking,
|
||||
" Run at entry %" PRIuSIZE ", length %" PRIu32 ", offset %" PRIuSIZE,
|
||||
entry - start, runLength, writer.length());
|
||||
|
||||
if (!offsets.append(writer.length()))
|
||||
|
@ -957,7 +958,7 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write
|
|||
offsets.clear();
|
||||
|
||||
const UniqueTrackedOptimizations::SortedVector& vec = unique.sortedVector();
|
||||
JitSpew(JitSpew_OptimizationTracking, "=> Writing unique optimizations table with %u entr%s",
|
||||
JitSpew(JitSpew_OptimizationTracking, "=> Writing unique optimizations table with %" PRIuSIZE " entr%s",
|
||||
vec.length(), vec.length() == 1 ? "y" : "ies");
|
||||
|
||||
// Write out type info payloads.
|
||||
|
@ -967,7 +968,8 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write
|
|||
|
||||
for (const UniqueTrackedOptimizations::SortEntry* p = vec.begin(); p != vec.end(); p++) {
|
||||
const TempOptimizationTypeInfoVector* v = p->types;
|
||||
JitSpew(JitSpew_OptimizationTracking, " Type info entry %u of length %u, offset %u",
|
||||
JitSpew(JitSpew_OptimizationTracking,
|
||||
" Type info entry %" PRIuSIZE " of length %" PRIuSIZE ", offset %" PRIuSIZE,
|
||||
p - vec.begin(), v->length(), writer.length());
|
||||
SpewTempOptimizationTypeInfoVector(v, " ");
|
||||
|
||||
|
@ -1017,7 +1019,8 @@ jit::WriteIonTrackedOptimizationsTable(JSContext* cx, CompactBufferWriter& write
|
|||
// Write out attempts payloads.
|
||||
for (const UniqueTrackedOptimizations::SortEntry* p = vec.begin(); p != vec.end(); p++) {
|
||||
const TempOptimizationAttemptsVector* v = p->attempts;
|
||||
JitSpew(JitSpew_OptimizationTracking, " Attempts entry %u of length %u, offset %u",
|
||||
JitSpew(JitSpew_OptimizationTracking,
|
||||
" Attempts entry %" PRIuSIZE " of length %" PRIuSIZE ", offset %" PRIuSIZE,
|
||||
p - vec.begin(), v->length(), writer.length());
|
||||
SpewTempOptimizationAttemptsVector(v, " ");
|
||||
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
|
||||
#include "jit/Recover.h"
|
||||
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include "jsapi.h"
|
||||
#include "jscntxt.h"
|
||||
#include "jsmath.h"
|
||||
|
@ -123,7 +125,7 @@ MResumePoint::writeRecoverData(CompactBufferWriter& writer) const
|
|||
uint32_t formalArgs = CountArgSlots(script, fun);
|
||||
uint32_t nallocs = formalArgs + script->nfixed() + exprStack;
|
||||
|
||||
JitSpew(JitSpew_IonSnapshots, "Starting frame; implicit %u, formals %u, fixed %u, exprs %u",
|
||||
JitSpew(JitSpew_IonSnapshots, "Starting frame; implicit %u, formals %u, fixed %" PRIuSIZE ", exprs %u",
|
||||
implicit, formalArgs - implicit, script->nfixed(), exprStack);
|
||||
|
||||
uint32_t pcoff = script->pcToOffset(pc());
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "jit/Safepoints.h"
|
||||
|
||||
#include "mozilla/MathAlgorithms.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include "jit/BitSet.h"
|
||||
#include "jit/JitSpewer.h"
|
||||
|
@ -31,7 +32,7 @@ SafepointWriter::init(TempAllocator& alloc)
|
|||
uint32_t
|
||||
SafepointWriter::startEntry()
|
||||
{
|
||||
JitSpew(JitSpew_Safepoints, "Encoding safepoint (position %d):", stream_.length());
|
||||
JitSpew(JitSpew_Safepoints, "Encoding safepoint (position %" PRIuSIZE "):", stream_.length());
|
||||
return uint32_t(stream_.length());
|
||||
}
|
||||
|
||||
|
|
|
@ -2132,7 +2132,7 @@ UpdateExistingGenerationalDOMProxyStub(ICGetProp_Fallback* stub,
|
|||
// Update generation
|
||||
uint64_t generation = expandoAndGeneration->generation;
|
||||
JitSpew(JitSpew_BaselineIC,
|
||||
" Updating existing stub with generation, old value: %i, "
|
||||
" Updating existing stub with generation, old value: %" PRIu64 ", "
|
||||
"new value: %" PRIu64 "", updateStub->generation(),
|
||||
generation);
|
||||
updateStub->setGeneration(generation);
|
||||
|
|
|
@ -202,8 +202,10 @@ class ICFallbackStub;
|
|||
#undef FORWARD_DECLARE_STUBS
|
||||
|
||||
#ifdef JS_JITSPEW
|
||||
void FallbackICSpew(JSContext* cx, ICFallbackStub* stub, const char* fmt, ...);
|
||||
void TypeFallbackICSpew(JSContext* cx, ICTypeMonitor_Fallback* stub, const char* fmt, ...);
|
||||
void FallbackICSpew(JSContext* cx, ICFallbackStub* stub, const char* fmt, ...)
|
||||
MOZ_FORMAT_PRINTF(3, 4);
|
||||
void TypeFallbackICSpew(JSContext* cx, ICTypeMonitor_Fallback* stub, const char* fmt, ...)
|
||||
MOZ_FORMAT_PRINTF(3, 4);
|
||||
#else
|
||||
#define FallbackICSpew(...)
|
||||
#define TypeFallbackICSpew(...)
|
||||
|
|
|
@ -1002,7 +1002,7 @@ ValueNumberer::visitBlock(MBasicBlock* block, const MBasicBlock* dominatorRoot)
|
|||
bool
|
||||
ValueNumberer::visitDominatorTree(MBasicBlock* dominatorRoot)
|
||||
{
|
||||
JitSpew(JitSpew_GVN, " Visiting dominator tree (with %llu blocks) rooted at block%u%s",
|
||||
JitSpew(JitSpew_GVN, " Visiting dominator tree (with %" PRIu64 " blocks) rooted at block%u%s",
|
||||
uint64_t(dominatorRoot->numDominated()), dominatorRoot->id(),
|
||||
dominatorRoot == graph_.entryBlock() ? " (normal entry block)" :
|
||||
dominatorRoot == graph_.osrBlock() ? " (OSR entry block)" :
|
||||
|
@ -1228,7 +1228,7 @@ ValueNumberer::run(UpdateAliasAnalysisFlag updateAliasAnalysis)
|
|||
{
|
||||
updateAliasAnalysis_ = updateAliasAnalysis == UpdateAliasAnalysis;
|
||||
|
||||
JitSpew(JitSpew_GVN, "Running GVN on graph (with %llu blocks)",
|
||||
JitSpew(JitSpew_GVN, "Running GVN on graph (with %" PRIu64 " blocks)",
|
||||
uint64_t(graph_.numBlocks()));
|
||||
|
||||
// Adding fixup blocks only make sense iff we have a second entry point into
|
||||
|
@ -1288,7 +1288,7 @@ ValueNumberer::run(UpdateAliasAnalysisFlag updateAliasAnalysis)
|
|||
break;
|
||||
}
|
||||
|
||||
JitSpew(JitSpew_GVN, "Re-running GVN on graph (run %d, now with %llu blocks)",
|
||||
JitSpew(JitSpew_GVN, "Re-running GVN on graph (run %d, now with %" PRIu64 " blocks)",
|
||||
runs, uint64_t(graph_.numBlocks()));
|
||||
}
|
||||
|
||||
|
|
|
@ -1363,7 +1363,7 @@ class Assembler : public AssemblerShared
|
|||
uint32_t spewResolve(Label* l);
|
||||
uint32_t spewProbe(Label* l);
|
||||
uint32_t spewDefine(Label* l);
|
||||
void spew(const char* fmt, ...);
|
||||
void spew(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
void spew(const char* fmt, va_list args);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ namespace disasm {
|
|||
|
||||
// Helper function for printing to a Vector.
|
||||
static int
|
||||
MOZ_FORMAT_PRINTF(2, 3)
|
||||
SNPrintF(V8Vector<char> str, const char* format, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "jit/shared/CodeGenerator-shared-inl.h"
|
||||
|
||||
#include "mozilla/DebugOnly.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include "jit/CompactBuffer.h"
|
||||
#include "jit/IonCaches.h"
|
||||
|
@ -233,7 +234,7 @@ CodeGeneratorShared::addNativeToBytecodeEntry(const BytecodeSite* site)
|
|||
// bytecodeOffset, but the nativeOffset has changed, do nothing.
|
||||
// The same site just generated some more code.
|
||||
if (lastEntry.tree == tree && lastEntry.pc == pc) {
|
||||
JitSpew(JitSpew_Profiling, " => In-place update [%u-%u]",
|
||||
JitSpew(JitSpew_Profiling, " => In-place update [%" PRIuSIZE "-%" PRIu32 "]",
|
||||
lastEntry.nativeOffset.offset(), nativeOffset);
|
||||
return true;
|
||||
}
|
||||
|
@ -280,7 +281,7 @@ CodeGeneratorShared::dumpNativeToBytecodeEntries()
|
|||
{
|
||||
#ifdef JS_JITSPEW
|
||||
InlineScriptTree* topTree = gen->info().inlineScriptTree();
|
||||
JitSpewStart(JitSpew_Profiling, "Native To Bytecode Entries for %s:%d\n",
|
||||
JitSpewStart(JitSpew_Profiling, "Native To Bytecode Entries for %s:%" PRIuSIZE "\n",
|
||||
topTree->script()->filename(), topTree->script()->lineno());
|
||||
for (unsigned i = 0; i < nativeToBytecodeList_.length(); i++)
|
||||
dumpNativeToBytecodeEntry(i);
|
||||
|
@ -303,16 +304,16 @@ CodeGeneratorShared::dumpNativeToBytecodeEntry(uint32_t idx)
|
|||
if (nextRef->tree == ref.tree)
|
||||
pcDelta = nextRef->pc - ref.pc;
|
||||
}
|
||||
JitSpewStart(JitSpew_Profiling, " %08x [+%-6d] => %-6d [%-4d] {%-10s} (%s:%d",
|
||||
JitSpewStart(JitSpew_Profiling, " %08" PRIxSIZE " [+%-6d] => %-6ld [%-4d] {%-10s} (%s:%" PRIuSIZE,
|
||||
ref.nativeOffset.offset(),
|
||||
nativeDelta,
|
||||
ref.pc - script->code(),
|
||||
(long) (ref.pc - script->code()),
|
||||
pcDelta,
|
||||
CodeName[JSOp(*ref.pc)],
|
||||
script->filename(), script->lineno());
|
||||
|
||||
for (tree = tree->caller(); tree; tree = tree->caller()) {
|
||||
JitSpewCont(JitSpew_Profiling, " <= %s:%d", tree->script()->filename(),
|
||||
JitSpewCont(JitSpew_Profiling, " <= %s:%" PRIuSIZE, tree->script()->filename(),
|
||||
tree->script()->lineno());
|
||||
}
|
||||
JitSpewCont(JitSpew_Profiling, ")");
|
||||
|
@ -927,7 +928,7 @@ CodeGeneratorShared::generateCompactTrackedOptimizationsMap(JSContext* cx, JitCo
|
|||
"== Compact Native To Optimizations Map [%p-%p] size %u",
|
||||
data, data + trackedOptimizationsMapSize_, trackedOptimizationsMapSize_);
|
||||
JitSpew(JitSpew_OptimizationTracking,
|
||||
" with type list of length %u, size %u",
|
||||
" with type list of length %" PRIuSIZE ", size %" PRIuSIZE,
|
||||
allTypes->length(), allTypes->length() * sizeof(IonTrackedTypeWithAddendum));
|
||||
|
||||
return true;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
#define jit_shared_IonAssemblerBufferWithConstantPools_h
|
||||
|
||||
#include "mozilla/MathAlgorithms.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
|
@ -792,7 +793,7 @@ struct AssemblerBufferWithConstantPools : public AssemblerBuffer<SliceSize, Inst
|
|||
if (numPoolEntries)
|
||||
JitSpew(JitSpew_Pools, "[%d] Inserting pool entry caused a spill", id);
|
||||
else
|
||||
JitSpew(JitSpew_Pools, "[%d] Inserting instruction(%d) caused a spill", id,
|
||||
JitSpew(JitSpew_Pools, "[%d] Inserting instruction(%" PRIuSIZE ") caused a spill", id,
|
||||
sizeExcludingCurrentPool());
|
||||
|
||||
finishPool();
|
||||
|
@ -863,7 +864,7 @@ struct AssemblerBufferWithConstantPools : public AssemblerBuffer<SliceSize, Inst
|
|||
// Now to get an instruction to write.
|
||||
PoolEntry retPE;
|
||||
if (numPoolEntries) {
|
||||
JitSpew(JitSpew_Pools, "[%d] Entry has index %u, offset %u", id, index,
|
||||
JitSpew(JitSpew_Pools, "[%d] Entry has index %u, offset %" PRIuSIZE, id, index,
|
||||
sizeExcludingCurrentPool());
|
||||
Asm::InsertIndexIntoTag(inst, index);
|
||||
// Figure out the offset within the pool entries.
|
||||
|
@ -935,8 +936,8 @@ struct AssemblerBufferWithConstantPools : public AssemblerBuffer<SliceSize, Inst
|
|||
}
|
||||
|
||||
void finishPool() {
|
||||
JitSpew(JitSpew_Pools, "[%d] Attempting to finish pool %d with %d entries.", id,
|
||||
poolInfo_.length(), pool_.numEntries());
|
||||
JitSpew(JitSpew_Pools, "[%d] Attempting to finish pool %" PRIuSIZE " with %u entries.",
|
||||
id, poolInfo_.length(), pool_.numEntries());
|
||||
|
||||
if (pool_.numEntries() == 0 && !hasExpirableShortRangeBranches()) {
|
||||
// If there is no data in the pool being dumped, don't dump anything.
|
||||
|
@ -1004,7 +1005,7 @@ struct AssemblerBufferWithConstantPools : public AssemblerBuffer<SliceSize, Inst
|
|||
// the pool entry that is being loaded. We need to do a non-trivial
|
||||
// amount of math here, since the pool that we've made does not
|
||||
// actually reside there in memory.
|
||||
JitSpew(JitSpew_Pools, "[%d] Fixing entry %d offset to %u", id, idx, codeOffset);
|
||||
JitSpew(JitSpew_Pools, "[%d] Fixing entry %d offset to %" PRIuSIZE, id, idx, codeOffset);
|
||||
Asm::PatchConstantPoolLoad(inst, (uint8_t*)inst + codeOffset);
|
||||
}
|
||||
|
||||
|
@ -1037,7 +1038,7 @@ struct AssemblerBufferWithConstantPools : public AssemblerBuffer<SliceSize, Inst
|
|||
// assumed that no pool entries are allocated in a no-pool region and
|
||||
// this is asserted when allocating entries.
|
||||
if (!hasSpaceForInsts(maxInst, 0)) {
|
||||
JitSpew(JitSpew_Pools, "[%d] No-Pool instruction(%d) caused a spill.", id,
|
||||
JitSpew(JitSpew_Pools, "[%d] No-Pool instruction(%" PRIuSIZE ") caused a spill.", id,
|
||||
sizeExcludingCurrentPool());
|
||||
finishPool();
|
||||
}
|
||||
|
@ -1077,8 +1078,8 @@ struct AssemblerBufferWithConstantPools : public AssemblerBuffer<SliceSize, Inst
|
|||
// dumped at the aligned code position.
|
||||
if (!hasSpaceForInsts(requiredFill / InstSize + 1, 0)) {
|
||||
// Alignment would cause a pool dump, so dump the pool now.
|
||||
JitSpew(JitSpew_Pools, "[%d] Alignment of %d at %d caused a spill.", id, alignment,
|
||||
sizeExcludingCurrentPool());
|
||||
JitSpew(JitSpew_Pools, "[%d] Alignment of %d at %" PRIuSIZE " caused a spill.",
|
||||
id, alignment, sizeExcludingCurrentPool());
|
||||
finishPool();
|
||||
}
|
||||
|
||||
|
|
|
@ -186,10 +186,7 @@ namespace jit {
|
|||
printer = sp;
|
||||
}
|
||||
|
||||
void spew(const char* fmt, ...)
|
||||
#ifdef __GNUC__
|
||||
__attribute__ ((format (printf, 2, 3)))
|
||||
#endif
|
||||
void spew(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3)
|
||||
{
|
||||
if (MOZ_UNLIKELY(printer || JitSpewEnabled(JitSpew_Codegen))) {
|
||||
va_list va;
|
||||
|
|
|
@ -73,6 +73,7 @@ UNIFIED_SOURCES += [
|
|||
'testParseJSON.cpp',
|
||||
'testPersistentRooted.cpp',
|
||||
'testPreserveJitCode.cpp',
|
||||
'testPrintf.cpp',
|
||||
'testPrivateGCThingValue.cpp',
|
||||
'testProfileStrings.cpp',
|
||||
'testPropCache.cpp',
|
||||
|
@ -146,7 +147,7 @@ USE_LIBS += [
|
|||
OS_LIBS += CONFIG['MOZ_ZLIB_LIBS']
|
||||
|
||||
if CONFIG['GNU_CXX']:
|
||||
CXXFLAGS += ['-Wno-shadow']
|
||||
CXXFLAGS += ['-Wno-shadow', '-Werror=format']
|
||||
|
||||
# This is intended as a temporary workaround to enable VS2015.
|
||||
if CONFIG['_MSC_VER']:
|
||||
|
|
|
@ -0,0 +1,71 @@
|
|||
/* -*- 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 "mozilla/IntegerPrintfMacros.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "jsprf.h"
|
||||
|
||||
#include "jsapi-tests/tests.h"
|
||||
|
||||
static bool
|
||||
MOZ_FORMAT_PRINTF(2, 3)
|
||||
print_one (const char *expect, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
char *output = JS_vsmprintf (fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
bool result = output && !strcmp(output, expect);
|
||||
JS_smprintf_free(output);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static const char *
|
||||
zero()
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BEGIN_TEST(testPrintf)
|
||||
{
|
||||
CHECK(print_one("23", "%d", 23));
|
||||
CHECK(print_one("-1", "%d", -1));
|
||||
CHECK(print_one("23", "%u", 23u));
|
||||
CHECK(print_one("0x17", "0x%x", 23u));
|
||||
CHECK(print_one("0xFF", "0x%X", 255u));
|
||||
CHECK(print_one("027", "0%o", 23u));
|
||||
CHECK(print_one("-1", "%hd", (short) -1));
|
||||
// This could be expanded if need be, it's just convenient to do
|
||||
// it this way.
|
||||
if (sizeof(short) == 2) {
|
||||
CHECK(print_one("8000", "%hx", (unsigned short) 0x8000));
|
||||
}
|
||||
CHECK(print_one("0xf0f0", "0x%lx", 0xf0f0ul));
|
||||
CHECK(print_one("0xF0F0", "0x%llX", 0xf0f0ull));
|
||||
CHECK(print_one("27270", "%zu", (size_t) 27270));
|
||||
CHECK(print_one("27270", "%" PRIuSIZE, (size_t) 27270));
|
||||
CHECK(print_one("hello", "he%so", "ll"));
|
||||
CHECK(print_one("(null)", "%s", zero()));
|
||||
CHECK(print_one("0", "%p", (char *) 0));
|
||||
CHECK(print_one("h", "%c", 'h'));
|
||||
CHECK(print_one("1.500000", "%f", 1.5f));
|
||||
CHECK(print_one("1.5", "%g", 1.5));
|
||||
|
||||
CHECK(print_one("2727", "%" PRIu32, (uint32_t) 2727));
|
||||
CHECK(print_one("aa7", "%" PRIx32, (uint32_t) 2727));
|
||||
CHECK(print_one("2727", "%" PRIu64, (uint64_t) 2727));
|
||||
CHECK(print_one("aa7", "%" PRIx64, (uint64_t) 2727));
|
||||
|
||||
return true;
|
||||
}
|
||||
END_TEST(testPrintf)
|
|
@ -5199,13 +5199,16 @@ const uint16_t MaxNumErrorArguments = 10;
|
|||
* and its arguments.
|
||||
*/
|
||||
extern JS_PUBLIC_API(void)
|
||||
JS_ReportErrorASCII(JSContext* cx, const char* format, ...);
|
||||
JS_ReportErrorASCII(JSContext* cx, const char* format, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
extern JS_PUBLIC_API(void)
|
||||
JS_ReportErrorLatin1(JSContext* cx, const char* format, ...);
|
||||
JS_ReportErrorLatin1(JSContext* cx, const char* format, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
extern JS_PUBLIC_API(void)
|
||||
JS_ReportErrorUTF8(JSContext* cx, const char* format, ...);
|
||||
JS_ReportErrorUTF8(JSContext* cx, const char* format, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
/*
|
||||
* Use an errorNumber to retrieve the format string, args are char*
|
||||
|
@ -5257,13 +5260,16 @@ JS_ReportErrorNumberUCArray(JSContext* cx, JSErrorCallback errorCallback,
|
|||
* being set, false otherwise.
|
||||
*/
|
||||
extern JS_PUBLIC_API(bool)
|
||||
JS_ReportWarningASCII(JSContext* cx, const char* format, ...);
|
||||
JS_ReportWarningASCII(JSContext* cx, const char* format, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
extern JS_PUBLIC_API(bool)
|
||||
JS_ReportWarningLatin1(JSContext* cx, const char* format, ...);
|
||||
JS_ReportWarningLatin1(JSContext* cx, const char* format, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
extern JS_PUBLIC_API(bool)
|
||||
JS_ReportWarningUTF8(JSContext* cx, const char* format, ...);
|
||||
JS_ReportWarningUTF8(JSContext* cx, const char* format, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
extern JS_PUBLIC_API(bool)
|
||||
JS_ReportErrorFlagsAndNumberASCII(JSContext* cx, unsigned flags,
|
||||
|
|
|
@ -763,11 +763,16 @@ FormatValue(JSContext* cx, const Value& vArg, JSAutoByteString& bytes)
|
|||
|
||||
// Wrapper for JS_sprintf_append() that reports allocation failure to the
|
||||
// context.
|
||||
template <typename... Args>
|
||||
static char*
|
||||
sprintf_append(JSContext* cx, char* buf, Args&&... args)
|
||||
MOZ_FORMAT_PRINTF(3, 4)
|
||||
sprintf_append(JSContext* cx, char* buf, const char* fmt, ...)
|
||||
{
|
||||
char* result = JS_sprintf_append(buf, mozilla::Forward<Args>(args)...);
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
char* result = JS_vsprintf_append(buf, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (!result) {
|
||||
ReportOutOfMemory(cx);
|
||||
return nullptr;
|
||||
|
|
|
@ -3630,11 +3630,11 @@ js::DumpBacktrace(JSContext* cx, FILE* fp)
|
|||
i.isWasm() ? 'W' :
|
||||
'?';
|
||||
|
||||
sprinter.printf("#%d %14p %c %s:%d",
|
||||
sprinter.printf("#%" PRIuSIZE " %14p %c %s:%d",
|
||||
depth, i.rawFramePtr(), frameType, filename, line);
|
||||
|
||||
if (i.hasScript()) {
|
||||
sprinter.printf(" (%p @ %d)\n",
|
||||
sprinter.printf(" (%p @ %" PRIuSIZE ")\n",
|
||||
i.script(), i.script()->pcToOffset(i.pc()));
|
||||
} else {
|
||||
sprinter.printf(" (%p)\n", i.pc());
|
||||
|
|
|
@ -151,14 +151,14 @@ const char * PCCounts::numExecName = "interp";
|
|||
static MOZ_MUST_USE bool
|
||||
DumpIonScriptCounts(Sprinter* sp, HandleScript script, jit::IonScriptCounts* ionCounts)
|
||||
{
|
||||
if (!sp->jsprintf("IonScript [%lu blocks]:\n", ionCounts->numBlocks()))
|
||||
if (!sp->jsprintf("IonScript [%" PRIuSIZE " blocks]:\n", ionCounts->numBlocks()))
|
||||
return false;
|
||||
|
||||
for (size_t i = 0; i < ionCounts->numBlocks(); i++) {
|
||||
const jit::IonBlockCounts& block = ionCounts->block(i);
|
||||
unsigned lineNumber = 0, columnNumber = 0;
|
||||
lineNumber = PCToLineNumber(script, script->offsetToPC(block.offset()), &columnNumber);
|
||||
if (!sp->jsprintf("BB #%lu [%05u,%u,%u]",
|
||||
if (!sp->jsprintf("BB #%" PRIu32 " [%05u,%u,%u]",
|
||||
block.id(), block.offset(), lineNumber, columnNumber))
|
||||
{
|
||||
return false;
|
||||
|
@ -168,10 +168,10 @@ DumpIonScriptCounts(Sprinter* sp, HandleScript script, jit::IonScriptCounts* ion
|
|||
return false;
|
||||
}
|
||||
for (size_t j = 0; j < block.numSuccessors(); j++) {
|
||||
if (!sp->jsprintf(" -> #%lu", block.successor(j)))
|
||||
if (!sp->jsprintf(" -> #%" PRIu32, block.successor(j)))
|
||||
return false;
|
||||
}
|
||||
if (!sp->jsprintf(" :: %llu hits\n", block.hitCount()))
|
||||
if (!sp->jsprintf(" :: %" PRIu64 " hits\n", block.hitCount()))
|
||||
return false;
|
||||
if (!sp->jsprintf("%s\n", block.code()))
|
||||
return false;
|
||||
|
|
169
js/src/jsprf.cpp
169
js/src/jsprf.cpp
|
@ -63,18 +63,18 @@ struct NumArgState
|
|||
typedef mozilla::Vector<NumArgState, 20, js::SystemAllocPolicy> NumArgStateVector;
|
||||
|
||||
|
||||
#define TYPE_INT16 0
|
||||
#define TYPE_UINT16 1
|
||||
#define TYPE_SHORT 0
|
||||
#define TYPE_USHORT 1
|
||||
#define TYPE_INTN 2
|
||||
#define TYPE_UINTN 3
|
||||
#define TYPE_INT32 4
|
||||
#define TYPE_UINT32 5
|
||||
#define TYPE_INT64 6
|
||||
#define TYPE_UINT64 7
|
||||
#define TYPE_LONG 4
|
||||
#define TYPE_ULONG 5
|
||||
#define TYPE_LONGLONG 6
|
||||
#define TYPE_ULONGLONG 7
|
||||
#define TYPE_STRING 8
|
||||
#define TYPE_DOUBLE 9
|
||||
#define TYPE_INTSTR 10
|
||||
#define TYPE_WSTRING 11
|
||||
#define TYPE_POINTER 11
|
||||
#define TYPE_UNKNOWN 20
|
||||
|
||||
#define FLAG_LEFT 0x1
|
||||
|
@ -89,31 +89,9 @@ generic_write(SprintfState* ss, const char* src, size_t srclen)
|
|||
return (*ss->stuff)(ss, src, srclen);
|
||||
}
|
||||
|
||||
inline bool
|
||||
generic_write(SprintfState* ss, const char16_t* src, size_t srclen)
|
||||
{
|
||||
const size_t CHUNK_SIZE = 64;
|
||||
char chunk[CHUNK_SIZE];
|
||||
|
||||
size_t j = 0;
|
||||
size_t i = 0;
|
||||
while (i < srclen) {
|
||||
// FIXME: truncates characters to 8 bits
|
||||
chunk[j++] = char(src[i++]);
|
||||
|
||||
if (j == CHUNK_SIZE || i == srclen) {
|
||||
if (!(*ss->stuff)(ss, chunk, j))
|
||||
return false;
|
||||
j = 0;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// Fill into the buffer using the data in src
|
||||
template <typename Char>
|
||||
static bool
|
||||
fill2(SprintfState* ss, const Char* src, int srclen, int width, int flags)
|
||||
fill2(SprintfState* ss, const char* src, int srclen, int width, int flags)
|
||||
{
|
||||
char space = ' ';
|
||||
|
||||
|
@ -318,19 +296,16 @@ static bool cvt_f(SprintfState* ss, double d, const char* fmt0, const char* fmt1
|
|||
}
|
||||
|
||||
static inline const char* generic_null_str(const char*) { return "(null)"; }
|
||||
static inline const char16_t* generic_null_str(const char16_t*) { return u"(null)"; }
|
||||
|
||||
static inline size_t generic_strlen(const char* s) { return strlen(s); }
|
||||
static inline size_t generic_strlen(const char16_t* s) { return js_strlen(s); }
|
||||
|
||||
/*
|
||||
* Convert a string into its printable form. "width" is the output
|
||||
* width. "prec" is the maximum number of characters of "s" to output,
|
||||
* where -1 means until NUL.
|
||||
*/
|
||||
template <typename Char>
|
||||
static bool
|
||||
cvt_s(SprintfState* ss, const Char* s, int width, int prec, int flags)
|
||||
cvt_s(SprintfState* ss, const char* s, int width, int prec, int flags)
|
||||
{
|
||||
if (prec == 0)
|
||||
return true;
|
||||
|
@ -452,23 +427,24 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas)
|
|||
// size
|
||||
nas[cn].type = TYPE_INTN;
|
||||
if (c == 'h') {
|
||||
nas[cn].type = TYPE_INT16;
|
||||
nas[cn].type = TYPE_SHORT;
|
||||
c = *p++;
|
||||
} else if (c == 'L') {
|
||||
// XXX not quite sure here
|
||||
nas[cn].type = TYPE_INT64;
|
||||
nas[cn].type = TYPE_LONGLONG;
|
||||
c = *p++;
|
||||
} else if (c == 'l') {
|
||||
nas[cn].type = TYPE_INT32;
|
||||
nas[cn].type = TYPE_LONG;
|
||||
c = *p++;
|
||||
if (c == 'l') {
|
||||
nas[cn].type = TYPE_INT64;
|
||||
nas[cn].type = TYPE_LONGLONG;
|
||||
c = *p++;
|
||||
}
|
||||
} else if (c == 'z' || c == 'I') {
|
||||
static_assert(sizeof(size_t) == sizeof(int32_t) || sizeof(size_t) == sizeof(int64_t),
|
||||
static_assert(sizeof(size_t) == sizeof(int) || sizeof(size_t) == sizeof(long) ||
|
||||
sizeof(size_t) == sizeof(long long),
|
||||
"size_t is not one of the expected sizes");
|
||||
nas[cn].type = sizeof(size_t) == sizeof(int64_t) ? TYPE_INT64 : TYPE_INT32;
|
||||
nas[cn].type = sizeof(size_t) == sizeof(int) ? TYPE_INTN :
|
||||
sizeof(size_t) == sizeof(long) ? TYPE_LONG : TYPE_LONGLONG;
|
||||
c = *p++;
|
||||
}
|
||||
|
||||
|
@ -490,16 +466,7 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas)
|
|||
break;
|
||||
|
||||
case 'p':
|
||||
// XXX should use cpp
|
||||
if (sizeof(void*) == sizeof(int32_t)) {
|
||||
nas[cn].type = TYPE_UINT32;
|
||||
} else if (sizeof(void*) == sizeof(int64_t)) {
|
||||
nas[cn].type = TYPE_UINT64;
|
||||
} else if (sizeof(void*) == sizeof(int)) {
|
||||
nas[cn].type = TYPE_UINTN;
|
||||
} else {
|
||||
nas[cn].type = TYPE_UNKNOWN;
|
||||
}
|
||||
nas[cn].type = TYPE_POINTER;
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
|
@ -512,7 +479,7 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas)
|
|||
break;
|
||||
|
||||
case 's':
|
||||
nas[cn].type = (nas[cn].type == TYPE_UINT16) ? TYPE_WSTRING : TYPE_STRING;
|
||||
nas[cn].type = TYPE_STRING;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
|
@ -544,18 +511,18 @@ BuildArgArray(const char* fmt, va_list ap, NumArgStateVector& nas)
|
|||
VARARGS_ASSIGN(nas[cn].ap, ap);
|
||||
|
||||
switch (nas[cn].type) {
|
||||
case TYPE_INT16:
|
||||
case TYPE_UINT16:
|
||||
case TYPE_SHORT:
|
||||
case TYPE_USHORT:
|
||||
case TYPE_INTN:
|
||||
case TYPE_UINTN: (void) va_arg(ap, int); break;
|
||||
case TYPE_INT32: (void) va_arg(ap, int32_t); break;
|
||||
case TYPE_UINT32: (void) va_arg(ap, uint32_t); break;
|
||||
case TYPE_INT64: (void) va_arg(ap, int64_t); break;
|
||||
case TYPE_UINT64: (void) va_arg(ap, uint64_t); break;
|
||||
case TYPE_LONG: (void) va_arg(ap, long); break;
|
||||
case TYPE_ULONG: (void) va_arg(ap, unsigned long); break;
|
||||
case TYPE_LONGLONG: (void) va_arg(ap, long long); break;
|
||||
case TYPE_ULONGLONG: (void) va_arg(ap, unsigned long long); break;
|
||||
case TYPE_STRING: (void) va_arg(ap, char*); break;
|
||||
case TYPE_WSTRING: (void) va_arg(ap, char16_t*); break;
|
||||
case TYPE_INTSTR: (void) va_arg(ap, int*); break;
|
||||
case TYPE_DOUBLE: (void) va_arg(ap, double); break;
|
||||
case TYPE_POINTER: (void) va_arg(ap, void*); break;
|
||||
|
||||
default: MOZ_CRASH();
|
||||
}
|
||||
|
@ -576,14 +543,13 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
int flags, width, prec, radix, type;
|
||||
union {
|
||||
char ch;
|
||||
char16_t wch;
|
||||
int i;
|
||||
long l;
|
||||
int64_t ll;
|
||||
long long ll;
|
||||
double d;
|
||||
const char* s;
|
||||
const char16_t* ws;
|
||||
int* ip;
|
||||
void* p;
|
||||
} u;
|
||||
const char* fmt0;
|
||||
static const char hex[] = "0123456789abcdef";
|
||||
|
@ -685,23 +651,24 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
// size
|
||||
type = TYPE_INTN;
|
||||
if (c == 'h') {
|
||||
type = TYPE_INT16;
|
||||
type = TYPE_SHORT;
|
||||
c = *fmt++;
|
||||
} else if (c == 'L') {
|
||||
// XXX not quite sure here
|
||||
type = TYPE_INT64;
|
||||
type = TYPE_LONGLONG;
|
||||
c = *fmt++;
|
||||
} else if (c == 'l') {
|
||||
type = TYPE_INT32;
|
||||
type = TYPE_LONG;
|
||||
c = *fmt++;
|
||||
if (c == 'l') {
|
||||
type = TYPE_INT64;
|
||||
type = TYPE_LONGLONG;
|
||||
c = *fmt++;
|
||||
}
|
||||
} else if (c == 'z' || c == 'I') {
|
||||
static_assert(sizeof(size_t) == sizeof(int32_t) || sizeof(size_t) == sizeof(int64_t),
|
||||
static_assert(sizeof(size_t) == sizeof(int) || sizeof(size_t) == sizeof(long) ||
|
||||
sizeof(size_t) == sizeof(long long),
|
||||
"size_t is not one of the expected sizes");
|
||||
type = sizeof(size_t) == sizeof(int64_t) ? TYPE_INT64 : TYPE_INT32;
|
||||
type = sizeof(size_t) == sizeof(int) ? TYPE_INTN :
|
||||
sizeof(size_t) == sizeof(long) ? TYPE_LONG : TYPE_LONGLONG;
|
||||
c = *fmt++;
|
||||
}
|
||||
|
||||
|
@ -735,15 +702,15 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
|
||||
fetch_and_convert:
|
||||
switch (type) {
|
||||
case TYPE_INT16:
|
||||
case TYPE_SHORT:
|
||||
u.l = va_arg(ap, int);
|
||||
if (u.l < 0) {
|
||||
u.l = -u.l;
|
||||
flags |= FLAG_NEG;
|
||||
}
|
||||
goto do_long;
|
||||
case TYPE_UINT16:
|
||||
u.l = va_arg(ap, int) & 0xffff;
|
||||
case TYPE_USHORT:
|
||||
u.l = (unsigned short) va_arg(ap, unsigned int);
|
||||
goto do_long;
|
||||
case TYPE_INTN:
|
||||
u.l = va_arg(ap, int);
|
||||
|
@ -756,30 +723,33 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
u.l = (long)va_arg(ap, unsigned int);
|
||||
goto do_long;
|
||||
|
||||
case TYPE_INT32:
|
||||
u.l = va_arg(ap, int32_t);
|
||||
case TYPE_LONG:
|
||||
u.l = va_arg(ap, long);
|
||||
if (u.l < 0) {
|
||||
u.l = -u.l;
|
||||
flags |= FLAG_NEG;
|
||||
}
|
||||
goto do_long;
|
||||
case TYPE_UINT32:
|
||||
u.l = (long)va_arg(ap, uint32_t);
|
||||
case TYPE_ULONG:
|
||||
u.l = (long)va_arg(ap, unsigned long);
|
||||
do_long:
|
||||
if (!cvt_l(ss, u.l, width, prec, radix, type, flags, hexp))
|
||||
return false;
|
||||
|
||||
break;
|
||||
|
||||
case TYPE_INT64:
|
||||
u.ll = va_arg(ap, int64_t);
|
||||
case TYPE_LONGLONG:
|
||||
u.ll = va_arg(ap, long long);
|
||||
if (u.ll < 0) {
|
||||
u.ll = -u.ll;
|
||||
flags |= FLAG_NEG;
|
||||
}
|
||||
goto do_longlong;
|
||||
case TYPE_UINT64:
|
||||
u.ll = va_arg(ap, uint64_t);
|
||||
case TYPE_POINTER:
|
||||
u.ll = (uintptr_t)va_arg(ap, void*);
|
||||
goto do_longlong;
|
||||
case TYPE_ULONGLONG:
|
||||
u.ll = va_arg(ap, unsigned long long);
|
||||
do_longlong:
|
||||
if (!cvt_ll(ss, u.ll, width, prec, radix, type, flags, hexp))
|
||||
return false;
|
||||
|
@ -816,7 +786,7 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
}
|
||||
}
|
||||
switch (type) {
|
||||
case TYPE_INT16:
|
||||
case TYPE_SHORT:
|
||||
case TYPE_INTN:
|
||||
u.ch = va_arg(ap, int);
|
||||
if (!(*ss->stuff)(ss, &u.ch, 1))
|
||||
|
@ -832,16 +802,7 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
break;
|
||||
|
||||
case 'p':
|
||||
if (sizeof(void*) == sizeof(int32_t)) {
|
||||
type = TYPE_UINT32;
|
||||
} else if (sizeof(void*) == sizeof(int64_t)) {
|
||||
type = TYPE_UINT64;
|
||||
} else if (sizeof(void*) == sizeof(int)) {
|
||||
type = TYPE_UINTN;
|
||||
} else {
|
||||
MOZ_ASSERT(0);
|
||||
break;
|
||||
}
|
||||
type = TYPE_POINTER;
|
||||
radix = 16;
|
||||
goto fetch_and_convert;
|
||||
|
||||
|
@ -856,15 +817,9 @@ dosprintf(SprintfState* ss, const char* fmt, va_list ap)
|
|||
#endif
|
||||
|
||||
case 's':
|
||||
if(type == TYPE_INT16) {
|
||||
u.ws = va_arg(ap, const char16_t*);
|
||||
if (!cvt_s(ss, u.ws, width, prec, flags))
|
||||
return false;
|
||||
} else {
|
||||
u.s = va_arg(ap, const char*);
|
||||
if (!cvt_s(ss, u.s, width, prec, flags))
|
||||
return false;
|
||||
}
|
||||
u.s = va_arg(ap, const char*);
|
||||
if (!cvt_s(ss, u.s, width, prec, flags))
|
||||
return false;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
|
@ -1004,18 +959,18 @@ JS_vsprintf_append(char* last, const char* fmt, va_list ap)
|
|||
return ss.base;
|
||||
}
|
||||
|
||||
#undef TYPE_INT16
|
||||
#undef TYPE_UINT16
|
||||
#undef TYPE_SHORT
|
||||
#undef TYPE_USHORT
|
||||
#undef TYPE_INTN
|
||||
#undef TYPE_UINTN
|
||||
#undef TYPE_INT32
|
||||
#undef TYPE_UINT32
|
||||
#undef TYPE_INT64
|
||||
#undef TYPE_UINT64
|
||||
#undef TYPE_LONG
|
||||
#undef TYPE_ULONG
|
||||
#undef TYPE_LONGLONG
|
||||
#undef TYPE_ULONGLONG
|
||||
#undef TYPE_STRING
|
||||
#undef TYPE_DOUBLE
|
||||
#undef TYPE_INTSTR
|
||||
#undef TYPE_WSTRING
|
||||
#undef TYPE_POINTER
|
||||
#undef TYPE_UNKNOWN
|
||||
|
||||
#undef FLAG_LEFT
|
||||
|
|
|
@ -14,11 +14,13 @@
|
|||
** %x - unsigned hex
|
||||
** %X - unsigned uppercase hex
|
||||
** %o - unsigned octal
|
||||
** %hd, %hu, %hx, %hX, %ho - 16-bit versions of above
|
||||
** %ld, %lu, %lx, %lX, %lo - 32-bit versions of above
|
||||
** %lld, %llu, %llx, %llX, %llo - 64 bit versions of above
|
||||
** %s - ascii string
|
||||
** %hs - ucs2 string
|
||||
** %hd, %hu, %hx, %hX, %ho - "short" versions of above
|
||||
** %ld, %lu, %lx, %lX, %lo - "long" versions of above
|
||||
** %lld, %llu, %llx, %llX, %llo - "long long" versions of above
|
||||
** %zd, %zo, %zu, %zx, %zX - size_t versions of above
|
||||
** %Id, %Io, %Iu, %Ix, %IX - size_t versions of above (for Windows compat)
|
||||
** You should use PRI*SIZE macros instead
|
||||
** %s - string
|
||||
** %c - character
|
||||
** %p - pointer (deals with machine dependent pointer size)
|
||||
** %f - float
|
||||
|
@ -37,7 +39,8 @@
|
|||
** buffer on success, nullptr on failure. Call "JS_smprintf_free" to release
|
||||
** the memory returned.
|
||||
*/
|
||||
extern JS_PUBLIC_API(char*) JS_smprintf(const char* fmt, ...);
|
||||
extern JS_PUBLIC_API(char*) JS_smprintf(const char* fmt, ...)
|
||||
MOZ_FORMAT_PRINTF(1, 2);
|
||||
|
||||
/*
|
||||
** Free the memory allocated, for the caller, by JS_smprintf
|
||||
|
@ -51,7 +54,8 @@ extern JS_PUBLIC_API(void) JS_smprintf_free(char* mem);
|
|||
** will allocate the initial string. The return value is the new value of
|
||||
** last for subsequent calls, or nullptr if there is a malloc failure.
|
||||
*/
|
||||
extern JS_PUBLIC_API(char*) JS_sprintf_append(char* last, const char* fmt, ...);
|
||||
extern JS_PUBLIC_API(char*) JS_sprintf_append(char* last, const char* fmt, ...)
|
||||
MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
/*
|
||||
** va_list forms of the above.
|
||||
|
|
|
@ -784,7 +784,7 @@ if CONFIG['JS_HAS_CTYPES']:
|
|||
DEFINES['FFI_BUILDING'] = True
|
||||
|
||||
if CONFIG['GNU_CXX']:
|
||||
CXXFLAGS += ['-Wno-shadow']
|
||||
CXXFLAGS += ['-Wno-shadow', '-Werror=format']
|
||||
|
||||
# Suppress warnings in third-party code.
|
||||
if CONFIG['CLANG_CXX']:
|
||||
|
|
|
@ -5247,7 +5247,7 @@ ReflectTrackedOptimizations(JSContext* cx, unsigned argc, Value* vp)
|
|||
uint8_t* addr = ion->method()->raw() + endOffset;
|
||||
entry.youngestFrameLocationAtAddr(rt, addr, &script, &pc);
|
||||
|
||||
if (!sp.jsprintf("{\"location\":\"%s:%u\",\"offset\":%u,\"index\":%u}%s",
|
||||
if (!sp.jsprintf("{\"location\":\"%s:%" PRIuSIZE "\",\"offset\":%" PRIuSIZE ",\"index\":%u}%s",
|
||||
script->filename(), script->lineno(), script->pcToOffset(pc), index,
|
||||
iter.more() ? "," : ""))
|
||||
{
|
||||
|
|
|
@ -264,7 +264,7 @@ OptionParser::extractValue(size_t argc, char** argv, size_t* i, char** value)
|
|||
if (eq) {
|
||||
*value = eq + 1;
|
||||
if (*value[0] == '\0')
|
||||
return error("A value is required for option %.*s", eq - argv[*i], argv[*i]);
|
||||
return error("A value is required for option %.*s", (int) (eq - argv[*i]), argv[*i]);
|
||||
return Okay;
|
||||
}
|
||||
|
||||
|
|
|
@ -228,7 +228,7 @@ class OptionParser
|
|||
Option* findArgument(const char* name);
|
||||
const Option* findArgument(const char* name) const;
|
||||
|
||||
Result error(const char* fmt, ...);
|
||||
Result error(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
Result extractValue(size_t argc, char** argv, size_t* i, char** value);
|
||||
Result handleArg(size_t argc, char** argv, size_t* i, bool* optsAllowed);
|
||||
Result handleOption(Option* opt, size_t argc, char** argv, size_t* i, bool* optsAllowed);
|
||||
|
|
|
@ -51,7 +51,7 @@ shellmoduleloader.inputs = [
|
|||
]
|
||||
|
||||
if CONFIG['GNU_CXX']:
|
||||
CXXFLAGS += ['-Wno-shadow']
|
||||
CXXFLAGS += ['-Wno-shadow', '-Werror=format']
|
||||
|
||||
# This is intended as a temporary workaround to enable VS2015.
|
||||
if CONFIG['_MSC_VER']:
|
||||
|
|
|
@ -91,16 +91,16 @@ LCovSource::exportInto(GenericPrinter& out) const
|
|||
|
||||
outFN_.exportInto(out);
|
||||
outFNDA_.exportInto(out);
|
||||
out.printf("FNF:%d\n", numFunctionsFound_);
|
||||
out.printf("FNH:%d\n", numFunctionsHit_);
|
||||
out.printf("FNF:%" PRIuSIZE "\n", numFunctionsFound_);
|
||||
out.printf("FNH:%" PRIuSIZE "\n", numFunctionsHit_);
|
||||
|
||||
outBRDA_.exportInto(out);
|
||||
out.printf("BRF:%d\n", numBranchesFound_);
|
||||
out.printf("BRH:%d\n", numBranchesHit_);
|
||||
out.printf("BRF:%" PRIuSIZE "\n", numBranchesFound_);
|
||||
out.printf("BRH:%" PRIuSIZE "\n", numBranchesHit_);
|
||||
|
||||
outDA_.exportInto(out);
|
||||
out.printf("LF:%d\n", numLinesInstrumented_);
|
||||
out.printf("LH:%d\n", numLinesHit_);
|
||||
out.printf("LF:%" PRIuSIZE "\n", numLinesInstrumented_);
|
||||
out.printf("LH:%" PRIuSIZE "\n", numLinesHit_);
|
||||
|
||||
out.put("end_of_record\n");
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ bool
|
|||
LCovSource::writeScript(JSScript* script)
|
||||
{
|
||||
numFunctionsFound_++;
|
||||
outFN_.printf("FN:%d,", script->lineno());
|
||||
outFN_.printf("FN:%" PRIuSIZE ",", script->lineno());
|
||||
if (!writeScriptName(outFN_, script))
|
||||
return false;
|
||||
outFN_.put("\n", 1);
|
||||
|
@ -191,7 +191,7 @@ LCovSource::writeScript(JSScript* script)
|
|||
}
|
||||
|
||||
if (oldLine != lineno && fallsthrough) {
|
||||
outDA_.printf("DA:%d,%" PRIu64 "\n", lineno, hits);
|
||||
outDA_.printf("DA:%" PRIuSIZE ",%" PRIu64 "\n", lineno, hits);
|
||||
|
||||
// Count the number of lines instrumented & hit.
|
||||
numLinesInstrumented_++;
|
||||
|
@ -220,13 +220,13 @@ LCovSource::writeScript(JSScript* script)
|
|||
}
|
||||
|
||||
uint64_t taken = hits - fallthroughHits;
|
||||
outBRDA_.printf("BRDA:%d,%d,0,", lineno, branchId);
|
||||
outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",0,", lineno, branchId);
|
||||
if (taken)
|
||||
outBRDA_.printf("%" PRIu64 "\n", taken);
|
||||
else
|
||||
outBRDA_.put("-\n", 2);
|
||||
|
||||
outBRDA_.printf("BRDA:%d,%d,1,", lineno, branchId);
|
||||
outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",1,", lineno, branchId);
|
||||
if (fallthroughHits)
|
||||
outBRDA_.printf("%" PRIu64 "\n", fallthroughHits);
|
||||
else
|
||||
|
@ -308,7 +308,8 @@ LCovSource::writeScript(JSScript* script)
|
|||
caseHits -= fallsThroughHits;
|
||||
}
|
||||
|
||||
outBRDA_.printf("BRDA:%d,%d,%d,", lineno, branchId, caseId);
|
||||
outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",%" PRIuSIZE ",",
|
||||
lineno, branchId, caseId);
|
||||
if (caseHits)
|
||||
outBRDA_.printf("%" PRIu64 "\n", caseHits);
|
||||
else
|
||||
|
@ -359,7 +360,8 @@ LCovSource::writeScript(JSScript* script)
|
|||
}
|
||||
|
||||
if (defaultHasOwnClause) {
|
||||
outBRDA_.printf("BRDA:%d,%d,%d,", lineno, branchId, caseId);
|
||||
outBRDA_.printf("BRDA:%" PRIuSIZE ",%" PRIuSIZE ",%" PRIuSIZE ",",
|
||||
lineno, branchId, caseId);
|
||||
if (defaultHits)
|
||||
outBRDA_.printf("%" PRIu64 "\n", defaultHits);
|
||||
else
|
||||
|
|
|
@ -43,7 +43,7 @@ class GenericPrinter
|
|||
}
|
||||
|
||||
// Prints a formatted string into the buffer.
|
||||
virtual int printf(const char* fmt, ...);
|
||||
virtual int printf(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
virtual int vprintf(const char* fmt, va_list ap);
|
||||
|
||||
// Report that a string operation failed to get the memory it requested. The
|
||||
|
@ -115,7 +115,7 @@ class Sprinter final : public GenericPrinter
|
|||
// Format the given format/arguments as if by JS_vsmprintf, then put it.
|
||||
// Return true on success, else return false and report an error (typically
|
||||
// OOM).
|
||||
MOZ_MUST_USE bool jsprintf(const char* fmt, ...);
|
||||
MOZ_MUST_USE bool jsprintf(const char* fmt, ...) MOZ_FORMAT_PRINTF(2, 3);
|
||||
|
||||
// Prints a formatted string into the buffer.
|
||||
virtual int vprintf(const char* fmt, va_list ap) override;
|
||||
|
@ -157,7 +157,7 @@ class Fprinter final : public GenericPrinter
|
|||
using GenericPrinter::put; // pick up |inline int put(const char* s);|
|
||||
|
||||
// Prints a formatted string into the buffer.
|
||||
virtual int printf(const char* fmt, ...) override;
|
||||
virtual int printf(const char* fmt, ...) override MOZ_FORMAT_PRINTF(2, 3);
|
||||
virtual int vprintf(const char* fmt, va_list ap) override;
|
||||
};
|
||||
|
||||
|
@ -203,7 +203,7 @@ class LSprinter final : public GenericPrinter
|
|||
using GenericPrinter::put; // pick up |inline int put(const char* s);|
|
||||
|
||||
// Prints a formatted string into the buffer.
|
||||
virtual int printf(const char* fmt, ...) override;
|
||||
virtual int printf(const char* fmt, ...) override MOZ_FORMAT_PRINTF(2, 3);
|
||||
virtual int vprintf(const char* fmt, va_list ap) override;
|
||||
|
||||
// Report that a string operation failed to get the memory it requested. The
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "mozilla/MemoryReporting.h"
|
||||
#include "mozilla/PodOperations.h"
|
||||
#include "mozilla/RangedPtr.h"
|
||||
#include "mozilla/SizePrintfMacros.h"
|
||||
#include "mozilla/TypeTraits.h"
|
||||
#include "mozilla/Unused.h"
|
||||
|
||||
|
@ -187,7 +188,7 @@ JSString::dumpRepresentationHeader(FILE* fp, int indent, const char* subclass) c
|
|||
uint32_t flags = d.u1.flags;
|
||||
// Print the string's address as an actual C++ expression, to facilitate
|
||||
// copy-and-paste into a debugger.
|
||||
fprintf(fp, "((%s*) %p) length: %zu flags: 0x%x", subclass, this, length(), flags);
|
||||
fprintf(fp, "((%s*) %p) length: %" PRIuSIZE " flags: 0x%x", subclass, this, length(), flags);
|
||||
if (flags & FLAT_BIT) fputs(" FLAT", fp);
|
||||
if (flags & HAS_BASE_BIT) fputs(" HAS_BASE", fp);
|
||||
if (flags & INLINE_CHARS_BIT) fputs(" INLINE_CHARS", fp);
|
||||
|
@ -703,7 +704,7 @@ JSDependentString::dumpRepresentation(FILE* fp, int indent) const
|
|||
dumpRepresentationHeader(fp, indent, "JSDependentString");
|
||||
indent += 2;
|
||||
|
||||
fprintf(fp, "%*soffset: %zu\n", indent, "", baseOffset());
|
||||
fprintf(fp, "%*soffset: %" PRIuSIZE "\n", indent, "", baseOffset());
|
||||
fprintf(fp, "%*sbase: ", indent, "");
|
||||
base()->dumpRepresentation(fp, indent);
|
||||
}
|
||||
|
@ -1363,7 +1364,7 @@ JSExtensibleString::dumpRepresentation(FILE* fp, int indent) const
|
|||
dumpRepresentationHeader(fp, indent, "JSExtensibleString");
|
||||
indent += 2;
|
||||
|
||||
fprintf(fp, "%*scapacity: %zu\n", indent, "", capacity());
|
||||
fprintf(fp, "%*scapacity: %" PRIuSIZE "\n", indent, "", capacity());
|
||||
dumpRepresentationChars(fp, indent);
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@ TraceLoggerGraphState* traceLoggerGraphState = nullptr;
|
|||
// are allowed, with %u standing for a full 32-bit number and %d standing for
|
||||
// an up to 3-digit number.
|
||||
static js::UniqueChars
|
||||
MOZ_FORMAT_PRINTF(1, 2)
|
||||
AllocTraceLogFilename(const char* pattern, ...) {
|
||||
js::UniqueChars filename;
|
||||
|
||||
|
|
|
@ -237,6 +237,7 @@ js::InferSpewImpl(const char* fmt, ...)
|
|||
#endif
|
||||
|
||||
MOZ_NORETURN MOZ_COLD static void
|
||||
MOZ_FORMAT_PRINTF(2, 3)
|
||||
TypeFailure(JSContext* cx, const char* fmt, ...)
|
||||
{
|
||||
char msgbuf[1024]; /* Larger error messages will be truncated */
|
||||
|
@ -3288,7 +3289,7 @@ js::TypeMonitorResult(JSContext* cx, JSScript* script, jsbytecode* pc, TypeSet::
|
|||
if (types->hasType(type))
|
||||
return;
|
||||
|
||||
InferSpew(ISpewOps, "bytecodeType: %p %05u: %s",
|
||||
InferSpew(ISpewOps, "bytecodeType: %p %05" PRIuSIZE ": %s",
|
||||
script, script->pcToOffset(pc), TypeSet::TypeString(type));
|
||||
types->addType(cx, type);
|
||||
}
|
||||
|
|
|
@ -1296,7 +1296,7 @@ const char * InferSpewColor(TypeConstraint* constraint);
|
|||
const char * InferSpewColor(TypeSet* types);
|
||||
|
||||
#define InferSpew(channel, ...) if (InferSpewActive(channel)) { InferSpewImpl(__VA_ARGS__); } else {}
|
||||
void InferSpewImpl(const char* fmt, ...);
|
||||
void InferSpewImpl(const char* fmt, ...) MOZ_FORMAT_PRINTF(1, 2);
|
||||
|
||||
/* Check that the type property for id in group contains value. */
|
||||
bool ObjectGroupHasProperty(JSContext* cx, ObjectGroup* group, jsid id, const Value& value);
|
||||
|
|
|
@ -154,6 +154,7 @@ private:
|
|||
};
|
||||
|
||||
static nsresult
|
||||
MOZ_FORMAT_PRINTF(2, 3)
|
||||
ReportOnCallerUTF8(JSContext* callerContext,
|
||||
const char* format, ...) {
|
||||
if (!callerContext) {
|
||||
|
@ -177,6 +178,7 @@ ReportOnCallerUTF8(JSContext* callerContext,
|
|||
}
|
||||
|
||||
static nsresult
|
||||
MOZ_FORMAT_PRINTF(2, 3)
|
||||
ReportOnCallerUTF8(JSCLContextHelper& helper,
|
||||
const char* format, ...)
|
||||
{
|
||||
|
|
|
@ -116,9 +116,9 @@ XPCThrower::ThrowBadResult(nsresult rv, nsresult result, XPCCallContext& ccx)
|
|||
format = "";
|
||||
|
||||
if (nsXPCException::NameAndFormatForNSResult(result, &name, nullptr) && name)
|
||||
sz = JS_smprintf("%s 0x%x (%s)", format, result, name);
|
||||
sz = JS_smprintf("%s 0x%x (%s)", format, (unsigned) result, name);
|
||||
else
|
||||
sz = JS_smprintf("%s 0x%x", format, result);
|
||||
sz = JS_smprintf("%s 0x%x", format, (unsigned) result);
|
||||
NS_ENSURE_TRUE_VOID(sz);
|
||||
|
||||
if (sz && sVerbose)
|
||||
|
|
|
@ -971,7 +971,7 @@ nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper, uint16_t methodIndex,
|
|||
const char* str = "IDL methods marked with [implicit_jscontext] "
|
||||
"or [optional_argc] may not be implemented in JS";
|
||||
// Throw and warn for good measure.
|
||||
JS_ReportErrorASCII(cx, str);
|
||||
JS_ReportErrorASCII(cx, "%s", str);
|
||||
NS_WARNING(str);
|
||||
return CheckForException(ccx, aes, name, GetInterfaceName());
|
||||
}
|
||||
|
|
|
@ -72,4 +72,4 @@ if CONFIG['MOZ_B2G_BT']:
|
|||
]
|
||||
|
||||
if CONFIG['GNU_CXX']:
|
||||
CXXFLAGS += ['-Wno-shadow']
|
||||
CXXFLAGS += ['-Wno-shadow', '-Werror=format']
|
||||
|
|
|
@ -274,7 +274,7 @@ static void
|
|||
EnterAndThrowASCII(JSContext* cx, JSObject* wrapper, const char* msg)
|
||||
{
|
||||
JSAutoCompartment ac(cx, wrapper);
|
||||
JS_ReportErrorASCII(cx, msg);
|
||||
JS_ReportErrorASCII(cx, "%s", msg);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -12805,11 +12805,7 @@ Iterator::AppendItemsToList(const Iterator& aEnd,
|
|||
}
|
||||
|
||||
// Move our entire list of items into the empty target list.
|
||||
// XXX: If LinkedList supports move assignment, we could use
|
||||
// aTargetList.mItems = Move(mList.mItems);
|
||||
aTargetList.mItems.~LinkedList<FrameConstructionItem>();
|
||||
new (&aTargetList.mItems) LinkedList<FrameConstructionItem>(
|
||||
Move(mList.mItems));
|
||||
aTargetList.mItems = Move(mList.mItems);
|
||||
|
||||
// Copy over the various counters
|
||||
aTargetList.mInlineCount = mList.mInlineCount;
|
||||
|
|
|
@ -1410,12 +1410,11 @@ nsBlockFrame::Reflow(nsPresContext* aPresContext,
|
|||
// calculating hypothetical position of absolutely-positioned
|
||||
// frames. The line cursor is immediately cleared afterward to
|
||||
// avoid affecting the display list generation.
|
||||
SetupLineCursor();
|
||||
AutoLineCursorSetup autoLineCursor(this);
|
||||
absoluteContainer->Reflow(this, aPresContext, *reflowInput,
|
||||
state.mReflowStatus,
|
||||
containingBlock, flags,
|
||||
&aMetrics.mOverflowAreas);
|
||||
ClearLineCursor();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -153,8 +153,12 @@ public:
|
|||
virtual mozilla::a11y::AccType AccessibleType() override;
|
||||
#endif
|
||||
|
||||
// line cursor methods to speed up searching for the line(s)
|
||||
// containing a point. The basic idea is that we set the cursor
|
||||
// Line cursor methods to speed up line searching in which one query
|
||||
// result is expected to be close to the next in general. This is
|
||||
// mainly for searching line(s) containing a point. It is also used
|
||||
// as a cache for local computation. Use AutoLineCursorSetup for the
|
||||
// latter case so that it wouldn't interact unexpectedly with the
|
||||
// former. The basic idea for the former is that we set the cursor
|
||||
// property if the lines' overflowArea.VisualOverflow().ys and
|
||||
// overflowArea.VisualOverflow().yMosts are non-decreasing
|
||||
// (considering only non-empty overflowArea.VisualOverflow()s; empty
|
||||
|
@ -179,6 +183,36 @@ public:
|
|||
// building the display list of this frame.
|
||||
void SetupLineCursor();
|
||||
|
||||
/**
|
||||
* Helper RAII class for automatically set and clear line cursor for
|
||||
* temporary use. If the frame already has line cursor, this would be
|
||||
* a no-op.
|
||||
*/
|
||||
class MOZ_STACK_CLASS AutoLineCursorSetup
|
||||
{
|
||||
public:
|
||||
explicit AutoLineCursorSetup(nsBlockFrame* aFrame)
|
||||
: mFrame(aFrame)
|
||||
, mOrigCursor(aFrame->GetLineCursor())
|
||||
{
|
||||
if (!mOrigCursor) {
|
||||
mFrame->SetupLineCursor();
|
||||
}
|
||||
}
|
||||
~AutoLineCursorSetup()
|
||||
{
|
||||
if (mOrigCursor) {
|
||||
mFrame->Properties().Set(LineCursorProperty(), mOrigCursor);
|
||||
} else {
|
||||
mFrame->ClearLineCursor();
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
nsBlockFrame* mFrame;
|
||||
nsLineBox* mOrigCursor;
|
||||
};
|
||||
|
||||
virtual void ChildIsDirty(nsIFrame* aChild) override;
|
||||
virtual bool IsVisibleInSelection(nsISelection* aSelection) override;
|
||||
|
||||
|
@ -368,9 +402,9 @@ protected:
|
|||
#endif
|
||||
|
||||
NS_DECLARE_FRAME_PROPERTY_WITHOUT_DTOR(LineCursorProperty, nsLineBox)
|
||||
bool HasLineCursor() { return GetStateBits() & NS_BLOCK_HAS_LINE_CURSOR; }
|
||||
nsLineBox* GetLineCursor() {
|
||||
return (GetStateBits() & NS_BLOCK_HAS_LINE_CURSOR) ?
|
||||
Properties().Get(LineCursorProperty()) : nullptr;
|
||||
return HasLineCursor() ? Properties().Get(LineCursorProperty()) : nullptr;
|
||||
}
|
||||
|
||||
nsLineBox* NewLineBox(nsIFrame* aFrame, bool aIsBlock) {
|
||||
|
|
|
@ -9634,17 +9634,10 @@ static void TransformChars(nsTextFrame* aFrame, const nsStyleText* aStyle,
|
|||
}
|
||||
|
||||
static bool
|
||||
LineEndsInHardLineBreak(nsTextFrame* aFrame)
|
||||
LineEndsInHardLineBreak(nsTextFrame* aFrame, nsBlockFrame* aLineContainer)
|
||||
{
|
||||
nsIFrame* lineContainer = FindLineContainer(aFrame);
|
||||
nsBlockFrame* block = do_QueryFrame(lineContainer);
|
||||
if (!block) {
|
||||
// Weird situation where we have a line layout without a block.
|
||||
// No soft breaks occur in this situation.
|
||||
return true;
|
||||
}
|
||||
bool foundValidLine;
|
||||
nsBlockInFlowLineIterator iter(block, aFrame, &foundValidLine);
|
||||
nsBlockInFlowLineIterator iter(aLineContainer, aFrame, &foundValidLine);
|
||||
if (!foundValidLine) {
|
||||
NS_ERROR("Invalid line!");
|
||||
return true;
|
||||
|
@ -9662,11 +9655,13 @@ nsTextFrame::GetRenderedText(uint32_t aStartOffset,
|
|||
|
||||
// The handling of offsets could be more efficient...
|
||||
RenderedText result;
|
||||
nsBlockFrame* lineContainer = nullptr;
|
||||
nsTextFrame* textFrame;
|
||||
const nsTextFragment* textFrag = mContent->GetText();
|
||||
uint32_t offsetInRenderedString = 0;
|
||||
bool haveOffsets = false;
|
||||
|
||||
Maybe<nsBlockFrame::AutoLineCursorSetup> autoLineCursor;
|
||||
for (textFrame = this; textFrame;
|
||||
textFrame = static_cast<nsTextFrame*>(textFrame->GetNextContinuation())) {
|
||||
if (textFrame->GetStateBits() & NS_FRAME_IS_DIRTY) {
|
||||
|
@ -9682,10 +9677,30 @@ nsTextFrame::GetRenderedText(uint32_t aStartOffset,
|
|||
}
|
||||
gfxSkipCharsIterator tmpIter = iter;
|
||||
|
||||
// Whether we need to trim whitespaces after the text frame.
|
||||
bool trimAfter;
|
||||
if (!textFrame->IsAtEndOfLine() ||
|
||||
aTrimTrailingWhitespace !=
|
||||
TrailingWhitespace::TRIM_TRAILING_WHITESPACE) {
|
||||
trimAfter = false;
|
||||
} else if (nsBlockFrame* thisLc =
|
||||
do_QueryFrame(FindLineContainer(textFrame))) {
|
||||
if (thisLc != lineContainer) {
|
||||
// Setup line cursor when needed.
|
||||
lineContainer = thisLc;
|
||||
autoLineCursor.reset();
|
||||
autoLineCursor.emplace(lineContainer);
|
||||
}
|
||||
trimAfter = LineEndsInHardLineBreak(textFrame, lineContainer);
|
||||
} else {
|
||||
// Weird situation where we have a line layout without a block.
|
||||
// No soft breaks occur in this situation.
|
||||
trimAfter = true;
|
||||
}
|
||||
|
||||
// Skip to the start of the text run, past ignored chars at start of line
|
||||
TrimmedOffsets trimmedOffsets = textFrame->GetTrimmedOffsets(textFrag,
|
||||
textFrame->IsAtEndOfLine() && LineEndsInHardLineBreak(textFrame) &&
|
||||
aTrimTrailingWhitespace == TrailingWhitespace::TRIM_TRAILING_WHITESPACE);
|
||||
TrimmedOffsets trimmedOffsets =
|
||||
textFrame->GetTrimmedOffsets(textFrag, trimAfter);
|
||||
bool trimmedSignificantNewline =
|
||||
trimmedOffsets.GetEnd() < GetContentEnd() &&
|
||||
HasSignificantTerminalNewline();
|
||||
|
|
|
@ -569,4 +569,36 @@
|
|||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/**
|
||||
* Printf style formats. MOZ_FORMAT_PRINTF can be used to annotate a
|
||||
* function or method that is "printf-like"; this will let (some)
|
||||
* compilers check that the arguments match the template string.
|
||||
*
|
||||
* This macro takes two arguments. The first argument is the argument
|
||||
* number of the template string. The second argument is the argument
|
||||
* number of the '...' argument holding the arguments.
|
||||
*
|
||||
* Argument numbers start at 1. Note that the implicit "this"
|
||||
* argument of a non-static member function counts as an argument.
|
||||
*
|
||||
* So, for a simple case like:
|
||||
* void print_something (int whatever, const char *fmt, ...);
|
||||
* The corresponding annotation would be
|
||||
* MOZ_FORMAT_PRINTF(2, 3)
|
||||
* However, if "print_something" were a non-static member function,
|
||||
* then the annotation would be:
|
||||
* MOZ_FORMAT_PRINTF(3, 4)
|
||||
*
|
||||
* Note that the checking is limited to standards-conforming
|
||||
* printf-likes, and in particular this should not be used for
|
||||
* PR_snprintf and friends, which are "printf-like" but which assign
|
||||
* different meanings to the various formats.
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
#define MOZ_FORMAT_PRINTF(stringIndex, firstToCheck) \
|
||||
__attribute__ ((format (printf, stringIndex, firstToCheck)))
|
||||
#else
|
||||
#define MOZ_FORMAT_PRINTF(stringIndex, firstToCheck)
|
||||
#endif
|
||||
|
||||
#endif /* mozilla_Attributes_h */
|
||||
|
|
|
@ -125,34 +125,23 @@ public:
|
|||
mIsSentinel(false)
|
||||
{ }
|
||||
|
||||
LinkedListElement(LinkedListElement<T>&& other)
|
||||
: mIsSentinel(other.mIsSentinel)
|
||||
/*
|
||||
* Moves |aOther| into |*this|. If |aOther| is already in a list, then
|
||||
* |aOther| is removed from the list and replaced by |*this|.
|
||||
*/
|
||||
LinkedListElement(LinkedListElement<T>&& aOther)
|
||||
: mIsSentinel(aOther.mIsSentinel)
|
||||
{
|
||||
if (!other.isInList()) {
|
||||
mNext = this;
|
||||
mPrev = this;
|
||||
return;
|
||||
}
|
||||
adjustLinkForMove(Move(aOther));
|
||||
}
|
||||
|
||||
MOZ_ASSERT(other.mNext->mPrev == &other);
|
||||
MOZ_ASSERT(other.mPrev->mNext == &other);
|
||||
|
||||
/*
|
||||
* Initialize |this| with |other|'s mPrev/mNext pointers, and adjust those
|
||||
* element to point to this one.
|
||||
*/
|
||||
mNext = other.mNext;
|
||||
mPrev = other.mPrev;
|
||||
|
||||
mNext->mPrev = this;
|
||||
mPrev->mNext = this;
|
||||
|
||||
/*
|
||||
* Adjust |other| so it doesn't think it's in a list. This makes it
|
||||
* safely destructable.
|
||||
*/
|
||||
other.mNext = &other;
|
||||
other.mPrev = &other;
|
||||
LinkedListElement& operator=(LinkedListElement<T>&& aOther)
|
||||
{
|
||||
MOZ_ASSERT(mIsSentinel == aOther.mIsSentinel, "Mismatch NodeKind!");
|
||||
MOZ_ASSERT(!isInList(),
|
||||
"Assigning to an element in a list messes up that list!");
|
||||
adjustLinkForMove(Move(aOther));
|
||||
return *this;
|
||||
}
|
||||
|
||||
~LinkedListElement()
|
||||
|
@ -233,15 +222,15 @@ public:
|
|||
private:
|
||||
friend class LinkedList<T>;
|
||||
|
||||
enum NodeKind {
|
||||
NODE_KIND_NORMAL,
|
||||
NODE_KIND_SENTINEL
|
||||
enum class NodeKind {
|
||||
Normal,
|
||||
Sentinel
|
||||
};
|
||||
|
||||
explicit LinkedListElement(NodeKind nodeKind)
|
||||
: mNext(this),
|
||||
mPrev(this),
|
||||
mIsSentinel(nodeKind == NODE_KIND_SENTINEL)
|
||||
mIsSentinel(nodeKind == NodeKind::Sentinel)
|
||||
{ }
|
||||
|
||||
/*
|
||||
|
@ -287,7 +276,39 @@ private:
|
|||
this->mPrev = listElem;
|
||||
}
|
||||
|
||||
private:
|
||||
/*
|
||||
* Adjust mNext and mPrev for implementing move constructor and move
|
||||
* assignment.
|
||||
*/
|
||||
void adjustLinkForMove(LinkedListElement<T>&& aOther)
|
||||
{
|
||||
if (!aOther.isInList()) {
|
||||
mNext = this;
|
||||
mPrev = this;
|
||||
return;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(aOther.mNext->mPrev == &aOther);
|
||||
MOZ_ASSERT(aOther.mPrev->mNext == &aOther);
|
||||
|
||||
/*
|
||||
* Initialize |this| with |aOther|'s mPrev/mNext pointers, and adjust those
|
||||
* element to point to this one.
|
||||
*/
|
||||
mNext = aOther.mNext;
|
||||
mPrev = aOther.mPrev;
|
||||
|
||||
mNext->mPrev = this;
|
||||
mPrev->mNext = this;
|
||||
|
||||
/*
|
||||
* Adjust |aOther| so it doesn't think it's in a list. This makes it
|
||||
* safely destructable.
|
||||
*/
|
||||
aOther.mNext = &aOther;
|
||||
aOther.mPrev = &aOther;
|
||||
}
|
||||
|
||||
LinkedListElement& operator=(const LinkedListElement<T>& aOther) = delete;
|
||||
LinkedListElement(const LinkedListElement<T>& aOther) = delete;
|
||||
};
|
||||
|
@ -319,12 +340,19 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
LinkedList() : sentinel(LinkedListElement<T>::NODE_KIND_SENTINEL) { }
|
||||
LinkedList() : sentinel(LinkedListElement<T>::NodeKind::Sentinel) { }
|
||||
|
||||
LinkedList(LinkedList<T>&& aOther)
|
||||
: sentinel(mozilla::Move(aOther.sentinel))
|
||||
{ }
|
||||
|
||||
LinkedList& operator=(LinkedList<T>&& aOther)
|
||||
{
|
||||
MOZ_ASSERT(isEmpty(), "Assigning to a non-empty list leaks elements in that list!");
|
||||
sentinel = mozilla::Move(aOther.sentinel);
|
||||
return *this;
|
||||
}
|
||||
|
||||
~LinkedList() {
|
||||
MOZ_ASSERT(isEmpty(),
|
||||
"failing this assertion means this LinkedList's creator is "
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <stdarg.h>
|
||||
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
|
@ -26,9 +27,7 @@ int VsprintfLiteral(char (&buffer)[N], const char* format, va_list args)
|
|||
}
|
||||
|
||||
template <size_t N>
|
||||
#if defined(__GNUC__)
|
||||
__attribute__((format(printf, 2, 3)))
|
||||
#endif
|
||||
MOZ_FORMAT_PRINTF(2, 3)
|
||||
int SprintfLiteral(char (&buffer)[N], const char* format, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
|
|
@ -12,7 +12,7 @@ using mozilla::LinkedListElement;
|
|||
|
||||
struct SomeClass : public LinkedListElement<SomeClass> {
|
||||
unsigned int mValue;
|
||||
explicit SomeClass(int aValue) : mValue(aValue) {}
|
||||
explicit SomeClass(int aValue = 0) : mValue(aValue) {}
|
||||
void incr() { ++mValue; }
|
||||
};
|
||||
|
||||
|
@ -34,7 +34,7 @@ TestList()
|
|||
LinkedList<SomeClass> list;
|
||||
|
||||
SomeClass one(1), two(2), three(3);
|
||||
|
||||
|
||||
MOZ_RELEASE_ASSERT(list.isEmpty());
|
||||
MOZ_RELEASE_ASSERT(!list.getFirst());
|
||||
MOZ_RELEASE_ASSERT(!list.getLast());
|
||||
|
@ -52,7 +52,7 @@ TestList()
|
|||
MOZ_RELEASE_ASSERT(one.isInList());
|
||||
MOZ_RELEASE_ASSERT(!two.isInList());
|
||||
MOZ_RELEASE_ASSERT(!three.isInList());
|
||||
|
||||
|
||||
MOZ_RELEASE_ASSERT(!list.isEmpty());
|
||||
MOZ_RELEASE_ASSERT(list.getFirst()->mValue == 1);
|
||||
MOZ_RELEASE_ASSERT(list.getLast()->mValue == 1);
|
||||
|
@ -117,6 +117,45 @@ TestList()
|
|||
MOZ_RELEASE_ASSERT(list.getLast()->mValue == 4);
|
||||
}
|
||||
|
||||
static void
|
||||
TestMove()
|
||||
{
|
||||
auto MakeSomeClass =
|
||||
[] (unsigned int aValue) -> SomeClass { return SomeClass(aValue); };
|
||||
|
||||
LinkedList<SomeClass> list1;
|
||||
|
||||
// Test move constructor for LinkedListElement.
|
||||
SomeClass c1(MakeSomeClass(1));
|
||||
list1.insertBack(&c1);
|
||||
|
||||
// Test move assignment for LinkedListElement from an element not in a
|
||||
// list.
|
||||
SomeClass c2;
|
||||
c2 = MakeSomeClass(2);
|
||||
list1.insertBack(&c2);
|
||||
|
||||
// Test move assignment of LinkedListElement from an element already in a
|
||||
// list.
|
||||
SomeClass c3;
|
||||
c3 = Move(c2);
|
||||
MOZ_RELEASE_ASSERT(!c2.isInList());
|
||||
MOZ_RELEASE_ASSERT(c3.isInList());
|
||||
|
||||
// Test move constructor for LinkedList.
|
||||
LinkedList<SomeClass> list2(Move(list1));
|
||||
{ unsigned int check[] { 1, 2 }; CheckListValues(list2, check); }
|
||||
MOZ_RELEASE_ASSERT(list1.isEmpty());
|
||||
|
||||
// Test move assignment for LinkedList.
|
||||
LinkedList<SomeClass> list3;
|
||||
list3 = Move(list2);
|
||||
{ unsigned int check[] { 1, 2 }; CheckListValues(list3, check); }
|
||||
MOZ_RELEASE_ASSERT(list2.isEmpty());
|
||||
|
||||
list3.clear();
|
||||
}
|
||||
|
||||
struct PrivateClass : private LinkedListElement<PrivateClass> {
|
||||
friend class mozilla::LinkedList<PrivateClass>;
|
||||
friend class mozilla::LinkedListElement<PrivateClass>;
|
||||
|
@ -143,5 +182,6 @@ main()
|
|||
{
|
||||
TestList();
|
||||
TestPrivate();
|
||||
TestMove();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -316,7 +316,9 @@ def nsis_version(nsis):
|
|||
raise FatalCheckError('Unknown version of makensis')
|
||||
ver = Version(m.group(0))
|
||||
|
||||
if ver < nsis_min_version:
|
||||
# Versions comparisons don't quite work well with beta versions, so ensure
|
||||
# it works for the non-beta version.
|
||||
if ver < nsis_min_version and (ver >= '3.0a' or ver < '3'):
|
||||
raise FatalCheckError('To build the installer you must have NSIS'
|
||||
' version %s or greater in your path'
|
||||
% nsis_min_version)
|
||||
|
|
|
@ -57,6 +57,37 @@ class TestMozConfigure(BaseConfigureTest):
|
|||
get_value_for(['--enable-application=browser',
|
||||
'--with-foo=foo bar']))
|
||||
|
||||
def test_nsis_version(self):
|
||||
this = self
|
||||
|
||||
class FakeNSIS(object):
|
||||
def __init__(self, version):
|
||||
self.version = version
|
||||
|
||||
def __call__(self, stdin, args):
|
||||
this.assertEquals(args, ('-version',))
|
||||
return 0, self.version, ''
|
||||
|
||||
def check_nsis_version(version):
|
||||
sandbox = self.get_sandbox(
|
||||
{'/usr/bin/makensis': FakeNSIS(version)}, {}, [],
|
||||
{'PATH': '/usr/bin', 'MAKENSISU': '/usr/bin/makensis'})
|
||||
return sandbox._value_for(sandbox['nsis_version'])
|
||||
|
||||
with self.assertRaises(SystemExit) as e:
|
||||
check_nsis_version('v2.5')
|
||||
|
||||
with self.assertRaises(SystemExit) as e:
|
||||
check_nsis_version('v3.0a2')
|
||||
|
||||
self.assertEquals(check_nsis_version('v3.0b1'), '3.0b1')
|
||||
self.assertEquals(check_nsis_version('v3.0b2'), '3.0b2')
|
||||
self.assertEquals(check_nsis_version('v3.0rc1'), '3.0rc1')
|
||||
self.assertEquals(check_nsis_version('v3.0'), '3.0')
|
||||
self.assertEquals(check_nsis_version('v3.0-2'), '3.0')
|
||||
self.assertEquals(check_nsis_version('v3.0.1'), '3.0')
|
||||
self.assertEquals(check_nsis_version('v3.1'), '3.1')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
|
@ -111,7 +111,9 @@ pageInfo_MixedContent2=Parts of the page you are viewing were not encrypted befo
|
|||
pageInfo_WeakCipher=Your connection to this website uses weak encryption and is not private. Other people can view your information or modify the website’s behavior.
|
||||
|
||||
# Cert Viewer
|
||||
certDetails=Certificate Viewer:
|
||||
# LOCALIZATION NOTE(certViewerTitle): Title used for the Certificate Viewer.
|
||||
# %1$S is a string representative of the certificate being viewed.
|
||||
certViewerTitle=Certificate Viewer: “%1$S”
|
||||
notPresent=<Not Part Of Certificate>
|
||||
|
||||
# Token Manager
|
||||
|
|
|
@ -11,17 +11,28 @@ class mozIDOMWindowProxy;
|
|||
class nsISupports;
|
||||
|
||||
/**
|
||||
* Common class that uses the window watcher service to open a
|
||||
* standard dialog, with or without a parent context. The params
|
||||
* parameter can be an nsISupportsArray so any number of additional
|
||||
* arguments can be used.
|
||||
* Helper class that uses the window watcher service to open a standard dialog,
|
||||
* with or without a parent context.
|
||||
*/
|
||||
class nsNSSDialogHelper
|
||||
{
|
||||
public:
|
||||
// params is a nsIDialogParamBlock or a nsIKeygenThread
|
||||
/**
|
||||
* Opens a XUL dialog.
|
||||
*
|
||||
* @param window
|
||||
* Parent window of the dialog, or nullptr to signal no parent.
|
||||
* @param url
|
||||
* URL to the XUL dialog.
|
||||
* @param params
|
||||
* Parameters to pass to the dialog. Same semantics as the
|
||||
* nsIWindowWatcher.openWindow() |aArguments| parameter.
|
||||
* @param modal
|
||||
* true if the dialog should be modal, false otherwise.
|
||||
* @return The result of opening the dialog.
|
||||
*/
|
||||
static nsresult openDialog(mozIDOMWindowProxy* window, const char* url,
|
||||
nsISupports* params, bool modal = true);
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif // nsNSSDialogHelper_h
|
||||
|
|
|
@ -7,35 +7,28 @@
|
|||
/*
|
||||
* Dialog services for PIP.
|
||||
*/
|
||||
|
||||
#include "nsNSSDialogs.h"
|
||||
|
||||
#include "mozIDOMWindow.h"
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/Casting.h"
|
||||
#include "nsArray.h"
|
||||
#include "nsDateTimeFormatCID.h"
|
||||
#include "nsEmbedCID.h"
|
||||
#include "nsIComponentManager.h"
|
||||
#include "nsIDateTimeFormat.h"
|
||||
#include "nsIDialogParamBlock.h"
|
||||
#include "nsIInterfaceRequestor.h"
|
||||
#include "nsIInterfaceRequestorUtils.h"
|
||||
#include "nsIKeygenThread.h"
|
||||
#include "nsIPromptService.h"
|
||||
#include "nsIProtectedAuthThread.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsIWindowWatcher.h"
|
||||
#include "nsIX509CertDB.h"
|
||||
#include "nsIX509Cert.h"
|
||||
#include "nsIX509CertValidity.h"
|
||||
#include "nsNSSDialogHelper.h"
|
||||
#include "nsNSSDialogs.h"
|
||||
#include "nsPromiseFlatString.h"
|
||||
#include "nsReadableUtils.h"
|
||||
#include "nsString.h"
|
||||
|
||||
#define PIPSTRING_BUNDLE_URL "chrome://pippki/locale/pippki.properties"
|
||||
|
||||
/* ==== */
|
||||
|
||||
nsNSSDialogs::nsNSSDialogs()
|
||||
{
|
||||
}
|
||||
|
@ -329,33 +322,18 @@ nsNSSDialogs::GetPKCS12FilePassword(nsIInterfaceRequestor* ctx,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
NS_IMETHODIMP
|
||||
nsNSSDialogs::ViewCert(nsIInterfaceRequestor* ctx, nsIX509Cert* cert)
|
||||
{
|
||||
nsCOMPtr<nsIMutableArray> dlgArray = nsArrayBase::Create();
|
||||
if (!dlgArray) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
nsresult rv = dlgArray->AppendElement(cert, false);
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
nsCOMPtr<nsIDialogParamBlock> dlgParamBlock(
|
||||
do_CreateInstance(NS_DIALOGPARAMBLOCK_CONTRACTID));
|
||||
if (!dlgParamBlock) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
rv = dlgParamBlock->SetObjects(dlgArray);
|
||||
if (NS_FAILED(rv)) {
|
||||
return rv;
|
||||
}
|
||||
// |ctx| is allowed to be null.
|
||||
NS_ENSURE_ARG(cert);
|
||||
|
||||
// Get the parent window for the dialog
|
||||
nsCOMPtr<mozIDOMWindowProxy> parent = do_GetInterface(ctx);
|
||||
return nsNSSDialogHelper::openDialog(parent,
|
||||
"chrome://pippki/content/certViewer.xul",
|
||||
dlgParamBlock,
|
||||
false);
|
||||
cert,
|
||||
false /*modal*/);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
|
|
@ -3,6 +3,14 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
"use strict";
|
||||
|
||||
/**
|
||||
* @file Implements functionality for certViewer.xul and its tabs certDump.xul
|
||||
* and viewCertDetails.xul: a dialog that allows various attributes of a
|
||||
* certificate to be viewed.
|
||||
* @argument {nsISupports} window.arguments[0]
|
||||
* The cert to view, queryable to nsIX509Cert.
|
||||
*/
|
||||
|
||||
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
|
||||
const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
|
||||
|
||||
|
@ -16,7 +24,6 @@ const nsIASN1Sequence = Ci.nsIASN1Sequence;
|
|||
const nsIASN1PrintableItem = Ci.nsIASN1PrintableItem;
|
||||
const nsIASN1Tree = Ci.nsIASN1Tree;
|
||||
const nsASN1Tree = "@mozilla.org/security/nsASN1Tree;1";
|
||||
const nsIDialogParamBlock = Ci.nsIDialogParamBlock;
|
||||
|
||||
var bundle;
|
||||
|
||||
|
@ -71,21 +78,11 @@ function AddUsage(usage)
|
|||
|
||||
function setWindowName()
|
||||
{
|
||||
// Get the cert from the cert database
|
||||
var certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB);
|
||||
var myName = self.name;
|
||||
bundle = document.getElementById("pippki_bundle");
|
||||
var cert;
|
||||
|
||||
var certDetails = bundle.getString('certDetails');
|
||||
if (myName != "") {
|
||||
document.title = certDetails + '"' + myName + '"'; // XXX l10n?
|
||||
cert = certdb.findCertByNickname(myName);
|
||||
} else {
|
||||
var params = window.arguments[0].QueryInterface(nsIDialogParamBlock);
|
||||
cert = params.objects.queryElementAt(0, nsIX509Cert);
|
||||
document.title = certDetails + '"' + cert.windowTitle + '"'; // XXX l10n?
|
||||
}
|
||||
let cert = window.arguments[0].QueryInterface(Ci.nsIX509Cert);
|
||||
document.title = bundle.getFormattedString("certViewerTitle",
|
||||
[cert.windowTitle]);
|
||||
|
||||
//
|
||||
// Set the cert attributes for viewing
|
|
@ -20,7 +20,8 @@
|
|||
|
||||
<stringbundle id="pippki_bundle" src="chrome://pippki/locale/pippki.properties"/>
|
||||
|
||||
<script type="application/javascript" src="chrome://pippki/content/viewCertDetails.js"/>
|
||||
<script type="application/javascript"
|
||||
src="chrome://pippki/content/certViewer.js"/>
|
||||
<script type="application/javascript" src="chrome://pippki/content/pippki.js"/>
|
||||
|
||||
<tabbox flex="1">
|
||||
|
|
|
@ -24,12 +24,12 @@ pippki.jar:
|
|||
content/pippki/exceptionDialog.js (content/exceptionDialog.js)
|
||||
content/pippki/deletecert.xul (content/deletecert.xul)
|
||||
content/pippki/deletecert.js (content/deletecert.js)
|
||||
content/pippki/viewCertDetails.js (content/viewCertDetails.js)
|
||||
content/pippki/setp12password.xul (content/setp12password.xul)
|
||||
content/pippki/pippki.js (content/pippki.js)
|
||||
content/pippki/clientauthask.xul (content/clientauthask.xul)
|
||||
content/pippki/clientauthask.js (content/clientauthask.js)
|
||||
content/pippki/certViewer.xul (content/certViewer.xul)
|
||||
content/pippki/certViewer.js (content/certViewer.js)
|
||||
content/pippki/certDump.xul (content/certDump.xul)
|
||||
content/pippki/device_manager.xul (content/device_manager.xul)
|
||||
content/pippki/device_manager.js (content/device_manager.js)
|
||||
|
|
|
@ -10,42 +10,47 @@
|
|||
|
||||
var { OS } = Cu.import("resource://gre/modules/osfile.jsm", {});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testCAandTitle() {
|
||||
let cert = yield readCertificate("ca.pem", "CTu,CTu,CTu");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkUsages(win, ["SSL Certificate Authority"]);
|
||||
|
||||
// There's no real need to test the title for every cert, so we just test it
|
||||
// once here.
|
||||
Assert.equal(win.document.title, "Certificate Viewer: \u201Cca\u201D",
|
||||
"Actual and expected title should match");
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testSSLEndEntity() {
|
||||
let cert = yield readCertificate("ssl-ee.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkUsages(win, ["SSL Server Certificate", "SSL Client Certificate"]);
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testEmailEndEntity() {
|
||||
let cert = yield readCertificate("email-ee.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkUsages(win, ["Email Recipient Certificate", "Email Signer Certificate"]);
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testCodeSignEndEntity() {
|
||||
let cert = yield readCertificate("code-ee.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkUsages(win, ["Object Signer"]);
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testExpired() {
|
||||
let cert = yield readCertificate("expired-ca.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkError(win, "Could not verify this certificate because it has expired.");
|
||||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testIssuerExpired() {
|
||||
let cert = yield readCertificate("ee-from-expired-ca.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkError(win,
|
||||
|
@ -54,7 +59,7 @@ add_task(function* () {
|
|||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testUnknownIssuer() {
|
||||
let cert = yield readCertificate("unknown-issuer.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkError(win,
|
||||
|
@ -63,7 +68,7 @@ add_task(function* () {
|
|||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testInsecureAlgo() {
|
||||
let cert = yield readCertificate("md5-ee.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkError(win,
|
||||
|
@ -73,7 +78,7 @@ add_task(function* () {
|
|||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testUntrusted() {
|
||||
let cert = yield readCertificate("untrusted-ca.pem", "p,p,p");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkError(win,
|
||||
|
@ -81,7 +86,7 @@ add_task(function* () {
|
|||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testUntrustedIssuer() {
|
||||
let cert = yield readCertificate("ee-from-untrusted-ca.pem", ",,");
|
||||
let win = yield displayCertificate(cert);
|
||||
checkError(win,
|
||||
|
@ -90,7 +95,7 @@ add_task(function* () {
|
|||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testRevoked() {
|
||||
// Note that there's currently no way to un-do this. This should only be a
|
||||
// problem if another test re-uses a certificate with this same key (perhaps
|
||||
// likely) and subject (less likely).
|
||||
|
@ -106,7 +111,7 @@ add_task(function* () {
|
|||
yield BrowserTestUtils.closeWindow(win);
|
||||
});
|
||||
|
||||
add_task(function* () {
|
||||
add_task(function* testInvalid() {
|
||||
// This certificate has a keyUsage extension asserting cRLSign and
|
||||
// keyCertSign, but it doesn't have a basicConstraints extension. This
|
||||
// shouldn't be valid for any usage. Sadly, we give a pretty lame error
|
||||
|
@ -129,13 +134,8 @@ add_task(function* () {
|
|||
* viewer window when the usages have been determined.
|
||||
*/
|
||||
function displayCertificate(certificate) {
|
||||
let array = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
|
||||
array.appendElement(certificate, false);
|
||||
let params = Cc["@mozilla.org/embedcomp/dialogparam;1"]
|
||||
.createInstance(Ci.nsIDialogParamBlock);
|
||||
params.objects = array;
|
||||
let win = window.openDialog("chrome://pippki/content/certViewer.xul", "",
|
||||
"", params);
|
||||
"", certificate);
|
||||
return TestUtils.topicObserved("ViewCertDetails:CertUsagesDone",
|
||||
(subject, data) => subject == win)
|
||||
.then(([subject, data]) => subject, error => { throw error; });
|
||||
|
|
|
@ -25,9 +25,42 @@ linux64-pgo/opt:
|
|||
linux64-asan/opt:
|
||||
build-platform: linux64-asan/opt
|
||||
test-set: asan-tests
|
||||
|
||||
linux64-ccov/opt:
|
||||
build-platform: linux64-ccov/opt
|
||||
test-set: ccov-code-coverage-tests
|
||||
linux64-jsdcov/opt:
|
||||
build-platform: linux64-jsdcov/opt
|
||||
test-set: jsdcov-code-coverage-tests
|
||||
test-set: jsdcov-code-coverage-tests
|
||||
|
||||
# win32 vm
|
||||
windows7-32-vm/debug:
|
||||
build-platform: win32/debug
|
||||
test-set: windows-vm-tests
|
||||
windows7-32-vm/opt:
|
||||
build-platform: win32/opt
|
||||
test-set: windows-vm-tests
|
||||
|
||||
# win32 gpu
|
||||
#windows7-32/debug:
|
||||
# build-platform: win32/debug
|
||||
# test-set: windows-gpu-tests
|
||||
#windows7-32/opt:
|
||||
# build-platform: win32/opt
|
||||
# test-set: windows-gpu-tests
|
||||
|
||||
# win64 vm
|
||||
windows10-64-vm/debug:
|
||||
build-platform: win64/debug
|
||||
test-set: windows-vm-tests
|
||||
windows10-64-vm/opt:
|
||||
build-platform: win64/opt
|
||||
test-set: windows-vm-tests
|
||||
|
||||
# win64 gpu
|
||||
#windows10-64/debug:
|
||||
# build-platform: win64/debug
|
||||
# test-set: windows-gpu-tests
|
||||
#windows10-64/opt:
|
||||
# build-platform: win64/opt
|
||||
# test-set: windows-gpu-tests
|
||||
|
|
|
@ -58,6 +58,35 @@ asan-tests:
|
|||
- reftest-no-accel
|
||||
- xpcshell
|
||||
|
||||
windows-vm-tests:
|
||||
- cppunit
|
||||
#- crashtest
|
||||
#- external-media-tests
|
||||
#- gtest
|
||||
#- jittest
|
||||
#- jsreftest
|
||||
#- marionette
|
||||
#- mochitest
|
||||
#- mochitest-browser-chrome
|
||||
#- mochitest-devtools-chrome
|
||||
#- mochitest-jetpack
|
||||
#- mochitest-media
|
||||
#- web-platform-tests
|
||||
#- web-platform-tests-reftests
|
||||
#- xpcshell
|
||||
|
||||
# windows-gpu-tests:
|
||||
# - reftest
|
||||
# - reftest-no-accel
|
||||
# - mochitest-webgl
|
||||
|
||||
# these tests currently run on hardware, but may migrate above when validated
|
||||
# note: on win, mochitest-a11y and mochitest-chrome come under mochitest-other
|
||||
# windows-hw-tests:
|
||||
# - mochitest-clipboard
|
||||
# - mochitest-gpu
|
||||
# - mochitest-other
|
||||
|
||||
ccov-code-coverage-tests:
|
||||
- mochitest-browser-chrome
|
||||
|
||||
|
|
|
@ -15,11 +15,8 @@ cppunit:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
# Coming soon:
|
||||
# win.*:
|
||||
# - unittests/win_unittest.py
|
||||
# - remove_executables.py
|
||||
# ...
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -31,12 +28,19 @@ crashtest:
|
|||
suite: reftest/crashtest
|
||||
treeherder-symbol: tc-R(C)
|
||||
docker-image: {"in-tree": "desktop1604-test"}
|
||||
e10s:
|
||||
by-test-platform:
|
||||
# Bug 1304435
|
||||
win.*: false
|
||||
default: both
|
||||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
chunked: true
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -54,8 +58,12 @@ external-media-tests:
|
|||
script: firefox_media_tests_buildbot.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
- mediatests/buildbot_posix_config.py
|
||||
- remove_executables.py
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- mediatests/taskcluster_windows_config.py
|
||||
default:
|
||||
- mediatests/buildbot_posix_config.py
|
||||
- remove_executables.py
|
||||
|
||||
firefox-ui-functional-local:
|
||||
description: "Firefox-ui-tests functional run"
|
||||
|
@ -98,6 +106,8 @@ gtest:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -109,12 +119,17 @@ jittest:
|
|||
suite: jittest/jittest-chunked
|
||||
treeherder-symbol: tc(Jit)
|
||||
e10s: false
|
||||
chunks: 6
|
||||
chunks:
|
||||
by-test-platform:
|
||||
win.*: 1
|
||||
default: 6
|
||||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -125,12 +140,17 @@ jsreftest:
|
|||
description: "JS Reftest run"
|
||||
suite: reftest/jsreftest
|
||||
treeherder-symbol: tc-R(J)
|
||||
chunks: 2
|
||||
chunks:
|
||||
by-test-platform:
|
||||
win.*: 1
|
||||
default: 2
|
||||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -146,15 +166,22 @@ marionette:
|
|||
script: marionette.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
- marionette/prod_config.py
|
||||
- remove_executables.py
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- marionette/windows_taskcluster_config.py
|
||||
default:
|
||||
- marionette/prod_config.py
|
||||
- remove_executables.py
|
||||
|
||||
mochitest:
|
||||
description: "Mochitest plain run"
|
||||
suite: mochitest/plain-chunked
|
||||
treeherder-symbol: tc-M()
|
||||
loopback-video: true
|
||||
chunks: 10
|
||||
chunks:
|
||||
by-test-platform:
|
||||
win.*: 5
|
||||
default: 10
|
||||
max-run-time: 5400
|
||||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
|
@ -162,6 +189,8 @@ mochitest:
|
|||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -183,6 +212,8 @@ mochitest-a11y:
|
|||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -222,6 +253,8 @@ mochitest-browser-chrome:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -254,6 +287,8 @@ mochitest-chrome:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -272,6 +307,8 @@ mochitest-clipboard:
|
|||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -284,7 +321,10 @@ mochitest-devtools-chrome:
|
|||
treeherder-symbol: tc-M(dt)
|
||||
loopback-video: true
|
||||
max-run-time: 5400
|
||||
chunks: 10
|
||||
chunks:
|
||||
by-test-platform:
|
||||
win.*: 8
|
||||
default: 10
|
||||
e10s:
|
||||
by-test-platform:
|
||||
# Bug 1242986: linux64/debug mochitest-devtools-chrome e10s is not greened up yet
|
||||
|
@ -295,6 +335,8 @@ mochitest-devtools-chrome:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -313,12 +355,18 @@ mochitest-gpu:
|
|||
suite: mochitest/plain-gpu,chrome-gpu,browser-chrome-gpu
|
||||
treeherder-symbol: tc-M(gpu)
|
||||
loopback-video: true
|
||||
e10s:
|
||||
by-test-platform:
|
||||
win.*: both
|
||||
default: true
|
||||
mozharness:
|
||||
script: desktop_unittest.py
|
||||
no-read-buildbot-config: true
|
||||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -338,11 +386,14 @@ mochitest-jetpack:
|
|||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --mochitest-suite=jetpack-package
|
||||
- --mochitest-suite=jetpack-addon
|
||||
|
||||
mochitest-media:
|
||||
description: "Mochitest media run"
|
||||
|
@ -358,6 +409,8 @@ mochitest-media:
|
|||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -376,6 +429,8 @@ mochitest-webgl:
|
|||
chunked: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -395,6 +450,8 @@ reftest:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -412,6 +469,8 @@ reftest-no-accel:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
@ -431,8 +490,12 @@ web-platform-tests:
|
|||
script: web_platform_tests.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
- web_platform_tests/prod_config.py
|
||||
- remove_executables.py
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- web_platform_tests/prod_config_windows_taskcluster.py
|
||||
default:
|
||||
- web_platform_tests/prod_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --test-type=testharness
|
||||
|
||||
|
@ -448,8 +511,12 @@ web-platform-tests-reftests:
|
|||
script: web_platform_tests.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
- web_platform_tests/prod_config.py
|
||||
- remove_executables.py
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- web_platform_tests/prod_config_windows_taskcluster.py
|
||||
default:
|
||||
- web_platform_tests/prod_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --test-type=reftest
|
||||
|
||||
|
@ -465,8 +532,12 @@ web-platform-tests-wdspec:
|
|||
script: web_platform_tests.py
|
||||
no-read-buildbot-config: true
|
||||
config:
|
||||
- web_platform_tests/prod_config.py
|
||||
- remove_executables.py
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- web_platform_tests/prod_config_windows_taskcluster.py
|
||||
default:
|
||||
- web_platform_tests/prod_config.py
|
||||
- remove_executables.py
|
||||
extra-options:
|
||||
- --test-type=wdspec
|
||||
|
||||
|
@ -476,6 +547,7 @@ xpcshell:
|
|||
treeherder-symbol: tc-X()
|
||||
chunks:
|
||||
by-test-platform:
|
||||
# win.*: 1
|
||||
linux64/debug: 10
|
||||
default: 8
|
||||
max-run-time: 5400
|
||||
|
@ -485,6 +557,8 @@ xpcshell:
|
|||
no-read-buildbot-config: true
|
||||
config:
|
||||
by-test-platform:
|
||||
win.*:
|
||||
- unittests/win_taskcluster_unittest.py
|
||||
default:
|
||||
- unittests/linux_unittest.py
|
||||
- remove_executables.py
|
||||
|
|
|
@ -205,7 +205,7 @@ task_description_schema = Schema({
|
|||
Required('implementation'): 'generic-worker',
|
||||
|
||||
# command is a list of commands to run, sequentially
|
||||
'command': [basestring],
|
||||
'command': [taskref_or_string],
|
||||
|
||||
# artifacts to extract from the task image after completion; note that artifacts
|
||||
# for the generic worker cannot have names
|
||||
|
@ -222,6 +222,9 @@ task_description_schema = Schema({
|
|||
|
||||
# the maximum time to run, in seconds
|
||||
'max-run-time': int,
|
||||
|
||||
# os user groups for test task workers
|
||||
Optional('os-groups', default=[]): [basestring],
|
||||
}, {
|
||||
Required('implementation'): 'buildbot-bridge',
|
||||
|
||||
|
@ -400,8 +403,9 @@ def build_generic_worker_payload(config, task, task_def):
|
|||
task_def['payload'] = {
|
||||
'command': worker['command'],
|
||||
'artifacts': artifacts,
|
||||
'env': worker['env'],
|
||||
'env': worker.get('env', {}),
|
||||
'maxRunTime': worker['max-run-time'],
|
||||
'osGroups': worker.get('os-groups', []),
|
||||
}
|
||||
|
||||
if 'retry-exit-status' in worker:
|
||||
|
|
|
@ -24,8 +24,10 @@ transforms = TransformSequence()
|
|||
def set_worker_implementation(config, tests):
|
||||
"""Set the worker implementation based on the test platform."""
|
||||
for test in tests:
|
||||
# this is simple for now, but soon will not be!
|
||||
test['worker-implementation'] = 'docker-worker'
|
||||
if test['test-platform'].startswith('win'):
|
||||
test['worker-implementation'] = 'generic-worker'
|
||||
else:
|
||||
test['worker-implementation'] = 'docker-worker'
|
||||
yield test
|
||||
|
||||
|
||||
|
|
|
@ -35,11 +35,12 @@ def set_treeherder_machine_platform(config, tests):
|
|||
# platforms
|
||||
translation = {
|
||||
'linux64-asan/opt': 'linux64/asan',
|
||||
'linux64-pgo/opt': 'linux64/pgo',
|
||||
'linux64-pgo/opt': 'linux64/pgo'
|
||||
}
|
||||
for test in tests:
|
||||
build_platform = test['build-platform']
|
||||
test['treeherder-machine-platform'] = translation.get(build_platform, build_platform)
|
||||
test_platform = test['test-platform']
|
||||
test['treeherder-machine-platform'] = translation.get(build_platform, test_platform)
|
||||
yield test
|
||||
|
||||
|
||||
|
@ -83,7 +84,11 @@ def split_e10s(config, tests):
|
|||
@transforms.add
|
||||
def allow_software_gl_layers(config, tests):
|
||||
for test in tests:
|
||||
allow = get_keyed_by(item=test, field='allow-software-gl-layers',
|
||||
|
||||
# since this value defaults to true, but is not applicable on windows,
|
||||
# it's overriden for that platform here.
|
||||
allow = not test['test-platform'].startswith('win') \
|
||||
and get_keyed_by(item=test, field='allow-software-gl-layers',
|
||||
item_name=test['test-name'])
|
||||
if allow:
|
||||
assert test['instance-size'] != 'legacy',\
|
||||
|
@ -94,3 +99,13 @@ def allow_software_gl_layers(config, tests):
|
|||
.append("--allow-software-gl-layers")
|
||||
|
||||
yield test
|
||||
|
||||
|
||||
@transforms.add
|
||||
def add_os_groups(config, tests):
|
||||
for test in tests:
|
||||
if test['test-platform'].startswith('win'):
|
||||
groups = get_keyed_by(item=test, field='os-groups', item_name=test['test-name'])
|
||||
if groups:
|
||||
test['os-groups'] = groups
|
||||
yield test
|
||||
|
|
|
@ -27,13 +27,18 @@ from taskgraph.transforms.job.common import (
|
|||
import logging
|
||||
|
||||
ARTIFACT_URL = 'https://queue.taskcluster.net/v1/task/{}/artifacts/{}'
|
||||
|
||||
ARTIFACTS = [
|
||||
# (artifact name prefix, in-image path)
|
||||
("public/logs/", "/home/worker/workspace/build/upload/logs/"),
|
||||
("public/test", "/home/worker/artifacts/"),
|
||||
("public/test_info/", "/home/worker/workspace/build/blobber_upload_dir/"),
|
||||
]
|
||||
WORKER_TYPE = {
|
||||
# default worker types keyed by instance-size
|
||||
'large': 'aws-provisioner-v1/desktop-test-large',
|
||||
'xlarge': 'aws-provisioner-v1/desktop-test-xlarge',
|
||||
'legacy': 'aws-provisioner-v1/desktop-test',
|
||||
'default': 'aws-provisioner-v1/desktop-test-large',
|
||||
# windows worker types keyed by test-platform
|
||||
'windows7-32-vm': 'aws-provisioner-v1/gecko-t-win7-32',
|
||||
'windows7-32': 'aws-provisioner-v1/gecko-t-win7-32-gpu',
|
||||
'windows10-64-vm': 'aws-provisioner-v1/gecko-t-win10-64',
|
||||
'windows10-64': 'aws-provisioner-v1/gecko-t-win10-64-gpu'
|
||||
}
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -122,6 +127,13 @@ def worker_setup_function(name):
|
|||
@worker_setup_function("docker-engine")
|
||||
@worker_setup_function("docker-worker")
|
||||
def docker_worker_setup(config, test, taskdesc):
|
||||
|
||||
artifacts = [
|
||||
# (artifact name prefix, in-image path)
|
||||
("public/logs/", "/home/worker/workspace/build/upload/logs/"),
|
||||
("public/test", "/home/worker/artifacts/"),
|
||||
("public/test_info/", "/home/worker/workspace/build/blobber_upload_dir/"),
|
||||
]
|
||||
mozharness = test['mozharness']
|
||||
|
||||
installer_url = ARTIFACT_URL.format('<build>', mozharness['build-artifact-name'])
|
||||
|
@ -130,12 +142,7 @@ def docker_worker_setup(config, test, taskdesc):
|
|||
mozharness_url = ARTIFACT_URL.format('<build>',
|
||||
'public/build/mozharness.zip')
|
||||
|
||||
taskdesc['worker-type'] = {
|
||||
'default': 'aws-provisioner-v1/desktop-test-large',
|
||||
'large': 'aws-provisioner-v1/desktop-test-large',
|
||||
'xlarge': 'aws-provisioner-v1/desktop-test-xlarge',
|
||||
'legacy': 'aws-provisioner-v1/desktop-test',
|
||||
}[test['instance-size']]
|
||||
taskdesc['worker-type'] = WORKER_TYPE[test['instance-size']]
|
||||
|
||||
worker = taskdesc['worker'] = {}
|
||||
worker['implementation'] = test['worker-implementation']
|
||||
|
@ -152,7 +159,7 @@ def docker_worker_setup(config, test, taskdesc):
|
|||
'name': prefix,
|
||||
'path': path,
|
||||
'type': 'directory',
|
||||
} for (prefix, path) in ARTIFACTS]
|
||||
} for (prefix, path) in artifacts]
|
||||
|
||||
worker['caches'] = [{
|
||||
'type': 'persistent',
|
||||
|
@ -242,3 +249,111 @@ def docker_worker_setup(config, test, taskdesc):
|
|||
command.append('--download-symbols=' + download_symbols)
|
||||
|
||||
worker['command'] = command
|
||||
|
||||
|
||||
def normpath(path):
|
||||
return path.replace('/', '\\')
|
||||
|
||||
|
||||
def get_firefox_version():
|
||||
with open('browser/config/version.txt', 'r') as f:
|
||||
return f.readline().strip()
|
||||
|
||||
|
||||
@worker_setup_function('generic-worker')
|
||||
def generic_worker_setup(config, test, taskdesc):
|
||||
artifacts = [
|
||||
{
|
||||
'path': 'public\\logs\\localconfig.json',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\logs\\log_critical.log',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\logs\\log_error.log',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\logs\\log_fatal.log',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\logs\\log_info.log',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\logs\\log_raw.log',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\logs\\log_warning.log',
|
||||
'type': 'file'
|
||||
},
|
||||
{
|
||||
'path': 'public\\test_info',
|
||||
'type': 'directory'
|
||||
}
|
||||
]
|
||||
mozharness = test['mozharness']
|
||||
|
||||
build_platform = taskdesc['attributes']['build_platform']
|
||||
test_platform = test['test-platform'].split('/')[0]
|
||||
|
||||
target = 'firefox-{}.en-US.{}'.format(get_firefox_version(), build_platform)
|
||||
|
||||
installer_url = ARTIFACT_URL.format(
|
||||
'<build>', 'public/build/{}.zip'.format(target))
|
||||
test_packages_url = ARTIFACT_URL.format(
|
||||
'<build>', 'public/build/{}.test_packages.json'.format(target))
|
||||
mozharness_url = ARTIFACT_URL.format(
|
||||
'<build>', 'public/build/mozharness.zip')
|
||||
|
||||
taskdesc['worker-type'] = WORKER_TYPE[test_platform]
|
||||
|
||||
taskdesc['scopes'].extend(
|
||||
['generic-worker:os-group:{}'.format(group) for group in test['os-groups']])
|
||||
|
||||
worker = taskdesc['worker'] = {}
|
||||
worker['os-groups'] = test['os-groups']
|
||||
worker['implementation'] = test['worker-implementation']
|
||||
worker['max-run-time'] = test['max-run-time']
|
||||
worker['artifacts'] = artifacts
|
||||
|
||||
env = worker['env'] = {
|
||||
# Bug 1306989
|
||||
'APPDATA': '%cd%\\AppData\\Roaming',
|
||||
'LOCALAPPDATA': '%cd%\\AppData\\Local',
|
||||
'TEMP': '%cd%\\AppData\\Local\\Temp',
|
||||
'TMP': '%cd%\\AppData\\Local\\Temp',
|
||||
'USERPROFILE': '%cd%',
|
||||
}
|
||||
|
||||
# assemble the command line
|
||||
mh_command = [
|
||||
'c:\\mozilla-build\\python\\python.exe',
|
||||
'-u',
|
||||
'mozharness\\scripts\\' + normpath(mozharness['script'])
|
||||
]
|
||||
for mh_config in mozharness['config']:
|
||||
mh_command.extend(['--cfg', 'mozharness\\configs\\' + normpath(mh_config)])
|
||||
mh_command.extend(mozharness.get('extra-options', []))
|
||||
if mozharness.get('no-read-buildbot-config'):
|
||||
mh_command.append('--no-read-buildbot-config')
|
||||
mh_command.extend(['--installer-url', installer_url])
|
||||
mh_command.extend(['--test-packages-url', test_packages_url])
|
||||
if mozharness.get('download-symbols'):
|
||||
if isinstance(mozharness['download-symbols'], basestring):
|
||||
mh_command.extend(['--download-symbols', mozharness['download-symbols']])
|
||||
else:
|
||||
mh_command.extend(['--download-symbols', 'true'])
|
||||
|
||||
worker['command'] = [
|
||||
'mkdir {} {}'.format(env['APPDATA'], env['TMP']),
|
||||
{'task-reference': 'c:\\mozilla-build\\wget\\wget.exe {}'.format(mozharness_url)},
|
||||
'c:\\mozilla-build\\info-zip\\unzip.exe mozharness.zip',
|
||||
{'task-reference': ' '.join(mh_command)},
|
||||
'xcopy build\\blobber_upload_dir public\\test_info /e /i',
|
||||
'copy /y logs\\*.* public\\logs\\'
|
||||
]
|
||||
|
|
|
@ -106,8 +106,8 @@ test_description_schema = Schema({
|
|||
# test platform.
|
||||
Optional('worker-implementation'): Any(
|
||||
'docker-worker',
|
||||
# coming soon:
|
||||
'generic-worker',
|
||||
# coming soon:
|
||||
'docker-engine',
|
||||
'buildbot-bridge',
|
||||
),
|
||||
|
@ -199,6 +199,14 @@ test_description_schema = Schema({
|
|||
# The current chunk; this is filled in by `all_kinds.py`
|
||||
Optional('this-chunk'): int,
|
||||
|
||||
# os user groups for test task workers; required scopes, will be
|
||||
# added automatically
|
||||
Optional('os-groups', default=[]): Any(
|
||||
[basestring],
|
||||
# todo: create a dedicated elevated worker group and name here
|
||||
{'by-test-platform': {basestring: [basestring]}},
|
||||
),
|
||||
|
||||
# -- values supplied by the task-generation infrastructure
|
||||
|
||||
# the platform of the build this task is testing
|
||||
|
|
|
@ -0,0 +1,122 @@
|
|||
# This is a template config file for marionette production on Windows.
|
||||
import os
|
||||
import sys
|
||||
|
||||
config = {
|
||||
# marionette options
|
||||
"marionette_address": "localhost:2828",
|
||||
"test_manifest": "unit-tests.ini",
|
||||
|
||||
"virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), 'python27.dll'),
|
||||
"virtualenv_path": 'venv',
|
||||
"exes": {
|
||||
'python': sys.executable,
|
||||
'virtualenv': [
|
||||
sys.executable,
|
||||
os.path.join(os.path.dirname(sys.executable), 'Lib', 'site-packages', 'virtualenv.py')
|
||||
],
|
||||
'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
|
||||
'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
|
||||
'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
|
||||
},
|
||||
|
||||
"find_links": [
|
||||
"http://pypi.pvt.build.mozilla.org/pub",
|
||||
"http://pypi.pub.build.mozilla.org/pub",
|
||||
],
|
||||
"pip_index": False,
|
||||
|
||||
"default_actions": [
|
||||
'clobber',
|
||||
'download-and-extract',
|
||||
'create-virtualenv',
|
||||
'install',
|
||||
'run-tests',
|
||||
],
|
||||
"default_blob_upload_servers": [
|
||||
"https://blobupload.elasticbeanstalk.com",
|
||||
],
|
||||
"blob_uploader_auth_file" : 'C:/builds/oauth.txt',
|
||||
"download_minidump_stackwalk": True,
|
||||
"download_symbols": "ondemand",
|
||||
"suite_definitions": {
|
||||
"gaiatest_desktop": {
|
||||
"options": [
|
||||
"--restart",
|
||||
"--timeout=%(timeout)s",
|
||||
"--testvars=%(testvars)s",
|
||||
"--profile=%(profile)s",
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--gecko-log=%(gecko_log)s",
|
||||
"--log-xunit=%(xml_output)s",
|
||||
"--html-output=%(html_output)s",
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--binary=%(binary)s",
|
||||
"--address=%(address)s",
|
||||
"--total-chunks=%(total_chunks)s",
|
||||
"--this-chunk=%(this_chunk)s"
|
||||
],
|
||||
"run_filename": "",
|
||||
"testsdir": ""
|
||||
},
|
||||
"gaiatest_emulator": {
|
||||
"options": [
|
||||
"--restart",
|
||||
"--timeout=%(timeout)s",
|
||||
"--testvars=%(testvars)s",
|
||||
"--profile=%(profile)s",
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--log-xunit=%(xml_output)s",
|
||||
"--html-output=%(html_output)s",
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--logcat-dir=%(logcat_dir)s",
|
||||
"--emulator=%(emulator)s",
|
||||
"--homedir=%(homedir)s"
|
||||
],
|
||||
"run_filename": "",
|
||||
"testsdir": ""
|
||||
},
|
||||
"marionette_desktop": {
|
||||
"options": [
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--binary=%(binary)s",
|
||||
"--address=%(address)s",
|
||||
"--symbols-path=%(symbols_path)s"
|
||||
],
|
||||
"run_filename": "",
|
||||
"testsdir": ""
|
||||
},
|
||||
"marionette_emulator": {
|
||||
"options": [
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--logcat-dir=%(logcat_dir)s",
|
||||
"--emulator=%(emulator)s",
|
||||
"--homedir=%(homedir)s",
|
||||
"--symbols-path=%(symbols_path)s"
|
||||
],
|
||||
"run_filename": "",
|
||||
"testsdir": ""
|
||||
},
|
||||
"webapi_desktop": {
|
||||
"options": [],
|
||||
"run_filename": "",
|
||||
"testsdir": ""
|
||||
},
|
||||
"webapi_emulator": {
|
||||
"options": [
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--logcat-dir=%(logcat_dir)s",
|
||||
"--emulator=%(emulator)s",
|
||||
"--homedir=%(homedir)s"
|
||||
],
|
||||
"run_filename": "",
|
||||
"testsdir": ""
|
||||
}
|
||||
},
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
import os
|
||||
import sys
|
||||
import mozharness
|
||||
|
||||
external_tools_path = os.path.join(
|
||||
os.path.abspath(os.path.dirname(os.path.dirname(mozharness.__file__))),
|
||||
'external_tools',
|
||||
)
|
||||
|
||||
config = {
|
||||
"virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), 'python27.dll'),
|
||||
"virtualenv_path": 'venv',
|
||||
"exes": {
|
||||
'python': sys.executable,
|
||||
'virtualenv': [
|
||||
sys.executable,
|
||||
os.path.join(os.path.dirname(sys.executable), 'Lib', 'site-packages', 'virtualenv.py')
|
||||
],
|
||||
'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
|
||||
'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
|
||||
'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
|
||||
},
|
||||
"find_links": [
|
||||
"http://pypi.pvt.build.mozilla.org/pub",
|
||||
"http://pypi.pub.build.mozilla.org/pub",
|
||||
],
|
||||
"pip_index": False,
|
||||
|
||||
"default_actions": [
|
||||
'clobber',
|
||||
'download-and-extract',
|
||||
'create-virtualenv',
|
||||
'install',
|
||||
'run-media-tests',
|
||||
],
|
||||
"default_blob_upload_servers": [
|
||||
"https://blobupload.elasticbeanstalk.com",
|
||||
],
|
||||
"blob_uploader_auth_file" : 'C:/builds/oauth.txt',
|
||||
"in_tree_config": "config/mozharness/marionette.py",
|
||||
"download_minidump_stackwalk": True,
|
||||
"download_symbols": "ondemand",
|
||||
|
||||
"suite_definitions": {
|
||||
"media-tests": {
|
||||
"options": [],
|
||||
},
|
||||
"media-youtube-tests": {
|
||||
"options": [
|
||||
"%(test_manifest)s"
|
||||
],
|
||||
},
|
||||
},
|
||||
}
|
|
@ -0,0 +1,282 @@
|
|||
import os
|
||||
import sys
|
||||
|
||||
# OS Specifics
|
||||
ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
|
||||
BINARY_PATH = os.path.join(ABS_WORK_DIR, "firefox", "firefox.exe")
|
||||
INSTALLER_PATH = os.path.join(ABS_WORK_DIR, "installer.zip")
|
||||
XPCSHELL_NAME = 'xpcshell.exe'
|
||||
EXE_SUFFIX = '.exe'
|
||||
DISABLE_SCREEN_SAVER = False
|
||||
ADJUST_MOUSE_AND_SCREEN = True
|
||||
#####
|
||||
config = {
|
||||
"exes": {
|
||||
'python': sys.executable,
|
||||
'virtualenv': [
|
||||
sys.executable,
|
||||
os.path.join(os.path.dirname(sys.executable), 'Lib', 'site-packages', 'virtualenv.py')
|
||||
],
|
||||
'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
|
||||
'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
|
||||
'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
|
||||
},
|
||||
###
|
||||
"installer_path": INSTALLER_PATH,
|
||||
"binary_path": BINARY_PATH,
|
||||
"xpcshell_name": XPCSHELL_NAME,
|
||||
"virtualenv_path": 'venv',
|
||||
"virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), "python27.dll"),
|
||||
|
||||
"find_links": [
|
||||
"http://pypi.pvt.build.mozilla.org/pub",
|
||||
"http://pypi.pub.build.mozilla.org/pub",
|
||||
],
|
||||
"pip_index": False,
|
||||
"exe_suffix": EXE_SUFFIX,
|
||||
"run_file_names": {
|
||||
"mochitest": "runtests.py",
|
||||
"reftest": "runreftest.py",
|
||||
"xpcshell": "runxpcshelltests.py",
|
||||
"cppunittest": "runcppunittests.py",
|
||||
"gtest": "rungtests.py",
|
||||
"jittest": "jit_test.py",
|
||||
"mozbase": "test.py",
|
||||
"mozmill": "runtestlist.py",
|
||||
},
|
||||
"minimum_tests_zip_dirs": [
|
||||
"bin/*",
|
||||
"certs/*",
|
||||
"config/*",
|
||||
"mach",
|
||||
"marionette/*",
|
||||
"modules/*",
|
||||
"mozbase/*",
|
||||
"tools/*",
|
||||
],
|
||||
"specific_tests_zip_dirs": {
|
||||
"mochitest": ["mochitest/*"],
|
||||
"reftest": ["reftest/*", "jsreftest/*"],
|
||||
"xpcshell": ["xpcshell/*"],
|
||||
"cppunittest": ["cppunittest/*"],
|
||||
"gtest": ["gtest/*"],
|
||||
"jittest": ["jit-test/*"],
|
||||
"mozbase": ["mozbase/*"],
|
||||
"mozmill": ["mozmill/*"],
|
||||
},
|
||||
"suite_definitions": {
|
||||
"cppunittest": {
|
||||
"options": [
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--xre-path=%(abs_app_dir)s"
|
||||
],
|
||||
"run_filename": "runcppunittests.py",
|
||||
"testsdir": "cppunittest"
|
||||
},
|
||||
"jittest": {
|
||||
"options": [
|
||||
"tests/bin/js",
|
||||
"--no-slow",
|
||||
"--no-progress",
|
||||
"--format=automation",
|
||||
"--jitflags=all",
|
||||
"--timeout=970" # Keep in sync with run_timeout below.
|
||||
],
|
||||
"run_filename": "jit_test.py",
|
||||
"testsdir": "jit-test/jit-test",
|
||||
"run_timeout": 1000 # Keep in sync with --timeout above.
|
||||
},
|
||||
"mochitest": {
|
||||
"options": [
|
||||
"--appname=%(binary_path)s",
|
||||
"--utility-path=tests/bin",
|
||||
"--extra-profile-file=tests/bin/plugins",
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--certificate-path=tests/certs",
|
||||
"--quiet",
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--screenshot-on-fail",
|
||||
"--cleanup-crashes",
|
||||
],
|
||||
"run_filename": "runtests.py",
|
||||
"testsdir": "mochitest"
|
||||
},
|
||||
"mozbase": {
|
||||
"options": [
|
||||
"-b",
|
||||
"%(binary_path)s"
|
||||
],
|
||||
"run_filename": "test.py",
|
||||
"testsdir": "mozbase"
|
||||
},
|
||||
"mozmill": {
|
||||
"options": [
|
||||
"--binary=%(binary_path)s",
|
||||
"--testing-modules-dir=test/modules",
|
||||
"--plugins-path=%(test_plugin_path)s",
|
||||
"--symbols-path=%(symbols_path)s"
|
||||
],
|
||||
"run_filename": "runtestlist.py",
|
||||
"testsdir": "mozmill"
|
||||
},
|
||||
"reftest": {
|
||||
"options": [
|
||||
"--appname=%(binary_path)s",
|
||||
"--utility-path=tests/bin",
|
||||
"--extra-profile-file=tests/bin/plugins",
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--cleanup-crashes",
|
||||
],
|
||||
"run_filename": "runreftest.py",
|
||||
"testsdir": "reftest"
|
||||
},
|
||||
"xpcshell": {
|
||||
"options": [
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--test-plugin-path=%(test_plugin_path)s",
|
||||
"--log-raw=%(raw_log_file)s",
|
||||
"--log-errorsummary=%(error_summary_file)s",
|
||||
"--utility-path=tests/bin",
|
||||
],
|
||||
"run_filename": "runxpcshelltests.py",
|
||||
"testsdir": "xpcshell"
|
||||
},
|
||||
"gtest": {
|
||||
"options": [
|
||||
"--xre-path=%(abs_res_dir)s",
|
||||
"--cwd=%(gtest_dir)s",
|
||||
"--symbols-path=%(symbols_path)s",
|
||||
"--utility-path=tests/bin",
|
||||
"%(binary_path)s",
|
||||
],
|
||||
"run_filename": "rungtests.py",
|
||||
},
|
||||
},
|
||||
# local mochi suites
|
||||
"all_mochitest_suites":
|
||||
{
|
||||
"plain": [],
|
||||
"plain-gpu": ["--subsuite=gpu"],
|
||||
"plain-clipboard": ["--subsuite=clipboard"],
|
||||
"plain-chunked": ["--chunk-by-dir=4"],
|
||||
"mochitest-media": ["--subsuite=media"],
|
||||
"chrome": ["--flavor=chrome"],
|
||||
"chrome-gpu": ["--flavor=chrome", "--subsuite=gpu"],
|
||||
"chrome-clipboard": ["--flavor=chrome", "--subsuite=clipboard"],
|
||||
"chrome-chunked": ["--flavor=chrome", "--chunk-by-dir=4"],
|
||||
"browser-chrome": ["--flavor=browser"],
|
||||
"browser-chrome-gpu": ["--flavor=browser", "--subsuite=gpu"],
|
||||
"browser-chrome-clipboard": ["--flavor=browser", "--subsuite=clipboard"],
|
||||
"browser-chrome-chunked": ["--flavor=browser", "--chunk-by-runtime"],
|
||||
"browser-chrome-addons": ["--flavor=browser", "--chunk-by-runtime", "--tag=addons"],
|
||||
"browser-chrome-screenshots": ["--flavor=browser", "--subsuite=screenshots"],
|
||||
"mochitest-gl": ["--subsuite=webgl"],
|
||||
"mochitest-devtools-chrome": ["--flavor=browser", "--subsuite=devtools"],
|
||||
"mochitest-devtools-chrome-chunked": ["--flavor=browser", "--subsuite=devtools", "--chunk-by-runtime"],
|
||||
"mochitest-metro-chrome": ["--flavor=browser", "--metro-immersive"],
|
||||
"jetpack-package": ["--flavor=jetpack-package"],
|
||||
"jetpack-package-clipboard": ["--flavor=jetpack-package", "--subsuite=clipboard"],
|
||||
"jetpack-addon": ["--flavor=jetpack-addon"],
|
||||
"a11y": ["--flavor=a11y"],
|
||||
},
|
||||
# local reftest suites
|
||||
"all_reftest_suites": {
|
||||
"reftest": {
|
||||
'options': ["--suite=reftest"],
|
||||
'tests': ["tests/reftest/tests/layout/reftests/reftest.list"]
|
||||
},
|
||||
"crashtest": {
|
||||
'options': ["--suite=crashtest"],
|
||||
'tests': ["tests/reftest/tests/testing/crashtest/crashtests.list"]
|
||||
},
|
||||
"jsreftest": {
|
||||
'options':["--extra-profile-file=tests/jsreftest/tests/user.js"],
|
||||
'tests': ["tests/jsreftest/tests/jstests.list"]
|
||||
},
|
||||
"reftest-ipc": {
|
||||
'options': ['--suite=reftest',
|
||||
'--setpref=browser.tabs.remote=true',
|
||||
'--setpref=browser.tabs.remote.autostart=true',
|
||||
'--setpref=extensions.e10sBlocksEnabling=false',
|
||||
'--setpref=layers.async-pan-zoom.enabled=true'],
|
||||
'tests': ['tests/reftest/tests/layout/reftests/reftest-sanity/reftest.list']
|
||||
},
|
||||
"reftest-no-accel": {
|
||||
"options": ["--suite=reftest",
|
||||
"--setpref=gfx.direct2d.disabled=true",
|
||||
"--setpref=layers.acceleration.disabled=true"],
|
||||
"tests": ["tests/reftest/tests/layout/reftests/reftest.list"]
|
||||
},
|
||||
"crashtest-ipc": {
|
||||
"options": ["--suite=crashtest",
|
||||
'--setpref=browser.tabs.remote=true',
|
||||
'--setpref=browser.tabs.remote.autostart=true',
|
||||
'--setpref=extensions.e10sBlocksEnabling=false',
|
||||
'--setpref=layers.async-pan-zoom.enabled=true'],
|
||||
"tests": ['tests/reftest/tests/testing/crashtest/crashtests.list'],
|
||||
},
|
||||
},
|
||||
"all_xpcshell_suites": {
|
||||
"xpcshell": {
|
||||
'options': ["--xpcshell=%(abs_app_dir)s/" + XPCSHELL_NAME,
|
||||
"--manifest=tests/xpcshell/tests/xpcshell.ini"],
|
||||
'tests': []
|
||||
},
|
||||
"xpcshell-addons": {
|
||||
'options': ["--xpcshell=%(abs_app_dir)s/" + XPCSHELL_NAME,
|
||||
"--tag=addons",
|
||||
"--manifest=tests/xpcshell/tests/xpcshell.ini"],
|
||||
'tests': []
|
||||
},
|
||||
},
|
||||
"all_cppunittest_suites": {
|
||||
"cppunittest": ['tests/cppunittest']
|
||||
},
|
||||
"all_gtest_suites": {
|
||||
"gtest": []
|
||||
},
|
||||
"all_jittest_suites": {
|
||||
"jittest": []
|
||||
},
|
||||
"all_mozbase_suites": {
|
||||
"mozbase": []
|
||||
},
|
||||
"run_cmd_checks_enabled": True,
|
||||
"preflight_run_cmd_suites": [
|
||||
{
|
||||
'name': 'disable_screen_saver',
|
||||
'cmd': ['xset', 's', 'off', 's', 'reset'],
|
||||
'architectures': ['32bit', '64bit'],
|
||||
'halt_on_failure': False,
|
||||
'enabled': DISABLE_SCREEN_SAVER
|
||||
},
|
||||
{
|
||||
'name': 'run mouse & screen adjustment script',
|
||||
'cmd': [
|
||||
sys.executable,
|
||||
os.path.join(os.getcwd(),
|
||||
'mozharness', 'external_tools', 'mouse_and_screen_resolution.py'),
|
||||
'--configuration-file',
|
||||
os.path.join(os.getcwd(),
|
||||
'mozharness', 'external_tools', 'machine-configuration.json')
|
||||
],
|
||||
'architectures': ['32bit'],
|
||||
'halt_on_failure': True,
|
||||
'enabled': ADJUST_MOUSE_AND_SCREEN
|
||||
}
|
||||
],
|
||||
"vcs_output_timeout": 1000,
|
||||
"minidump_save_path": "%(abs_work_dir)s/../minidumps",
|
||||
"buildbot_max_log_size": 52428800,
|
||||
"default_blob_upload_servers": [
|
||||
"https://blobupload.elasticbeanstalk.com",
|
||||
],
|
||||
"structured_suites": ["reftest"],
|
||||
'blob_uploader_auth_file': 'C:/builds/oauth.txt',
|
||||
"download_minidump_stackwalk": True,
|
||||
"minidump_stackwalk_path": "win32-minidump_stackwalk.exe",
|
||||
"minidump_tooltool_manifest_path": "config/tooltool-manifests/win32/releng.manifest"
|
||||
}
|
|
@ -0,0 +1,48 @@
|
|||
# ***** BEGIN LICENSE BLOCK *****
|
||||
# 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/.
|
||||
# ***** END LICENSE BLOCK *****
|
||||
|
||||
# This is a template config file for web-platform-tests test.
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
config = {
|
||||
"options": [
|
||||
"--prefs-root=%(test_path)s/prefs",
|
||||
"--processes=1",
|
||||
"--config=%(test_path)s/wptrunner.ini",
|
||||
"--ca-cert-path=%(test_path)s/certs/cacert.pem",
|
||||
"--host-key-path=%(test_path)s/certs/web-platform.test.key",
|
||||
"--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
|
||||
"--certutil-binary=%(test_install_path)s/bin/certutil",
|
||||
],
|
||||
|
||||
"exes": {
|
||||
'python': sys.executable,
|
||||
'virtualenv': [
|
||||
sys.executable,
|
||||
os.path.join(os.path.dirname(sys.executable), 'Lib', 'site-packages', 'virtualenv.py')
|
||||
],
|
||||
'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
|
||||
'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
|
||||
'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
|
||||
},
|
||||
|
||||
"find_links": [
|
||||
"http://pypi.pvt.build.mozilla.org/pub",
|
||||
"http://pypi.pub.build.mozilla.org/pub",
|
||||
],
|
||||
|
||||
"pip_index": False,
|
||||
|
||||
"default_blob_upload_servers": [
|
||||
"https://blobupload.elasticbeanstalk.com",
|
||||
],
|
||||
|
||||
"blob_uploader_auth_file" : 'C:/builds/oauth.txt',
|
||||
|
||||
"download_minidump_stackwalk": True,
|
||||
}
|
|
@ -95,6 +95,7 @@ function Script(extension, options, deferred = PromiseUtils.defer()) {
|
|||
this.js = this.options.js || [];
|
||||
this.css = this.options.css || [];
|
||||
this.remove_css = this.options.remove_css;
|
||||
this.match_about_blank = this.options.match_about_blank;
|
||||
|
||||
this.deferred = deferred;
|
||||
|
||||
|
@ -134,6 +135,12 @@ Script.prototype = {
|
|||
return false;
|
||||
}
|
||||
|
||||
if (this.match_about_blank && ["about:blank", "about:srcdoc"].includes(uri.spec)) {
|
||||
// When matching about:blank/srcdoc documents, the checks below
|
||||
// need to be performed against the "owner" document's URI.
|
||||
uri = window.document.nodePrincipal.URI;
|
||||
}
|
||||
|
||||
if (!(this.matches_.matches(uri) || this.matches_host_.matchesIgnoringPath(uri))) {
|
||||
return false;
|
||||
}
|
||||
|
@ -160,8 +167,6 @@ Script.prototype = {
|
|||
return false;
|
||||
}
|
||||
|
||||
// TODO: match_about_blank.
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
|
@ -416,11 +421,13 @@ DocumentManager = {
|
|||
extensionPageWindows: new Map(),
|
||||
|
||||
init() {
|
||||
Services.obs.addObserver(this, "content-document-global-created", false);
|
||||
Services.obs.addObserver(this, "document-element-inserted", false);
|
||||
Services.obs.addObserver(this, "inner-window-destroyed", false);
|
||||
},
|
||||
|
||||
uninit() {
|
||||
Services.obs.removeObserver(this, "content-document-global-created");
|
||||
Services.obs.removeObserver(this, "document-element-inserted");
|
||||
Services.obs.removeObserver(this, "inner-window-destroyed");
|
||||
},
|
||||
|
@ -437,13 +444,27 @@ DocumentManager = {
|
|||
},
|
||||
|
||||
observe: function(subject, topic, data) {
|
||||
if (topic == "document-element-inserted") {
|
||||
// For some types of documents (about:blank), we only see the first
|
||||
// notification, for others (data: URIs) we only observe the second.
|
||||
if (topic == "content-document-global-created" || topic == "document-element-inserted") {
|
||||
let document = subject;
|
||||
let window = document && document.defaultView;
|
||||
|
||||
if (topic == "content-document-global-created") {
|
||||
window = subject;
|
||||
document = window && window.document;
|
||||
}
|
||||
|
||||
if (!document || !document.location || !window) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Make sure we always load exactly once (notice != used as logical XOR),
|
||||
// usually on document-element-inserted, except for about:blank documents.
|
||||
if ((topic == "content-document-global-created") != (window.location.href == "about:blank")) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Make sure we only load into frames that ExtensionContent.init
|
||||
// was called on (i.e., not frames for social or sidebars).
|
||||
let mm = getWindowMessageManager(window);
|
||||
|
@ -463,7 +484,8 @@ DocumentManager = {
|
|||
}
|
||||
}
|
||||
|
||||
this.trigger("document_start", window);
|
||||
this.trigger(window);
|
||||
|
||||
/* eslint-disable mozilla/balanced-listeners */
|
||||
window.addEventListener("DOMContentLoaded", this, true);
|
||||
window.addEventListener("load", this, true);
|
||||
|
@ -505,9 +527,9 @@ DocumentManager = {
|
|||
// Need to check if we're still on the right page? Greasemonkey does this.
|
||||
|
||||
if (event.type == "DOMContentLoaded") {
|
||||
this.trigger("document_end", window);
|
||||
this.trigger(window);
|
||||
} else if (event.type == "load") {
|
||||
this.trigger("document_idle", window);
|
||||
this.trigger(window);
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -643,7 +665,7 @@ DocumentManager = {
|
|||
}
|
||||
},
|
||||
|
||||
trigger(when, window) {
|
||||
trigger(window) {
|
||||
let state = this.getWindowState(window);
|
||||
|
||||
if (state == "document_start") {
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче