summaryrefslogtreecommitdiff
path: root/source/l/mozjs60/patches
diff options
context:
space:
mode:
Diffstat (limited to 'source/l/mozjs60/patches')
-rw-r--r--source/l/mozjs60/patches/Always-use-the-equivalent-year-to-determine-the-time-zone.patch100
-rw-r--r--source/l/mozjs60/patches/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch64
-rw-r--r--source/l/mozjs60/patches/Save-x28-before-clobbering-it-in-the-regex-compiler.patch97
-rw-r--r--source/l/mozjs60/patches/build-icu-big-endian.patch13
-rw-r--r--source/l/mozjs60/patches/copy-headers.patch29
-rw-r--r--source/l/mozjs60/patches/emitter.patch15
-rw-r--r--source/l/mozjs60/patches/emitter_test.patch26
-rw-r--r--source/l/mozjs60/patches/fix-soname.patch25
-rw-r--r--source/l/mozjs60/patches/icu_sources_data-Write-command-output-to-our-stderr.patch34
-rw-r--r--source/l/mozjs60/patches/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch26
-rw-r--r--source/l/mozjs60/patches/init_patch.patch12
-rw-r--r--source/l/mozjs60/patches/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch41
-rw-r--r--source/l/mozjs60/patches/tests-increase-timeout.patch22
13 files changed, 504 insertions, 0 deletions
diff --git a/source/l/mozjs60/patches/Always-use-the-equivalent-year-to-determine-the-time-zone.patch b/source/l/mozjs60/patches/Always-use-the-equivalent-year-to-determine-the-time-zone.patch
new file mode 100644
index 00000000..81474a42
--- /dev/null
+++ b/source/l/mozjs60/patches/Always-use-the-equivalent-year-to-determine-the-time-zone.patch
@@ -0,0 +1,100 @@
+From: =?utf-8?q?Andr=C3=A9_Bargull?= <andrebargull@googlemail.com>
+Date: Wed, 8 Nov 2017 03:23:41 -0800
+Subject: Always use the equivalent year to determine the time zone offset and
+ name
+
+Reviewed-by: Jeff Walden
+Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1415202
+Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1479687
+Origin: upstream
+Applied-upstream: 62, commit:https://hg.mozilla.org/mozilla-central/rev/ce9f1466ec78
+---
+ js/src/jsdate.cpp | 11 +++++++----
+ js/src/vm/Time.cpp | 14 ++++----------
+ js/src/vm/Time.h | 2 +-
+ 3 files changed, 12 insertions(+), 15 deletions(-)
+
+diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp
+index 07af3d18c865..ff8fd6c3763c 100644
+--- a/js/src/jsdate.cpp
++++ b/js/src/jsdate.cpp
+@@ -2353,12 +2353,15 @@ static PRMJTime ToPRMJTime(double localTime, double utcTime) {
+ static size_t FormatTime(char* buf, int buflen, const char* fmt, double utcTime,
+ double localTime) {
+ PRMJTime prtm = ToPRMJTime(localTime, utcTime);
+- int eqivalentYear = IsRepresentableAsTime32(utcTime)
+- ? prtm.tm_year
+- : EquivalentYearForDST(prtm.tm_year);
++ // If an equivalent year was used to compute the date/time components, use
++ // the same equivalent year to determine the time zone name and offset in
++ // PRMJ_FormatTime(...).
++ int timeZoneYear = IsRepresentableAsTime32(utcTime)
++ ? prtm.tm_year
++ : EquivalentYearForDST(prtm.tm_year);
+ int offsetInSeconds = (int)floor((localTime - utcTime) / msPerSecond);
+
+- return PRMJ_FormatTime(buf, buflen, fmt, &prtm, eqivalentYear,
++ return PRMJ_FormatTime(buf, buflen, fmt, &prtm, timeZoneYear,
+ offsetInSeconds);
+ }
+
+diff --git a/js/src/vm/Time.cpp b/js/src/vm/Time.cpp
+index f59977f0d0e9..5ee4794b3e83 100644
+--- a/js/src/vm/Time.cpp
++++ b/js/src/vm/Time.cpp
+@@ -247,7 +247,7 @@ static void PRMJ_InvalidParameterHandler(const wchar_t* expression,
+
+ /* Format a time value into a buffer. Same semantics as strftime() */
+ size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt,
+- const PRMJTime* prtm, int equivalentYear,
++ const PRMJTime* prtm, int timeZoneYear,
+ int offsetInSeconds) {
+ size_t result = 0;
+ #if defined(XP_UNIX) || defined(XP_WIN)
+@@ -280,7 +280,8 @@ size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt,
+ * Fill out |td| to the time represented by |prtm|, leaving the
+ * timezone fields zeroed out. localtime_r will then fill in the
+ * timezone fields for that local time according to the system's
+- * timezone parameters.
++ * timezone parameters. Use |timeZoneYear| for the year to ensure the
++ * time zone name matches the time zone offset used by the caller.
+ */
+ struct tm td;
+ memset(&td, 0, sizeof(td));
+@@ -290,19 +291,12 @@ size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt,
+ td.tm_mday = prtm->tm_mday;
+ td.tm_mon = prtm->tm_mon;
+ td.tm_wday = prtm->tm_wday;
+- td.tm_year = prtm->tm_year - 1900;
++ td.tm_year = timeZoneYear - 1900;
+ td.tm_yday = prtm->tm_yday;
+ td.tm_isdst = prtm->tm_isdst;
+
+ time_t t = mktime(&td);
+
+- // If |prtm| cannot be represented in |time_t| the year is probably
+- // out of range, try again with the DST equivalent year.
+- if (t == static_cast<time_t>(-1)) {
+- td.tm_year = equivalentYear - 1900;
+- t = mktime(&td);
+- }
+-
+ // If either mktime or localtime_r failed, fill in the fallback time
+ // zone offset |offsetInSeconds| and set the time zone identifier to
+ // the empty string.
+diff --git a/js/src/vm/Time.h b/js/src/vm/Time.h
+index 3a51d869c922..37b7faeec028 100644
+--- a/js/src/vm/Time.h
++++ b/js/src/vm/Time.h
+@@ -49,7 +49,7 @@ inline void PRMJ_NowShutdown() {}
+
+ /* Format a time value into a buffer. Same semantics as strftime() */
+ extern size_t PRMJ_FormatTime(char* buf, int buflen, const char* fmt,
+- const PRMJTime* tm, int equivalentYear,
++ const PRMJTime* tm, int timeZoneYear,
+ int offsetInSeconds);
+
+ /**
+--
+2.21.0
+
diff --git a/source/l/mozjs60/patches/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch b/source/l/mozjs60/patches/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch
new file mode 100644
index 00000000..46d280d0
--- /dev/null
+++ b/source/l/mozjs60/patches/Save-and-restore-non-volatile-x28-on-ARM64-for-generated-unboxed-object-constructor.patch
@@ -0,0 +1,64 @@
+# HG changeset patch
+# User Lars T Hansen <lhansen@mozilla.com>
+# Date 1519822672 -3600
+# Node ID 800abe66894d6b07b24bccecbf6a65e2261076f6
+# Parent 223c97459e96183eb616aed39147207bdb953ba8
+Bug 1375074 - Save and restore non-volatile x28 on ARM64 for generated unboxed object constructor. r=sstangl
+
+Origin: upstream
+Applied-upstream: 61, commit: https://hg.mozilla.org/mozilla-central/rev/800abe66894d
+---
+ js/src/vm/UnboxedObject.cpp | 30 ++++++++++++++++++++++++++----
+ 1 file changed, 26 insertions(+), 4 deletions(-)
+
+diff --git a/js/src/vm/UnboxedObject.cpp b/js/src/vm/UnboxedObject.cpp
+index 35ca20d7405f..1c20a1093d13 100644
+--- a/js/src/vm/UnboxedObject.cpp
++++ b/js/src/vm/UnboxedObject.cpp
+@@ -86,9 +86,16 @@ static const uintptr_t CLEAR_CONSTRUCTOR_CODE_TOKEN = 0x1;
+ #endif
+
+ #ifdef JS_CODEGEN_ARM64
+- // ARM64 communicates stack address via sp, but uses a pseudo-sp for
+- // addressing.
+- masm.initStackPtr();
++ // ARM64 communicates stack address via sp, but uses a pseudo-sp (PSP) for
++ // addressing. The register we use for PSP may however also be used by
++ // calling code, and it is nonvolatile, so save it. Do this as a special
++ // case first because the generic save/restore code needs the PSP to be
++ // initialized already.
++ MOZ_ASSERT(PseudoStackPointer64.Is(masm.GetStackPointer64()));
++ masm.Str(PseudoStackPointer64, vixl::MemOperand(sp, -16, vixl::PreIndex));
++
++ // Initialize the PSP from the SP.
++ masm.initStackPtr();
+ #endif
+
+ MOZ_ASSERT(propertiesReg.volatile_());
+@@ -239,7 +246,22 @@ static const uintptr_t CLEAR_CONSTRUCTOR_CODE_TOKEN = 0x1;
+ if (ScratchDoubleReg.volatile_()) masm.pop(ScratchDoubleReg);
+ masm.PopRegsInMask(savedNonVolatileRegisters);
+
+- masm.abiret();
++#ifdef JS_CODEGEN_ARM64
++ // Now restore the value that was in the PSP register on entry, and return.
++
++ // Obtain the correct SP from the PSP.
++ masm.Mov(sp, PseudoStackPointer64);
++
++ // Restore the saved value of the PSP register, this value is whatever the
++ // caller had saved in it, not any actual SP value, and it must not be
++ // overwritten subsequently.
++ masm.Ldr(PseudoStackPointer64, vixl::MemOperand(sp, 16, vixl::PostIndex));
++
++ // Perform a plain Ret(), as abiret() will move SP <- PSP and that is wrong.
++ masm.Ret(vixl::lr);
++#else
++ masm.abiret();
++#endif
+
+ masm.bind(&failureStoreOther);
+
+--
+2.21.0
+
diff --git a/source/l/mozjs60/patches/Save-x28-before-clobbering-it-in-the-regex-compiler.patch b/source/l/mozjs60/patches/Save-x28-before-clobbering-it-in-the-regex-compiler.patch
new file mode 100644
index 00000000..3886c0e9
--- /dev/null
+++ b/source/l/mozjs60/patches/Save-x28-before-clobbering-it-in-the-regex-compiler.patch
@@ -0,0 +1,97 @@
+# HG changeset patch
+# User Lars T Hansen <lhansen@mozilla.com>
+# Date 1521449886 -3600
+# Node ID 903a79a1efff18fc7cc50db09a3fe5d768adc9a8
+# Parent 4d2955a9ca7e30ca4c3af9c214ccc77fb2fe7fb8
+Bug 1445907 - Save x28 before clobbering it in the regex compiler. r=sstangl
+
+Origin: upstream
+Applied-upstream: 61, commit: https://hg.mozilla.org/mozilla-central/rev/903a79a1efff
+---
+diff --git a/js/src/irregexp/NativeRegExpMacroAssembler.cpp b/js/src/irregexp/NativeRegExpMacroAssembler.cpp
+--- a/js/src/irregexp/NativeRegExpMacroAssembler.cpp
++++ b/js/src/irregexp/NativeRegExpMacroAssembler.cpp
+@@ -118,17 +118,25 @@ NativeRegExpMacroAssembler::GenerateCode
+
+ Label return_temp0;
+
+ // Finalize code - write the entry point code now we know how many
+ // registers we need.
+ masm.bind(&entry_label_);
+
+ #ifdef JS_CODEGEN_ARM64
+- // ARM64 communicates stack address via sp, but uses a pseudo-sp for addressing.
++ // ARM64 communicates stack address via SP, but uses a pseudo-sp (PSP) for
++ // addressing. The register we use for PSP may however also be used by
++ // calling code, and it is nonvolatile, so save it. Do this as a special
++ // case first because the generic save/restore code needs the PSP to be
++ // initialized already.
++ MOZ_ASSERT(PseudoStackPointer64.Is(masm.GetStackPointer64()));
++ masm.Str(PseudoStackPointer64, vixl::MemOperand(sp, -16, vixl::PreIndex));
++
++ // Initialize the PSP from the SP.
+ masm.initStackPtr();
+ #endif
+
+ // Push non-volatile registers which might be modified by jitcode.
+ size_t pushedNonVolatileRegisters = 0;
+ for (GeneralRegisterForwardIterator iter(savedNonVolatileRegisters); iter.more(); ++iter) {
+ masm.Push(*iter);
+ pushedNonVolatileRegisters++;
+@@ -416,17 +424,32 @@ NativeRegExpMacroAssembler::GenerateCode
+ masm.pop(temp0);
+ masm.movePtr(temp0, StackPointer);
+ #endif
+
+ // Restore non-volatile registers which were saved on entry.
+ for (GeneralRegisterBackwardIterator iter(savedNonVolatileRegisters); iter.more(); ++iter)
+ masm.Pop(*iter);
+
++#ifdef JS_CODEGEN_ARM64
++ // Now restore the value that was in the PSP register on entry, and return.
++
++ // Obtain the correct SP from the PSP.
++ masm.Mov(sp, PseudoStackPointer64);
++
++ // Restore the saved value of the PSP register, this value is whatever the
++ // caller had saved in it, not any actual SP value, and it must not be
++ // overwritten subsequently.
++ masm.Ldr(PseudoStackPointer64, vixl::MemOperand(sp, 16, vixl::PostIndex));
++
++ // Perform a plain Ret(), as abiret() will move SP <- PSP and that is wrong.
++ masm.Ret(vixl::lr);
++#else
+ masm.abiret();
++#endif
+
+ // Backtrack code (branch target for conditional backtracks).
+ if (backtrack_label_.used()) {
+ masm.bind(&backtrack_label_);
+ Backtrack();
+ }
+
+ // Backtrack stack overflow code.
+diff --git a/js/src/jit-test/tests/regexp/bug1445907.js b/js/src/jit-test/tests/regexp/bug1445907.js
+new file mode 100644
+--- /dev/null
++++ b/js/src/jit-test/tests/regexp/bug1445907.js
+@@ -0,0 +1,15 @@
++// On ARM64, we failed to save x28 properly when generating code for the regexp
++// matcher.
++//
++// There's wasm and Debugger code here because the combination forces the use of
++// x28 and exposes the bug when running on the simulator.
++
++if (!wasmIsSupported())
++ quit();
++
++var g = newGlobal('');
++var dbg = new Debugger(g);
++g.eval(`var m = new WebAssembly.Instance(new WebAssembly.Module(wasmTextToBinary('(module (func (export "test")))')))`);
++var re = /./;
++dbg.onEnterFrame = function(frame) { re.exec("x") };
++result = g.eval("m.exports.test()");
+
+--
+2.21.0
+
diff --git a/source/l/mozjs60/patches/build-icu-big-endian.patch b/source/l/mozjs60/patches/build-icu-big-endian.patch
new file mode 100644
index 00000000..2cfc8396
--- /dev/null
+++ b/source/l/mozjs60/patches/build-icu-big-endian.patch
@@ -0,0 +1,13 @@
+diff -up firefox-60.0/build/autoconf/icu.m4.icu firefox-60.0/build/autoconf/icu.m4
+--- firefox-60.0/build/autoconf/icu.m4.icu 2018-04-24 13:13:03.938961958 +0200
++++ firefox-60.0/build/autoconf/icu.m4 2018-04-24 13:14:44.472714375 +0200
+@@ -78,7 +78,7 @@ if test -n "$USE_ICU"; then
+ # TODO: the l is actually endian-dependent
+ # We could make this set as 'l' or 'b' for little or big, respectively,
+ # but we'd need to check in a big-endian version of the file.
+- ICU_DATA_FILE="icudt${version}l.dat"
++ ICU_DATA_FILE="icudt${version}b.dat"
+
+ MOZ_ICU_DATA_ARCHIVE=
+ fi
+
diff --git a/source/l/mozjs60/patches/copy-headers.patch b/source/l/mozjs60/patches/copy-headers.patch
new file mode 100644
index 00000000..aec3b10a
--- /dev/null
+++ b/source/l/mozjs60/patches/copy-headers.patch
@@ -0,0 +1,29 @@
+From: Rico Tzschichholz <ricotz@ubuntu.com>
+Date: Wed, 5 Jul 2017 22:45:59 -0700
+Subject: build: Copy headers on install instead of symlinking
+
+Patch ported forward to mozjs52 by Philip Chimento
+<philip.chimento@gmail.com>.
+---
+ python/mozbuild/mozbuild/backend/recursivemake.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/python/mozbuild/mozbuild/backend/recursivemake.py b/python/mozbuild/mozbuild/backend/recursivemake.py
+index dd9020d..6918ef8 100644
+--- a/python/mozbuild/mozbuild/backend/recursivemake.py
++++ b/python/mozbuild/mozbuild/backend/recursivemake.py
+@@ -1427,11 +1427,11 @@ class RecursiveMakeBackend(CommonBackend):
+ raise Exception("Wildcards are only supported in the filename part of "
+ "srcdir-relative or absolute paths.")
+
+- install_manifest.add_pattern_link(basepath, wild, path)
++ install_manifest.add_pattern_copy(basepath, wild, path)
+ else:
+- install_manifest.add_pattern_link(f.srcdir, f, path)
++ install_manifest.add_pattern_copy(f.srcdir, f, path)
+ else:
+- install_manifest.add_link(f.full_path, dest)
++ install_manifest.add_copy(f.full_path, dest)
+ else:
+ install_manifest.add_optional_exists(dest)
+ backend_file.write('%s_FILES += %s\n' % (
diff --git a/source/l/mozjs60/patches/emitter.patch b/source/l/mozjs60/patches/emitter.patch
new file mode 100644
index 00000000..0f414d7c
--- /dev/null
+++ b/source/l/mozjs60/patches/emitter.patch
@@ -0,0 +1,15 @@
+--- a/python/mozbuild/mozbuild/frontend/emitter.py
++++ b/python/mozbuild/mozbuild/frontend/emitter.py
+@@ -1127,11 +1127,6 @@
+ raise SandboxValidationError('Path specified in LOCAL_INCLUDES '
+ 'does not exist: %s (resolved to %s)' % (local_include,
+ full_path), context)
+- if (full_path == context.config.topsrcdir or
+- full_path == context.config.topobjdir):
+- raise SandboxValidationError('Path specified in LOCAL_INCLUDES '
+- 'is not allowed: %s (resolved to %s)' % (local_include,
+- full_path), context)
+ include_obj = LocalInclude(context, local_include)
+ local_includes.append(include_obj.path.full_path)
+ yield include_obj
+
diff --git a/source/l/mozjs60/patches/emitter_test.patch b/source/l/mozjs60/patches/emitter_test.patch
new file mode 100644
index 00000000..dad8ddc1
--- /dev/null
+++ b/source/l/mozjs60/patches/emitter_test.patch
@@ -0,0 +1,26 @@
+--- a/python/mozbuild/mozbuild/test/frontend/test_emitter.py
++++ b/python/mozbuild/mozbuild/test/frontend/test_emitter.py
+@@ -999,22 +999,6 @@
+
+ self.assertEqual(local_includes, expected)
+
+- def test_local_includes_invalid(self):
+- """Test that invalid LOCAL_INCLUDES are properly detected."""
+- reader = self.reader('local_includes-invalid/srcdir')
+-
+- with self.assertRaisesRegexp(
+- SandboxValidationError,
+- 'Path specified in LOCAL_INCLUDES is not allowed:'):
+- objs = self.read_topsrcdir(reader)
+-
+- reader = self.reader('local_includes-invalid/objdir')
+-
+- with self.assertRaisesRegexp(
+- SandboxValidationError,
+- 'Path specified in LOCAL_INCLUDES is not allowed:'):
+- objs = self.read_topsrcdir(reader)
+-
+ def test_generated_includes(self):
+ """Test that GENERATED_INCLUDES is emitted correctly."""
+ reader = self.reader('generated_includes')
+
diff --git a/source/l/mozjs60/patches/fix-soname.patch b/source/l/mozjs60/patches/fix-soname.patch
new file mode 100644
index 00000000..fc8052a8
--- /dev/null
+++ b/source/l/mozjs60/patches/fix-soname.patch
@@ -0,0 +1,25 @@
+From: "Laszlo Boszormenyi (GCS)" <gcs@debian.org>
+Date: Fri, 2 May 2014 22:20:45 +0200
+Subject: fix soname
+
+Add soname switch to linker, regardless of Operating System
+
+Bug-Debian: http://bugs.debian.org/746705
+---
+ config/rules.mk | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/config/rules.mk b/config/rules.mk
+index eb86b0c..1bb3988 100644
+--- a/config/rules.mk
++++ b/config/rules.mk
+@@ -359,6 +359,9 @@ endif
+ endif
+ EXTRA_DEPS += $(SYMBOLS_FILE)
+ endif
++
++EXTRA_DSO_LDOPTS += -Wl,-soname,lib$(JS_LIBRARY_NAME).so.0
++
+ #
+ # GNU doesn't have path length limitation
+ #
diff --git a/source/l/mozjs60/patches/icu_sources_data-Write-command-output-to-our-stderr.patch b/source/l/mozjs60/patches/icu_sources_data-Write-command-output-to-our-stderr.patch
new file mode 100644
index 00000000..19c0cc05
--- /dev/null
+++ b/source/l/mozjs60/patches/icu_sources_data-Write-command-output-to-our-stderr.patch
@@ -0,0 +1,34 @@
+From: Simon McVittie <smcv@debian.org>
+Date: Mon, 9 Oct 2017 09:23:14 +0100
+Subject: icu_sources_data: Write command output to our stderr
+
+Saying "See output in /tmp/foobar" is all very well for a developer
+build, but on a buildd our /tmp is going to get thrown away after
+the build. Just log the usual way instead.
+---
+ intl/icu_sources_data.py | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/intl/icu_sources_data.py b/intl/icu_sources_data.py
+index 8cf9290..7d2d983 100644
+--- a/intl/icu_sources_data.py
++++ b/intl/icu_sources_data.py
+@@ -84,16 +84,13 @@ def update_sources(topsrcdir):
+
+ def try_run(name, command, cwd=None, **kwargs):
+ try:
+- with tempfile.NamedTemporaryFile(prefix=name, delete=False) as f:
+- subprocess.check_call(command, cwd=cwd, stdout=f,
++ subprocess.check_call(command, cwd=cwd, stdout=sys.stderr,
+ stderr=subprocess.STDOUT, **kwargs)
+ except subprocess.CalledProcessError:
+- print('''Error running "{}" in directory {}
+- See output in {}'''.format(' '.join(command), cwd, f.name),
++ print('''Error running "{}" in directory {}'''.format(' '.join(command), cwd),
+ file=sys.stderr)
+ return False
+ else:
+- os.unlink(f.name)
+ return True
+
+
diff --git a/source/l/mozjs60/patches/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch b/source/l/mozjs60/patches/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch
new file mode 100644
index 00000000..5c75a895
--- /dev/null
+++ b/source/l/mozjs60/patches/icu_sources_data.py-Decouple-from-Mozilla-build-system.patch
@@ -0,0 +1,26 @@
+From: Simon McVittie <smcv@debian.org>
+Date: Mon, 9 Oct 2017 09:22:12 +0100
+Subject: icu_sources_data.py: Decouple from Mozilla build system
+
+mozpack.path is a wrapper around os.path that normalizes path
+separators on Windows, but on Unix we only have one path separator
+so there's nothing to normalize. Avoid needing to import all of it.
+---
+ intl/icu_sources_data.py | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/intl/icu_sources_data.py b/intl/icu_sources_data.py
+index 98c0ccb..8cf9290 100644
+--- a/intl/icu_sources_data.py
++++ b/intl/icu_sources_data.py
+@@ -19,7 +19,9 @@ import subprocess
+ import sys
+ import tempfile
+
+-from mozpack import path as mozpath
++# Close enough
++import os.path as mozpath
++mozpath.normsep = lambda p: p
+
+
+ def find_source_file(dir, filename):
diff --git a/source/l/mozjs60/patches/init_patch.patch b/source/l/mozjs60/patches/init_patch.patch
new file mode 100644
index 00000000..2c1db67c
--- /dev/null
+++ b/source/l/mozjs60/patches/init_patch.patch
@@ -0,0 +1,12 @@
+--- a/python/mozbuild/mozbuild/configure/__init__.py
++++ b/python/mozbuild/mozbuild/configure/__init__.py
+@@ -421,7 +421,7 @@
+ # All options should have been removed (handled) by now.
+ for arg in self._helper:
+ without_value = arg.split('=', 1)[0]
+- raise InvalidOptionError('Unknown option: %s' % without_value)
++ # raise InvalidOptionError('Unknown option: %s' % without_value)
+
+ # Run the execution queue
+ for func, args in self._execution_queue:
+
diff --git a/source/l/mozjs60/patches/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch b/source/l/mozjs60/patches/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch
new file mode 100644
index 00000000..d7ac4410
--- /dev/null
+++ b/source/l/mozjs60/patches/tests-For-tests-that-are-skipped-on-64-bit-mips64-is-also.patch
@@ -0,0 +1,41 @@
+From: Simon McVittie <smcv@debian.org>
+Date: Mon, 9 Oct 2017 09:46:31 +0100
+Subject: tests: For tests that are skipped on 64-bit, mips64 is also 64-bit
+
+mips64 is a 64-bit platform and a Debian release architecture.
+---
+ js/src/tests/non262/Array/regress-157652.js | 2 +-
+ js/src/tests/non262/Array/regress-330812.js | 2 +-
+ js/src/tests/non262/regress/regress-422348.js | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/js/src/tests/non262/Array/regress-157652.js b/js/src/tests/non262/Array/regress-157652.js
+index 6916fe1..b21dcc3 100644
+--- a/js/src/tests/non262/Array/regress-157652.js
++++ b/js/src/tests/non262/Array/regress-157652.js
+@@ -1,4 +1,4 @@
+-// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x/)||Android) -- No test results
++// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)||Android) -- No test results
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+ /* 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
+diff --git a/js/src/tests/non262/Array/regress-330812.js b/js/src/tests/non262/Array/regress-330812.js
+index c48f4c8..6b1ba2a 100644
+--- a/js/src/tests/non262/Array/regress-330812.js
++++ b/js/src/tests/non262/Array/regress-330812.js
+@@ -1,4 +1,4 @@
+-// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x/)||Android) -- No test results
++// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)||Android) -- No test results
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+ /* 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
+diff --git a/js/src/tests/non262/regress/regress-422348.js b/js/src/tests/non262/regress/regress-422348.js
+index 2c28d5a..e94c397 100644
+--- a/js/src/tests/non262/regress/regress-422348.js
++++ b/js/src/tests/non262/regress/regress-422348.js
+@@ -1,4 +1,4 @@
+-// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x/)) -- On 64-bit, takes forever rather than throwing
++// |reftest| skip-if(xulRuntime.XPCOMABI.match(/x86_64|aarch64|ppc64|ppc64le|s390x|mips64/)) -- On 64-bit, takes forever rather than throwing
+ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+ /* 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
diff --git a/source/l/mozjs60/patches/tests-increase-timeout.patch b/source/l/mozjs60/patches/tests-increase-timeout.patch
new file mode 100644
index 00000000..91f5fa76
--- /dev/null
+++ b/source/l/mozjs60/patches/tests-increase-timeout.patch
@@ -0,0 +1,22 @@
+From: Adrian Bunk <bunk@debian.org>
+Date: Tue, 3 Jul 2018 10:03:37 +0100
+Subject: Increase the test timeout for slower buildds
+
+Bug-Debian: https://bugs.debian.org/878284
+---
+ js/src/Makefile.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/js/src/Makefile.in b/js/src/Makefile.in
+index 4ac9f48..6ab5582 100644
+--- a/js/src/Makefile.in
++++ b/js/src/Makefile.in
+@@ -72,7 +72,7 @@ check:: check-style check-masm check-js-msg check-opcode
+
+ check-jstests:
+ $(wildcard $(RUN_TEST_PROGRAM)) $(PYTHON) -u $(srcdir)/tests/jstests.py \
+- --no-progress --format=automation --timeout 300 \
++ --no-progress --format=automation --timeout 600 \
+ $(JSTESTS_EXTRA_ARGS) \
+ $(DIST)/bin/$(JS_SHELL_NAME)$(BIN_SUFFIX)
+