Merge autoland to m-c on a CLOSED TREE. a=merge

This commit is contained in:
Ryan VanderMeulen 2016-10-21 17:12:27 -04:00
Родитель 5c4d7020f2 2a9930daf9
Коммит 75888fe1aa
111 изменённых файлов: 1909 добавлений и 633 удалений

Просмотреть файл

@ -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;

Просмотреть файл

@ -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 websites 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") {

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше