diff --git a/firefox-52-rhbz-1451055.patch b/firefox-52-rhbz-1451055.patch deleted file mode 100644 index 49a92a5..0000000 --- a/firefox-52-rhbz-1451055.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- firefox-52.1.0esr/layout/style/nsCSSPseudoElements.h.old 2017-04-11 04:13:10.000000000 +0200 -+++ firefox-52.1.0esr/layout/style/nsCSSPseudoElements.h 2017-05-15 23:27:57.470258443 +0200 -@@ -109,7 +109,8 @@ - - // Work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64037 , - // which is a general gcc bug that we seem to have hit only on Android/x86. --#if defined(ANDROID) && defined(__i386__) && defined(__GNUC__) && \ -+ // ...and CentOS 6/x86 -+#if defined(__i386__) && defined(__GNUC__) && \ - !defined(__clang__) - #if (MOZ_GCC_VERSION_AT_LEAST(4,8,0) && MOZ_GCC_VERSION_AT_MOST(4,8,4)) || \ - (MOZ_GCC_VERSION_AT_LEAST(4,9,0) && MOZ_GCC_VERSION_AT_MOST(4,9,2)) diff --git a/seamonkey-2.53.10-allsettled.patch b/seamonkey-2.53.10-allsettled.patch deleted file mode 100644 index 4c18bc6..0000000 --- a/seamonkey-2.53.10-allsettled.patch +++ /dev/null @@ -1,380 +0,0 @@ -From bcbe59d4d99068bcb72f8dc7741b289684464473 Mon Sep 17 00:00:00 2001 -From: Moonchild -Date: Tue, 13 Jul 2021 20:09:21 +0000 -Subject: [PATCH] Bug 1539694 - Implement Promise.allSettled() - -Co-authored-by: athenian200 <19531193+athenian200@users.noreply.github.com> ---- - js/src/builtin/Promise.cpp | 319 ++++++++++++++++++++++++++++++++ - js/src/vm/CommonPropertyNames.h | 1 + - 2 files changed, 320 insertions(+) - -diff --git a/js/src/builtin/Promise.cpp b/js/src/builtin/Promise.cpp -index 0e5d5950e012..02c1f2e8787d 100644 ---- a/js/src/builtin/Promise.cpp -+++ b/js/src/builtin/Promise.cpp -@@ -1583,12 +1583,63 @@ Promise_static_all(JSContext* cx, unsigned argc, Value* vp) - return true; - } - -+static MOZ_MUST_USE bool PerformPromiseAllSettled(JSContext *cx, JS::ForOfIterator& iterator, -+ HandleObject C, HandleObject promiseObj, -+ HandleObject resolve, HandleObject reject, -+ bool* done); -+ -+// ES2020 -+static bool -+Promise_static_allSettled(JSContext* cx, unsigned argc, Value* vp) -+{ -+ CallArgs args = CallArgsFromVp(argc, vp); -+ RootedValue iterable(cx, args.get(0)); -+ RootedValue CVal(cx, args.thisv()); -+ if (!CVal.isObject()) { -+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_NOT_NONNULL_OBJECT, -+ "Receiver of Promise.allSettled call"); -+ return false; -+ } -+ -+ RootedObject C(cx, &CVal.toObject()); -+ RootedObject resultPromise(cx); -+ RootedObject resolve(cx); -+ RootedObject reject(cx); -+ if (!NewPromiseCapability(cx, C, &resultPromise, &resolve, &reject, false)) -+ return false; -+ -+ JS::ForOfIterator iter(cx); -+ if (!iter.init(iterable, JS::ForOfIterator::AllowNonIterable)) -+ return AbruptRejectPromise(cx, args, resultPromise, reject); -+ -+ if (!iter.valueIsIterable()) { -+ JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_NOT_ITERABLE, -+ "Argument of Promise.allSettled"); -+ return AbruptRejectPromise(cx, args, resultPromise, reject); -+ } -+ -+ bool done; -+ bool result = PerformPromiseAllSettled(cx, iter, C, resultPromise, resolve, reject, &done); -+ -+ if (!result) { -+ if (!done) -+ iter.closeThrow(); -+ -+ return AbruptRejectPromise(cx, args, resultPromise, reject); -+ } -+ -+ args.rval().setObject(*resultPromise); -+ return true; -+} -+ - static MOZ_MUST_USE bool PerformPromiseThen(JSContext* cx, Handle promise, - HandleValue onFulfilled_, HandleValue onRejected_, - HandleObject resultPromise, - HandleObject resolve, HandleObject reject); - - static bool PromiseAllResolveElementFunction(JSContext* cx, unsigned argc, Value* vp); -+static bool PromiseAllSettledResolveElementFunction(JSContext* cx, unsigned argc, Value* vp); -+static bool PromiseAllSettledRejectElementFunction(JSContext* cx, unsigned argc, Value* vp); - - // Unforgeable version of ES2016, 25.4.4.1. - MOZ_MUST_USE JSObject* -@@ -1905,6 +1956,120 @@ PerformPromiseAll(JSContext *cx, JS::ForOfIterator& iterator, HandleObject C, - } - } - -+static MOZ_MUST_USE bool -+PerformPromiseAllSettled(JSContext *cx, JS::ForOfIterator& iterator, HandleObject C, -+ HandleObject promiseObj, HandleObject resolve, HandleObject reject, -+ bool* done) -+{ -+ *done = false; -+ -+ RootedObject unwrappedPromiseObj(cx); -+ if (IsWrapper(promiseObj)) { -+ unwrappedPromiseObj = CheckedUnwrap(promiseObj); -+ MOZ_ASSERT(unwrappedPromiseObj); -+ } -+ -+ RootedValue CVal(cx, ObjectValue(*C)); -+ -+ RootedObject valuesArray(cx); -+ if (unwrappedPromiseObj) { -+ JSAutoCompartment ac(cx, unwrappedPromiseObj); -+ valuesArray = NewDenseFullyAllocatedArray(cx, 0); -+ } else { -+ valuesArray = NewDenseFullyAllocatedArray(cx, 0); -+ } -+ if (!valuesArray) -+ return false; -+ -+ RootedValue valuesArrayVal(cx, ObjectValue(*valuesArray)); -+ if (!cx->compartment()->wrap(cx, &valuesArrayVal)) -+ return false; -+ -+ Rooted dataHolder(cx, NewPromiseAllDataHolder(cx, promiseObj, -+ valuesArrayVal, resolve)); -+ if (!dataHolder) -+ return false; -+ RootedValue dataHolderVal(cx, ObjectValue(*dataHolder)); -+ -+ uint32_t index = 0; -+ -+ RootedValue nextValue(cx); -+ RootedId indexId(cx); -+ -+ while (true) { -+ if (!iterator.next(&nextValue, done)) { -+ *done = true; -+ return false; -+ } -+ -+ if (*done) { -+ int32_t remainingCount = dataHolder->decreaseRemainingCount(); -+ if (remainingCount == 0) { -+ return RunResolutionFunction(cx, resolve, valuesArrayVal, ResolveMode, -+ promiseObj); -+ } -+ return true; -+ } -+ -+ { // Scoped for AutoCompartment -+ JSAutoCompartment ac(cx, valuesArray); -+ indexId = INT_TO_JSID(index); -+ if (!DefineProperty(cx, valuesArray, indexId, UndefinedHandleValue)) -+ return false; -+ } -+ -+ RootedValue nextPromise(cx); -+ RootedValue staticResolve(cx); -+ RootedValue staticReject(cx); -+ -+ // Because Promise.allSettled can continue whether the promise is fulfilled or rejected, we -+ // should only return false if neither condition is true. -+ -+ if (!GetProperty(cx, CVal, cx->names().resolve, &staticResolve) && -+ !GetProperty(cx, CVal, cx->names().reject, &staticReject)) -+ return false; -+ -+ FixedInvokeArgs<1> resolveArgs(cx); -+ resolveArgs[0].set(nextValue); -+ FixedInvokeArgs<1> rejectArgs(cx); -+ rejectArgs[0].set(nextValue); -+ if (!Call(cx, staticResolve, CVal, resolveArgs, &nextPromise) && -+ !Call(cx, staticReject, CVal, rejectArgs, &nextPromise)) -+ return false; -+ -+ -+ RootedFunction resolveFunc(cx, NewNativeFunction(cx, PromiseAllSettledResolveElementFunction, -+ 1, nullptr, -+ gc::AllocKind::FUNCTION_EXTENDED, -+ GenericObject)); -+ -+ RootedFunction rejectFunc(cx, NewNativeFunction(cx, PromiseAllSettledRejectElementFunction, -+ 1, nullptr, -+ gc::AllocKind::FUNCTION_EXTENDED, -+ GenericObject)); -+ if (!resolveFunc && !rejectFunc) { -+ return false; -+ } -+ -+ resolveFunc->setExtendedSlot(PromiseAllResolveElementFunctionSlot_Data, dataHolderVal); -+ resolveFunc->setExtendedSlot(PromiseAllResolveElementFunctionSlot_ElementIndex, -+ Int32Value(index)); -+ rejectFunc->setExtendedSlot(PromiseAllResolveElementFunctionSlot_Data, dataHolderVal); -+ rejectFunc->setExtendedSlot(PromiseAllResolveElementFunctionSlot_ElementIndex, -+ Int32Value(index)); -+ -+ dataHolder->increaseRemainingCount(); -+ -+ RootedValue resolveFunVal(cx, ObjectValue(*resolveFunc)); -+ RootedValue rejectFunVal(cx, ObjectValue(*rejectFunc)); -+ if (!BlockOnPromise(cx, nextPromise, promiseObj, resolveFunVal, rejectFunVal)) -+ return false; -+ -+ index++; -+ MOZ_ASSERT(index > 0); -+ } -+} -+ - // ES2016, 25.4.4.1.2. - static bool - PromiseAllResolveElementFunction(JSContext* cx, unsigned argc, Value* vp) -@@ -1978,6 +2143,159 @@ PromiseAllResolveElementFunction(JSContext* cx, unsigned argc, Value* vp) - return true; - } - -+// ES2020. -+static bool -+PromiseAllSettledResolveElementFunction(JSContext* cx, unsigned argc, Value* vp) -+{ -+ CallArgs args = CallArgsFromVp(argc, vp); -+ -+ RootedFunction resolve(cx, &args.callee().as()); -+ RootedValue xVal(cx, args.get(0)); -+ RootedValue dataVal(cx, resolve->getExtendedSlot(PromiseAllResolveElementFunctionSlot_Data)); -+ -+ if (dataVal.isUndefined()) { -+ args.rval().setUndefined(); -+ return true; -+ } -+ -+ Rooted data(cx, &dataVal.toObject().as()); -+ -+ resolve->setExtendedSlot(PromiseAllResolveElementFunctionSlot_Data, UndefinedValue()); -+ -+ int32_t index = resolve->getExtendedSlot(PromiseAllResolveElementFunctionSlot_ElementIndex) -+ .toInt32(); -+ -+ RootedValue valuesVal(cx, data->valuesArray()); -+ RootedObject valuesObj(cx, &valuesVal.toObject()); -+ bool valuesListIsWrapped = false; -+ if (IsWrapper(valuesObj)) { -+ valuesListIsWrapped = true; -+ // See comment for PerformPromiseAll, step 3 for why we unwrap here. -+ valuesObj = UncheckedUnwrap(valuesObj); -+ } -+ NativeObject* values = &valuesObj->as(); -+ -+ // The index is guaranteed to be initialized to `undefined`. -+ if (valuesListIsWrapped) { -+ AutoCompartment ac(cx, values); -+ if (!cx->compartment()->wrap(cx, &xVal)) -+ return false; -+ } -+ -+ RootedPlainObject obj(cx, NewBuiltinClassInstance(cx)); -+ if (!obj) { -+ return false; -+ } -+ RootedId id(cx, NameToId(cx->names().status)); -+ RootedValue statusValue(cx); -+ statusValue.setString(cx->names().fulfilled); -+ if (!::JS_DefinePropertyById(cx, obj, id, statusValue, JSPROP_ENUMERATE)) { -+ return false; -+ } -+ id = NameToId(cx->names().value); -+ if (!::JS_DefinePropertyById(cx, obj, id, xVal, JSPROP_ENUMERATE)) { -+ return false; -+ } -+ -+ RootedValue objVal(cx, ObjectValue(*obj)); -+/* if (needsWrapping) { -+ AutoRealm ar(cx, valuesObj); -+ if (!cx->compartment()->wrap(cx, &objVal)) { -+ return false; -+ } -+ } */ -+ values->setDenseElement(index, objVal); -+ -+ uint32_t remainingCount = data->decreaseRemainingCount(); -+ -+ if (remainingCount == 0) { -+ RootedObject resolveAllFun(cx, data->resolveObj()); -+ RootedObject promiseObj(cx, data->promiseObj()); -+ if (!RunResolutionFunction(cx, resolveAllFun, valuesVal, ResolveMode, promiseObj)) -+ return false; -+ } -+ -+ args.rval().setUndefined(); -+ return true; -+} -+ -+static bool -+PromiseAllSettledRejectElementFunction(JSContext* cx, unsigned argc, Value* vp) -+{ -+ CallArgs args = CallArgsFromVp(argc, vp); -+ -+ RootedFunction resolve(cx, &args.callee().as()); -+ RootedValue xVal(cx, args.get(0)); -+ RootedValue dataVal(cx, resolve->getExtendedSlot(PromiseAllResolveElementFunctionSlot_Data)); -+ -+ if (dataVal.isUndefined()) { -+ args.rval().setUndefined(); -+ return true; -+ } -+ -+ Rooted data(cx, &dataVal.toObject().as()); -+ -+ resolve->setExtendedSlot(PromiseAllResolveElementFunctionSlot_Data, UndefinedValue()); -+ -+ int32_t index = resolve->getExtendedSlot(PromiseAllResolveElementFunctionSlot_ElementIndex) -+ .toInt32(); -+ -+ RootedValue valuesVal(cx, data->valuesArray()); -+ RootedObject valuesObj(cx, &valuesVal.toObject()); -+ bool valuesListIsWrapped = false; -+ if (IsWrapper(valuesObj)) { -+ valuesListIsWrapped = true; -+ // See comment for PerformPromiseAll, step 3 for why we unwrap here. -+ valuesObj = UncheckedUnwrap(valuesObj); -+ } -+ NativeObject* values = &valuesObj->as(); -+ -+ // The index is guaranteed to be initialized to `undefined`. -+ if (valuesListIsWrapped) { -+ AutoCompartment ac(cx, values); -+ if (!cx->compartment()->wrap(cx, &xVal)) -+ return false; -+ } -+ -+ RootedPlainObject obj(cx, NewBuiltinClassInstance(cx)); -+ if (!obj) { -+ return false; -+ } -+ RootedId id(cx, NameToId(cx->names().status)); -+ RootedValue statusValue(cx); -+ statusValue.setString(cx->names().rejected); -+ if (!::JS_DefinePropertyById(cx, obj, id, statusValue, JSPROP_ENUMERATE)) { -+ return false; -+ } -+ RootedValue resultValue(cx); -+ id = NameToId(cx->names().reason); -+ if (!::JS_DefinePropertyById(cx, obj, id, xVal, JSPROP_ENUMERATE)) { -+ return false; -+ } -+ -+ RootedValue objVal(cx, ObjectValue(*obj)); -+/* if (needsWrapping) { -+ AutoRealm ar(cx, valuesObj); -+ if (!cx->compartment()->wrap(cx, &objVal)) { -+ return false; -+ } -+ } */ -+ values->setDenseElement(index, objVal); -+ -+ -+ uint32_t remainingCount = data->decreaseRemainingCount(); -+ -+ if (remainingCount == 0) { -+ RootedObject resolveAllFun(cx, data->resolveObj()); -+ RootedObject promiseObj(cx, data->promiseObj()); -+ if (!RunResolutionFunction(cx, resolveAllFun, valuesVal, ResolveMode, promiseObj)) -+ return false; -+ } -+ -+ args.rval().setUndefined(); -+ return true; -+} -+ - static MOZ_MUST_USE bool PerformPromiseRace(JSContext *cx, JS::ForOfIterator& iterator, - HandleObject C, HandleObject promiseObj, - HandleObject resolve, HandleObject reject, -@@ -3326,6 +3644,7 @@ static const JSPropertySpec promise_properties[] = { - - static const JSFunctionSpec promise_static_methods[] = { - JS_FN("all", Promise_static_all, 1, 0), -+ JS_FN("allSettled", Promise_static_allSettled, 1, 0), - JS_FN("race", Promise_static_race, 1, 0), - JS_FN("reject", Promise_reject, 1, 0), - JS_FN("resolve", Promise_static_resolve, 1, 0), -diff --git a/js/src/vm/CommonPropertyNames.h b/js/src/vm/CommonPropertyNames.h -index c43d3a478b1c..a16526dc5f32 100644 ---- a/js/src/vm/CommonPropertyNames.h -+++ b/js/src/vm/CommonPropertyNames.h -@@ -378,6 +378,7 @@ - macro(startTimestamp, startTimestamp, "startTimestamp") \ - macro(state, state, "state") \ - macro(static, static_, "static") \ -+ macro(status, status, "status") \ - macro(std_Function_apply, std_Function_apply, "std_Function_apply") \ - macro(sticky, sticky, "sticky") \ - macro(StringIterator, StringIterator, "String Iterator") \ diff --git a/seamonkey-2.53.10-mozilla-1466909.patch b/seamonkey-2.53.10-mozilla-1466909.patch deleted file mode 100644 index c8cf5dd..0000000 --- a/seamonkey-2.53.10-mozilla-1466909.patch +++ /dev/null @@ -1,123 +0,0 @@ - -# HG changeset patch -# User André Bargull -# Date 1528381642 25200 -# Node ID 17b140524c6ee9e1263175212dec5231bfe3059f -# Parent 7b4cd53cbfb8dbc6207d34e549516b84ffe3601c -Bug 1466909 - Use AddLvalueReference for UniquePtr's operator*(). r=froydnj - -diff --git a/mfbt/UniquePtr.h b/mfbt/UniquePtr.h ---- a/mfbt/UniquePtr.h -+++ b/mfbt/UniquePtr.h -@@ -309,17 +309,17 @@ public: - } - - UniquePtr& operator=(decltype(nullptr)) - { - reset(nullptr); - return *this; - } - -- T& operator*() const { return *get(); } -+ typename AddLvalueReference::Type operator*() const { return *get(); } - Pointer operator->() const - { - MOZ_ASSERT(get(), "dereferencing a UniquePtr containing nullptr"); - return get(); - } - - explicit operator bool() const { return get() != nullptr; } - -diff --git a/mfbt/tests/TestUniquePtr.cpp b/mfbt/tests/TestUniquePtr.cpp ---- a/mfbt/tests/TestUniquePtr.cpp -+++ b/mfbt/tests/TestUniquePtr.cpp -@@ -4,25 +4,27 @@ - * 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/Assertions.h" - #include "mozilla/Compiler.h" - #include "mozilla/Move.h" - #include "mozilla/TypeTraits.h" - #include "mozilla/UniquePtr.h" -+#include "mozilla/UniquePtrExtensions.h" - #include "mozilla/Vector.h" - - #include - - using mozilla::DefaultDelete; - using mozilla::IsSame; - using mozilla::MakeUnique; - using mozilla::Swap; - using mozilla::UniquePtr; -+using mozilla::UniqueFreePtr; - using mozilla::Vector; - - #define CHECK(c) \ - do { \ - bool cond = !!(c); \ - MOZ_ASSERT(cond, "Failed assertion: " #c); \ - if (!cond) { \ - return false; \ -@@ -557,16 +559,46 @@ TestMakeUnique() - // various type mismatching to test "fuzzy" forwarding - UniquePtr q4(MakeUnique('s', 66LL, 3.141592654, &q3)); - - UniquePtr c1(MakeUnique(5)); - - return true; - } - -+static bool -+TestVoid() -+{ -+ // UniquePtr supports all operations except operator*() and -+ // operator->(). -+ UniqueFreePtr p1(malloc(1)); -+ UniqueFreePtr p2; -+ -+ auto x = p1.get(); -+ CHECK(x != nullptr); -+ CHECK((IsSame::value)); -+ -+ p2.reset(p1.release()); -+ CHECK(p1.get() == nullptr); -+ CHECK(p2.get() != nullptr); -+ -+ p1 = std::move(p2); -+ CHECK(p1); -+ CHECK(!p2); -+ -+ p1.swap(p2); -+ CHECK(!p1); -+ CHECK(p2); -+ -+ p2 = nullptr; -+ CHECK(!p2); -+ -+ return true; -+} -+ - int - main() - { - TestDeleterType(); - - if (!TestDefaultFree()) { - return 1; - } -@@ -583,10 +615,13 @@ main() - return 1; - } - if (!TestArray()) { - return 1; - } - if (!TestMakeUnique()) { - return 1; - } -+ if (!TestVoid()) { -+ return 1; -+ } - return 0; - } - diff --git a/seamonkey-2.53.10-optchain-1466000-1.patch b/seamonkey-2.53.10-optchain-1466000-1.patch deleted file mode 100644 index 34216be..0000000 --- a/seamonkey-2.53.10-optchain-1466000-1.patch +++ /dev/null @@ -1,135 +0,0 @@ -# -# Manual backport of bug 1466000 part 1, needed for following optchain backporting -# - -diff -Nrup mozilla-OLD/js/src/frontend/BytecodeEmitter.cpp mozilla/js/src/frontend/BytecodeEmitter.cpp ---- mozilla-OLD/js/src/frontend/BytecodeEmitter.cpp 2022-01-10 07:17:48.764326660 +0300 -+++ mozilla/js/src/frontend/BytecodeEmitter.cpp 2022-01-10 07:18:25.683065770 +0300 -@@ -9491,20 +9491,21 @@ BytecodeEmitter::isRestParameter(ParseNo - } - - bool --BytecodeEmitter::emitCallee(ParseNode* callee, ParseNode* call, bool spread, bool* callop) -+BytecodeEmitter::emitCalleeAndThis(ParseNode* callee, ParseNode* call, bool isCall, bool isNew) - { -+ bool needsThis = !isCall; - switch (callee->getKind()) { - case ParseNodeKind::Name: -- if (!emitGetName(callee, *callop)) -+ if (!emitGetName(callee, isCall)) - return false; - break; - case ParseNodeKind::Dot: - MOZ_ASSERT(emitterMode != BytecodeEmitter::SelfHosting); - if (callee->as().isSuper()) { -- if (!emitSuperPropOp(callee, JSOP_GETPROP_SUPER, /* isCall = */ *callop)) -+ if (!emitSuperPropOp(callee, JSOP_GETPROP_SUPER, isCall)) - return false; - } else { -- if (!emitPropOp(callee, *callop ? JSOP_CALLPROP : JSOP_GETPROP)) -+ if (!emitPropOp(callee, isCall ? JSOP_CALLPROP : JSOP_GETPROP)) - return false; - } - -@@ -9512,12 +9513,12 @@ BytecodeEmitter::emitCallee(ParseNode* c - case ParseNodeKind::Elem: - MOZ_ASSERT(emitterMode != BytecodeEmitter::SelfHosting); - if (callee->as().isSuper()) { -- if (!emitSuperElemOp(callee, JSOP_GETELEM_SUPER, /* isCall = */ *callop)) -+ if (!emitSuperElemOp(callee, JSOP_GETELEM_SUPER, isCall)) - return false; - } else { -- if (!emitElemOp(callee, *callop ? JSOP_CALLELEM : JSOP_GETELEM)) -+ if (!emitElemOp(callee, isCall ? JSOP_CALLELEM : JSOP_GETELEM)) - return false; -- if (*callop) { -+ if (isCall) { - if (!emit1(JSOP_SWAP)) - return false; - } -@@ -9545,7 +9546,7 @@ BytecodeEmitter::emitCallee(ParseNode* c - if (!emitTree(callee)) - return false; - } -- *callop = false; -+ needsThis = true; - break; - case ParseNodeKind::SuperBase: - MOZ_ASSERT(call->isKind(ParseNodeKind::SuperCall)); -@@ -9556,10 +9557,22 @@ BytecodeEmitter::emitCallee(ParseNode* c - default: - if (!emitTree(callee)) - return false; -- *callop = false; /* trigger JSOP_UNDEFINED after */ -+ needsThis = true; - break; - } - -+ if (needsThis) { -+ if (isNew) { -+ if (!emit1(JSOP_IS_CONSTRUCTING)) { -+ return false; -+ } -+ } else { -+ if (!emit1(JSOP_UNDEFINED)) { -+ return false; -+ } -+ } -+ } -+ - return true; - } - -@@ -9575,14 +9588,8 @@ BytecodeEmitter::emitPipeline(ParseNode* - ParseNode* callee = pn->pn_head->pn_next; - - do { -- bool callop = true; -- if (!emitCallee(callee, pn, false, &callop)) -+ if (!emitCalleeAndThis(callee, pn, true, false)) { - return false; -- -- // Emit room for |this| -- if (!callop) { -- if (!emit1(JSOP_UNDEFINED)) -- return false; - } - - if (!emit2(JSOP_PICK, 2)) -@@ -9707,21 +9714,11 @@ BytecodeEmitter::emitCallOrNew(ParseNode - // Fall through - } - -- if (!emitCallee(pn_callee, pn, false, &callop)) -- return false; -- - bool isNewOp = pn->getOp() == JSOP_NEW || pn->getOp() == JSOP_SPREADNEW || - pn->getOp() == JSOP_SUPERCALL || pn->getOp() == JSOP_SPREADSUPERCALL; - -- // Emit room for |this|. -- if (!callop) { -- if (isNewOp) { -- if (!emit1(JSOP_IS_CONSTRUCTING)) -- return false; -- } else { -- if (!emit1(JSOP_UNDEFINED)) -- return false; -- } -+ if (!emitCalleeAndThis(pn_callee, pn, callop, isNewOp)) { -+ return false; - } - - if (!emitArguments(pn_args, callop, spread)) -diff -Nrup mozilla-OLD/js/src/frontend/BytecodeEmitter.h mozilla/js/src/frontend/BytecodeEmitter.h ---- mozilla-OLD/js/src/frontend/BytecodeEmitter.h 2022-01-10 07:17:48.765326652 +0300 -+++ mozilla/js/src/frontend/BytecodeEmitter.h 2022-01-10 07:18:25.684065763 +0300 -@@ -868,7 +868,8 @@ struct MOZ_STACK_CLASS BytecodeEmitter - EmitElemOption opts = EmitElemOption::Get); - MOZ_MUST_USE bool emitSuperElemOp(ParseNode* pn, JSOp op, bool isCall = false); - -- MOZ_MUST_USE bool emitCallee(ParseNode* callee, ParseNode* call, bool spread, bool* callop); -+ MOZ_MUST_USE bool emitCalleeAndThis(ParseNode* callee, ParseNode* call, -+ bool isCall, bool isNew); - - MOZ_MUST_USE bool emitPipeline(ParseNode* pn); - diff --git a/seamonkey-2.53.10-optchain-1610447.patch b/seamonkey-2.53.10-optchain-1610447.patch deleted file mode 100644 index 67a10ae..0000000 --- a/seamonkey-2.53.10-optchain-1610447.patch +++ /dev/null @@ -1,207 +0,0 @@ -# -# Backport updating of js/src/builtin/ReflectParse.cpp stuff for optchain support: -# -# bug 1610447 -# bug 1611777 part4 (ReflectParse.cpp chunk only) -# bug 1657835 -# - -diff -Nrup mozilla-OLD/js/src/builtin/ReflectParse.cpp mozilla/js/src/builtin/ReflectParse.cpp ---- mozilla-OLD/js/src/builtin/ReflectParse.cpp 2022-01-12 02:34:03.802674404 +0300 -+++ mozilla/js/src/builtin/ReflectParse.cpp 2022-01-12 01:29:40.048226482 +0300 -@@ -166,7 +166,7 @@ static const char* const unopNames[] = { - "~", /* UNOP_BITNOT */ - "typeof", /* UNOP_TYPEOF */ - "void", /* UNOP_VOID */ -- "await" /* UNOP_AWAIT */ -+ "await", /* UNOP_AWAIT */ - }; - - static const char* const nodeTypeNames[] = { -@@ -579,10 +579,11 @@ class NodeBuilder - MutableHandleValue dst); - - MOZ_MUST_USE bool callExpression(HandleValue callee, NodeVector& args, TokenPos* pos, -- MutableHandleValue dst); -+ MutableHandleValue dst, bool isOptional = false); - - MOZ_MUST_USE bool memberExpression(bool computed, HandleValue expr, HandleValue member, -- TokenPos* pos, MutableHandleValue dst); -+ TokenPos* pos, MutableHandleValue dst, -+ bool isOptional = false); - - MOZ_MUST_USE bool arrayExpression(NodeVector& elts, TokenPos* pos, MutableHandleValue dst); - -@@ -596,6 +597,11 @@ class NodeBuilder - - MOZ_MUST_USE bool spreadExpression(HandleValue expr, TokenPos* pos, MutableHandleValue dst); - -+ MOZ_MUST_USE bool optionalExpression(HandleValue expr, TokenPos* pos, MutableHandleValue dst); -+ -+ MOZ_MUST_USE bool deleteOptionalExpression(HandleValue expr, TokenPos* pos, -+ MutableHandleValue dst); -+ - MOZ_MUST_USE bool computedName(HandleValue name, TokenPos* pos, MutableHandleValue dst); - - MOZ_MUST_USE bool objectExpression(NodeVector& elts, TokenPos* pos, MutableHandleValue dst); -@@ -1119,7 +1125,7 @@ NodeBuilder::sequenceExpression(NodeVect - - bool - NodeBuilder::callExpression(HandleValue callee, NodeVector& args, TokenPos* pos, -- MutableHandleValue dst) -+ MutableHandleValue dst, bool isOptional) - { - RootedValue array(cx); - if (!newArray(args, &array)) -@@ -1129,7 +1135,7 @@ NodeBuilder::callExpression(HandleValue - if (!cb.isNull()) - return callback(cb, callee, array, pos, dst); - -- return newNode(AST_CALL_EXPR, pos, -+ return newNode(isOptional ? AST_OPT_CALL_EXPR : AST_CALL_EXPR, pos, - "callee", callee, - "arguments", array, - dst); -@@ -1155,7 +1161,7 @@ NodeBuilder::newExpression(HandleValue c - - bool - NodeBuilder::memberExpression(bool computed, HandleValue expr, HandleValue member, TokenPos* pos, -- MutableHandleValue dst) -+ MutableHandleValue dst, bool isOptional) - { - RootedValue computedVal(cx, BooleanValue(computed)); - -@@ -1163,7 +1169,7 @@ NodeBuilder::memberExpression(bool compu - if (!cb.isNull()) - return callback(cb, computedVal, expr, member, pos, dst); - -- return newNode(AST_MEMBER_EXPR, pos, -+ return newNode(isOptional ? AST_OPT_MEMBER_EXPR : AST_MEMBER_EXPR, pos, - "object", expr, - "property", member, - "computed", computedVal, -@@ -1230,6 +1236,20 @@ NodeBuilder::spreadExpression(HandleValu - } - - bool -+NodeBuilder::optionalExpression(HandleValue expr, TokenPos* pos, MutableHandleValue dst) { -+ return newNode(AST_OPTIONAL_EXPR, pos, -+ "expression", expr, -+ dst); -+} -+ -+bool -+NodeBuilder::deleteOptionalExpression(HandleValue expr, TokenPos* pos, MutableHandleValue dst) { -+ return newNode(AST_DELETE_OPTIONAL_EXPR, pos, -+ "expression", expr, -+ dst); -+} -+ -+bool - NodeBuilder::propertyPattern(HandleValue key, HandleValue patt, bool isShorthand, TokenPos* pos, - MutableHandleValue dst) - { -@@ -2940,9 +2960,22 @@ ASTSerializer::expression(ParseNode* pn, - case ParseNodeKind::GenExp: - return generatorExpression(pn->generatorExpr(), dst); - -+ case ParseNodeKind::DeleteOptionalChain: { -+ RootedValue expr(cx); -+ return expression(pn->pn_kid, &expr) && -+ builder.deleteOptionalExpression(expr, &pn->pn_pos, dst); -+ } -+ -+ case ParseNodeKind::OptionalChain: { -+ RootedValue expr(cx); -+ return expression(pn->pn_kid, &expr) && -+ builder.optionalExpression(expr, &pn->pn_pos, dst); -+ } -+ - case ParseNodeKind::New: - case ParseNodeKind::TaggedTemplate: - case ParseNodeKind::Call: -+ case ParseNodeKind::OptionalCall: - case ParseNodeKind::SuperCall: - { - ParseNode* pn_callee = pn->pn_left; -@@ -2975,13 +3008,15 @@ ASTSerializer::expression(ParseNode* pn, - if (pn->getKind() == ParseNodeKind::TaggedTemplate) - return builder.taggedTemplate(callee, args, &pn->pn_pos, dst); - -+ bool isOptional = pn->isKind(ParseNodeKind::OptionalCall); -+ - // SUPERCALL is Call(super, args) - return pn->isKind(ParseNodeKind::New) - ? builder.newExpression(callee, args, &pn->pn_pos, dst) -- -- : builder.callExpression(callee, args, &pn->pn_pos, dst); -+ : builder.callExpression(callee, args, &pn->pn_pos, dst, isOptional); - } - -+ case ParseNodeKind::OptionalDot: - case ParseNodeKind::Dot: - { - MOZ_ASSERT(pn->pn_pos.encloses(pn->pn_left->pn_pos)); -@@ -2990,7 +3025,9 @@ ASTSerializer::expression(ParseNode* pn, - RootedValue propname(cx); - RootedAtom pnAtom(cx, pn->pn_right->pn_atom); - -- if (pn->as().isSuper()) { -+ bool isOptional = pn->isKind(ParseNodeKind::OptionalDot); -+ -+ if (!isOptional && pn->as().isSuper()) { - if (!builder.super(&pn->pn_left->pn_pos, &expr)) - return false; - } else { -@@ -2999,9 +3036,11 @@ ASTSerializer::expression(ParseNode* pn, - } - - return identifier(pnAtom, nullptr, &propname) && -- builder.memberExpression(false, expr, propname, &pn->pn_pos, dst); -+ builder.memberExpression(false, expr, propname, &pn->pn_pos, dst, -+ isOptional); - } - -+ case ParseNodeKind::OptionalElem: - case ParseNodeKind::Elem: - { - MOZ_ASSERT(pn->pn_pos.encloses(pn->pn_left->pn_pos)); -@@ -3009,7 +3048,9 @@ ASTSerializer::expression(ParseNode* pn, - - RootedValue left(cx), right(cx); - -- if (pn->as().isSuper()) { -+ bool isOptional = pn->isKind(ParseNodeKind::OptionalElem); -+ -+ if (!isOptional && pn->as().isSuper()) { - if (!builder.super(&pn->pn_left->pn_pos, &left)) - return false; - } else { -@@ -3018,7 +3059,8 @@ ASTSerializer::expression(ParseNode* pn, - } - - return expression(pn->pn_right, &right) && -- builder.memberExpression(true, left, right, &pn->pn_pos, dst); -+ builder.memberExpression(true, left, right, &pn->pn_pos, dst, -+ isOptional); - } - - case ParseNodeKind::CallSiteObj: -diff -Nrup mozilla-OLD/js/src/jsast.tbl mozilla/js/src/jsast.tbl ---- mozilla-OLD/js/src/jsast.tbl 2022-01-12 02:34:03.814674317 +0300 -+++ mozilla/js/src/jsast.tbl 2022-01-12 00:48:25.442649220 +0300 -@@ -27,10 +27,14 @@ ASTDEF(AST_LOGICAL_EXPR, "Logic - ASTDEF(AST_UPDATE_EXPR, "UpdateExpression", "updateExpression") - ASTDEF(AST_NEW_EXPR, "NewExpression", "newExpression") - ASTDEF(AST_CALL_EXPR, "CallExpression", "callExpression") -+ASTDEF(AST_OPT_CALL_EXPR, "OptionalCallExpression", "optionalCallExpression") - ASTDEF(AST_MEMBER_EXPR, "MemberExpression", "memberExpression") -+ASTDEF(AST_OPT_MEMBER_EXPR, "OptionalMemberExpression", "optionalMemberExpression") - ASTDEF(AST_FUNC_EXPR, "FunctionExpression", "functionExpression") - ASTDEF(AST_ARROW_EXPR, "ArrowFunctionExpression", "arrowFunctionExpression") - ASTDEF(AST_ARRAY_EXPR, "ArrayExpression", "arrayExpression") -+ASTDEF(AST_DELETE_OPTIONAL_EXPR, "DeleteOptionalExpression", "deleteOptionalExpression") -+ASTDEF(AST_OPTIONAL_EXPR, "OptionalExpression", "optionalExpression") - ASTDEF(AST_SPREAD_EXPR, "SpreadExpression", "spreadExpression") - ASTDEF(AST_OBJECT_EXPR, "ObjectExpression", "objectExpression") - ASTDEF(AST_THIS_EXPR, "ThisExpression", "thisExpression") diff --git a/seamonkey-2.53.10-optchain-baselinejit.patch b/seamonkey-2.53.10-optchain-baselinejit.patch deleted file mode 100644 index b512c74..0000000 --- a/seamonkey-2.53.10-optchain-baselinejit.patch +++ /dev/null @@ -1,255 +0,0 @@ -# -# Original OptionalEmitter implementation uses JSOP_GOTO, but our legacy code -# still uses SourceNotes for BaselineJIT compiling. The SourceNotes require -# each JSOP_GOTO to be accompanied by a call to newSrcNote() with a proper note type, -# but there is no such a type for the optional chaining yet. -# -# To make the current BaselineJIT happy, we just emulate "break