mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-22 23:27:30 +09:00
Merge remote-tracking branch 'origin/master' into custom
This commit is contained in:
commit
09a915bd50
24 changed files with 392 additions and 74 deletions
|
|
@ -6,13 +6,16 @@ installer:
|
||||||
@$(MAKE) -C application/basilisk/installer installer
|
@$(MAKE) -C application/basilisk/installer installer
|
||||||
|
|
||||||
package:
|
package:
|
||||||
@$(MAKE) -C application/basilisk/installer
|
@$(MAKE) -C application/basilisk/installer make-archive
|
||||||
|
|
||||||
|
mozpackage:
|
||||||
|
@$(MAKE) -C application/basilisk/installer make-package
|
||||||
|
|
||||||
package-compare:
|
package-compare:
|
||||||
@$(MAKE) -C application/basilisk/installer package-compare
|
@$(MAKE) -C application/basilisk/installer package-compare
|
||||||
|
|
||||||
stage-package:
|
stage-package:
|
||||||
@$(MAKE) -C application/basilisk/installer stage-package
|
@$(MAKE) -C application/basilisk/installer stage-package make-buildinfo-file
|
||||||
|
|
||||||
sdk:
|
sdk:
|
||||||
@$(MAKE) -C application/basilisk/installer make-sdk
|
@$(MAKE) -C application/basilisk/installer make-sdk
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -98,7 +98,7 @@ endif
|
||||||
INSTALL_SDK = 1
|
INSTALL_SDK = 1
|
||||||
|
|
||||||
include $(topsrcdir)/toolkit/mozapps/installer/signing.mk
|
include $(topsrcdir)/toolkit/mozapps/installer/signing.mk
|
||||||
include $(topsrcdir)/toolkit/mozapps/installer/packager.mk
|
include $(topsrcdir)/toolkit/mozapps/installer/packager-uxp.mk
|
||||||
|
|
||||||
ifeq (bundle, $(MOZ_FS_LAYOUT))
|
ifeq (bundle, $(MOZ_FS_LAYOUT))
|
||||||
BINPATH = $(_BINPATH)
|
BINPATH = $(_BINPATH)
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,16 @@ installer:
|
||||||
@$(MAKE) -C application/palemoon/installer installer
|
@$(MAKE) -C application/palemoon/installer installer
|
||||||
|
|
||||||
package:
|
package:
|
||||||
@$(MAKE) -C application/palemoon/installer
|
@$(MAKE) -C application/palemoon/installer make-archive
|
||||||
|
|
||||||
|
mozpackage:
|
||||||
|
@$(MAKE) -C application/palemoon/installer make-package
|
||||||
|
|
||||||
package-compare:
|
package-compare:
|
||||||
@$(MAKE) -C application/palemoon/installer package-compare
|
@$(MAKE) -C application/palemoon/installer package-compare
|
||||||
|
|
||||||
stage-package:
|
stage-package:
|
||||||
@$(MAKE) -C application/palemoon/installer stage-package
|
@$(MAKE) -C application/palemoon/installer stage-package make-buildinfo-file
|
||||||
|
|
||||||
install::
|
install::
|
||||||
@$(MAKE) -C application/palemoon/installer install
|
@$(MAKE) -C application/palemoon/installer install
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -109,7 +109,7 @@ INSTALL_SDK = 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
include $(topsrcdir)/toolkit/mozapps/installer/signing.mk
|
include $(topsrcdir)/toolkit/mozapps/installer/signing.mk
|
||||||
include $(topsrcdir)/toolkit/mozapps/installer/packager.mk
|
include $(topsrcdir)/toolkit/mozapps/installer/packager-uxp.mk
|
||||||
|
|
||||||
ifeq (bundle, $(MOZ_FS_LAYOUT))
|
ifeq (bundle, $(MOZ_FS_LAYOUT))
|
||||||
BINPATH = $(_BINPATH)
|
BINPATH = $(_BINPATH)
|
||||||
|
|
|
||||||
40
dom/indexedDB/crashtests/1558522-1.html
Normal file
40
dom/indexedDB/crashtests/1558522-1.html
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<script id='worker' type='javascript/worker'>
|
||||||
|
onmessage = function (e) {
|
||||||
|
const file = e.data[0]
|
||||||
|
const db = indexedDB.open('', {})
|
||||||
|
db.onupgradeneeded = function (event) {
|
||||||
|
const store = event.target.result.createObjectStore('IDBStore_0', {})
|
||||||
|
store.add({}, '')
|
||||||
|
}
|
||||||
|
db.onsuccess = function (event) {
|
||||||
|
const transaction = event.target.result.transaction('IDBStore_0', 'readwrite')
|
||||||
|
const store = transaction.objectStore('IDBStore_0')
|
||||||
|
const cursor = store.openCursor()
|
||||||
|
cursor.onsuccess = function (event) {
|
||||||
|
event.target.result.update({
|
||||||
|
data: file
|
||||||
|
})
|
||||||
|
event.target.result.advance(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
event.target.result.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
let worker;
|
||||||
|
|
||||||
|
function start () {
|
||||||
|
const file = new File([], 'x')
|
||||||
|
const blob = new Blob([document.getElementById('worker').textContent], { type: 'text/javascript' })
|
||||||
|
worker = new Worker(window.URL.createObjectURL(blob))
|
||||||
|
worker.postMessage([file], [])
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', start)
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
load 726376-1.html
|
load 726376-1.html
|
||||||
|
load 1558522-1.html
|
||||||
|
|
|
||||||
|
|
@ -779,7 +779,7 @@ struct JSClass {
|
||||||
// application.
|
// application.
|
||||||
#define JSCLASS_GLOBAL_APPLICATION_SLOTS 5
|
#define JSCLASS_GLOBAL_APPLICATION_SLOTS 5
|
||||||
#define JSCLASS_GLOBAL_SLOT_COUNT \
|
#define JSCLASS_GLOBAL_SLOT_COUNT \
|
||||||
(JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 39)
|
(JSCLASS_GLOBAL_APPLICATION_SLOTS + JSProto_LIMIT * 2 + 40)
|
||||||
#define JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(n) \
|
#define JSCLASS_GLOBAL_FLAGS_WITH_SLOTS(n) \
|
||||||
(JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT + (n)))
|
(JSCLASS_IS_GLOBAL | JSCLASS_HAS_RESERVED_SLOTS(JSCLASS_GLOBAL_SLOT_COUNT + (n)))
|
||||||
#define JSCLASS_GLOBAL_FLAGS \
|
#define JSCLASS_GLOBAL_FLAGS \
|
||||||
|
|
|
||||||
|
|
@ -795,6 +795,7 @@ const JSFunctionSpec js::regexp_methods[] = {
|
||||||
JS_SELF_HOSTED_FN("exec", "RegExp_prototype_Exec", 1,0),
|
JS_SELF_HOSTED_FN("exec", "RegExp_prototype_Exec", 1,0),
|
||||||
JS_SELF_HOSTED_FN("test", "RegExpTest" , 1,0),
|
JS_SELF_HOSTED_FN("test", "RegExpTest" , 1,0),
|
||||||
JS_SELF_HOSTED_SYM_FN(match, "RegExpMatch", 1,0),
|
JS_SELF_HOSTED_SYM_FN(match, "RegExpMatch", 1,0),
|
||||||
|
JS_SELF_HOSTED_SYM_FN(matchAll, "RegExpMatchAll", 1, 0),
|
||||||
JS_SELF_HOSTED_SYM_FN(replace, "RegExpReplace", 2,0),
|
JS_SELF_HOSTED_SYM_FN(replace, "RegExpReplace", 2,0),
|
||||||
JS_SELF_HOSTED_SYM_FN(search, "RegExpSearch", 1,0),
|
JS_SELF_HOSTED_SYM_FN(search, "RegExpSearch", 1,0),
|
||||||
JS_SELF_HOSTED_SYM_FN(split, "RegExpSplit", 2,0),
|
JS_SELF_HOSTED_SYM_FN(split, "RegExpSplit", 2,0),
|
||||||
|
|
|
||||||
|
|
@ -1031,3 +1031,135 @@ function RegExpSpecies() {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
_SetCanonicalName(RegExpSpecies, "get [Symbol.species]");
|
_SetCanonicalName(RegExpSpecies, "get [Symbol.species]");
|
||||||
|
|
||||||
|
// String.prototype.matchAll proposal.
|
||||||
|
//
|
||||||
|
// RegExp.prototype [ @@matchAll ] ( string )
|
||||||
|
function RegExpMatchAll(string) {
|
||||||
|
// Step 1.
|
||||||
|
var rx = this;
|
||||||
|
|
||||||
|
// Step 2.
|
||||||
|
if (!IsObject(rx))
|
||||||
|
ThrowTypeError(JSMSG_NOT_NONNULL_OBJECT, rx === null ? "null" : typeof rx);
|
||||||
|
|
||||||
|
// Step 3.
|
||||||
|
var str = ToString(string);
|
||||||
|
|
||||||
|
// Step 4.
|
||||||
|
var C = SpeciesConstructor(rx, GetBuiltinConstructor("RegExp"));
|
||||||
|
|
||||||
|
// Step 5.
|
||||||
|
var flags = ToString(rx.flags);
|
||||||
|
|
||||||
|
// Step 2.b.iii; located here because it needs |flags|.
|
||||||
|
if (!callFunction(std_String_includes, flags, "g")) {
|
||||||
|
ThrowTypeError(JSMSG_BAD_REGEXP_FLAG, "- matchAll requires g");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 6.
|
||||||
|
var matcher = new C(rx, flags);
|
||||||
|
|
||||||
|
// Steps 7-8.
|
||||||
|
matcher.lastIndex = ToLength(rx.lastIndex);
|
||||||
|
|
||||||
|
// Steps 9-12.
|
||||||
|
// Note, always global because non-global throws as per
|
||||||
|
// https://github.com/tc39/ecma262/pull/1716
|
||||||
|
var flags = REGEXP_GLOBAL_FLAG |
|
||||||
|
(callFunction(std_String_includes, flags, "u") ? REGEXP_UNICODE_FLAG : 0);
|
||||||
|
|
||||||
|
// Step 13.
|
||||||
|
return CreateRegExpStringIterator(matcher, str, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
// String.prototype.matchAll proposal.
|
||||||
|
//
|
||||||
|
// CreateRegExpStringIterator ( R, S, global, fullUnicode )
|
||||||
|
function CreateRegExpStringIterator(regexp, string, flags) {
|
||||||
|
// Step 1.
|
||||||
|
assert(typeof string === "string", "|string| is a string value");
|
||||||
|
|
||||||
|
// Steps 2-3.
|
||||||
|
assert(typeof flags === "number", "|flags| is a number value");
|
||||||
|
|
||||||
|
// Steps 4-9.
|
||||||
|
var iterator = NewRegExpStringIterator();
|
||||||
|
UnsafeSetReservedSlot(iterator, REGEXP_STRING_ITERATOR_REGEXP_SLOT, regexp);
|
||||||
|
UnsafeSetReservedSlot(iterator, REGEXP_STRING_ITERATOR_STRING_SLOT, string);
|
||||||
|
UnsafeSetReservedSlot(iterator, REGEXP_STRING_ITERATOR_FLAGS_SLOT, flags | 0);
|
||||||
|
UnsafeSetReservedSlot(iterator, REGEXP_STRING_ITERATOR_DONE_SLOT, false);
|
||||||
|
|
||||||
|
// Step 10.
|
||||||
|
return iterator;
|
||||||
|
}
|
||||||
|
|
||||||
|
// String.prototype.matchAll proposal.
|
||||||
|
//
|
||||||
|
// %RegExpStringIteratorPrototype%.next ( )
|
||||||
|
function RegExpStringIteratorNext() {
|
||||||
|
// Steps 1-3.
|
||||||
|
var obj;
|
||||||
|
if (!IsObject(this) || (obj = GuardToRegExpStringIterator(this)) === null) {
|
||||||
|
return callFunction(CallRegExpStringIteratorMethodIfWrapped, this,
|
||||||
|
"RegExpStringIteratorNext");
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = { value: undefined, done: false };
|
||||||
|
|
||||||
|
// Step 4.
|
||||||
|
var done = UnsafeGetReservedSlot(obj, REGEXP_STRING_ITERATOR_DONE_SLOT);
|
||||||
|
if (done) {
|
||||||
|
result.done = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 5.
|
||||||
|
var regexp = UnsafeGetObjectFromReservedSlot(obj, REGEXP_STRING_ITERATOR_REGEXP_SLOT);
|
||||||
|
|
||||||
|
// Step 6.
|
||||||
|
var string = UnsafeGetStringFromReservedSlot(obj, REGEXP_STRING_ITERATOR_STRING_SLOT);
|
||||||
|
|
||||||
|
// Steps 7-8.
|
||||||
|
var flags = UnsafeGetInt32FromReservedSlot(obj, REGEXP_STRING_ITERATOR_FLAGS_SLOT);
|
||||||
|
var global = !!(flags & REGEXP_GLOBAL_FLAG);
|
||||||
|
var fullUnicode = !!(flags & REGEXP_UNICODE_FLAG);
|
||||||
|
|
||||||
|
// Step 9.
|
||||||
|
var match = RegExpExec(regexp, string, false);
|
||||||
|
|
||||||
|
// Step 10.
|
||||||
|
if (match === null) {
|
||||||
|
// Step 10.a.
|
||||||
|
UnsafeSetReservedSlot(obj, REGEXP_STRING_ITERATOR_DONE_SLOT, true);
|
||||||
|
|
||||||
|
// Step 10.b.
|
||||||
|
result.done = true;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 11.a.
|
||||||
|
if (global) {
|
||||||
|
// Step 11.a.i.
|
||||||
|
var matchStr = ToString(match[0]);
|
||||||
|
|
||||||
|
// Step 11.a.ii.
|
||||||
|
if (matchStr.length === 0) {
|
||||||
|
// Step 11.a.ii.1.
|
||||||
|
var thisIndex = ToLength(regexp.lastIndex);
|
||||||
|
|
||||||
|
// Step 11.a.ii.2.
|
||||||
|
var nextIndex = fullUnicode ? AdvanceStringIndex(string, thisIndex) : thisIndex + 1;
|
||||||
|
|
||||||
|
// Step 11.a.ii.3.
|
||||||
|
regexp.lastIndex = nextIndex;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Step 11.b.i.
|
||||||
|
UnsafeSetReservedSlot(obj, REGEXP_STRING_ITERATOR_DONE_SLOT, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Steps 11.a.iii and 11.b.ii.
|
||||||
|
result.value = match;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,11 @@
|
||||||
#define REGEXP_UNICODE_FLAG 0x10
|
#define REGEXP_UNICODE_FLAG 0x10
|
||||||
#define REGEXP_DOTALL_FLAG 0x20
|
#define REGEXP_DOTALL_FLAG 0x20
|
||||||
|
|
||||||
|
#define REGEXP_STRING_ITERATOR_REGEXP_SLOT 0
|
||||||
|
#define REGEXP_STRING_ITERATOR_STRING_SLOT 1
|
||||||
|
#define REGEXP_STRING_ITERATOR_FLAGS_SLOT 2
|
||||||
|
#define REGEXP_STRING_ITERATOR_DONE_SLOT 3
|
||||||
|
|
||||||
#define MODULE_OBJECT_ENVIRONMENT_SLOT 2
|
#define MODULE_OBJECT_ENVIRONMENT_SLOT 2
|
||||||
|
|
||||||
#define MODULE_STATE_FAILED 0
|
#define MODULE_STATE_FAILED 0
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,33 @@ function String_generic_match(thisValue, regexp) {
|
||||||
return callFunction(String_match, thisValue, regexp);
|
return callFunction(String_match, thisValue, regexp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// String.prototype.matchAll proposal.
|
||||||
|
//
|
||||||
|
// String.prototype.matchAll ( regexp )
|
||||||
|
function String_matchAll(regexp) {
|
||||||
|
// Step 1.
|
||||||
|
RequireObjectCoercible(this);
|
||||||
|
|
||||||
|
// Step 2.
|
||||||
|
if (regexp !== undefined && regexp !== null) {
|
||||||
|
// Step 2.a.
|
||||||
|
var matcher = GetMethod(regexp, std_matchAll);
|
||||||
|
|
||||||
|
// Step 2.b.
|
||||||
|
if (matcher !== undefined)
|
||||||
|
return callContentFunction(matcher, regexp, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 3.
|
||||||
|
var string = ToString(this);
|
||||||
|
|
||||||
|
// Step 4.
|
||||||
|
var rx = RegExpCreate(regexp, "g");
|
||||||
|
|
||||||
|
// Step 5.
|
||||||
|
return callContentFunction(GetMethod(rx, std_matchAll), rx, string);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A helper function implementing the logic for both String.prototype.padStart
|
* A helper function implementing the logic for both String.prototype.padStart
|
||||||
* and String.prototype.padEnd as described in ES7 Draft March 29, 2016
|
* and String.prototype.padEnd as described in ES7 Draft March 29, 2016
|
||||||
|
|
|
||||||
|
|
@ -5087,7 +5087,8 @@ GetSymbolDescription(HandleSymbol symbol);
|
||||||
macro(split) \
|
macro(split) \
|
||||||
macro(toPrimitive) \
|
macro(toPrimitive) \
|
||||||
macro(toStringTag) \
|
macro(toStringTag) \
|
||||||
macro(unscopables)
|
macro(unscopables) \
|
||||||
|
macro(matchAll)
|
||||||
|
|
||||||
enum class SymbolCode : uint32_t {
|
enum class SymbolCode : uint32_t {
|
||||||
// There is one SymbolCode for each well-known symbol.
|
// There is one SymbolCode for each well-known symbol.
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "jstypes.h"
|
#include "jstypes.h"
|
||||||
#include "jsutil.h"
|
#include "jsutil.h"
|
||||||
|
|
||||||
|
#include "builtin/SelfHostingDefines.h"
|
||||||
#include "ds/Sort.h"
|
#include "ds/Sort.h"
|
||||||
#include "gc/Marking.h"
|
#include "gc/Marking.h"
|
||||||
#include "js/Proxy.h"
|
#include "js/Proxy.h"
|
||||||
|
|
@ -1135,6 +1136,38 @@ static const JSFunctionSpec string_iterator_methods[] = {
|
||||||
JS_FS_END
|
JS_FS_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const Class RegExpStringIteratorPrototypeClass = {
|
||||||
|
"RegExp String Iterator",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RegExpStringIteratorSlotRegExp,
|
||||||
|
RegExpStringIteratorSlotString,
|
||||||
|
RegExpStringIteratorSlotFlags,
|
||||||
|
RegExpStringIteratorSlotDone,
|
||||||
|
RegExpStringIteratorSlotCount
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(RegExpStringIteratorSlotRegExp == REGEXP_STRING_ITERATOR_REGEXP_SLOT,
|
||||||
|
"RegExpStringIteratorSlotRegExp must match self-hosting define for regexp slot.");
|
||||||
|
static_assert(RegExpStringIteratorSlotString == REGEXP_STRING_ITERATOR_STRING_SLOT,
|
||||||
|
"RegExpStringIteratorSlotString must match self-hosting define for string slot.");
|
||||||
|
static_assert(RegExpStringIteratorSlotFlags == REGEXP_STRING_ITERATOR_FLAGS_SLOT,
|
||||||
|
"RegExpStringIteratorSlotFlags must match self-hosting define for flags slot.");
|
||||||
|
static_assert(RegExpStringIteratorSlotDone == REGEXP_STRING_ITERATOR_DONE_SLOT,
|
||||||
|
"RegExpStringIteratorSlotDone must match self-hosting define for done slot.");
|
||||||
|
|
||||||
|
const Class RegExpStringIteratorObject::class_ = {
|
||||||
|
"RegExp String Iterator",
|
||||||
|
JSCLASS_HAS_RESERVED_SLOTS(RegExpStringIteratorSlotCount)
|
||||||
|
};
|
||||||
|
|
||||||
|
static const JSFunctionSpec regexp_string_iterator_methods[] = {
|
||||||
|
JS_SELF_HOSTED_FN("next", "RegExpStringIteratorNext", 0, 0),
|
||||||
|
JS_FS_END
|
||||||
|
};
|
||||||
|
|
||||||
JSObject*
|
JSObject*
|
||||||
js::ValueToIterator(JSContext* cx, unsigned flags, HandleValue vp)
|
js::ValueToIterator(JSContext* cx, unsigned flags, HandleValue vp)
|
||||||
{
|
{
|
||||||
|
|
@ -1541,6 +1574,30 @@ GlobalObject::initStringIteratorProto(JSContext* cx, Handle<GlobalObject*> globa
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* static */ bool
|
||||||
|
GlobalObject::initRegExpStringIteratorProto(JSContext* cx, Handle<GlobalObject*> global)
|
||||||
|
{
|
||||||
|
if (global->getReservedSlot(REGEXP_STRING_ITERATOR_PROTO).isObject())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
RootedObject iteratorProto(cx, GlobalObject::getOrCreateIteratorPrototype(cx, global));
|
||||||
|
if (!iteratorProto)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const Class* cls = &RegExpStringIteratorPrototypeClass;
|
||||||
|
RootedObject proto(cx, GlobalObject::createBlankPrototypeInheriting(cx, global, cls,
|
||||||
|
iteratorProto));
|
||||||
|
if (!proto ||
|
||||||
|
!DefinePropertiesAndFunctions(cx, proto, nullptr, regexp_string_iterator_methods) ||
|
||||||
|
!DefineToStringTag(cx, proto, cx->names().RegExpStringIterator))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
global->setReservedSlot(REGEXP_STRING_ITERATOR_PROTO, ObjectValue(*proto));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
JSObject*
|
JSObject*
|
||||||
js::InitLegacyIteratorClass(JSContext* cx, HandleObject obj)
|
js::InitLegacyIteratorClass(JSContext* cx, HandleObject obj)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,12 @@ class StringIteratorObject : public JSObject
|
||||||
static const Class class_;
|
static const Class class_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class RegExpStringIteratorObject : public JSObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const Class class_;
|
||||||
|
};
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GetIterator(JSContext* cx, HandleObject obj, unsigned flags, MutableHandleObject objp);
|
GetIterator(JSContext* cx, HandleObject obj, unsigned flags, MutableHandleObject objp);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2584,6 +2584,7 @@ static const JSFunctionSpec string_methods[] = {
|
||||||
|
|
||||||
/* Perl-ish methods (search is actually Python-esque). */
|
/* Perl-ish methods (search is actually Python-esque). */
|
||||||
JS_SELF_HOSTED_FN("match", "String_match", 1,0),
|
JS_SELF_HOSTED_FN("match", "String_match", 1,0),
|
||||||
|
JS_SELF_HOSTED_FN("matchAll", "String_matchAll", 1,0),
|
||||||
JS_SELF_HOSTED_FN("search", "String_search", 1,0),
|
JS_SELF_HOSTED_FN("search", "String_search", 1,0),
|
||||||
JS_SELF_HOSTED_FN("replace", "String_replace", 2,0),
|
JS_SELF_HOSTED_FN("replace", "String_replace", 2,0),
|
||||||
JS_SELF_HOSTED_FN("split", "String_split", 2,0),
|
JS_SELF_HOSTED_FN("split", "String_split", 2,0),
|
||||||
|
|
|
||||||
|
|
@ -282,6 +282,7 @@
|
||||||
macro(RegExpFlagsGetter, RegExpFlagsGetter, "RegExpFlagsGetter") \
|
macro(RegExpFlagsGetter, RegExpFlagsGetter, "RegExpFlagsGetter") \
|
||||||
macro(RegExpMatcher, RegExpMatcher, "RegExpMatcher") \
|
macro(RegExpMatcher, RegExpMatcher, "RegExpMatcher") \
|
||||||
macro(RegExpSearcher, RegExpSearcher, "RegExpSearcher") \
|
macro(RegExpSearcher, RegExpSearcher, "RegExpSearcher") \
|
||||||
|
macro(RegExpStringIterator, RegExpStringIterator, "RegExp String Iterator") \
|
||||||
macro(RegExpTester, RegExpTester, "RegExpTester") \
|
macro(RegExpTester, RegExpTester, "RegExpTester") \
|
||||||
macro(RegExp_prototype_Exec, RegExp_prototype_Exec, "RegExp_prototype_Exec") \
|
macro(RegExp_prototype_Exec, RegExp_prototype_Exec, "RegExp_prototype_Exec") \
|
||||||
macro(Reify, Reify, "Reify") \
|
macro(Reify, Reify, "Reify") \
|
||||||
|
|
|
||||||
|
|
@ -468,62 +468,29 @@ GlobalObject::initSelfHostingBuiltins(JSContext* cx, Handle<GlobalObject*> globa
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
RootedValue std_isConcatSpreadable(cx);
|
struct SymbolAndName {
|
||||||
std_isConcatSpreadable.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::isConcatSpreadable));
|
JS::SymbolCode code;
|
||||||
if (!JS_DefineProperty(cx, global, "std_isConcatSpreadable", std_isConcatSpreadable,
|
const char* name;
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
};
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define a top-level property 'std_iterator' with the name of the method
|
SymbolAndName wellKnownSymbols[] = {
|
||||||
// used by for-of loops to create an iterator.
|
{JS::SymbolCode::isConcatSpreadable, "std_isConcatSpreadable"},
|
||||||
RootedValue std_iterator(cx);
|
{JS::SymbolCode::iterator, "std_iterator"},
|
||||||
std_iterator.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::iterator));
|
{JS::SymbolCode::match, "std_match"},
|
||||||
if (!JS_DefineProperty(cx, global, "std_iterator", std_iterator,
|
{JS::SymbolCode::matchAll, "std_matchAll"},
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
{JS::SymbolCode::replace, "std_replace"},
|
||||||
{
|
{JS::SymbolCode::search, "std_search"},
|
||||||
return false;
|
{JS::SymbolCode::species, "std_species"},
|
||||||
}
|
{JS::SymbolCode::split, "std_split"},
|
||||||
|
};
|
||||||
|
|
||||||
RootedValue std_match(cx);
|
RootedValue symVal(cx);
|
||||||
std_match.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::match));
|
for (const auto& sym : wellKnownSymbols) {
|
||||||
if (!JS_DefineProperty(cx, global, "std_match", std_match,
|
symVal.setSymbol(cx->wellKnownSymbols().get(sym.code));
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
if (!JS_DefineProperty(cx, global, sym.name, symVal,
|
||||||
{
|
JSPROP_PERMANENT | JSPROP_READONLY)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
RootedValue std_replace(cx);
|
|
||||||
std_replace.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::replace));
|
|
||||||
if (!JS_DefineProperty(cx, global, "std_replace", std_replace,
|
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RootedValue std_search(cx);
|
|
||||||
std_search.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::search));
|
|
||||||
if (!JS_DefineProperty(cx, global, "std_search", std_search,
|
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RootedValue std_species(cx);
|
|
||||||
std_species.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::species));
|
|
||||||
if (!JS_DefineProperty(cx, global, "std_species", std_species,
|
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
RootedValue std_split(cx);
|
|
||||||
std_split.setSymbol(cx->wellKnownSymbols().get(JS::SymbolCode::split));
|
|
||||||
if (!JS_DefineProperty(cx, global, "std_split", std_split,
|
|
||||||
JSPROP_PERMANENT | JSPROP_READONLY))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return InitBareBuiltinCtor(cx, global, JSProto_Array) &&
|
return InitBareBuiltinCtor(cx, global, JSProto_Array) &&
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,7 @@ class GlobalObject : public NativeObject
|
||||||
ITERATOR_PROTO,
|
ITERATOR_PROTO,
|
||||||
ARRAY_ITERATOR_PROTO,
|
ARRAY_ITERATOR_PROTO,
|
||||||
STRING_ITERATOR_PROTO,
|
STRING_ITERATOR_PROTO,
|
||||||
|
REGEXP_STRING_ITERATOR_PROTO,
|
||||||
LEGACY_GENERATOR_OBJECT_PROTO,
|
LEGACY_GENERATOR_OBJECT_PROTO,
|
||||||
STAR_GENERATOR_OBJECT_PROTO,
|
STAR_GENERATOR_OBJECT_PROTO,
|
||||||
STAR_GENERATOR_FUNCTION_PROTO,
|
STAR_GENERATOR_FUNCTION_PROTO,
|
||||||
|
|
@ -582,6 +583,12 @@ class GlobalObject : public NativeObject
|
||||||
initStringIteratorProto));
|
initStringIteratorProto));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NativeObject*
|
||||||
|
getOrCreateRegExpStringIteratorPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||||
|
return MaybeNativeObject(getOrCreateObject(cx, global, REGEXP_STRING_ITERATOR_PROTO,
|
||||||
|
initRegExpStringIteratorProto));
|
||||||
|
}
|
||||||
|
|
||||||
static NativeObject*
|
static NativeObject*
|
||||||
getOrCreateLegacyGeneratorObjectPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
getOrCreateLegacyGeneratorObjectPrototype(JSContext* cx, Handle<GlobalObject*> global) {
|
||||||
return MaybeNativeObject(getOrCreateObject(cx, global, LEGACY_GENERATOR_OBJECT_PROTO,
|
return MaybeNativeObject(getOrCreateObject(cx, global, LEGACY_GENERATOR_OBJECT_PROTO,
|
||||||
|
|
@ -767,6 +774,7 @@ class GlobalObject : public NativeObject
|
||||||
static bool initIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
static bool initIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
||||||
static bool initArrayIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
static bool initArrayIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
||||||
static bool initStringIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
static bool initStringIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
||||||
|
static bool initRegExpStringIteratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
||||||
|
|
||||||
// Implemented in vm/GeneratorObject.cpp.
|
// Implemented in vm/GeneratorObject.cpp.
|
||||||
static bool initLegacyGeneratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
static bool initLegacyGeneratorProto(JSContext* cx, Handle<GlobalObject*> global);
|
||||||
|
|
|
||||||
|
|
@ -856,6 +856,24 @@ intrinsic_NewStringIterator(JSContext* cx, unsigned argc, Value* vp)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
intrinsic_NewRegExpStringIterator(JSContext* cx, unsigned argc, Value* vp)
|
||||||
|
{
|
||||||
|
CallArgs args = CallArgsFromVp(argc, vp);
|
||||||
|
MOZ_ASSERT(args.length() == 0);
|
||||||
|
|
||||||
|
RootedObject proto(cx, GlobalObject::getOrCreateRegExpStringIteratorPrototype(cx, cx->global()));
|
||||||
|
if (!proto)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
JSObject* obj = NewObjectWithGivenProto(cx, &RegExpStringIteratorObject::class_, proto);
|
||||||
|
if (!obj)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
args.rval().setObject(*obj);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
intrinsic_SetCanonicalName(JSContext* cx, unsigned argc, Value* vp)
|
intrinsic_SetCanonicalName(JSContext* cx, unsigned argc, Value* vp)
|
||||||
{
|
{
|
||||||
|
|
@ -2288,6 +2306,8 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||||
JS_INLINABLE_FN("GuardToStringIterator",
|
JS_INLINABLE_FN("GuardToStringIterator",
|
||||||
intrinsic_GuardToBuiltin<StringIteratorObject>, 1,0,
|
intrinsic_GuardToBuiltin<StringIteratorObject>, 1,0,
|
||||||
IntrinsicGuardToStringIterator),
|
IntrinsicGuardToStringIterator),
|
||||||
|
JS_FN("GuardToRegExpStringIterator",
|
||||||
|
intrinsic_GuardToBuiltin<RegExpStringIteratorObject>, 1,0),
|
||||||
|
|
||||||
JS_FN("_CreateMapIterationResultPair", intrinsic_CreateMapIterationResultPair, 0, 0),
|
JS_FN("_CreateMapIterationResultPair", intrinsic_CreateMapIterationResultPair, 0, 0),
|
||||||
JS_INLINABLE_FN("_GetNextMapEntryForIterator", intrinsic_GetNextMapEntryForIterator, 2,0,
|
JS_INLINABLE_FN("_GetNextMapEntryForIterator", intrinsic_GetNextMapEntryForIterator, 2,0,
|
||||||
|
|
@ -2305,6 +2325,9 @@ static const JSFunctionSpec intrinsic_functions[] = {
|
||||||
JS_FN("NewStringIterator", intrinsic_NewStringIterator, 0,0),
|
JS_FN("NewStringIterator", intrinsic_NewStringIterator, 0,0),
|
||||||
JS_FN("CallStringIteratorMethodIfWrapped",
|
JS_FN("CallStringIteratorMethodIfWrapped",
|
||||||
CallNonGenericSelfhostedMethod<Is<StringIteratorObject>>, 2,0),
|
CallNonGenericSelfhostedMethod<Is<StringIteratorObject>>, 2,0),
|
||||||
|
JS_FN("NewRegExpStringIterator", intrinsic_NewRegExpStringIterator, 0,0),
|
||||||
|
JS_FN("CallRegExpStringIteratorMethodIfWrapped",
|
||||||
|
CallNonGenericSelfhostedMethod<Is<RegExpStringIteratorObject>>, 2,0),
|
||||||
|
|
||||||
JS_FN("IsStarGeneratorObject",
|
JS_FN("IsStarGeneratorObject",
|
||||||
intrinsic_IsInstanceOfBuiltin<StarGeneratorObject>, 1,0),
|
intrinsic_IsInstanceOfBuiltin<StarGeneratorObject>, 1,0),
|
||||||
|
|
|
||||||
|
|
@ -1084,7 +1084,7 @@ class Package(MachCommandBase):
|
||||||
"""Package the built product for distribution."""
|
"""Package the built product for distribution."""
|
||||||
|
|
||||||
@Command('package', category='post-build',
|
@Command('package', category='post-build',
|
||||||
description='Package the built product for distribution as an APK, DMG, etc.')
|
description='Package the built product for distribution as an archive.')
|
||||||
@CommandArgument('-v', '--verbose', action='store_true',
|
@CommandArgument('-v', '--verbose', action='store_true',
|
||||||
help='Verbose output for what commands the packaging process is running.')
|
help='Verbose output for what commands the packaging process is running.')
|
||||||
def package(self, verbose=False):
|
def package(self, verbose=False):
|
||||||
|
|
@ -1094,6 +1094,21 @@ class Package(MachCommandBase):
|
||||||
self.notify('Packaging complete')
|
self.notify('Packaging complete')
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@CommandProvider
|
||||||
|
class Mozpackage(MachCommandBase):
|
||||||
|
"""Package the built product for distribution."""
|
||||||
|
|
||||||
|
@Command('mozpackage', category='post-build',
|
||||||
|
description='Package the built product for distribution as an archive. (mozilla orginal routine)')
|
||||||
|
@CommandArgument('-v', '--verbose', action='store_true',
|
||||||
|
help='Verbose output for what commands the packaging process is running.')
|
||||||
|
def mozpackage(self, verbose=False):
|
||||||
|
ret = self._run_make(directory=".", target='mozpackage',
|
||||||
|
silent=not verbose, ensure_exit_code=False)
|
||||||
|
if ret == 0:
|
||||||
|
self.notify('Packaging complete')
|
||||||
|
return ret
|
||||||
|
|
||||||
@CommandProvider
|
@CommandProvider
|
||||||
class Installer(MachCommandBase):
|
class Installer(MachCommandBase):
|
||||||
"""Create the windows installer for the built product."""
|
"""Create the windows installer for the built product."""
|
||||||
|
|
|
||||||
|
|
@ -220,6 +220,7 @@ const COMPATIBLE_BY_DEFAULT_TYPES = {
|
||||||
};
|
};
|
||||||
|
|
||||||
const MSG_JAR_FLUSH = "AddonJarFlush";
|
const MSG_JAR_FLUSH = "AddonJarFlush";
|
||||||
|
const MSG_MESSAGE_MANAGER_CACHES_FLUSH = "AddonMessageManagerCachesFlush";
|
||||||
|
|
||||||
var gGlobalScope = this;
|
var gGlobalScope = this;
|
||||||
|
|
||||||
|
|
@ -1199,13 +1200,16 @@ function buildJarURI(aJarfile, aPath) {
|
||||||
*/
|
*/
|
||||||
function flushJarCache(aJarFile) {
|
function flushJarCache(aJarFile) {
|
||||||
Services.obs.notifyObservers(aJarFile, "flush-cache-entry", null);
|
Services.obs.notifyObservers(aJarFile, "flush-cache-entry", null);
|
||||||
Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageBroadcaster)
|
Services.mm.broadcastAsyncMessage(MSG_JAR_FLUSH, aJarFile.path);
|
||||||
.broadcastAsyncMessage(MSG_JAR_FLUSH, aJarFile.path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function flushStartupCache() {
|
function flushChromeCaches() {
|
||||||
// Init this, so it will get the notification.
|
// Init this, so it will get the notification.
|
||||||
Services.obs.notifyObservers(null, "startupcache-invalidate", null);
|
Services.obs.notifyObservers(null, "startupcache-invalidate", null);
|
||||||
|
// Flush message manager cached scripts
|
||||||
|
Services.obs.notifyObservers(null, "message-manager-flush-caches", null);
|
||||||
|
// Also dispatch this event to child processes
|
||||||
|
Services.mm.broadcastAsyncMessage(MSG_MESSAGE_MANAGER_CACHES_FLUSH, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -2129,7 +2133,7 @@ this.XPIProvider = {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flushCaches) {
|
if (flushCaches) {
|
||||||
flushStartupCache();
|
Services.obs.notifyObservers(null, "startupcache-invalidate", null);
|
||||||
// UI displayed early in startup (like the compatibility UI) may have
|
// UI displayed early in startup (like the compatibility UI) may have
|
||||||
// caused us to cache parts of the skin or locale in memory. These must
|
// caused us to cache parts of the skin or locale in memory. These must
|
||||||
// be flushed to allow extension provided skins and locales to take full
|
// be flushed to allow extension provided skins and locales to take full
|
||||||
|
|
@ -2665,7 +2669,7 @@ this.XPIProvider = {
|
||||||
existingAddon, "uninstall", uninstallReason,
|
existingAddon, "uninstall", uninstallReason,
|
||||||
{ newVersion: newVersion });
|
{ newVersion: newVersion });
|
||||||
this.unloadBootstrapScope(existingAddonID);
|
this.unloadBootstrapScope(existingAddonID);
|
||||||
flushStartupCache();
|
flushChromeCaches();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
|
@ -2939,7 +2943,7 @@ this.XPIProvider = {
|
||||||
// If the new add-on is bootstrapped and active then call its install method
|
// If the new add-on is bootstrapped and active then call its install method
|
||||||
if (newDBAddon.active && newDBAddon.bootstrap) {
|
if (newDBAddon.active && newDBAddon.bootstrap) {
|
||||||
// Startup cache must be flushed before calling the bootstrap script
|
// Startup cache must be flushed before calling the bootstrap script
|
||||||
flushStartupCache();
|
flushChromeCaches();
|
||||||
|
|
||||||
let installReason = Services.vc.compare(aOldAddon.version, newDBAddon.version) < 0 ?
|
let installReason = Services.vc.compare(aOldAddon.version, newDBAddon.version) < 0 ?
|
||||||
BOOTSTRAP_REASONS.ADDON_UPGRADE :
|
BOOTSTRAP_REASONS.ADDON_UPGRADE :
|
||||||
|
|
@ -3344,7 +3348,7 @@ this.XPIProvider = {
|
||||||
// If the new add-on is bootstrapped then we must flush the caches
|
// If the new add-on is bootstrapped then we must flush the caches
|
||||||
// before calling the new bootstrap script
|
// before calling the new bootstrap script
|
||||||
if (newDBAddon.bootstrap)
|
if (newDBAddon.bootstrap)
|
||||||
flushStartupCache();
|
flushChromeCaches();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!newDBAddon.bootstrap)
|
if (!newDBAddon.bootstrap)
|
||||||
|
|
@ -4746,7 +4750,7 @@ this.XPIProvider = {
|
||||||
this.callBootstrapMethod(aAddon, file, "uninstall",
|
this.callBootstrapMethod(aAddon, file, "uninstall",
|
||||||
BOOTSTRAP_REASONS.ADDON_UNINSTALL);
|
BOOTSTRAP_REASONS.ADDON_UNINSTALL);
|
||||||
this.unloadBootstrapScope(aAddon.id);
|
this.unloadBootstrapScope(aAddon.id);
|
||||||
flushStartupCache();
|
flushChromeCaches();
|
||||||
}
|
}
|
||||||
aAddon._installLocation.uninstallAddon(aAddon.id);
|
aAddon._installLocation.uninstallAddon(aAddon.id);
|
||||||
XPIDatabase.removeAddonMetadata(aAddon);
|
XPIDatabase.removeAddonMetadata(aAddon);
|
||||||
|
|
@ -5876,7 +5880,7 @@ AddonInstall.prototype = {
|
||||||
"uninstall", reason,
|
"uninstall", reason,
|
||||||
{ newVersion: this.addon.version });
|
{ newVersion: this.addon.version });
|
||||||
XPIProvider.unloadBootstrapScope(this.existingAddon.id);
|
XPIProvider.unloadBootstrapScope(this.existingAddon.id);
|
||||||
flushStartupCache();
|
flushChromeCaches();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isUpgrade && this.existingAddon.active) {
|
if (!isUpgrade && this.existingAddon.active) {
|
||||||
|
|
|
||||||
23
toolkit/mozapps/installer/packager-uxp.mk
Normal file
23
toolkit/mozapps/installer/packager-uxp.mk
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
# We need to include the mozilla packaging routines because we are
|
||||||
|
# very much still dependent on them
|
||||||
|
include $(MOZILLA_DIR)/toolkit/mozapps/installer/packager.mk
|
||||||
|
|
||||||
|
# This is currently only used on Windows and Linux
|
||||||
|
# on other platforms such as Mac will fall back to the orginal
|
||||||
|
# mozilla packaging
|
||||||
|
make-archive:
|
||||||
|
ifeq (,$(filter Linux WINNT,$(OS_ARCH)))
|
||||||
|
$(MAKE) make-package
|
||||||
|
else
|
||||||
|
$(MAKE) stage-package make-buildinfo-file
|
||||||
|
@echo 'Compressing...'
|
||||||
|
ifeq (WINNT,$(OS_ARCH))
|
||||||
|
cd $(DIST); $(CYGWIN_WRAPPER) 7z a -t7z -m0=lzma2 -mx=9 -aoa -bb3 $(PKG_BASENAME).7z $(MOZ_PKG_DIR)
|
||||||
|
else
|
||||||
|
cd $(DIST); XZ_OPT=-9e $(TAR) cfJv $(PKG_BASENAME).tar.xz $(MOZ_PKG_DIR)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
Loading…
Add table
Add a link
Reference in a new issue