Compare commits

..

No commits in common. "rawhide" and "f41" have entirely different histories.

20 changed files with 2004 additions and 70 deletions

12
.gitignore vendored
View file

@ -284,15 +284,3 @@
/icecat-128.12.0-rh1.tar.bz2
/icecat-128.13.0-langpacks.tar.gz
/icecat-128.13.0-rh1.tar.bz2
/icecat-128.14.0-langpacks.tar.gz
/icecat-128.14.0-rh1.tar.bz2
/icecat-140.3.0-langpacks.tar.gz
/icecat-140.3.0-rh1.tar.bz2
/icecat-140.4.0-langpacks.tar.gz
/icecat-140.4.0-rh1.tar.bz2
/icecat-140.5.0-langpacks.tar.gz
/icecat-140.5.0-rh1.tar.bz2
/icecat-140.6.0-langpacks.tar.gz
/icecat-140.6.0-rh1.tar.bz2
/icecat-140.7.0-langpacks.tar.gz
/icecat-140.7.0-rh1.tar.bz2

36
build-aarch64-skia.patch Normal file
View file

@ -0,0 +1,36 @@
diff -up firefox-128.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h.aarch64-skia firefox-128.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h
--- firefox-128.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h.aarch64-skia 2024-07-02 11:10:25.047099913 +0200
+++ firefox-128.0/gfx/skia/skia/modules/skcms/src/Transform_inl.h 2024-07-02 11:15:43.855410571 +0200
@@ -151,7 +151,7 @@ SI U32 to_fixed(F f) { return (U32)cast
SI F F_from_Half(U16 half) {
-#if defined(USING_NEON_F16C)
+#if 0 // defined(USING_NEON_F16C)
return vcvt_f32_f16((float16x4_t)half);
#elif defined(USING_AVX512F)
return (F)_mm512_cvtph_ps((__m256i)half);
@@ -178,7 +178,7 @@ SI F F_from_Half(U16 half) {
__attribute__((no_sanitize("unsigned-integer-overflow")))
#endif
SI U16 Half_from_F(F f) {
-#if defined(USING_NEON_F16C)
+#if 0 //defined(USING_NEON_F16C)
return (U16)vcvt_f16_f32(f);
#elif defined(USING_AVX512F)
return (U16)_mm512_cvtps_ph((__m512 )f, _MM_FROUND_CUR_DIRECTION );
diff -up firefox-128.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h.aarch64-skia firefox-128.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h
--- firefox-128.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h.aarch64-skia 2024-07-02 11:10:25.048099949 +0200
+++ firefox-128.0/gfx/skia/skia/src/opts/SkRasterPipeline_opts.h 2024-07-02 11:13:33.384783413 +0200
@@ -1425,8 +1425,8 @@ SI F from_half(U16 h) {
}
SI U16 to_half(F f) {
-#if defined(JUMPER_IS_NEON) && defined(SK_CPU_ARM64)
- return (U16)vcvt_f16_f32(f);
+#if 0 //defined(JUMPER_IS_NEON) && defined(SK_CPU_ARM64)
+ return (U16)vcvt_f16_f32(f);
#elif defined(JUMPER_IS_SKX)
return (U16)_mm512_cvtps_ph(f, _MM_FROUND_CUR_DIRECTION);

12
build-arm-libopus.patch Normal file
View file

@ -0,0 +1,12 @@
diff -up firefox-66.0/media/libopus/silk/arm/arm_silk_map.c.old firefox-66.0/media/libopus/silk/arm/arm_silk_map.c
--- firefox-66.0/media/libopus/silk/arm/arm_silk_map.c.old 2019-03-12 21:07:35.356677522 +0100
+++ firefox-66.0/media/libopus/silk/arm/arm_silk_map.c 2019-03-12 21:07:42.937693394 +0100
@@ -28,7 +28,7 @@ POSSIBILITY OF SUCH DAMAGE.
# include "config.h"
#endif
-#include "main_FIX.h"
+#include "fixed/main_FIX.h"
#include "NSQ.h"
#include "SigProc_FIX.h"

12
firefox-nss-version.patch Normal file
View file

@ -0,0 +1,12 @@
diff -up firefox-78.0/toolkit/moz.configure.nss-version firefox-78.0/toolkit/moz.configure
--- firefox-78.0/toolkit/moz.configure.nss-version 2020-06-30 08:47:09.657501414 +0200
+++ firefox-78.0/toolkit/moz.configure 2020-06-30 08:47:12.652510169 +0200
@@ -2089,7 +2089,7 @@ option('--with-system-nss', help='Use sy
imply_option('--with-system-nspr', True, when='--with-system-nss')
-nss_pkg = pkg_check_modules('NSS', 'nss >= 3.53.1', when='--with-system-nss', config=False)
+nss_pkg = pkg_check_modules('NSS', 'nss >= 3.53.0', when='--with-system-nss', config=False)
set_config('MOZ_SYSTEM_NSS', True, when='--with-system-nss')

View file

@ -0,0 +1,392 @@
# HG changeset patch
# User Sam James <sam@cmpct.info>
# Date 1726081531 0
# Node ID 0249085453e0d5c8378a1a053b94753fd52c956c
# Parent 3fca72d15659808d8f453b44a13320d4f6ceca86
Bug 1917964 - Fix swgl build with GCC 15. r=gfx-reviewers,lsalzman
Fix broken specialisations which are exposed by a recent change in GCC trunk.
See https://gcc.gnu.org/PR116666.
Differential Revision: https://phabricator.services.mozilla.com/D221744
diff --git a/gfx/wr/swgl/src/vector_type.h b/gfx/wr/swgl/src/vector_type.h
--- a/gfx/wr/swgl/src/vector_type.h
+++ b/gfx/wr/swgl/src/vector_type.h
@@ -235,33 +235,33 @@ struct VectorType {
data /= x.data;
return *this;
}
VectorType& operator%=(int x) {
data %= x;
return *this;
}
- VectorType<mask_type, N> operator==(VectorType x) const {
- return VectorType<mask_type, N>::wrap(data == x.data);
+ VectorType<mask_index, N> operator==(VectorType x) const {
+ return VectorType<mask_index, N>::wrap(data == x.data);
}
- VectorType<mask_type, N> operator!=(VectorType x) const {
- return VectorType<mask_type, N>::wrap(data != x.data);
+ VectorType<mask_index, N> operator!=(VectorType x) const {
+ return VectorType<mask_index, N>::wrap(data != x.data);
}
- VectorType<mask_type, N> operator<(VectorType x) const {
- return VectorType<mask_type, N>::wrap(data < x.data);
+ VectorType<mask_index, N> operator<(VectorType x) const {
+ return VectorType<mask_index, N>::wrap(data < x.data);
}
- VectorType<mask_type, N> operator>(VectorType x) const {
- return VectorType<mask_type, N>::wrap(data > x.data);
+ VectorType<mask_index, N> operator>(VectorType x) const {
+ return VectorType<mask_index, N>::wrap(data > x.data);
}
- VectorType<mask_type, N> operator<=(VectorType x) const {
- return VectorType<mask_type, N>::wrap(data <= x.data);
+ VectorType<mask_index, N> operator<=(VectorType x) const {
+ return VectorType<mask_index, N>::wrap(data <= x.data);
}
- VectorType<mask_type, N> operator>=(VectorType x) const {
- return VectorType<mask_type, N>::wrap(data >= x.data);
+ VectorType<mask_index, N> operator>=(VectorType x) const {
+ return VectorType<mask_index, N>::wrap(data >= x.data);
}
VectorType operator!() const { return wrap(!data); }
VectorType operator&&(VectorType x) const { return wrap(data & x.data); }
VectorType operator||(VectorType x) const { return wrap(data | x.data); }
VectorType& operator=(VectorType x) {
data = x.data;
# HG changeset patch
# User Lee Salzman <lsalzman@mozilla.com>
# Date 1726239330 0
# Node ID d36ca9941b2f90d910854e38293875e32c49796b
# Parent 156543617de576c07a7914dd20d13692ddb0845a
Bug 1917964 - Use __builtin_convertvector and __builtin_shufflevector on GCC when available. r=aosmond
GCC upstream recommends we use __builtin_convertvector and __builtin_shufflevector instead of __builtin_shuffle
for better code generation.
See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116666#c7
Differential Revision: https://phabricator.services.mozilla.com/D222067
diff --git a/gfx/wr/swgl/src/vector_type.h b/gfx/wr/swgl/src/vector_type.h
--- a/gfx/wr/swgl/src/vector_type.h
+++ b/gfx/wr/swgl/src/vector_type.h
@@ -89,16 +89,25 @@ template <>
struct VectorMask<uint8_t> {
typedef int8_t type;
};
template <>
struct VectorMask<float> {
typedef int type;
};
+# ifdef __has_builtin
+# if __has_builtin(__builtin_convertvector)
+# define HAS_BUILTIN_CONVERTVECTOR
+# endif
+# if __has_builtin(__builtin_shufflevector)
+# define HAS_BUILTIN_SHUFFLEVECTOR
+# endif
+# endif
+
template <typename T, int N>
struct VectorType {
enum { SIZE = N };
typedef T data_type __attribute__((vector_size(sizeof(T) * N)));
typedef typename VectorMask<T>::type mask_index;
typedef mask_index mask_type
__attribute__((vector_size(sizeof(mask_index) * N)));
@@ -131,16 +140,23 @@ struct VectorType {
VectorType v;
v.data = data;
return v;
}
T& operator[](size_t i) { return elements[i]; }
T operator[](size_t i) const { return elements[i]; }
+# ifdef HAS_BUILTIN_CONVERTVECTOR
+ template <typename U, int M>
+ operator VectorType<U, M>() const {
+ return VectorType<U, M>::wrap(
+ __builtin_convertvector(data, typename VectorType<U, M>::data_type));
+ }
+# else
template <typename U>
operator VectorType<U, 2>() const {
return VectorType<U, 2>::wrap(
(typename VectorType<U, N>::data_type){U(x), U(y)});
}
template <typename U>
operator VectorType<U, 4>() const {
return VectorType<U, 4>::wrap(
@@ -168,16 +184,17 @@ struct VectorType {
U(elements[10]),
U(elements[11]),
U(elements[12]),
U(elements[13]),
U(elements[14]),
U(elements[15]),
});
}
+# endif
VectorType operator-() const { return wrap(-data); }
VectorType operator~() const { return wrap(~data); }
VectorType operator&(VectorType x) const { return wrap(data & x.data); }
VectorType operator&(T x) const { return wrap(data & x); }
VectorType operator|(VectorType x) const { return wrap(data | x.data); }
VectorType operator|(T x) const { return wrap(data | x); }
@@ -263,110 +280,107 @@ struct VectorType {
VectorType operator&&(VectorType x) const { return wrap(data & x.data); }
VectorType operator||(VectorType x) const { return wrap(data | x.data); }
VectorType& operator=(VectorType x) {
data = x.data;
return *this;
}
- VectorType<T, 4> shuffle(VectorType b, mask_index x, mask_index y,
- mask_index z, mask_index w) const {
- return VectorType<T, 4>::wrap(__builtin_shuffle(
- data, b.data, (typename VectorType<T, 4>::mask_type){x, y, z, w}));
- }
- VectorType<T, 8> shuffle(VectorType b, mask_index x, mask_index y,
- mask_index z, mask_index w, mask_index s,
- mask_index t, mask_index u, mask_index v) const {
- return VectorType<T, 8>::wrap(__builtin_shuffle(
- data, b.data,
- (typename VectorType<T, 8>::mask_type){x, y, z, w, s, t, u, v}));
- }
- VectorType<T, 16> shuffle(VectorType b, mask_index x, mask_index y,
- mask_index z, mask_index w, mask_index s,
- mask_index t, mask_index u, mask_index v,
- mask_index i, mask_index j, mask_index k,
- mask_index l, mask_index m, mask_index n,
- mask_index o, mask_index p) const {
- return VectorType<T, 16>::wrap(
- __builtin_shuffle(data, b.data,
- (typename VectorType<T, 16>::mask_type){
- x, y, z, w, s, t, u, v, i, j, k, l, m, n, o, p}));
- }
-
- VectorType<T, 4> swizzle(mask_index x, mask_index y, mask_index z,
- mask_index w) const {
- return VectorType<T, 4>::wrap(__builtin_shuffle(
- data, (typename VectorType<T, 4>::mask_type){x, y, z, w}));
- }
- VectorType<T, 8> swizzle(mask_index x, mask_index y, mask_index z,
- mask_index w, mask_index s, mask_index t,
- mask_index u, mask_index v) const {
- return VectorType<T, 8>::wrap(__builtin_shuffle(
- data, (typename VectorType<T, 8>::mask_type){x, y, z, w, s, t, u, v}));
- }
-
SI VectorType wrap(half_type low, half_type high) {
VectorType v;
v.low_half = low;
v.high_half = high;
return v;
}
VectorType<T, N * 2> combine(VectorType high) const {
return VectorType<T, N * 2>::wrap(data, high.data);
}
-# define xxxx swizzle(0, 0, 0, 0)
-# define yyyy swizzle(1, 1, 1, 1)
-# define zzzz swizzle(2, 2, 2, 2)
-# define wwww swizzle(3, 3, 3, 3)
-# define xxyy swizzle(0, 0, 1, 1)
-# define xxzz swizzle(0, 0, 2, 2)
-# define yyww swizzle(1, 1, 3, 3)
-# define zzww swizzle(2, 2, 3, 3)
-# define xyxy swizzle(0, 1, 0, 1)
-# define xzxz swizzle(0, 2, 0, 2)
-# define ywyw swizzle(1, 3, 1, 3)
-# define zwzw swizzle(2, 3, 2, 3)
-# define zwxy swizzle(2, 3, 0, 1)
-# define zyxw swizzle(2, 1, 0, 3)
-# define xxyz swizzle(0, 0, 1, 2)
-# define xyyz swizzle(0, 1, 1, 2)
-# define xyzz swizzle(0, 1, 2, 2)
-# define xzyw swizzle(0, 2, 1, 3)
-# define yzwx swizzle(1, 2, 3, 0)
-# define wxyz swizzle(3, 0, 1, 2)
-# define wzyx swizzle(3, 2, 1, 0)
-# define xxxxyyyy XXXXYYYY()
- VectorType<T, 8> XXXXYYYY() const {
- return swizzle(0, 0, 0, 0).combine(swizzle(1, 1, 1, 1));
+# ifdef HAS_BUILTIN_SHUFFLEVECTOR
+ template <mask_index... INDEXES, int M = sizeof...(INDEXES)>
+ VectorType<T, M> shuffle(VectorType b) const {
+ return VectorType<T, M>::wrap(
+ __builtin_shufflevector(data, b.data, INDEXES...));
+ }
+
+ template <mask_index... INDEXES, int M = sizeof...(INDEXES)>
+ VectorType<T, M> swizzle() const {
+ return VectorType<T, M>::wrap(
+ __builtin_shufflevector(data, data, INDEXES...));
+ }
+# else
+ template <mask_index... INDEXES, int M = sizeof...(INDEXES)>
+ VectorType<T, M> shuffle(VectorType<T, M> b) const {
+ return VectorType<T, M>::wrap(__builtin_shuffle(
+ data, b.data, (typename VectorType<T, M>::mask_type){INDEXES...}));
+ }
+
+ template <mask_index A, mask_index B, mask_index C, mask_index D,
+ mask_index E, mask_index F, mask_index G, mask_index H>
+ VectorType<T, 8> shuffle(VectorType<T, 4> b) const {
+ return shuffle<A, B, C, D>(b).combine(shuffle<E, F, G, H>(b));
+ }
+
+ template <mask_index A, mask_index B, mask_index C, mask_index D,
+ mask_index E, mask_index F, mask_index G, mask_index H,
+ mask_index I, mask_index J, mask_index K, mask_index L,
+ mask_index W, mask_index X, mask_index Y, mask_index Z>
+ VectorType<T, 16> shuffle(VectorType<T, 4> b) const {
+ return shuffle<A, B, C, D, E, F, G, H>(b).combine(
+ shuffle<I, J, K, L, W, X, Y, Z>(b));
}
-# define zzzzwwww ZZZZWWWW()
- VectorType<T, 8> ZZZZWWWW() const {
- return swizzle(2, 2, 2, 2).combine(swizzle(3, 3, 3, 3));
+
+ template <mask_index A, mask_index B, mask_index C, mask_index D,
+ mask_index E, mask_index F, mask_index G, mask_index H,
+ mask_index I, mask_index J, mask_index K, mask_index L,
+ mask_index W, mask_index X, mask_index Y, mask_index Z>
+ VectorType<T, 16> shuffle(VectorType<T, 8> b) const {
+ return shuffle<A, B, C, D, E, F, G, H>(b).combine(
+ shuffle<I, J, K, L, W, X, Y, Z>(b));
}
-# define xyzwxyzw XYZWXYZW()
- VectorType<T, 8> XYZWXYZW() const { return combine(*this); }
-# define xyxyxyxy XYXYXYXY()
- VectorType<T, 8> XYXYXYXY() const {
- return swizzle(0, 1, 0, 1).combine(swizzle(0, 1, 0, 1));
+
+ template <mask_index... INDEXES, int M = sizeof...(INDEXES)>
+ VectorType<T, M> swizzle() const {
+ return shuffle<INDEXES...>(*this);
}
-# define zwzwzwzw ZWZWZWZW()
- VectorType<T, 8> ZWZWZWZW() const {
- return swizzle(2, 3, 2, 3).combine(swizzle(2, 3, 2, 3));
- }
-# define xxyyzzww XXYYZZWW()
- VectorType<T, 8> XXYYZZWW() const {
- return swizzle(0, 0, 1, 1).combine(swizzle(2, 2, 3, 3));
- }
-# define xxxxyyyyzzzzwwww XXXXYYYYZZZZWWWW()
- VectorType<T, 16> XXXXYYYYZZZZWWWW() {
- return XXXXYYYY().combine(ZZZZWWWW());
- }
+# endif
+
+# define SWIZZLE(...) template swizzle<__VA_ARGS__>()
+
+# define xxxx SWIZZLE(0, 0, 0, 0)
+# define yyyy SWIZZLE(1, 1, 1, 1)
+# define zzzz SWIZZLE(2, 2, 2, 2)
+# define wwww SWIZZLE(3, 3, 3, 3)
+# define xxyy SWIZZLE(0, 0, 1, 1)
+# define xxzz SWIZZLE(0, 0, 2, 2)
+# define yyww SWIZZLE(1, 1, 3, 3)
+# define zzww SWIZZLE(2, 2, 3, 3)
+# define xyxy SWIZZLE(0, 1, 0, 1)
+# define xzxz SWIZZLE(0, 2, 0, 2)
+# define ywyw SWIZZLE(1, 3, 1, 3)
+# define zwzw SWIZZLE(2, 3, 2, 3)
+# define zwxy SWIZZLE(2, 3, 0, 1)
+# define zyxw SWIZZLE(2, 1, 0, 3)
+# define xxyz SWIZZLE(0, 0, 1, 2)
+# define xyyz SWIZZLE(0, 1, 1, 2)
+# define xyzz SWIZZLE(0, 1, 2, 2)
+# define xzyw SWIZZLE(0, 2, 1, 3)
+# define yzwx SWIZZLE(1, 2, 3, 0)
+# define wxyz SWIZZLE(3, 0, 1, 2)
+# define wzyx SWIZZLE(3, 2, 1, 0)
+# define xxxxyyyy SWIZZLE(0, 0, 0, 0, 1, 1, 1, 1)
+# define zzzzwwww SWIZZLE(2, 2, 2, 2, 3, 3, 3, 3)
+# define xyzwxyzw SWIZZLE(0, 1, 2, 3, 0, 1, 2, 3)
+# define xyxyxyxy SWIZZLE(0, 1, 0, 1, 0, 1, 0, 1)
+# define zwzwzwzw SWIZZLE(2, 3, 2, 3, 2, 3, 2, 3)
+# define xxyyzzww SWIZZLE(0, 0, 1, 1, 2, 2, 3, 3)
+# define xxxxyyyyzzzzwwww \
+ SWIZZLE(0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3)
};
template <typename T>
struct VectorType<T, 2> {
typedef T data_type __attribute__((vector_size(sizeof(T) * 2)));
union {
data_type data;
struct {
@@ -383,17 +397,17 @@ struct VectorType<T, 2> {
VectorType operator&(VectorType x) const { return wrap(data & x.data); }
VectorType operator&(T x) const { return wrap(data & x); }
VectorType operator|(VectorType x) const { return wrap(data | x.data); }
VectorType operator|(T x) const { return wrap(data | x); }
};
# define CONVERT(vector, type) ((type)(vector))
-# define SHUFFLE(a, b, ...) a.shuffle(b, __VA_ARGS__)
+# define SHUFFLE(a, b, ...) ((a).template shuffle<__VA_ARGS__>(b))
template <typename T, int N>
SI VectorType<T, N * 2> combine(VectorType<T, N> a, VectorType<T, N> b) {
return VectorType<T, N * 2>::wrap(a.data, b.data);
}
template <typename T, int N>
SI VectorType<T, N / 2> lowHalf(VectorType<T, N> a) {
@@ -473,32 +487,25 @@ SI VectorType<T, 8> zip2Low(VectorType<T
return SHUFFLE(a, b, 0, 1, 8, 9, 2, 3, 10, 11);
}
template <typename T>
SI VectorType<T, 8> zip2High(VectorType<T, 8> a, VectorType<T, 8> b) {
return SHUFFLE(a, b, 4, 5, 12, 13, 6, 7, 14, 15);
}
-#ifdef __clang__
template <typename T>
SI VectorType<T, 8> zip(VectorType<T, 4> a, VectorType<T, 4> b) {
return SHUFFLE(a, b, 0, 4, 1, 5, 2, 6, 3, 7);
}
template <typename T>
SI VectorType<T, 16> zip(VectorType<T, 8> a, VectorType<T, 8> b) {
return SHUFFLE(a, b, 0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15);
}
-#else
-template <typename T, int N>
-SI VectorType<T, N * 2> zip(VectorType<T, N> a, VectorType<T, N> b) {
- return combine(zipLow(a, b), zipHigh(a, b));
-}
-#endif
template <typename T>
struct Unaligned {
template <typename P>
SI T load(const P* p) {
T v;
memcpy(&v, p, sizeof(v));
return v;

425
icecat-1742849.patch Normal file
View file

@ -0,0 +1,425 @@
# HG changeset patch
# User Alexandre Lissy <lissyx+mozillians@lissyx.dyndns.org>
# Date 1639046833 0
# Node ID 33f81fb07d792be30dcd1008b21b187ca24f21e6
# Parent 3382e4da79289240c4c2fe718b461f7a58bce553
Bug 1742849 - Parsing CCache 4.4+ stats output r=mhentges
Statistics output changed after 4.4 and requires different parsing, as
well as an extra --verbose to get the same informations as before.
See https://github.com/ccache/ccache/commit/8892814e8a790d615e44262c0005513d6d49f9e1
Differential Revision: https://phabricator.services.mozilla.com/D133086
diff --git a/python/mozbuild/mozbuild/controller/building.py b/python/mozbuild/mozbuild/controller/building.py
--- a/python/mozbuild/mozbuild/controller/building.py
+++ b/python/mozbuild/mozbuild/controller/building.py
@@ -5,16 +5,17 @@
from __future__ import absolute_import, print_function, unicode_literals
import errno
import getpass
import io
import json
import logging
import os
+import re
import shutil
import six
import subprocess
import sys
import time
from collections import (
Counter,
@@ -583,21 +584,24 @@ class BuildMonitor(MozbuildObject):
"Swap in/out (MB): {sin}/{sout}",
)
def ccache_stats(self):
ccache_stats = None
ccache = mozfile.which("ccache")
if ccache:
+ # With CCache v4.4+ statistics might require --verbose
+ is_version_4_4_or_newer = CCacheStats.check_version_4_4_or_newer(ccache)
try:
output = subprocess.check_output(
- [ccache, "-s"], universal_newlines=True
+ [ccache, "-s" if not is_version_4_4_or_newer else "-sv"],
+ universal_newlines=True,
)
- ccache_stats = CCacheStats(output)
+ ccache_stats = CCacheStats(output, is_version_4_4_or_newer)
except ValueError as e:
self.log(logging.WARNING, "ccache", {"msg": str(e)}, "{msg}")
return ccache_stats
class TerminalLoggingHandler(logging.Handler):
"""Custom logging handler that works with terminal window dressing.
@@ -883,33 +887,154 @@ class CCacheStats(object):
("cache_files", "files in cache"),
("cache_size", "cache size"),
("cache_max_size", "max cache size"),
]
DIRECTORY_DESCRIPTION = "cache directory"
PRIMARY_CONFIG_DESCRIPTION = "primary config"
SECONDARY_CONFIG_DESCRIPTION = "secondary config"
+
+ STATS_KEYS_4_4 = [
+ ("stats_updated", "Summary/Stats updated"),
+ (
+ "cache_hit_rate",
+ "Summary/Hits",
+ lambda x: next(iter(re.findall(r"\((.*) %\)", x)), "0.00 %"),
+ ),
+ (
+ "cache_hit_direct",
+ "Summary/Hits/Direct",
+ lambda x: next(iter(re.findall(r"(\d+)\s+/\s+\d+\s+\(", x)), "0"),
+ ),
+ (
+ "cache_hit_preprocessed",
+ "Summary/Hits/Preprocessed",
+ lambda x: next(iter(re.findall(r"(\d+)\s+/\s+\d+\s+\(", x)), "0"),
+ ),
+ ("cache_miss", "Summary/Misses"),
+ ("error", "Summary/Errors"),
+ ("linking", "Uncacheable/Called for linking"),
+ ("preprocessing", "Uncacheable/Called for preprocessing"),
+ ("failed", "Uncacheable/Compilation failed"),
+ ("preprocessor_error", "Uncacheable/Preprocessing failed"),
+ ("cache_file_missing", "Errors/Missing cache file"),
+ ("bad_args", "Uncacheable/Bad compiler arguments"),
+ ("autoconf", "Uncacheable/Autoconf compile/link"),
+ ("no_input", "Uncacheable/No input file"),
+ ("num_cleanups", "Primary storage/Cleanups"),
+ ("cache_files", "Primary storage/Files"),
+ # Cache size is reported in GB, see
+ # https://github.com/ccache/ccache/commit/8892814e8a790d615e44262c0005513d6d49f9e1#diff-30ec2bbfafe4c3842c8e35179ef0d3253a66dcc054812e50049d0ca3b10e317fR274
+ (
+ "cache_size",
+ "Primary storage/Cache size (GB)",
+ lambda x: str(
+ float(next(iter(re.findall(r"(.*)\s+/\s+.*\s+\(", x)), "0"))
+ * CCacheStats.GiB
+ ),
+ True, # Allow to continue evaluation for the next value
+ ),
+ (
+ "cache_max_size",
+ "Primary storage/Cache size (GB)",
+ lambda x: str(
+ float(next(iter(re.findall(r".*\s+/\s+(.*)\s+\(", x)), "0"))
+ * CCacheStats.GiB
+ ),
+ ),
+ ]
+
+ SKIP_KEYS_4_4 = [
+ "Summary/Uncacheable",
+ "Summary/Misses/Direct",
+ "Summary/Misses/Preprocessed",
+ "Primary storage/Hits",
+ "Primary storage/Misses",
+ ]
+
+ DIRECTORY_DESCRIPTION_4_4 = "Summary/Cache directory"
+ PRIMARY_CONFIG_DESCRIPTION_4_4 = "Summary/Primary config"
+ SECONDARY_CONFIG_DESCRIPTION_4_4 = "Summary/Secondary config"
+
ABSOLUTE_KEYS = {"cache_files", "cache_size", "cache_max_size"}
FORMAT_KEYS = {"cache_size", "cache_max_size"}
GiB = 1024 ** 3
MiB = 1024 ** 2
KiB = 1024
- def __init__(self, output=None):
+ def __init__(self, output=None, is_version_4_4_or_newer=False):
"""Construct an instance from the output of ccache -s."""
self._values = {}
self.cache_dir = ""
self.primary_config = ""
self.secondary_config = ""
if not output:
return
+ if is_version_4_4_or_newer:
+ self._parse_human_format_4_4_plus(output)
+ else:
+ self._parse_human_format(output)
+
+ def _parse_human_format_4_4_plus(self, content):
+ head = ""
+ subhead = ""
+
+ for line in content.splitlines():
+ name = ""
+ if not line:
+ continue
+ if line.startswith(" "):
+ if not line.startswith(" "):
+ subhead = line.strip().split(":")[0]
+ name = line.strip().split(":")[0]
+ raw_value = ":".join(line.split(":")[1:]).strip()
+ if raw_value:
+ key = head
+ if subhead != name:
+ key += "/{}".format(subhead)
+ key += "/{}".format(name)
+ self._parse_line_4_4_plus(key, raw_value)
+ else:
+ head = line.strip(":")
+ subhead = ""
+
+ def _parse_line_4_4_plus(self, key, value):
+ if key.startswith(self.DIRECTORY_DESCRIPTION_4_4):
+ self.cache_dir = value
+ elif key.startswith(self.PRIMARY_CONFIG_DESCRIPTION_4_4):
+ self.primary_config = value
+ elif key.startswith(self.SECONDARY_CONFIG_DESCRIPTION_4_4):
+ self.secondary_config = value
+ else:
+ for seq in self.STATS_KEYS_4_4:
+ stat_key = seq[0]
+ stat_description = seq[1]
+ raw_value = value
+ if len(seq) > 2:
+ raw_value = seq[2](value)
+ if stat_key not in self._values and key == stat_description:
+ self._values[stat_key] = self._parse_value(raw_value)
+
+ # We dont want to break when we need to extract two infos
+ # from the same line
+ if len(seq) < 4:
+ break
+ else:
+ if key not in self.SKIP_KEYS_4_4:
+ raise ValueError(
+ "Failed to parse ccache stats output: '{}' '{}'".format(
+ key, value
+ )
+ )
+
+ def _parse_human_format(self, output):
for line in output.splitlines():
line = line.strip()
if line:
self._parse_line(line)
def _parse_line(self, line):
line = six.ensure_text(line)
if line.startswith(self.DIRECTORY_DESCRIPTION):
@@ -1050,6 +1175,29 @@
else:
return "%.1f Kbytes" % (float(v) / CCacheStats.KiB)
+ @staticmethod
+ def check_version_4_4_or_newer(ccache):
+ output_version = subprocess.check_output(
+ [ccache, "--version"], universal_newlines=True
+ )
+ return CCacheStats._is_version_4_4_or_newer(output_version)
+
+ @staticmethod
+ def _is_version_4_4_or_newer(output):
+ if "ccache version" not in output:
+ return False
+
+ major = 0
+ minor = 0
+
+ for line in output.splitlines():
+ version = re.search(r"ccache version (\d+).(\d+).*", line)
+ if version:
+ major = int(version.group(1))
+ minor = int(version.group(2))
+ break
+
+ return ((major << 8) + minor) >= ((4 << 8) + 4)
class BuildDriver(MozbuildObject):
"""Provides a high-level API for build actions."""
diff --git a/python/mozbuild/mozbuild/test/controller/test_ccachestats.py b/python/mozbuild/mozbuild/test/controller/test_ccachestats.py
--- a/python/mozbuild/mozbuild/test/controller/test_ccachestats.py
+++ b/python/mozbuild/mozbuild/test/controller/test_ccachestats.py
@@ -223,16 +223,143 @@ class TestCcacheStats(unittest.TestCase)
cleanups performed 3154
files in cache 18525
cache size 13.4 GB
max cache size 15.0 GB
""".format(
timestamp=time.strftime("%c"), timestamp2=time.strftime("%c")
)
+ VERSION_3_5_GIT = """
+ ccache version 3.5.1+2_gf5309092_dirty
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2019 Joel Rosdahl
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_2 = """
+ ccache version 4.2.1
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_4 = """
+ ccache version 4.4
+ Features: file-storage http-storage
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_4_2 = """
+ ccache version 4.4.2
+ Features: file-storage http-storage
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ VERSION_4_5 = """
+ ccache version 4.5.1
+ Features: file-storage http-storage redis-storage
+
+ Copyright (C) 2002-2007 Andrew Tridgell
+ Copyright (C) 2009-2021 Joel Rosdahl and other contributors
+
+ See <https://ccache.dev/credits.html> for a complete list of contributors.
+
+ This program is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3 of the License, or (at your option) any later
+ version.
+ """
+
+ STAT10 = """
+Summary:
+ Cache directory: /home/suer/.ccache
+ Primary config: /home/suer/.ccache/ccache.conf
+ Secondary config: /etc/ccache.conf
+ Stats updated: {timestamp}
+ Hits: 916 / 9343 (9.80 %)
+ Direct: 197 / 197 (100.0 %)
+ Preprocessed: 719 / 719 (100.0 %)
+ Misses: 8427
+ Direct: 0
+ Preprocessed: 0
+ Errors: 1
+ Uncacheable: 1251
+Primary storage:
+ Hits: 0 / 0
+ Misses: 0
+ Cache size (GB): 4.41 / 5.00 (88.27 %)
+ Files: 4425
+ Cleanups: 161
+Errors:
+ Missing cache file: 1
+Uncacheable:
+ Autoconf compile/link: 418
+ Bad compiler arguments: 6
+ Called for linking: 569
+ Called for preprocessing: 110
+ Compilation failed: 49
+ No input file: 9
+ Preprocessing failed: 90
+ """.format(
+ timestamp=time.strftime("%c")
+ )
+
+ STAT11 = """
+Summary:
+ Cache directory: /home/suer/.ccache
+ Primary config: /home/suer/.ccache/ccache.conf
+ Secondary config: /etc/ccache.conf
+ Stats updated: {timestamp}
+ Hits: 0 / 0
+ Direct: 0 / 0
+ Preprocessed: 0 / 0
+ Misses: 0
+ Direct: 0
+ Preprocessed: 0
+Primary storage:
+ Hits: 0 / 0
+ Misses: 0
+ Cache size (GB): 0.00 / 5.00 (0.00 %)
+ Files: 0
+ Cleanups: 16
+ """.format(
+ timestamp=time.strftime("%c")
+ )
+
def test_parse_garbage_stats_message(self):
self.assertRaises(ValueError, CCacheStats, self.STAT_GARBAGE)
def test_parse_zero_stats_message(self):
stats = CCacheStats(self.STAT0)
self.assertEqual(stats.cache_dir, "/home/tlin/.ccache")
self.assertEqual(stats.hit_rates(), (0, 0, 0))
@@ -290,11 +417,26 @@ class TestCcacheStats(unittest.TestCase)
stat8 = CCacheStats(self.STAT8)
self.assertTrue(stat8)
def test_stats_version35(self):
# Test parsing 3.5 output.
stat9 = CCacheStats(self.STAT9)
self.assertTrue(stat9)
+ def test_stats_version44(self):
+ # verify version checks
+ self.assertFalse(CCacheStats._is_version_4_4_or_newer(self.VERSION_3_5_GIT))
+ self.assertFalse(CCacheStats._is_version_4_4_or_newer(self.VERSION_4_2))
+ self.assertTrue(CCacheStats._is_version_4_4_or_newer(self.VERSION_4_4))
+ self.assertTrue(CCacheStats._is_version_4_4_or_newer(self.VERSION_4_4_2))
+ self.assertTrue(CCacheStats._is_version_4_4_or_newer(self.VERSION_4_5))
+
+ # Test parsing 4.4+ output.
+ stat10 = CCacheStats(self.STAT10, True)
+ self.assertTrue(stat10)
+
+ stat11 = CCacheStats(self.STAT11, True)
+ self.assertTrue(stat11)
+
if __name__ == "__main__":
main()

76
icecat-commasplit.patch Normal file
View file

@ -0,0 +1,76 @@
--- firefox-111.0.1/build/moz.configure/rust.configure 2023-03-21 06:16:03.000000000 -0700
+++ firefox-111.0.1/build/moz.configure/rust.configure.new 2023-04-05 08:57:29.403219120 -0700
@@ -593,7 +593,7 @@
# ==============================================================
-option(env="RUSTFLAGS", nargs=1, help="Rust compiler flags")
+option(env="RUSTFLAGS", nargs=1, help="Rust compiler flags", comma_split=False)
set_config("RUSTFLAGS", depends("RUSTFLAGS")(lambda flags: flags))
--- firefox-111.0.1/python/mozbuild/mozbuild/configure/options.py 2023-03-21 06:16:09.000000000 -0700
+++ firefox-111.0.1/python/mozbuild/mozbuild/configure/options.py.new 2023-04-05 08:57:31.270193468 -0700
@@ -191,6 +191,10 @@
to instantiate an option indirectly. Set this to a positive integer to
force the script to look into a deeper stack frame when inferring the
`category`.
+ - `comma_split` specifies whether the value string should be split on
+ commas. The default is True. Setting it False is necessary for things
+ like compiler flags which should be a single string that may contain
+ commas.
"""
__slots__ = (
@@ -205,6 +209,7 @@
"possible_origins",
"category",
"define_depth",
+ "comma_split",
)
def __init__(
@@ -218,6 +223,7 @@
category=None,
help=None,
define_depth=0,
+ comma_split=True,
):
if not name and not env:
raise InvalidOptionError(
@@ -335,9 +341,10 @@
self.choices = choices
self.help = help
self.category = category or _infer_option_category(define_depth)
+ self.comma_split = comma_split
@staticmethod
- def split_option(option):
+ def split_option(option, comma_split=True):
"""Split a flag or variable into a prefix, a name and values
Variables come in the form NAME=values (no prefix).
@@ -350,7 +357,13 @@
elements = option.split("=", 1)
name = elements[0]
- values = tuple(elements[1].split(",")) if len(elements) == 2 else ()
+ if len(elements) == 2:
+ if comma_split:
+ values = tuple(elements[1].split(","))
+ else:
+ values = (elements[1],)
+ else:
+ values = ()
if name.startswith("--"):
name = name[2:]
if not name.islower():
@@ -426,7 +439,7 @@
% (option, origin, ", ".join(self.possible_origins))
)
- prefix, name, values = self.split_option(option)
+ prefix, name, values = self.split_option(option, self.comma_split)
option = self._join_option(prefix, name)
assert name in (self.name, self.env)

View file

@ -0,0 +1,62 @@
diff -ur a/js/xpconnect/src/XPCJSContext.cpp b/js/xpconnect/src/XPCJSContext.cpp
--- a/js/xpconnect/src/XPCJSContext.cpp 2021-07-05 21:16:02.000000000 +0200
+++ b/js/xpconnect/src/XPCJSContext.cpp 2021-07-19 15:01:24.083460460 +0200
@@ -81,14 +81,6 @@
using namespace JS;
using mozilla::dom::AutoEntryScript;
-// The watchdog thread loop is pretty trivial, and should not require much stack
-// space to do its job. So only give it 32KiB or the platform minimum.
-#if !defined(PTHREAD_STACK_MIN)
-# define PTHREAD_STACK_MIN 0
-#endif
-static constexpr size_t kWatchdogStackSize =
- PTHREAD_STACK_MIN < 32 * 1024 ? 32 * 1024 : PTHREAD_STACK_MIN;
-
static void WatchdogMain(void* arg);
class Watchdog;
class WatchdogManager;
@@ -161,7 +153,7 @@
// watchdog, we need to join it on shutdown.
mThread = PR_CreateThread(PR_USER_THREAD, WatchdogMain, this,
PR_PRIORITY_NORMAL, PR_GLOBAL_THREAD,
- PR_JOINABLE_THREAD, kWatchdogStackSize);
+ PR_JOINABLE_THREAD, 0);
if (!mThread) {
MOZ_CRASH("PR_CreateThread failed!");
}
diff -ur a/security/sandbox/linux/launch/SandboxLaunch.cpp b/security/sandbox/linux/launch/SandboxLaunch.cpp
--- a/security/sandbox/linux/launch/SandboxLaunch.cpp 2021-07-05 18:20:36.000000000 +0200
+++ b/security/sandbox/linux/launch/SandboxLaunch.cpp 2021-07-20 08:39:17.272136982 +0200
@@ -489,7 +489,8 @@ static int CloneCallee(void* aPtr) {
// we don't currently support sandboxing under valgrind.
MOZ_NEVER_INLINE MOZ_ASAN_BLACKLIST static pid_t DoClone(int aFlags,
jmp_buf* aCtx) {
- uint8_t miniStack[PTHREAD_STACK_MIN];
+ static constexpr size_t kStackAlignment = 16;
+ uint8_t miniStack[4096] __attribute__((aligned(kStackAlignment)));
#ifdef __hppa__
void* stackPtr = miniStack;
#else
@@ -510,13 +511,19 @@ static pid_t ForkWithFlags(int aFlags) {
CLONE_CHILD_CLEARTID;
MOZ_RELEASE_ASSERT((aFlags & kBadFlags) == 0);
+ // Block signals due to small stack in DoClone.
+ sigset_t oldSigs;
+ BlockAllSignals(&oldSigs);
+
+ int ret = 0;
jmp_buf ctx;
if (setjmp(ctx) == 0) {
// In the parent and just called setjmp:
- return DoClone(aFlags | SIGCHLD, &ctx);
+ ret = DoClone(aFlags | SIGCHLD, &ctx);
}
+ RestoreSignals(&oldSigs);
// In the child and have longjmp'ed:
- return 0;
+ return ret;
}
static bool WriteStringToFile(const char* aPath, const char* aStr,

View file

@ -1,6 +1,6 @@
#!/bin/bash
VERSION=140.7.0
VERSION=128.13.0
URL=https://ftp.mozilla.org/pub/firefox/releases/${VERSION}esr/linux-x86_64/xpi/
for u in $URL; do

View file

@ -0,0 +1,93 @@
--- a/dom/base/usecounters.py.python-open-U 2022-06-28 04:37:00.000000000 +0200
+++ b/dom/base/usecounters.py 2022-07-11 19:17:46.266517761 +0200
@@ -8,7 +8,7 @@ import re
def read_conf(conf_filename):
# Can't read/write from a single StringIO, so make a new one for reading.
- stream = open(conf_filename, "rU")
+ stream = open(conf_filename, "r")
def parse_counters(stream):
for line_num, line in enumerate(stream):
--- a/python/mozbuild/mozbuild/action/process_define_files.py.python-open-U 2022-06-28 04:37:39.000000000 +0200
+++ b/python/mozbuild/mozbuild/action/process_define_files.py 2022-07-11 19:18:24.056417112 +0200
@@ -36,7 +36,7 @@ def process_define_file(output, input):
) and not config.substs.get("JS_STANDALONE"):
config = PartialConfigEnvironment(mozpath.join(topobjdir, "js", "src"))
- with open(path, "rU") as input:
+ with open(path, "r") as input:
r = re.compile(
"^\s*#\s*(?P<cmd>[a-z]+)(?:\s+(?P<name>\S+)(?:\s+(?P<value>\S+))?)?", re.U
)
--- a/python/mozbuild/mozbuild/backend/base.py.python-open-U 2022-06-28 04:37:39.000000000 +0200
+++ b/python/mozbuild/mozbuild/backend/base.py 2022-07-11 19:18:34.165390187 +0200
@@ -272,7 +272,7 @@ class BuildBackend(LoggingMixin):
return status
@contextmanager
- def _write_file(self, path=None, fh=None, readmode="rU"):
+ def _write_file(self, path=None, fh=None, readmode="r"):
"""Context manager to write a file.
This is a glorified wrapper around FileAvoidWrite with integration to
--- a/python/mozbuild/mozbuild/preprocessor.py.python-open-U 2022-06-28 04:37:20.000000000 +0200
+++ b/python/mozbuild/mozbuild/preprocessor.py 2022-07-11 19:19:30.677239685 +0200
@@ -531,7 +531,7 @@ class Preprocessor:
if args:
for f in args:
- with io.open(f, "rU", encoding="utf-8") as input:
+ with io.open(f, "r", encoding="utf-8") as input:
self.processFile(input=input, output=out)
if depfile:
mk = Makefile()
@@ -860,7 +860,7 @@ class Preprocessor:
args = self.applyFilters(args)
if not os.path.isabs(args):
args = os.path.join(self.curdir, args)
- args = io.open(args, "rU", encoding="utf-8")
+ args = io.open(args, "r", encoding="utf-8")
except Preprocessor.Error:
raise
except Exception:
@@ -914,7 +914,7 @@ class Preprocessor:
def preprocess(includes=[sys.stdin], defines={}, output=sys.stdout, marker="#"):
pp = Preprocessor(defines=defines, marker=marker)
for f in includes:
- with io.open(f, "rU", encoding="utf-8") as input:
+ with io.open(f, "r", encoding="utf-8") as input:
pp.processFile(input=input, output=output)
return pp.includes
--- a/python/mozbuild/mozbuild/util.py.python-open-U 2022-06-28 04:37:40.000000000 +0200
+++ b/python/mozbuild/mozbuild/util.py 2022-07-11 19:19:19.903268374 +0200
@@ -225,7 +225,7 @@ class FileAvoidWrite(BytesIO):
still occur, as well as diff capture if requested.
"""
- def __init__(self, filename, capture_diff=False, dry_run=False, readmode="rU"):
+ def __init__(self, filename, capture_diff=False, dry_run=False, readmode="r"):
BytesIO.__init__(self)
self.name = filename
assert type(capture_diff) == bool
--- a/python/mozbuild/mozpack/files.py.python-open-U 2022-06-28 04:37:40.000000000 +0200
+++ b/python/mozbuild/mozpack/files.py 2022-07-11 19:19:40.372213866 +0200
@@ -574,7 +574,7 @@ class PreprocessedFile(BaseFile):
pp = Preprocessor(defines=self.defines, marker=self.marker)
pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings)
- with _open(self.path, "rU") as input:
+ with _open(self.path, "r") as input:
with _open(os.devnull, "w") as output:
pp.processFile(input=input, output=output)
@@ -631,7 +631,7 @@ class PreprocessedFile(BaseFile):
pp = Preprocessor(defines=self.defines, marker=self.marker)
pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings)
- with _open(self.path, "rU") as input:
+ with _open(self.path, "r") as input:
pp.processFile(input=input, output=dest, depfile=deps_out)
dest.close()

View file

@ -0,0 +1,27 @@
--- thunderbird-91.11.0/xpcom/idl-parser/xpidl/xpidl.py.python-inline-flags 2022-06-28 04:39:56.000000000 +0200
+++ thunderbird-91.11.0/xpcom/idl-parser/xpidl/xpidl.py 2022-07-11 21:55:05.287553042 +0200
@@ -1563,13 +1563,13 @@ class IDLParser(object):
t_ignore = " \t"
def t_multilinecomment(self, t):
- r"/\*(?s).*?\*/"
+ r"/\*(?s:.*?)\*/"
t.lexer.lineno += t.value.count("\n")
if t.value.startswith("/**"):
self._doccomments.append(t.value)
def t_singlelinecomment(self, t):
- r"(?m)//.*?$"
+ r"(?m://.*?$)"
def t_IID(self, t):
return t
@@ -1582,7 +1582,7 @@ class IDLParser(object):
return t
def t_LCDATA(self, t):
- r"(?s)%\{[ ]*C\+\+[ ]*\n(?P<cdata>.*?\n?)%\}[ ]*(C\+\+)?"
+ r"(?s:%\{[ ]*C\+\+[ ]*\n(?P<cdata>.*?\n?)%\}[ ]*(C\+\+)?)"
t.type = "CDATA"
t.value = t.lexer.lexmatch.group("cdata")
t.lexer.lineno += t.value.count("\n")

View file

@ -20,19 +20,25 @@ ExcludeArch: %{ix86} %{arm}
# Downgrade optimization
%global less_optbuild 0
# Build PGO+LTO on x86_64 and aarch64 only
%ifarch x86_64 %{arm64}
# Build PGO+LTO on x86_64 and aarch64 only due to build issues
# on other arches.
%ifarch x86_64
%if 0%{?release_build}
%global build_with_pgo 1
%global pgo_wayland 1
%global launch_wayland_compositor 1
%global build_with_pgo 0
%global pgo_wayland 0
%else
%global build_with_pgo 0
%global pgo_wayland 0
%global launch_wayland_compositor 0
%endif
%endif
%global launch_wayland_compositor 0
%if 0%{?build_with_pgo}
%global launch_wayland_compositor 1
%endif
# Disable LTO to work around rhbz#1883904
%define _lto_cflags %{nil}
####################
# Active/Deactive language files handling
@ -93,17 +99,17 @@ ExcludeArch: %{ix86} %{arm}
%global __requires_exclude ^(%%(find %{buildroot}%{icecatappdir} -name '*.so' | xargs -n1 basename | sort -u | paste -s -d '|' -))
Name: icecat
Epoch: 4
Version: 140.7.0
Epoch: 3
Version: 128.13.0
Release: %autorelease -e %{redhat_ver}
Summary: GNU version of Firefox browser
# Tri-licensing scheme for Gnuzilla/IceCat in parentheses, and licenses for the extensions included
License: (MPL-1.1 OR GPL-2.0-or-later OR LGPL-2.1-or-later) AND GPL-3.0-or-later AND MIT AND BSD-4-Clause-UC AND ISC AND Apache-2.0 AND MPL-2.0
URL: http://www.gnu.org/software/gnuzilla/
URL: http://www.gnu.org/software/gnuzilla/
## Source archive created by scripts based on Gnuzilla files.
## All modified files are hosted in a dedicated fork repository:
## Modified files are hosted in a dedicated fork repository:
## https://gitlab.com/anto.trande/icecat
Source0: %{name}-%{version}-%{redhat_ver}.tar.bz2
@ -131,15 +137,45 @@ Source14: %{name}.desktop
# cbingen
Source17: cbindgen-vendor.tar.xz
Source18: node-stdout-nonblocking-wrapper
Source19: run-wayland-compositor
# Build patches
# Fixes installation of those addons which don't have ID on IceCat ("Cannot find id for addon" error).
Patch2: %{name}-commasplit.patch
# With clang LLVM 16 rust-bindgen 0.56.0 is too old, combined
# https://github.com/rust-lang/rust-bindgen/pull/2319
# https://github.com/rust-lang/rust-bindgen/pull/2339
Patch7: rust-bindgen-2319-2339.patch
# Needed with rust 1.70
# https://github.com/mozilla/mp4parse-rust/commit/8b5b652d38e007e736bb442ccd5aa5ed699db100
Patch8: mp4parse-rust-8b5b652d38e007e736bb442ccd5aa5ed699db100.patch
Patch40: build-aarch64-skia.patch
Patch44: build-arm-libopus.patch
# Fedora specific patches
Patch219: rhbz-1173156.patch
Patch220: firefox-nss-version.patch
Patch221: firefox-nss-addon-hack.patch
Patch223: %{name}-glibc-dynstack.patch
Patch224: %{name}-GLIBCXX-fix-for-GCC-12.patch
# ARM run-time patch
Patch226: rhbz-1354671.patch
# Upstream patches
Patch401: icecat-1742849.patch
Patch402: mozilla-1196777.patch
Patch403: icecat-python3.11-open-U.patch
Patch404: icecat-python3.11-regex-inline-flags.patch
Patch412: mozilla-1337988.patch
Patch422: mozilla-1580174-webrtc-popup.patch
# Patch for GCC-15
Patch426: icecat-115.19.0-fix_mz1917964.patch
# Fix crash on ppc64le (mozilla#1512162)
Patch423: mozilla-1512162.patch
@ -209,7 +245,6 @@ BuildRequires: pipewire-devel
BuildRequires: python3-devel
BuildRequires: python3-setuptools
BuildRequires: python3.11-devel
BuildRequires: python3-orjson
BuildRequires: perl-interpreter
BuildRequires: pkgconfig(xrender)
BuildRequires: pkgconfig(libstartup-notification-1.0)
@ -218,36 +253,32 @@ BuildRequires: pkgconfig(libcurl)
%if %{with pulseaudio}
BuildRequires: pulseaudio-libs-devel
%endif
BuildRequires: yasm
BuildRequires: llvm
%if 0%{?fedora} >= 42 || 0%{?rhel} >= 10
BuildRequires: clang19
BuildRequires: clang19-libs
BuildRequires: llvm19-devel
BuildRequires: compiler-rt19
%global llvm_suffix -19
%else
%if 0%{?fedora} >= 40 || 0%{?rhel} >= 10
BuildRequires: clang17
BuildRequires: clang17-libs
BuildRequires: llvm17-devel
BuildRequires: compiler-rt17
%global llvm_suffix -17
%else
BuildRequires: clang
BuildRequires: clang-libs
BuildRequires: llvm-devel
%endif
%if "%toolchain" == "clang"
BuildRequires: lld
%endif
BuildRequires: rust
BuildRequires: rustfmt
%if 0%{?pgo_wayland}
BuildRequires: xorg-x11-server-Xvfb
BuildRequires: mutter
BuildRequires: gsettings-desktop-schemas
BuildRequires: gnome-settings-daemon
BuildRequires: mesa-dri-drivers
BuildRequires: mesa-libEGL
BuildRequires: xorg-x11-server-Xwayland
BuildRequires: dbus-x11
BuildRequires: gnome-keyring
%endif
%if 0%{?build_with_pgo}
BuildRequires: xorg-x11-server-Xvfb
%endif
%if 0%{?big_endian}
@ -271,6 +302,11 @@ Requires: fedora-bookmarks
Suggests: mozilla-ublock-origin
Provides: webclient
%if 0%{?fedora} >= 40
Obsoletes: icecat-wayland < 3:128.12.0-1
Obsoletes: icecat-x11 < 3:128.12.0-1
%endif
%description
GNU IceCat is the GNU version of the Firefox ESR browser.
Extensions included to this version of IceCat:
@ -299,7 +335,7 @@ Extensions included to this version of IceCat:
%if %{with langpacks_subpkg}
%package langpacks
Summary: IceCat langpacks
Requires: %{name} = 4:%{version}-%{release}
Requires: %{name} = 3:%{version}-%{release}
%description langpacks
The icecat-langpacks package contains all the localization
and translations langpack add-ons.
@ -313,7 +349,10 @@ and translations langpack add-ons.
# Copy license files
tar -xf %{SOURCE5}
%patch -P 2 -p 1 -b .commasplit
# Fedora patches
%patch -P 219 -p 1 -b .rhbz-1173156
%if 0%{?fedora}
%patch -P 221 -p 1 -b .firefox-nss-addon-hack
%endif
@ -321,12 +360,15 @@ tar -xf %{SOURCE5}
# ARM64
%ifarch %{arm64}
%patch -P 40 -p 1 -b .aarch64-skia
%patch -P 226 -p 1 -b .1354671
%endif
%patch -P 402 -p 1 -b .1196777
%ifarch %{power64}
%patch -P 423 -p 1 -b .1512162
%endif
%patch -P 426 -p 1 -b .1917964
%patch -P 603 -p1 -b .inline
# Remove default configuration and copy the customized one
@ -388,6 +430,9 @@ echo "ac_add_options --disable-optimize" >> .mozconfig
echo "ac_add_options --enable-rust-debug" >> .mozconfig
%else
%global optimize_flags "none"
%ifarch s390x
%define optimize_flags " -fno-schedule-insns"
%endif
%if %{?optimize_flags} != "none"
echo 'ac_add_options --enable-optimize=%{?optimize_flags}' >> .mozconfig
%else
@ -407,6 +452,7 @@ echo "ac_add_options --with-l10n-base=$PWD/l10n" >> .mozconfig
%if "%toolchain" == "clang"
echo "ac_add_options --with-libclang-path=`llvm-config%{?llvm_suffix} --libdir`" >> .mozconfig
#echo "ac_add_options --with-clang-path=%%{_bindir}/clang%%{?llvm_suffix}" >> .mozconfig
%endif
%ifarch s390x %{arm64}
@ -537,33 +583,56 @@ echo "ac_add_options MOZ_PGO=1" >> .mozconfig
export CCACHE_DISABLE=1
%endif
# Require 4 GB of RAM per CPU core
%global _smp_tasksize_proc 4096
%if %{?less_optbuild}
echo "mk_add_options MOZ_MAKE_FLAGS=\"-j1\"" >> .mozconfig
MOZ_SMP_FLAGS=-j1
%else
echo "mk_add_options MOZ_MAKE_FLAGS=\"-j%{_smp_build_ncpus}\"" >> .mozconfig
MOZ_SMP_FLAGS=-j1
# On x86_64 architectures, Mozilla can build up to 4 jobs at once in parallel,
# however builds tend to fail on other arches when building in parallel.
%ifarch s390x %{arm64}
[ -z "$RPM_BUILD_NCPUS" ] && \
RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
%endif
%ifarch x86_64 %{power64}
[ -z "$RPM_BUILD_NCPUS" ] && \
RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
[ "$RPM_BUILD_NCPUS" -ge 4 ] && MOZ_SMP_FLAGS=-j4
[ "$RPM_BUILD_NCPUS" -ge 8 ] && MOZ_SMP_FLAGS=-j8
[ "$RPM_BUILD_NCPUS" -ge 16 ] && MOZ_SMP_FLAGS=-j16
[ "$RPM_BUILD_NCPUS" -ge 24 ] && MOZ_SMP_FLAGS=-j24
[ "$RPM_BUILD_NCPUS" -ge 32 ] && MOZ_SMP_FLAGS=-j32
[ "$RPM_BUILD_NCPUS" -ge 64 ] && MOZ_SMP_FLAGS=-j64
%endif
%endif
echo "mk_add_options MOZ_MAKE_FLAGS=\"$MOZ_SMP_FLAGS\"" >> .mozconfig
echo "mk_add_options MOZ_SERVICES_SYNC=1" >> .mozconfig
echo "export STRIP=/bin/true" >> .mozconfig
%if 0%{?launch_wayland_compositor}
cp -p %{SOURCE19} .
. ./run-wayland-compositor
. ./run-wayland-compositor
%endif
%if %{?debug_build}
export CARGO_PROFILE_RELEASE_BUILD_OVERRIDE_DEBUG=true
%endif
export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
#Use python 3.11 for mach
sed -i -e 's|#!/usr/bin/env python3|#!/usr/bin/env python3.11|' mach
./mach build -v 2>&1 | cat - || exit 1
%if 0%{?build_with_pgo}
kill $MUTTER_PID
%if 0%{?pgo_wayland}
env | grep "WAYLAND"
MOZ_ENABLE_WAYLAND=1 ./mach build -v 2>&1 | cat - && exit 1
%else
xvfb-run ./mach build 2>&1 | cat - || exit 1
%endif
%else
./mach build -v 2>&1 | cat - || exit 1
%endif
%install

14
mozilla-1196777.patch Normal file
View file

@ -0,0 +1,14 @@
diff -up firefox-100.0/widget/gtk/nsWindow.cpp.1196777 firefox-100.0/widget/gtk/nsWindow.cpp
--- firefox-100.0/widget/gtk/nsWindow.cpp.1196777 2022-05-02 11:29:06.763325015 +0200
+++ firefox-100.0/widget/gtk/nsWindow.cpp 2022-05-02 11:30:49.100717334 +0200
@@ -163,7 +163,8 @@ const gint kEvents = GDK_TOUCHPAD_GESTUR
GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK |
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
GDK_SMOOTH_SCROLL_MASK | GDK_TOUCH_MASK | GDK_SCROLL_MASK |
- GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK;
+ GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK |
+ GDK_FOCUS_CHANGE_MASK;
/* utility functions */
static bool is_mouse_in_window(GdkWindow* aWindow, gdouble aMouseX,

496
mozilla-1337988.patch Normal file
View file

@ -0,0 +1,496 @@
diff -up firefox-56.0/dom/plugins/base/nsJSNPRuntime.cpp.1337988 firefox-56.0/dom/plugins/base/nsJSNPRuntime.cpp
--- firefox-56.0/dom/plugins/base/nsJSNPRuntime.cpp.1337988 2017-09-14 22:15:56.000000000 +0200
+++ firefox-56.0/dom/plugins/base/nsJSNPRuntime.cpp 2017-09-25 10:34:11.205611698 +0200
@@ -1719,7 +1719,7 @@ NPObjWrapper_ObjectMoved(JSObject *obj,
auto entry =
static_cast<NPObjWrapperHashEntry*>(sNPObjWrappers->Search(npobj));
MOZ_ASSERT(entry && entry->mJSObj);
- MOZ_ASSERT(entry->mJSObj == old);
+ MOZ_ASSERT(entry->mJSObj.unbarrieredGetPtr() == old);
entry->mJSObj = obj;
}
diff -up firefox-56.0/js/ipc/JavaScriptShared.cpp.1337988 firefox-56.0/js/ipc/JavaScriptShared.cpp
--- firefox-56.0/js/ipc/JavaScriptShared.cpp.1337988 2017-07-31 18:20:47.000000000 +0200
+++ firefox-56.0/js/ipc/JavaScriptShared.cpp 2017-09-25 10:34:11.205611698 +0200
@@ -101,7 +101,7 @@ IdToObjectMap::has(const ObjectId& id, c
auto p = table_.lookup(id);
if (!p)
return false;
- return p->value() == obj;
+ return p->value().unbarrieredGet() == obj;
}
#endif
diff -up firefox-56.0/js/public/RootingAPI.h.1337988 firefox-56.0/js/public/RootingAPI.h
--- firefox-56.0/js/public/RootingAPI.h.1337988 2017-07-31 18:20:47.000000000 +0200
+++ firefox-56.0/js/public/RootingAPI.h 2017-09-25 10:34:11.206611695 +0200
@@ -148,6 +148,10 @@ template<typename T>
struct PersistentRootedMarker;
} /* namespace gc */
+#define DECLARE_POINTER_COMPARISON_OPS(T) \
+ bool operator==(const T& other) const { return get() == other; } \
+ bool operator!=(const T& other) const { return get() != other; }
+
// Important: Return a reference so passing a Rooted<T>, etc. to
// something that takes a |const T&| is not a GC hazard.
#define DECLARE_POINTER_CONSTREF_OPS(T) \
@@ -237,8 +241,6 @@ class Heap : public js::HeapBase<T, Heap
static_assert(js::IsHeapConstructibleType<T>::value,
"Type T must be a public GC pointer type");
public:
- using ElementType = T;
-
Heap() {
static_assert(sizeof(T) == sizeof(Heap<T>),
"Heap<T> must be binary compatible with T.");
@@ -385,8 +387,6 @@ template <typename T>
class TenuredHeap : public js::HeapBase<T, TenuredHeap<T>>
{
public:
- using ElementType = T;
-
TenuredHeap() : bits(0) {
static_assert(sizeof(T) == sizeof(TenuredHeap<T>),
"TenuredHeap<T> must be binary compatible with T.");
@@ -394,6 +394,9 @@ class TenuredHeap : public js::HeapBase<
explicit TenuredHeap(T p) : bits(0) { setPtr(p); }
explicit TenuredHeap(const TenuredHeap<T>& p) : bits(0) { setPtr(p.getPtr()); }
+ bool operator==(const TenuredHeap<T>& other) { return bits == other.bits; }
+ bool operator!=(const TenuredHeap<T>& other) { return bits != other.bits; }
+
void setPtr(T newPtr) {
MOZ_ASSERT((reinterpret_cast<uintptr_t>(newPtr) & flagsMask) == 0);
if (newPtr)
@@ -470,8 +473,6 @@ class MOZ_NONHEAP_CLASS Handle : public
friend class JS::MutableHandle<T>;
public:
- using ElementType = T;
-
/* Creates a handle from a handle of a type convertible to T. */
template <typename S>
MOZ_IMPLICIT Handle(Handle<S> handle,
@@ -533,6 +534,7 @@ class MOZ_NONHEAP_CLASS Handle : public
MOZ_IMPLICIT Handle(MutableHandle<S>& root,
typename mozilla::EnableIf<mozilla::IsConvertible<S, T>::value, int>::Type dummy = 0);
+ DECLARE_POINTER_COMPARISON_OPS(T);
DECLARE_POINTER_CONSTREF_OPS(T);
DECLARE_NONPOINTER_ACCESSOR_METHODS(*ptr);
@@ -559,8 +561,6 @@ template <typename T>
class MOZ_STACK_CLASS MutableHandle : public js::MutableHandleBase<T, MutableHandle<T>>
{
public:
- using ElementType = T;
-
inline MOZ_IMPLICIT MutableHandle(Rooted<T>* root);
inline MOZ_IMPLICIT MutableHandle(PersistentRooted<T>* root);
@@ -589,6 +589,7 @@ class MOZ_STACK_CLASS MutableHandle : pu
return h;
}
+ DECLARE_POINTER_COMPARISON_OPS(T);
DECLARE_POINTER_CONSTREF_OPS(T);
DECLARE_NONPOINTER_ACCESSOR_METHODS(*ptr);
DECLARE_NONPOINTER_MUTABLE_ACCESSOR_METHODS(*ptr);
@@ -805,8 +806,6 @@ class MOZ_RAII Rooted : public js::Roote
}
public:
- using ElementType = T;
-
template <typename RootingContext>
explicit Rooted(const RootingContext& cx)
: ptr(GCPolicy<T>::initial())
@@ -839,6 +838,7 @@ class MOZ_RAII Rooted : public js::Roote
ptr = mozilla::Move(value);
}
+ DECLARE_POINTER_COMPARISON_OPS(T);
DECLARE_POINTER_CONSTREF_OPS(T);
DECLARE_POINTER_ASSIGN_OPS(Rooted, T);
DECLARE_NONPOINTER_ACCESSOR_METHODS(ptr);
@@ -903,14 +903,13 @@ template <typename T>
class MOZ_RAII FakeRooted : public RootedBase<T, FakeRooted<T>>
{
public:
- using ElementType = T;
-
template <typename CX>
explicit FakeRooted(CX* cx) : ptr(JS::GCPolicy<T>::initial()) {}
template <typename CX>
FakeRooted(CX* cx, T initial) : ptr(initial) {}
+ DECLARE_POINTER_COMPARISON_OPS(T);
DECLARE_POINTER_CONSTREF_OPS(T);
DECLARE_POINTER_ASSIGN_OPS(FakeRooted, T);
DECLARE_NONPOINTER_ACCESSOR_METHODS(ptr);
@@ -931,8 +930,6 @@ template <typename T>
class FakeMutableHandle : public js::MutableHandleBase<T, FakeMutableHandle<T>>
{
public:
- using ElementType = T;
-
MOZ_IMPLICIT FakeMutableHandle(T* t) {
ptr = t;
}
@@ -1124,8 +1121,6 @@ class PersistentRooted : public js::Root
}
public:
- using ElementType = T;
-
PersistentRooted() : ptr(GCPolicy<T>::initial()) {}
explicit PersistentRooted(RootingContext* cx)
@@ -1203,6 +1198,7 @@ class PersistentRooted : public js::Root
}
}
+ DECLARE_POINTER_COMPARISON_OPS(T);
DECLARE_POINTER_CONSTREF_OPS(T);
DECLARE_POINTER_ASSIGN_OPS(PersistentRooted, T);
DECLARE_NONPOINTER_ACCESSOR_METHODS(ptr);
@@ -1234,8 +1230,6 @@ class JS_PUBLIC_API(ObjectPtr)
Heap<JSObject*> value;
public:
- using ElementType = JSObject*;
-
ObjectPtr() : value(nullptr) {}
explicit ObjectPtr(JSObject* obj) : value(obj) {}
@@ -1342,177 +1336,6 @@ Swap(JS::TenuredHeap<T>& aX, JS::Tenured
} /* namespace mozilla */
-namespace js {
-namespace detail {
-
-// DefineComparisonOps is a trait which selects which wrapper classes to define
-// operator== and operator!= for. It supplies a getter function to extract the
-// value to compare. This is used to avoid triggering the automatic read
-// barriers where appropriate.
-//
-// If DefineComparisonOps is not specialized for a particular wrapper you may
-// get errors such as 'invalid operands to binary expression' or 'no match for
-// operator==' when trying to compare against instances of the wrapper.
-
-template <typename T>
-struct DefineComparisonOps : mozilla::FalseType {};
-
-template <typename T>
-struct DefineComparisonOps<JS::Heap<T>> : mozilla::TrueType {
- static const T& get(const JS::Heap<T>& v) { return v.unbarrieredGet(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<JS::TenuredHeap<T>> : mozilla::TrueType {
- static const T get(const JS::TenuredHeap<T>& v) { return v.unbarrieredGetPtr(); }
-};
-
-template <>
-struct DefineComparisonOps<JS::ObjectPtr> : mozilla::TrueType {
- static const JSObject* get(const JS::ObjectPtr& v) { return v.unbarrieredGet(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<JS::Rooted<T>> : mozilla::TrueType {
- static const T& get(const JS::Rooted<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<JS::Handle<T>> : mozilla::TrueType {
- static const T& get(const JS::Handle<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<JS::MutableHandle<T>> : mozilla::TrueType {
- static const T& get(const JS::MutableHandle<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<JS::PersistentRooted<T>> : mozilla::TrueType {
- static const T& get(const JS::PersistentRooted<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<js::FakeRooted<T>> : mozilla::TrueType {
- static const T& get(const js::FakeRooted<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<js::FakeMutableHandle<T>> : mozilla::TrueType {
- static const T& get(const js::FakeMutableHandle<T>& v) { return v.get(); }
-};
-
-} /* namespace detail */
-} /* namespace js */
-
-// Overload operator== and operator!= for all types with the DefineComparisonOps
-// trait using the supplied getter.
-//
-// There are four cases:
-
-// Case 1: comparison between two wrapper objects.
-
-template <typename T, typename U>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- js::detail::DefineComparisonOps<U>::value, bool>::Type
-operator==(const T& a, const U& b) {
- return js::detail::DefineComparisonOps<T>::get(a) == js::detail::DefineComparisonOps<U>::get(b);
-}
-
-template <typename T, typename U>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- js::detail::DefineComparisonOps<U>::value, bool>::Type
-operator!=(const T& a, const U& b) {
- return !(a == b);
-}
-
-// Case 2: comparison between a wrapper object and its unwrapped element type.
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
-operator==(const T& a, const typename T::ElementType& b) {
- return js::detail::DefineComparisonOps<T>::get(a) == b;
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
-operator!=(const T& a, const typename T::ElementType& b) {
- return !(a == b);
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
-operator==(const typename T::ElementType& a, const T& b) {
- return a == js::detail::DefineComparisonOps<T>::get(b);
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value, bool>::Type
-operator!=(const typename T::ElementType& a, const T& b) {
- return !(a == b);
-}
-
-// Case 3: For pointer wrappers, comparison between the wrapper and a const
-// element pointer.
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator==(const typename mozilla::RemovePointer<typename T::ElementType>::Type* a, const T& b) {
- return a == js::detail::DefineComparisonOps<T>::get(b);
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator!=(const typename mozilla::RemovePointer<typename T::ElementType>::Type* a, const T& b) {
- return !(a == b);
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator==(const T& a, const typename mozilla::RemovePointer<typename T::ElementType>::Type* b) {
- return js::detail::DefineComparisonOps<T>::get(a) == b;
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator!=(const T& a, const typename mozilla::RemovePointer<typename T::ElementType>::Type* b) {
- return !(a == b);
-}
-
-// Case 4: For pointer wrappers, comparison between the wrapper and nullptr.
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator==(std::nullptr_t a, const T& b) {
- return a == js::detail::DefineComparisonOps<T>::get(b);
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator!=(std::nullptr_t a, const T& b) {
- return !(a == b);
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator==(const T& a, std::nullptr_t b) {
- return js::detail::DefineComparisonOps<T>::get(a) == b;
-}
-
-template <typename T>
-typename mozilla::EnableIf<js::detail::DefineComparisonOps<T>::value &&
- mozilla::IsPointer<typename T::ElementType>::value, bool>::Type
-operator!=(const T& a, std::nullptr_t b) {
- return !(a == b);
-}
-
#undef DELETE_ASSIGNMENT_OPS
#endif /* js_RootingAPI_h */
diff -up firefox-56.0/js/src/gc/Barrier.h.1337988 firefox-56.0/js/src/gc/Barrier.h
--- firefox-56.0/js/src/gc/Barrier.h.1337988 2017-09-14 22:16:01.000000000 +0200
+++ firefox-56.0/js/src/gc/Barrier.h 2017-09-25 10:34:11.206611695 +0200
@@ -353,8 +353,8 @@ class WriteBarrieredBase : public Barrie
explicit WriteBarrieredBase(const T& v) : BarrieredBase<T>(v) {}
public:
- using ElementType = T;
+ DECLARE_POINTER_COMPARISON_OPS(T);
DECLARE_POINTER_CONSTREF_OPS(T);
// Use this if the automatic coercion to T isn't working.
@@ -612,13 +612,14 @@ class ReadBarriered : public ReadBarrier
return *this;
}
- const T& get() const {
- if (InternalBarrierMethods<T>::isMarkable(this->value))
- this->read();
+ const T get() const {
+ if (!InternalBarrierMethods<T>::isMarkable(this->value))
+ return JS::GCPolicy<T>::initial();
+ this->read();
return this->value;
}
- const T& unbarrieredGet() const {
+ const T unbarrieredGet() const {
return this->value;
}
@@ -626,9 +627,9 @@ class ReadBarriered : public ReadBarrier
return bool(this->value);
}
- operator const T&() const { return get(); }
+ operator const T() const { return get(); }
- const T& operator->() const { return get(); }
+ const T operator->() const { return get(); }
T* unsafeGet() { return &this->value; }
T const* unsafeGet() const { return &this->value; }
@@ -955,35 +956,6 @@ typedef ReadBarriered<WasmTableObject*>
typedef ReadBarriered<Value> ReadBarrieredValue;
-namespace detail {
-
-template <typename T>
-struct DefineComparisonOps<PreBarriered<T>> : mozilla::TrueType {
- static const T& get(const PreBarriered<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<GCPtr<T>> : mozilla::TrueType {
- static const T& get(const GCPtr<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<HeapPtr<T>> : mozilla::TrueType {
- static const T& get(const HeapPtr<T>& v) { return v.get(); }
-};
-
-template <typename T>
-struct DefineComparisonOps<ReadBarriered<T>> : mozilla::TrueType {
- static const T& get(const ReadBarriered<T>& v) { return v.unbarrieredGet(); }
-};
-
-template <>
-struct DefineComparisonOps<HeapSlot> : mozilla::TrueType {
- static const Value& get(const HeapSlot& v) { return v.get(); }
-};
-
-} /* namespace detail */
-
} /* namespace js */
#endif /* gc_Barrier_h */
diff -up firefox-56.0/js/src/jsapi-tests/testGCHeapPostBarriers.cpp.1337988 firefox-56.0/js/src/jsapi-tests/testGCHeapPostBarriers.cpp
--- firefox-56.0/js/src/jsapi-tests/testGCHeapPostBarriers.cpp.1337988 2017-09-14 22:16:02.000000000 +0200
+++ firefox-56.0/js/src/jsapi-tests/testGCHeapPostBarriers.cpp 2017-09-25 10:34:11.206611695 +0200
@@ -5,7 +5,6 @@
* 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/TypeTraits.h"
#include "mozilla/UniquePtr.h"
#include "js/RootingAPI.h"
diff -up firefox-56.0/js/src/vm/SharedMem.h.1337988 firefox-56.0/js/src/vm/SharedMem.h
--- firefox-56.0/js/src/vm/SharedMem.h.1337988 2017-06-15 22:52:29.000000000 +0200
+++ firefox-56.0/js/src/vm/SharedMem.h 2017-09-25 10:34:11.206611695 +0200
@@ -12,8 +12,8 @@
template<typename T>
class SharedMem
{
- // static_assert(mozilla::IsPointer<T>::value,
- // "SharedMem encapsulates pointer types");
+ static_assert(mozilla::IsPointer<T>::value,
+ "SharedMem encapsulates pointer types");
enum Sharedness {
IsUnshared,
diff -up firefox-56.0/js/xpconnect/src/XPCInlines.h.1337988 firefox-56.0/js/xpconnect/src/XPCInlines.h
--- firefox-56.0/js/xpconnect/src/XPCInlines.h.1337988 2017-09-14 22:16:03.000000000 +0200
+++ firefox-56.0/js/xpconnect/src/XPCInlines.h 2017-09-25 10:34:11.206611695 +0200
@@ -465,7 +465,7 @@ inline
void XPCWrappedNativeTearOff::JSObjectMoved(JSObject* obj, const JSObject* old)
{
MOZ_ASSERT(!IsMarked());
- MOZ_ASSERT(mJSObject == old);
+ MOZ_ASSERT(mJSObject.unbarrieredGetPtr() == old);
mJSObject = obj;
}
diff -up firefox-56.0/js/xpconnect/src/XPCWrappedNative.cpp.1337988 firefox-56.0/js/xpconnect/src/XPCWrappedNative.cpp
--- firefox-56.0/js/xpconnect/src/XPCWrappedNative.cpp.1337988 2017-09-14 22:16:03.000000000 +0200
+++ firefox-56.0/js/xpconnect/src/XPCWrappedNative.cpp 2017-09-25 10:34:11.207611692 +0200
@@ -874,7 +874,7 @@ void
XPCWrappedNative::FlatJSObjectMoved(JSObject* obj, const JSObject* old)
{
JS::AutoAssertGCCallback inCallback;
- MOZ_ASSERT(mFlatJSObject == old);
+ MOZ_ASSERT(mFlatJSObject.unbarrieredGetPtr() == old);
nsWrapperCache* cache = nullptr;
CallQueryInterface(mIdentity, &cache);
diff -up firefox-56.0/js/xpconnect/src/XPCWrappedNativeProto.cpp.1337988 firefox-56.0/js/xpconnect/src/XPCWrappedNativeProto.cpp
--- firefox-56.0/js/xpconnect/src/XPCWrappedNativeProto.cpp.1337988 2017-07-31 18:20:47.000000000 +0200
+++ firefox-56.0/js/xpconnect/src/XPCWrappedNativeProto.cpp 2017-09-25 10:34:11.207611692 +0200
@@ -101,7 +101,7 @@ XPCWrappedNativeProto::CallPostCreatePro
void
XPCWrappedNativeProto::JSProtoObjectFinalized(js::FreeOp* fop, JSObject* obj)
{
- MOZ_ASSERT(obj == mJSProtoObject, "huh?");
+ MOZ_ASSERT(obj == mJSProtoObject.unbarrieredGet(), "huh?");
#ifdef DEBUG
// Check that this object has already been swept from the map.
@@ -117,7 +117,7 @@ XPCWrappedNativeProto::JSProtoObjectFina
void
XPCWrappedNativeProto::JSProtoObjectMoved(JSObject* obj, const JSObject* old)
{
- MOZ_ASSERT(mJSProtoObject == old);
+ MOZ_ASSERT(mJSProtoObject.unbarrieredGet() == old);
mJSProtoObject.init(obj); // Update without triggering barriers.
}

View file

@ -0,0 +1,51 @@
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
--- a/widget/gtk/nsWindow.cpp
+++ b/widget/gtk/nsWindow.cpp
@@ -1155,6 +1155,28 @@
}
}
+bool IsPopupWithoutToplevelParent(nsMenuPopupFrame* aMenuPopupFrame) {
+ // Check if the popup is autocomplete (like tags autocomplete
+ // in the bookmark edit popup).
+ nsAtom* popupId = aMenuPopupFrame->GetContent()->GetID();
+ if (popupId && popupId->Equals(NS_LITERAL_STRING("PopupAutoComplete"))) {
+ return true;
+ }
+
+ // Check if the popup is in popupnotificationcontent (like choosing capture
+ // device when starting webrtc session).
+ nsIFrame* parentFrame = aMenuPopupFrame->GetParent();
+ if (!parentFrame) {
+ return false;
+ }
+ parentFrame = parentFrame->GetParent();
+ if (parentFrame && parentFrame->GetContent()->NodeName().EqualsLiteral(
+ "popupnotificationcontent")) {
+ return true;
+ }
+ return false;
+}
+
// Wayland keeps strong popup window hierarchy. We need to track active
// (visible) popup windows and make sure we hide popup on the same level
// before we open another one on that level. It means that every open
@@ -1211,10 +1233,14 @@
LOG(("...[%p] GetParentMenuWidget() = %p\n", (void*)this, parentWindow));
// If the popup is a regular menu but GetParentMenuWidget() returns
- // nullptr which means it's connected non-menu parent
- // (bookmark toolbar for instance).
+ // nullptr which means is not a submenu of any other menu.
// In this case use a parent given at nsWindow::Create().
- if (!parentWindow && !menuPopupFrame->IsContextMenu()) {
+ // But we have to avoid using mToplevelParentWindow in case the popup
+ // is in 'popupnotificationcontent' element or autocomplete popup,
+ // otherwise the popupnotification would disappear when for
+ // example opening a popup with microphone selection.
+ if (!parentWindow && !menuPopupFrame->IsContextMenu() &&
+ !IsPopupWithoutToplevelParent(menuPopupFrame)) {
parentWindow =
get_window_for_gtk_widget(GTK_WIDGET(mToplevelParentWindow));
}

File diff suppressed because one or more lines are too long

12
rhbz-1173156.patch Normal file
View file

@ -0,0 +1,12 @@
diff -up a/extensions/auth/nsAuthSambaNTLM.cpp.old b/extensions/auth/nsAuthSambaNTLM.cpp
--- a/extensions/auth/nsAuthSambaNTLM.cpp.old 2014-11-25 12:23:22.000000000 +0100
+++ b/extensions/auth/nsAuthSambaNTLM.cpp 2014-12-23 15:26:36.606674625 +0100
@@ -161,7 +161,7 @@
const char* username = PR_GetEnv("USER");
if (!username) return NS_ERROR_FAILURE;
- const char* const args[] = {"ntlm_auth",
+ const char* const args[] = {"/usr/bin/ntlm_auth",
"--helper-protocol",
"ntlmssp-client-1",
"--use-cached-creds",

View file

@ -20,24 +20,21 @@ if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
# if not found, launch a new one
eval `dbus-launch --sh-syntax`
fi
eval `echo '' | /usr/bin/gnome-keyring-daemon -r -d --unlock --components=secrets`
if [ -z "$XDG_RUNTIME_DIR" ]; then
export XDG_RUNTIME_DIR=$HOME
fi
export WAYLAND_DISPLAY=icecat-pgo-wayland-0
if [ -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; then
rm -f $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY
rm -f $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY.lock
. xvfb-run -s "-screen 0 1600x1200x24" -n 80 mutter --display=:80 --wayland --nested &
export DISPLAY=:80
if [ -z "$WAYLAND_DISPLAY" ] ; then
export WAYLAND_DISPLAY=wayland-0
else
export WAYLAND_DISPLAY=wayland-1
fi
echo "Launch mutter for $WAYLAND_DISPLAY"
mutter --headless --virtual-monitor 1920x1080 --wayland-display=$WAYLAND_DISPLAY --no-x11 & MUTTER_PID=$!
export MUTTER_PID
echo "Mutter PID $MUTTER_PID"
echo "Waiting for mutter to start..."
sleep 5
sleep 10
retry_count=0
max_retries=5
until [ $retry_count -gt $max_retries ]; do
@ -50,11 +47,4 @@ until [ $retry_count -gt $max_retries ]; do
fi
done
if [ ! -S "$XDG_RUNTIME_DIR/$WAYLAND_DISPLAY" ]; then
echo "Mutter failed to start!"
exit 1
fi
echo "Mutter is running, $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY is here."
env | grep "DISPLAY"

View file

@ -0,0 +1,154 @@
--- thunderbird-102.11.1/third_party/rust/bindgen/.cargo-checksum.json.rust-bindgen-2319-2339 2023-05-24 00:50:52.000000000 +0200
+++ thunderbird-102.11.1/third_party/rust/bindgen/.cargo-checksum.json 2023-06-07 01:11:35.838302019 +0200
@@ -1 +1 @@
-{"files":{"Cargo.lock":"836e8f8431bd4ebdac9b1251676f6afa755757e401455259fe659e7280be8230","Cargo.toml":"3a585a6e27a177f08dedcb21f7d555e9db58fa158203273b228db91ebee4e6b3","LICENSE":"c23953d9deb0a3312dbeaf6c128a657f3591acee45067612fa68405eaa4525db","README.md":"29fe30d7a2729922b13a578bc8f5eedc808fd0f2ef67a3f12017548baf8f293a","build.rs":"3fe1e534c99df4ee207606794f133fb187c0948e055389f74c904994ecaed38a","csmith-fuzzing/README.md":"7107b70fedb0c0a0cadb3c439a49c1bd0119a6d38dc63b1aecc74d1942256ef2","src/callbacks.rs":"1e5a118b94977938751758ac0495b1d41ce5e280c066614a4a7cbd930f326350","src/clang.rs":"aa0644278a8319506be08904c0f6706fbcdcd72eb1e85564b8c7488bd810e126","src/codegen/bitfield_unit.rs":"a8fb1a2d97a99685106fcaac87d2013f79d2690d6a46ff05ad1e3629b6075664","src/codegen/bitfield_unit_tests.rs":"dd252134118450800b516e375c872e17b4c1aee63a7b8adbe5b2cd53434bbc7e","src/codegen/dyngen.rs":"15149bc927e5b2706f93e52a6b26ef55384b3baf40bfc9bc4343e9820479f26b","src/codegen/error.rs":"5e308b8c54b68511fc8ea2ad15ddac510172c4ff460a80a265336440b0c9653d","src/codegen/helpers.rs":"ea83104addb8af31736aaeb850e10c694cd434befe7ffaaa206208f722d72c58","src/codegen/impl_debug.rs":"1ff9ec754b610c98c757b114c6509473ead0e1a9375e9089a7fa40a41a753709","src/codegen/impl_partialeq.rs":"5e526fd88dd15dd1f04addd3c6ecea1d3da92293fadf04346d6c716791f436f9","src/codegen/mod.rs":"19fd11feefab0ff9ecaf8a01583583008269adce805508fb61b9a8acc49da586","src/codegen/struct_layout.rs":"b62c3569dcfb011daa4d09f1aa9eb732da69546c3deb9f247fa8ce7114dbc7b9","src/extra_assertions.rs":"494534bd4f18b80d89b180c8a93733e6617edcf7deac413e9a73fd6e7bc9ced7","src/features.rs":"fafb85510b1dfc9a41ed71f7d765fca49b236deb4ee567e00204e751362aaf23","src/ir/analysis/derive.rs":"ff4821d810961696008a57ae496f95ebcdc14b4c439fe87d78a84817442fa759","src/ir/analysis/has_destructor.rs":"d9a3a24bd4cabc87cddb0c76d27da1691f8f37ffb8eadf5b5975a1c44dea99c2","src/ir/analysis/has_float.rs":"5242cc07ec4d4bdf5a792e1f8ee5758a87838314917d42dbb9dcfc19620520ce","src/ir/analysis/has_type_param_in_array.rs":"ec3fb67f782abb4c866da91bce3f7ee6f8e2310c47a54065282431b909233f7d","src/ir/analysis/has_vtable.rs":"63e2d0f62171811893615c11453bc7b39438d0d83c3eb444dec2346140d86efe","src/ir/analysis/mod.rs":"2c54f0cd6f3d86cf3fcb07d9d0be06cde839cab4170671c80d806a3f27820faf","src/ir/analysis/sizedness.rs":"17f1f2b6affd025f73853b9b5a76b3f157b5f9e563e9eaa374735fcb84c13308","src/ir/analysis/template_params.rs":"da949976a7fd04d6fc564ea6a77dfdbf4f5bf05db64687ed7a0616cba598a42d","src/ir/annotations.rs":"1c931d7bbba1e1613e9cccaab58d14f75e79b831b5c881e41f5b5257a9cbced7","src/ir/comment.rs":"31d64a49ae3d9c3c348fa2539e03306ca3a23fae429cab452e42b31ecf632145","src/ir/comp.rs":"abaa90e27dc6416f1b8db003f87888e7651d5b46c4d4526153980e5621612e54","src/ir/context.rs":"3a76458a5aa74075a60a5cd752ed59ad3943054f55b017700389f78072935215","src/ir/derive.rs":"e5581852eec87918901a129284b4965aefc8a19394187a8095779a084f28fabe","src/ir/dot.rs":"e25ff72ac174a798894c9673d81bdfb86fa9f4228b34a14ce0dc741a186a52bd","src/ir/enum_ty.rs":"e49e3c6ffc0289584e2f836fe56a4b7ebf6ca3f8b602248141d67b9f533770cc","src/ir/function.rs":"aa454ace56bda8074b2865933282aa124624310c8bc0c994d454f5799f4e88be","src/ir/int.rs":"68a86182743ec338d58e42203364dc7c8970cb7ec3550433ca92f0c9489b4442","src/ir/item.rs":"a71bdacc7419ec86d52ac534158cf4bfa4600e9cbc214c0075766700f5b053b0","src/ir/item_kind.rs":"7666a1ff1b8260978b790a08b4139ab56b5c65714a5652bbcec7faa7443adc36","src/ir/layout.rs":"755e3787c262de434a53a8c326f0e825f95415ed6b0f925c1cddf208ca8e3bc4","src/ir/mod.rs":"713cd537434567003197a123cbae679602c715e976d22f7b23dafd0826ea4c70","src/ir/module.rs":"70cf6ddfeabe6cdc13fdc767c783216c073404848d827e85fc6c2de3a19b5c3f","src/ir/objc.rs":"195fb2a3e4371b90244f3a8f295fd80cc77e0f2daf8fd27e3d8e5b78bd6b55d6","src/ir/template.rs":"44bd7214cf1e7f70e60694115082aac5b8a6c1687fff584cd08cdcfadabc5734","src/ir/traversal.rs":"5ac088277f4dfe2918d81b9294aaee41fd83db8e46def66a05f89de078bf4c49","src/ir/ty.rs":"8f2b970da76850685c4d334289af6dede7742862d7a81f2236115afaa1a92fa9","src/ir/var.rs":"86e9f19403fb9231ba60dec0a04e5b56fe28a37c7a5e6f676c978789c9d93c5a","src/lib.rs":"ed2d0aeb48b28b4a96b8e76a10e00b10cb6cc32c0a686d536f9021463b7ee0e8","src/log_stubs.rs":"6dfdd908b7c6453da416cf232893768f9480e551ca4add0858ef88bf71ee6ceb","src/main.rs":"74e582c37b146090332b1496f5b4bca02c7629d03a4ae40302cb4a723f08e445","src/options.rs":"119358b741601dafc13560856f6e4b4f78b6cd2b19067893c2672ba8f5dc6de1","src/parse.rs":"4ffc54415eadb622ee488603862788c78361ef2c889de25259441a340c2a010f","src/regex_set.rs":"6c46357fb1ee68250e5e017cbf691f340041489ae78599eee7a5665a6ddce27f","src/time.rs":"8efe317e7c6b5ba8e0865ce7b49ca775ee8a02590f4241ef62f647fa3c22b68e"},"package":"2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239"}
\ No newline at end of file
+{"files":{"Cargo.lock":"836e8f8431bd4ebdac9b1251676f6afa755757e401455259fe659e7280be8230","Cargo.toml":"3a585a6e27a177f08dedcb21f7d555e9db58fa158203273b228db91ebee4e6b3","LICENSE":"c23953d9deb0a3312dbeaf6c128a657f3591acee45067612fa68405eaa4525db","README.md":"29fe30d7a2729922b13a578bc8f5eedc808fd0f2ef67a3f12017548baf8f293a","build.rs":"3fe1e534c99df4ee207606794f133fb187c0948e055389f74c904994ecaed38a","csmith-fuzzing/README.md":"7107b70fedb0c0a0cadb3c439a49c1bd0119a6d38dc63b1aecc74d1942256ef2","src/callbacks.rs":"1e5a118b94977938751758ac0495b1d41ce5e280c066614a4a7cbd930f326350","src/clang.rs":"30fdc473ff70dcbc394927d6fb674d70a62c1a3847e855becd988dc476997815","src/codegen/bitfield_unit.rs":"a8fb1a2d97a99685106fcaac87d2013f79d2690d6a46ff05ad1e3629b6075664","src/codegen/bitfield_unit_tests.rs":"dd252134118450800b516e375c872e17b4c1aee63a7b8adbe5b2cd53434bbc7e","src/codegen/dyngen.rs":"15149bc927e5b2706f93e52a6b26ef55384b3baf40bfc9bc4343e9820479f26b","src/codegen/error.rs":"5e308b8c54b68511fc8ea2ad15ddac510172c4ff460a80a265336440b0c9653d","src/codegen/helpers.rs":"ea83104addb8af31736aaeb850e10c694cd434befe7ffaaa206208f722d72c58","src/codegen/impl_debug.rs":"1ff9ec754b610c98c757b114c6509473ead0e1a9375e9089a7fa40a41a753709","src/codegen/impl_partialeq.rs":"5e526fd88dd15dd1f04addd3c6ecea1d3da92293fadf04346d6c716791f436f9","src/codegen/mod.rs":"19fd11feefab0ff9ecaf8a01583583008269adce805508fb61b9a8acc49da586","src/codegen/struct_layout.rs":"b62c3569dcfb011daa4d09f1aa9eb732da69546c3deb9f247fa8ce7114dbc7b9","src/extra_assertions.rs":"494534bd4f18b80d89b180c8a93733e6617edcf7deac413e9a73fd6e7bc9ced7","src/features.rs":"fafb85510b1dfc9a41ed71f7d765fca49b236deb4ee567e00204e751362aaf23","src/ir/analysis/derive.rs":"ff4821d810961696008a57ae496f95ebcdc14b4c439fe87d78a84817442fa759","src/ir/analysis/has_destructor.rs":"d9a3a24bd4cabc87cddb0c76d27da1691f8f37ffb8eadf5b5975a1c44dea99c2","src/ir/analysis/has_float.rs":"5242cc07ec4d4bdf5a792e1f8ee5758a87838314917d42dbb9dcfc19620520ce","src/ir/analysis/has_type_param_in_array.rs":"ec3fb67f782abb4c866da91bce3f7ee6f8e2310c47a54065282431b909233f7d","src/ir/analysis/has_vtable.rs":"63e2d0f62171811893615c11453bc7b39438d0d83c3eb444dec2346140d86efe","src/ir/analysis/mod.rs":"2c54f0cd6f3d86cf3fcb07d9d0be06cde839cab4170671c80d806a3f27820faf","src/ir/analysis/sizedness.rs":"17f1f2b6affd025f73853b9b5a76b3f157b5f9e563e9eaa374735fcb84c13308","src/ir/analysis/template_params.rs":"da949976a7fd04d6fc564ea6a77dfdbf4f5bf05db64687ed7a0616cba598a42d","src/ir/annotations.rs":"1c931d7bbba1e1613e9cccaab58d14f75e79b831b5c881e41f5b5257a9cbced7","src/ir/comment.rs":"31d64a49ae3d9c3c348fa2539e03306ca3a23fae429cab452e42b31ecf632145","src/ir/comp.rs":"232300be66abbbc3d7ef948c24f000dd8a50d78e72aa0e4b2cc43ffd4f800226","src/ir/context.rs":"3a76458a5aa74075a60a5cd752ed59ad3943054f55b017700389f78072935215","src/ir/derive.rs":"e5581852eec87918901a129284b4965aefc8a19394187a8095779a084f28fabe","src/ir/dot.rs":"e25ff72ac174a798894c9673d81bdfb86fa9f4228b34a14ce0dc741a186a52bd","src/ir/enum_ty.rs":"e49e3c6ffc0289584e2f836fe56a4b7ebf6ca3f8b602248141d67b9f533770cc","src/ir/function.rs":"aa454ace56bda8074b2865933282aa124624310c8bc0c994d454f5799f4e88be","src/ir/int.rs":"68a86182743ec338d58e42203364dc7c8970cb7ec3550433ca92f0c9489b4442","src/ir/item.rs":"a71bdacc7419ec86d52ac534158cf4bfa4600e9cbc214c0075766700f5b053b0","src/ir/item_kind.rs":"7666a1ff1b8260978b790a08b4139ab56b5c65714a5652bbcec7faa7443adc36","src/ir/layout.rs":"755e3787c262de434a53a8c326f0e825f95415ed6b0f925c1cddf208ca8e3bc4","src/ir/mod.rs":"713cd537434567003197a123cbae679602c715e976d22f7b23dafd0826ea4c70","src/ir/module.rs":"70cf6ddfeabe6cdc13fdc767c783216c073404848d827e85fc6c2de3a19b5c3f","src/ir/objc.rs":"195fb2a3e4371b90244f3a8f295fd80cc77e0f2daf8fd27e3d8e5b78bd6b55d6","src/ir/template.rs":"44bd7214cf1e7f70e60694115082aac5b8a6c1687fff584cd08cdcfadabc5734","src/ir/traversal.rs":"5ac088277f4dfe2918d81b9294aaee41fd83db8e46def66a05f89de078bf4c49","src/ir/ty.rs":"8d7e7883316245c54e5dfa2fd150df1be2dc559c7df0828da736dd6b18d2165b","src/ir/var.rs":"1e7be8eedba72effa995b48c581504e61e407867d8794a8528975688742b0420","src/lib.rs":"ed2d0aeb48b28b4a96b8e76a10e00b10cb6cc32c0a686d536f9021463b7ee0e8","src/log_stubs.rs":"6dfdd908b7c6453da416cf232893768f9480e551ca4add0858ef88bf71ee6ceb","src/main.rs":"74e582c37b146090332b1496f5b4bca02c7629d03a4ae40302cb4a723f08e445","src/options.rs":"119358b741601dafc13560856f6e4b4f78b6cd2b19067893c2672ba8f5dc6de1","src/parse.rs":"4ffc54415eadb622ee488603862788c78361ef2c889de25259441a340c2a010f","src/regex_set.rs":"6c46357fb1ee68250e5e017cbf691f340041489ae78599eee7a5665a6ddce27f","src/time.rs":"8efe317e7c6b5ba8e0865ce7b49ca775ee8a02590f4241ef62f647fa3c22b68e"},"package":"2da379dbebc0b76ef63ca68d8fc6e71c0f13e59432e0987e508c1820e6ab5239"}
\ No newline at end of file
--- thunderbird-102.11.1/third_party/rust/bindgen/src/clang.rs.rust-bindgen-2319-2339 2023-05-24 00:50:51.000000000 +0200
+++ thunderbird-102.11.1/third_party/rust/bindgen/src/clang.rs 2023-06-07 00:59:18.845709213 +0200
@@ -54,6 +54,11 @@ impl Cursor {
unsafe { clang_isDeclaration(self.kind()) != 0 }
}
+ /// Is this cursor's referent an anonymous record or so?
+ pub fn is_anonymous(&self) -> bool {
+ unsafe { clang_Cursor_isAnonymous(self.x) != 0 }
+ }
+
/// Get this cursor's referent's spelling.
pub fn spelling(&self) -> String {
unsafe { cxstring_into_string(clang_getCursorSpelling(self.x)) }
--- thunderbird-102.11.1/third_party/rust/bindgen/src/ir/comp.rs.rust-bindgen-2319-2339 2023-05-24 00:50:52.000000000 +0200
+++ thunderbird-102.11.1/third_party/rust/bindgen/src/ir/comp.rs 2023-06-07 00:59:18.846709211 +0200
@@ -1372,8 +1372,7 @@ impl CompInfo {
// A declaration of an union or a struct without name could
// also be an unnamed field, unfortunately.
- if cur.spelling().is_empty() &&
- cur.kind() != CXCursor_EnumDecl
+ if cur.is_anonymous() && cur.kind() != CXCursor_EnumDecl
{
let ty = cur.cur_type();
let offset = cur.offset_of_field().ok();
--- thunderbird-102.11.1/third_party/rust/bindgen/src/ir/ty.rs.rust-bindgen-2319-2339 2023-05-24 00:50:52.000000000 +0200
+++ thunderbird-102.11.1/third_party/rust/bindgen/src/ir/ty.rs 2023-06-07 00:59:18.847709209 +0200
@@ -737,7 +737,12 @@ impl Type {
let layout = ty.fallible_layout(ctx).ok();
let cursor = ty.declaration();
- let mut name = cursor.spelling();
+ let is_anonymous = cursor.is_anonymous();
+ let mut name = if is_anonymous {
+ None
+ } else {
+ Some(cursor.spelling()).filter(|n| !n.is_empty())
+ };
debug!(
"from_clang_ty: {:?}, ty: {:?}, loc: {:?}",
@@ -771,7 +776,7 @@ impl Type {
if is_canonical_objcpointer && is_template_type_param {
// Objective-C generics are just ids with fancy name.
// To keep it simple, just name them ids
- name = "id".to_owned();
+ name = Some("id".to_owned());
}
}
@@ -900,7 +905,7 @@ impl Type {
return Err(ParseError::Recurse);
}
} else {
- name = location.spelling();
+ name = Some(location.spelling());
}
let complex = CompInfo::from_ty(
@@ -942,7 +947,7 @@ impl Type {
CXType_Typedef
);
- name = current.spelling();
+ name = Some(location.spelling());
let inner_ty = cur
.typedef_type()
@@ -1126,10 +1131,10 @@ impl Type {
CXType_Enum => {
let enum_ = Enum::from_ty(ty, ctx).expect("Not an enum?");
- if name.is_empty() {
+ if !is_anonymous {
let pretty_name = ty.spelling();
if clang::is_valid_identifier(&pretty_name) {
- name = pretty_name;
+ name = Some(pretty_name);
}
}
@@ -1144,12 +1149,12 @@ impl Type {
)
.expect("Not a complex type?");
- if name.is_empty() {
+ if !is_anonymous {
// The pretty-printed name may contain typedefed name,
// but may also be "struct (anonymous at .h:1)"
let pretty_name = ty.spelling();
if clang::is_valid_identifier(&pretty_name) {
- name = pretty_name;
+ name = Some(pretty_name);
}
}
@@ -1189,7 +1194,9 @@ impl Type {
CXType_ObjCClass | CXType_ObjCInterface => {
let interface = ObjCInterface::from_ty(&location, ctx)
.expect("Not a valid objc interface?");
- name = interface.rust_name();
+ if !is_anonymous {
+ name = Some(interface.rust_name());
+ }
TypeKind::ObjCInterface(interface)
}
CXType_Dependent => {
@@ -1207,7 +1214,7 @@ impl Type {
}
};
- let name = if name.is_empty() { None } else { Some(name) };
+ name = name.filter(|n| !n.is_empty());
let is_const = ty.is_const() ||
(ty.kind() == CXType_ConstantArray &&
--- thunderbird-102.11.1/third_party/rust/bindgen/src/ir/ty.rs.rust-bindgen-2319-2339
+++ thunderbird-102.11.1/third_party/rust/bindgen/src/ir/ty.rs
@@ -1145,8 +1145,7 @@ impl Type {
location,
None,
ctx,
- )
- .expect("Not able to resolve vector element?");
+ )?;
TypeKind::Vector(inner, ty.num_elements().unwrap())
}
CXType_ConstantArray => {
--- thunderbird-102.11.1/third_party/rust/bindgen/src/ir/var.rs.rust-bindgen-2319-2339
+++ thunderbird-102.11.1/third_party/rust/bindgen/src/ir/var.rs
@@ -293,11 +293,11 @@ impl ClangSubItemParser for Var {
let ty = match Item::from_ty(&ty, cursor, None, ctx) {
Ok(ty) => ty,
Err(e) => {
- assert_eq!(
- ty.kind(),
- CXType_Auto,
+ assert!(
+ matches!(ty.kind(), CXType_Auto | CXType_Unexposed),
"Couldn't resolve constant type, and it \
- wasn't an nondeductible auto type!"
+ wasn't an nondeductible auto type or unexposed \
+ type!"
);
return Err(e);
}

View file

@ -1,5 +1,5 @@
SHA512 (cbindgen-vendor.tar.xz) = 647dcadf3507bd05262613d03ff18a8c876bcbb4e83ce59f911128ae020ac16695298987c6c14f8b7a7aee5bb096740c6885c0a854d8b26431fc9a8ff864c369
SHA512 (icecat-140.7.0-langpacks.tar.gz) = a4618e3272b48be4307c79222bdd55f321aefb6d6ba08beb10178d0b95530bc4130cf86901d0906e714bd75106ad8513957fe3ad335431c8faf5b2d9767e17de
SHA512 (icecat-140.7.0-rh1.tar.bz2) = 7a19f7928322bea905828e6a4e981395687f1b649e37518a8000bcfcb29446b424ee592f708d0c7c93ebeb901820752785f883a937e9361e9f172a0a9bacb603
SHA512 (cbindgen-vendor.tar.xz) = 6d354d65674395b8171f262ae9aa08f656fdd83b6d29d70bd1ad2f13c4a52db81df780cfdf6ac86e9d1f16426c9ab3cdc0160f0785a0909ad7525fd8a9bc3b25
SHA512 (icecat-128.13.0-langpacks.tar.gz) = b0d4ac1f6014f23d587e9168689b292c29139794bf5c9f24ef0ab296add4d3198403eddfd7c8c67ae493ce533e1294b3e74e977e418a3455510f6219e2391d87
SHA512 (icecat-128.13.0-rh1.tar.bz2) = f16c8a329db890be32f8024a5852667500d8a2a8a8cedcbbb9e473c7a65f8ef90002210388ccb84716463d10e5f56048abdf27fb479d669b489be502cf4cadcf
SHA512 (icecat-COPYING-licensefiles.tar.gz) = ed541845170f1d209e322b0def3248d571e0c42c4a17c74e83197e743bd8a128a1475f5312d905c8e70d047eddeac17e604373892eb6d5f1720c5c361849c42c
SHA512 (icecat.png) = a3cec16cb15a27c3c91b53e2c534e78b07911011ff1331e450c0baf8e13b76da7cea2a90e5d75191fa88cfbfd40a0a7f3e553e92b64d0043dadd5ad5edfdf81c