mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-27 21:00:50 +00:00
Merge m-c to autoland, a=merge
MozReview-Commit-ID: KmdITOdRCqU
This commit is contained in:
commit
a08b8a8c03
@ -2143,16 +2143,12 @@
|
||||
<versionRange maxVersion="13.0.0.302" minVersion="13.0.0.302" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1495" os="Linux">
|
||||
<match exp="" name="name"/>
|
||||
<match exp="libflashplayer\.so" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="24.0.0.186" minVersion="23.0.0.207" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1420" os="">
|
||||
<match exp="" name="name"/>
|
||||
<pluginItem blockID="p1420">
|
||||
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="23.0.0.205" minVersion="23.0.0.185" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
@ -2206,9 +2202,7 @@
|
||||
<versionRange maxVersion="*" minVersion="0"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1419" os="Linux">
|
||||
<match exp="" name="name"/>
|
||||
<match exp="libflashplayer\.so" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="11.2.202.643" minVersion="11.2.202.637" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
@ -2465,10 +2459,8 @@
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="18.0.0.232" minVersion="18.0.0.204" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1274" os="">
|
||||
<match exp="" name="name"/>
|
||||
<pluginItem blockID="p1274">
|
||||
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="22.0.0.211" minVersion="22.0.0.192" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
@ -2579,10 +2571,8 @@
|
||||
</targetApplication>
|
||||
</versionRange>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1494" os="">
|
||||
<match exp="" name="name"/>
|
||||
<pluginItem blockID="p1494">
|
||||
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="24.0.0.186" minVersion="23.0.0.207" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
@ -2650,10 +2640,8 @@
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="18.0.0.352" minVersion="18.0.0.343" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p160" os="">
|
||||
<match exp="" name="name"/>
|
||||
<pluginItem blockID="p160">
|
||||
<match exp="NPSWF32\.dll" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="10.2.9999" minVersion="0" severity="0" vulnerabilitystatus="1">
|
||||
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
|
||||
@ -2821,10 +2809,8 @@
|
||||
<pluginItem blockID="p28">
|
||||
<match exp="NPFFAddOn.dll" name="filename"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1421" os="Linux">
|
||||
<match exp="" name="name"/>
|
||||
<pluginItem blockID="p1421">
|
||||
<match exp="libflashplayer\.so" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="23.0.0.207" minVersion="11.2.202.643" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
@ -3020,10 +3006,8 @@
|
||||
<infoURL>https://get.adobe.com/reader</infoURL>
|
||||
<versionRange maxVersion="15.006.30174" minVersion="15.006.30174" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
<pluginItem blockID="p1422" os="">
|
||||
<match exp="" name="name"/>
|
||||
<pluginItem blockID="p1422">
|
||||
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
|
||||
<match exp="" name="description"/>
|
||||
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
|
||||
<versionRange maxVersion="23.0.0.207" minVersion="23.0.0.205" severity="0" vulnerabilitystatus="1"/>
|
||||
</pluginItem>
|
||||
|
@ -1056,6 +1056,7 @@ sys/statvfs.h
|
||||
sys/syscall.h
|
||||
sys/sysctl.h
|
||||
sys/sysinfo.h
|
||||
sys/sysmacros.h
|
||||
sys/sysmp.h
|
||||
sys/syssgi.h
|
||||
sys/system_properties.h
|
||||
|
25
docshell/base/crashtests/1331295.html
Normal file
25
docshell/base/crashtests/1331295.html
Normal file
@ -0,0 +1,25 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<script>
|
||||
function boom() {
|
||||
setTimeout(function(){
|
||||
var o=document.getElementById('b');
|
||||
document.getElementById('a').appendChild(o.parentNode.removeChild(o));
|
||||
},0);
|
||||
var o=document.getElementById('c');
|
||||
var p=document.getElementById('b');
|
||||
p.id=[o.id, o.id=p.id][0];
|
||||
o=document.getElementById('b');
|
||||
o.setAttribute('sandbox', 'disc');
|
||||
window.location.reload(true);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="boom();">
|
||||
<header id='a'></header>
|
||||
<output id='b'></output>
|
||||
<iframe id='c' sandbox='allow-same-origin' src='http://a'></iframe>
|
||||
</body>
|
||||
</html>
|
@ -13,3 +13,4 @@ load 614499-1.html
|
||||
load 678872-1.html
|
||||
skip-if(Android) pref(dom.disable_open_during_load,false) load 914521.html
|
||||
pref(browser.send_pings,true) load 1257730-1.html
|
||||
load 1331295.html
|
||||
|
@ -8100,7 +8100,11 @@ nsDocShell::CreateAboutBlankContentViewer(nsIPrincipal* aPrincipal,
|
||||
if (docFactory) {
|
||||
nsCOMPtr<nsIPrincipal> principal;
|
||||
if (mSandboxFlags & SANDBOXED_ORIGIN) {
|
||||
principal = nsNullPrincipal::CreateWithInheritedAttributes(aPrincipal);
|
||||
if (aPrincipal) {
|
||||
principal = nsNullPrincipal::CreateWithInheritedAttributes(aPrincipal);
|
||||
} else {
|
||||
principal = nsNullPrincipal::CreateWithInheritedAttributes(this);
|
||||
}
|
||||
} else {
|
||||
principal = aPrincipal;
|
||||
}
|
||||
|
@ -329,6 +329,8 @@ nsSMILAnimationController::DoSample(bool aSkipUnchangedContainers)
|
||||
return;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDocument> document(mDocument); // keeps 'this' alive too
|
||||
|
||||
// Set running sample flag -- do this before flushing styles so that when we
|
||||
// flush styles we don't end up requesting extra samples
|
||||
AutoRestore<bool> autoRestoreRunningSample(mRunningSample);
|
||||
@ -432,7 +434,6 @@ nsSMILAnimationController::DoSample(bool aSkipUnchangedContainers)
|
||||
return;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIDocument> document(mDocument); // keeps 'this' alive too
|
||||
if (isStyleFlushNeeded) {
|
||||
document->FlushPendingNotifications(FlushType::Style);
|
||||
}
|
||||
|
@ -90,10 +90,10 @@ nsSMILInstanceTime::HandleChangedInterval(
|
||||
bool objectChanged = mCreator->DependsOnBegin() ? aBeginObjectChanged :
|
||||
aEndObjectChanged;
|
||||
|
||||
RefPtr<nsSMILInstanceTime> deathGrip(this);
|
||||
mozilla::AutoRestore<bool> setVisited(mVisited);
|
||||
mVisited = true;
|
||||
|
||||
RefPtr<nsSMILInstanceTime> deathGrip(this);
|
||||
mCreator->HandleChangedInstanceTime(*GetBaseTime(), aSrcContainer, *this,
|
||||
objectChanged);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
52348
|
||||
52349
|
||||
0/nm
|
||||
0th/pt
|
||||
1/n1
|
||||
@ -26862,6 +26862,7 @@ foulmouthed
|
||||
foulness/M
|
||||
found/FSDG
|
||||
foundation/SM
|
||||
foundational
|
||||
founded/U
|
||||
founder/GMDS
|
||||
foundling/SM
|
||||
|
@ -1220,6 +1220,8 @@ SyncObjectD3D11::Init()
|
||||
!DeviceManagerDx::Get()->HasDeviceReset())
|
||||
{
|
||||
gfxDevCrash(LogReason::D3D11FinalizeFrame) << "Without device reset: " << hexa(hr);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -46,6 +46,10 @@ bool
|
||||
nsNCRFallbackEncoderWrapper::Encode(const nsAString& aUtf16,
|
||||
nsACString& aBytes)
|
||||
{
|
||||
// mozilla::dom::EncodingUtils::EncoderForEncoding fails during shutdown
|
||||
if (!mEncoder) {
|
||||
return false;
|
||||
}
|
||||
// nsIUnicodeEncoder uses int32_t for sizes :-(
|
||||
if (aUtf16.Length() > INT32_MAX) {
|
||||
return false;
|
||||
|
@ -1636,8 +1636,10 @@ OutlineTypedObject::obj_trace(JSTracer* trc, JSObject* object)
|
||||
newData += reinterpret_cast<uint8_t*>(owner) - reinterpret_cast<uint8_t*>(oldOwner);
|
||||
typedObj.setData(newData);
|
||||
|
||||
Nursery& nursery = typedObj.zoneFromAnyThread()->group()->nursery();
|
||||
nursery.maybeSetForwardingPointer(trc, oldData, newData, /* direct = */ false);
|
||||
if (trc->isTenuringTracer()) {
|
||||
Nursery& nursery = typedObj.zoneFromAnyThread()->group()->nursery();
|
||||
nursery.maybeSetForwardingPointer(trc, oldData, newData, /* direct = */ false);
|
||||
}
|
||||
}
|
||||
|
||||
if (!descr.opaque() || !typedObj.isAttached())
|
||||
|
@ -41,6 +41,9 @@ js::Allocate(JSContext* cx, AllocKind kind, size_t nDynamicSlots, InitialHeap he
|
||||
|
||||
// Off-thread alloc cannot trigger GC or make runtime assertions.
|
||||
if (cx->helperThread()) {
|
||||
// The zone group used by the helper thread should have been created
|
||||
// with a disabled nursery.
|
||||
MOZ_ASSERT(!cx->nursery().isEnabled());
|
||||
JSObject* obj = GCRuntime::tryNewTenuredObject<NoGC>(cx, kind, thingSize, nDynamicSlots);
|
||||
if (MOZ_UNLIKELY(allowGC && !obj))
|
||||
ReportOutOfMemory(cx);
|
||||
|
@ -2414,7 +2414,7 @@ JSObject*
|
||||
js::TenuringTracer::moveToTenured(JSObject* src)
|
||||
{
|
||||
MOZ_ASSERT(IsInsideNursery(src));
|
||||
MOZ_ASSERT(!src->zone()->usedByExclusiveThread);
|
||||
MOZ_ASSERT(!src->zone()->usedByHelperThread());
|
||||
|
||||
AllocKind dstKind = src->allocKindForTenure(nursery());
|
||||
Zone* zone = src->zone();
|
||||
|
@ -39,28 +39,22 @@ template <typename T>
|
||||
static inline T*
|
||||
AllocateObjectBuffer(JSContext* cx, uint32_t count)
|
||||
{
|
||||
if (!cx->helperThread()) {
|
||||
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
|
||||
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(cx->zone(), nbytes));
|
||||
if (!buffer)
|
||||
ReportOutOfMemory(cx);
|
||||
return buffer;
|
||||
}
|
||||
return cx->zone()->pod_malloc<T>(count);
|
||||
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
|
||||
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(cx->zone(), nbytes));
|
||||
if (!buffer)
|
||||
ReportOutOfMemory(cx);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static inline T*
|
||||
AllocateObjectBuffer(JSContext* cx, JSObject* obj, uint32_t count)
|
||||
{
|
||||
if (!cx->helperThread()) {
|
||||
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
|
||||
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(obj, nbytes));
|
||||
if (!buffer)
|
||||
ReportOutOfMemory(cx);
|
||||
return buffer;
|
||||
}
|
||||
return obj->zone()->pod_malloc<T>(count);
|
||||
size_t nbytes = JS_ROUNDUP(count * sizeof(T), sizeof(Value));
|
||||
T* buffer = static_cast<T*>(cx->nursery().allocateBuffer(obj, nbytes));
|
||||
if (!buffer)
|
||||
ReportOutOfMemory(cx);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// If this returns null then the old buffer will be left alone.
|
||||
@ -69,15 +63,12 @@ static inline T*
|
||||
ReallocateObjectBuffer(JSContext* cx, JSObject* obj, T* oldBuffer,
|
||||
uint32_t oldCount, uint32_t newCount)
|
||||
{
|
||||
if (!cx->helperThread()) {
|
||||
T* buffer = static_cast<T*>(cx->nursery().reallocateBuffer(obj, oldBuffer,
|
||||
oldCount * sizeof(T),
|
||||
newCount * sizeof(T)));
|
||||
if (!buffer)
|
||||
ReportOutOfMemory(cx);
|
||||
return buffer;
|
||||
}
|
||||
return obj->zone()->pod_realloc<T>(oldBuffer, oldCount, newCount);
|
||||
T* buffer = static_cast<T*>(cx->nursery().reallocateBuffer(obj, oldBuffer,
|
||||
oldCount * sizeof(T),
|
||||
newCount * sizeof(T)));
|
||||
if (!buffer)
|
||||
ReportOutOfMemory(cx);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
@ -298,6 +298,7 @@ js::Nursery::allocate(size_t size)
|
||||
{
|
||||
MOZ_ASSERT(isEnabled());
|
||||
MOZ_ASSERT(!JS::CurrentThreadIsHeapBusy());
|
||||
MOZ_ASSERT(CurrentThreadCanAccessRuntime(zoneGroup()->runtime));
|
||||
MOZ_ASSERT_IF(currentChunk_ == currentStartChunk_, position() >= currentStartPosition_);
|
||||
MOZ_ASSERT(position() % gc::CellSize == 0);
|
||||
MOZ_ASSERT(size % gc::CellSize == 0);
|
||||
|
@ -237,6 +237,8 @@ class Nursery
|
||||
return numChunks() * gc::ChunkSize;
|
||||
}
|
||||
size_t sizeOfMallocedBuffers(mozilla::MallocSizeOf mallocSizeOf) const {
|
||||
if (!mallocedBuffers.initialized())
|
||||
return 0;
|
||||
size_t total = 0;
|
||||
for (MallocedBuffersSet::Range r = mallocedBuffers.all(); !r.empty(); r.popFront())
|
||||
total += mallocSizeOf(r.front());
|
||||
|
@ -179,7 +179,7 @@ gc::GCRuntime::startVerifyPreBarriers()
|
||||
if (verifyPreData || isIncrementalGCInProgress())
|
||||
return;
|
||||
|
||||
if (IsIncrementalGCUnsafe(rt) != AbortReason::None || TlsContext.get()->keepAtoms || rt->exclusiveThreadsPresent())
|
||||
if (IsIncrementalGCUnsafe(rt) != AbortReason::None || TlsContext.get()->keepAtoms || rt->hasHelperThreadZones())
|
||||
return;
|
||||
|
||||
number++;
|
||||
@ -239,11 +239,10 @@ gc::GCRuntime::startVerifyPreBarriers()
|
||||
marker.start();
|
||||
|
||||
for (ZonesIter zone(rt, WithAtoms); !zone.done(); zone.next()) {
|
||||
MOZ_ASSERT(!zone->usedByHelperThread());
|
||||
PurgeJITCaches(zone);
|
||||
if (!zone->usedByExclusiveThread) {
|
||||
zone->setNeedsIncrementalBarrier(true, Zone::UpdateJit);
|
||||
zone->arenas.purge();
|
||||
}
|
||||
zone->setNeedsIncrementalBarrier(true, Zone::UpdateJit);
|
||||
zone->arenas.purge();
|
||||
}
|
||||
|
||||
return;
|
||||
@ -353,7 +352,7 @@ gc::GCRuntime::endVerifyPreBarriers()
|
||||
if (!compartmentCreated &&
|
||||
IsIncrementalGCUnsafe(rt) == AbortReason::None &&
|
||||
!TlsContext.get()->keepAtoms &&
|
||||
!rt->exclusiveThreadsPresent())
|
||||
!rt->hasHelperThreadZones())
|
||||
{
|
||||
CheckEdgeTracer cetrc(rt);
|
||||
|
||||
|
@ -51,7 +51,6 @@ JS::Zone::Zone(JSRuntime* rt, ZoneGroup* group)
|
||||
initialShapes_(group, this, InitialShapeSet()),
|
||||
data(group, nullptr),
|
||||
isSystem(group, false),
|
||||
usedByExclusiveThread(false),
|
||||
#ifdef DEBUG
|
||||
gcLastZoneGroupIndex(group, 0),
|
||||
#endif
|
||||
@ -105,7 +104,8 @@ Zone::setNeedsIncrementalBarrier(bool needs, ShouldUpdateJit updateJit)
|
||||
jitUsingBarriers_ = needs;
|
||||
}
|
||||
|
||||
MOZ_ASSERT_IF(needs && isAtomsZone(), !runtimeFromActiveCooperatingThread()->exclusiveThreadsPresent());
|
||||
MOZ_ASSERT_IF(needs && isAtomsZone(),
|
||||
!runtimeFromActiveCooperatingThread()->hasHelperThreadZones());
|
||||
MOZ_ASSERT_IF(needs, canCollect());
|
||||
needsIncrementalBarrier_ = needs;
|
||||
}
|
||||
@ -295,7 +295,7 @@ Zone::gcNumber()
|
||||
{
|
||||
// Zones in use by exclusive threads are not collected, and threads using
|
||||
// them cannot access the main runtime's gcNumber without racing.
|
||||
return usedByExclusiveThread ? 0 : runtimeFromActiveCooperatingThread()->gc.gcNumber();
|
||||
return usedByHelperThread() ? 0 : runtimeFromActiveCooperatingThread()->gc.gcNumber();
|
||||
}
|
||||
|
||||
js::jit::JitZone*
|
||||
@ -324,10 +324,10 @@ bool
|
||||
Zone::canCollect()
|
||||
{
|
||||
// Zones cannot be collected while in use by other threads.
|
||||
if (usedByExclusiveThread)
|
||||
if (usedByHelperThread())
|
||||
return false;
|
||||
JSRuntime* rt = runtimeFromAnyThread();
|
||||
if (isAtomsZone() && rt->exclusiveThreadsPresent())
|
||||
if (isAtomsZone() && rt->hasHelperThreadZones())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
@ -468,7 +468,9 @@ struct Zone : public JS::shadow::Zone,
|
||||
|
||||
js::ZoneGroupData<bool> isSystem;
|
||||
|
||||
mozilla::Atomic<bool> usedByExclusiveThread;
|
||||
bool usedByHelperThread() {
|
||||
return !isAtomsZone() && group()->usedByHelperThread;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
js::ZoneGroupData<unsigned> gcLastZoneGroupIndex;
|
||||
@ -598,11 +600,8 @@ struct Zone : public JS::shadow::Zone,
|
||||
|
||||
namespace js {
|
||||
|
||||
// Iterate over all zone groups except those which may be in use by parse
|
||||
// threads. Pretty soon this will exclude zone groups in use by parse threads
|
||||
// (as for ZonesIter), i.e. the zone groups in use by cooperating threads,
|
||||
// except that right now parse threads use zones in the same zone group as
|
||||
// cooperating threads (bug 1323066).
|
||||
// Iterate over all zone groups except those which may be in use by helper
|
||||
// thread parse tasks.
|
||||
class ZoneGroupsIter
|
||||
{
|
||||
gc::AutoEnterIteration iterMarker;
|
||||
@ -613,13 +612,18 @@ class ZoneGroupsIter
|
||||
explicit ZoneGroupsIter(JSRuntime* rt) : iterMarker(&rt->gc) {
|
||||
it = rt->gc.groups.ref().begin();
|
||||
end = rt->gc.groups.ref().end();
|
||||
|
||||
if (!done() && (*it)->usedByHelperThread)
|
||||
next();
|
||||
}
|
||||
|
||||
bool done() const { return it == end; }
|
||||
|
||||
void next() {
|
||||
MOZ_ASSERT(!done());
|
||||
it++;
|
||||
do {
|
||||
it++;
|
||||
} while (!done() && (*it)->usedByHelperThread);
|
||||
}
|
||||
|
||||
ZoneGroup* get() const {
|
||||
@ -703,7 +707,7 @@ class ZonesIter
|
||||
if (zone.ref().done()) {
|
||||
zone.reset();
|
||||
group.next();
|
||||
} else if (!zone.ref().get()->usedByExclusiveThread) {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -15,8 +15,9 @@ namespace js {
|
||||
ZoneGroup::ZoneGroup(JSRuntime* runtime)
|
||||
: runtime(runtime),
|
||||
ownerContext_(TlsContext.get()),
|
||||
enterCount(this, 1),
|
||||
zones_(),
|
||||
enterCount(1),
|
||||
zones_(this),
|
||||
usedByHelperThread(false),
|
||||
nursery_(this, this),
|
||||
storeBuffer_(this, runtime, nursery()),
|
||||
blocksToFreeAfterMinorGC((size_t) JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
|
||||
|
@ -22,19 +22,12 @@ class AutoKeepAtoms;
|
||||
typedef Vector<JS::Zone*, 4, SystemAllocPolicy> ZoneVector;
|
||||
|
||||
// Zone groups encapsulate data about a group of zones that are logically
|
||||
// related in some way. Currently, each runtime has a single zone group, and
|
||||
// all zones except the atoms zone (which has no group) are in that group.
|
||||
// This will change soon.
|
||||
// related in some way.
|
||||
//
|
||||
// When JSRuntimes become multithreaded (also happening soon; see bug 1323066),
|
||||
// zone groups will be the primary means by which threads ensure exclusive
|
||||
// access to the data they are using. Most data in a zone group, its zones,
|
||||
// Zone groups are the primary means by which threads ensure exclusive access
|
||||
// to the data they are using. Most data in a zone group, its zones,
|
||||
// compartments, GC things and so forth may only be used by the thread that has
|
||||
// entered the zone group.
|
||||
//
|
||||
// This restriction is not quite in place yet: zones used by an parse thread
|
||||
// are accessed by that thread even though it does not have exclusive access
|
||||
// to the entire zone group. This will also be changing soon.
|
||||
|
||||
class ZoneGroup
|
||||
{
|
||||
@ -46,7 +39,7 @@ class ZoneGroup
|
||||
UnprotectedData<CooperatingContext> ownerContext_;
|
||||
|
||||
// The number of times the context has entered this zone group.
|
||||
ZoneGroupData<size_t> enterCount;
|
||||
UnprotectedData<size_t> enterCount;
|
||||
|
||||
public:
|
||||
CooperatingContext& ownerContext() { return ownerContext_.ref(); }
|
||||
@ -58,10 +51,13 @@ class ZoneGroup
|
||||
|
||||
// All zones in the group.
|
||||
private:
|
||||
ActiveThreadOrGCTaskData<ZoneVector> zones_;
|
||||
ZoneGroupOrGCTaskData<ZoneVector> zones_;
|
||||
public:
|
||||
ZoneVector& zones() { return zones_.ref(); }
|
||||
|
||||
// Whether a zone in this group is in use by a helper thread.
|
||||
mozilla::Atomic<bool> usedByHelperThread;
|
||||
|
||||
explicit ZoneGroup(JSRuntime* runtime);
|
||||
~ZoneGroup();
|
||||
|
||||
|
@ -804,7 +804,7 @@ DoGetElemFallback(JSContext* cx, BaselineFrame* frame, ICGetElem_Fallback* stub_
|
||||
bool isTemporarilyUnoptimizable = false;
|
||||
if (!attached && !JitOptions.disableCacheIR) {
|
||||
ICStubEngine engine = ICStubEngine::Baseline;
|
||||
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetElem, engine,
|
||||
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetElem,
|
||||
&isTemporarilyUnoptimizable, lhs, rhs, CanAttachGetter::Yes);
|
||||
if (gen.tryAttachStub()) {
|
||||
ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(),
|
||||
|
@ -40,14 +40,12 @@ IRGenerator::IRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, Cac
|
||||
{}
|
||||
|
||||
GetPropIRGenerator::GetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc,
|
||||
CacheKind cacheKind, ICStubEngine engine,
|
||||
bool* isTemporarilyUnoptimizable,
|
||||
CacheKind cacheKind, bool* isTemporarilyUnoptimizable,
|
||||
HandleValue val, HandleValue idVal,
|
||||
CanAttachGetter canAttachGetter)
|
||||
: IRGenerator(cx, script, pc, cacheKind),
|
||||
val_(val),
|
||||
idVal_(idVal),
|
||||
engine_(engine),
|
||||
isTemporarilyUnoptimizable_(isTemporarilyUnoptimizable),
|
||||
canAttachGetter_(canAttachGetter),
|
||||
preliminaryObjectAction_(PreliminaryObjectAction::None)
|
||||
@ -282,7 +280,7 @@ enum NativeGetPropCacheability {
|
||||
static NativeGetPropCacheability
|
||||
CanAttachNativeGetProp(JSContext* cx, HandleObject obj, HandleId id,
|
||||
MutableHandleNativeObject holder, MutableHandleShape shape,
|
||||
jsbytecode* pc, ICStubEngine engine, CanAttachGetter canAttachGetter,
|
||||
jsbytecode* pc, CanAttachGetter canAttachGetter,
|
||||
bool* isTemporarilyUnoptimizable)
|
||||
{
|
||||
MOZ_ASSERT(JSID_IS_STRING(id) || JSID_IS_SYMBOL(id));
|
||||
@ -318,11 +316,8 @@ CanAttachNativeGetProp(JSContext* cx, HandleObject obj, HandleId id,
|
||||
if (canAttachGetter == CanAttachGetter::No)
|
||||
return CanAttachNone;
|
||||
|
||||
if (IsCacheableGetPropCallScripted(obj, holder, shape, isTemporarilyUnoptimizable)) {
|
||||
// See bug 1226816.
|
||||
if (engine != ICStubEngine::IonSharedIC)
|
||||
return CanAttachCallGetter;
|
||||
}
|
||||
if (IsCacheableGetPropCallScripted(obj, holder, shape, isTemporarilyUnoptimizable))
|
||||
return CanAttachCallGetter;
|
||||
|
||||
if (IsCacheableGetPropCallNative(obj, holder, shape))
|
||||
return CanAttachCallGetter;
|
||||
@ -499,7 +494,7 @@ GetPropIRGenerator::tryAttachNative(HandleObject obj, ObjOperandId objId, Handle
|
||||
RootedNativeObject holder(cx_);
|
||||
|
||||
NativeGetPropCacheability type = CanAttachNativeGetProp(cx_, obj, id, &holder, &shape, pc_,
|
||||
engine_, canAttachGetter_,
|
||||
canAttachGetter_,
|
||||
isTemporarilyUnoptimizable_);
|
||||
MOZ_ASSERT_IF(idempotent(),
|
||||
type == CanAttachNone || (type == CanAttachReadSlot && holder));
|
||||
@ -554,7 +549,7 @@ GetPropIRGenerator::tryAttachWindowProxy(HandleObject obj, ObjOperandId objId, H
|
||||
RootedShape shape(cx_);
|
||||
RootedNativeObject holder(cx_);
|
||||
NativeGetPropCacheability type = CanAttachNativeGetProp(cx_, windowObj, id, &holder, &shape, pc_,
|
||||
engine_, canAttachGetter_,
|
||||
canAttachGetter_,
|
||||
isTemporarilyUnoptimizable_);
|
||||
switch (type) {
|
||||
case CanAttachNone:
|
||||
@ -647,7 +642,7 @@ GetPropIRGenerator::tryAttachDOMProxyExpando(HandleObject obj, ObjOperandId objI
|
||||
RootedNativeObject holder(cx_);
|
||||
RootedShape propShape(cx_);
|
||||
NativeGetPropCacheability canCache =
|
||||
CanAttachNativeGetProp(cx_, expandoObj, id, &holder, &propShape, pc_, engine_,
|
||||
CanAttachNativeGetProp(cx_, expandoObj, id, &holder, &propShape, pc_,
|
||||
canAttachGetter_, isTemporarilyUnoptimizable_);
|
||||
if (canCache != CanAttachReadSlot && canCache != CanAttachCallGetter)
|
||||
return false;
|
||||
@ -750,7 +745,7 @@ GetPropIRGenerator::tryAttachDOMProxyUnshadowed(HandleObject obj, ObjOperandId o
|
||||
RootedNativeObject holder(cx_);
|
||||
RootedShape shape(cx_);
|
||||
NativeGetPropCacheability canCache = CanAttachNativeGetProp(cx_, checkObj, id, &holder, &shape,
|
||||
pc_, engine_, canAttachGetter_,
|
||||
pc_, canAttachGetter_,
|
||||
isTemporarilyUnoptimizable_);
|
||||
MOZ_ASSERT_IF(idempotent(),
|
||||
canCache == CanAttachNone || (canCache == CanAttachReadSlot && holder));
|
||||
@ -1071,7 +1066,7 @@ GetPropIRGenerator::tryAttachPrimitive(ValOperandId valId, HandleId id)
|
||||
RootedShape shape(cx_);
|
||||
RootedNativeObject holder(cx_);
|
||||
NativeGetPropCacheability type = CanAttachNativeGetProp(cx_, proto, id, &holder, &shape, pc_,
|
||||
engine_, canAttachGetter_,
|
||||
canAttachGetter_,
|
||||
isTemporarilyUnoptimizable_);
|
||||
if (type != CanAttachReadSlot)
|
||||
return false;
|
||||
|
@ -912,7 +912,6 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator
|
||||
{
|
||||
HandleValue val_;
|
||||
HandleValue idVal_;
|
||||
ICStubEngine engine_;
|
||||
bool* isTemporarilyUnoptimizable_;
|
||||
CanAttachGetter canAttachGetter_;
|
||||
|
||||
@ -972,8 +971,8 @@ class MOZ_RAII GetPropIRGenerator : public IRGenerator
|
||||
|
||||
public:
|
||||
GetPropIRGenerator(JSContext* cx, HandleScript script, jsbytecode* pc, CacheKind cacheKind,
|
||||
ICStubEngine engine, bool* isTemporarilyUnoptimizable,
|
||||
HandleValue val,HandleValue idVal, CanAttachGetter canAttachGetter);
|
||||
bool* isTemporarilyUnoptimizable, HandleValue val,HandleValue idVal,
|
||||
CanAttachGetter canAttachGetter);
|
||||
|
||||
bool tryAttachStub();
|
||||
bool tryAttachIdempotentStub();
|
||||
|
@ -3077,9 +3077,6 @@ InvalidateActivation(FreeOp* fop, const JitActivationIterator& activations, bool
|
||||
it.returnAddressToFp());
|
||||
break;
|
||||
}
|
||||
case JitFrame_IonStub:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " ion stub frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
case JitFrame_BaselineStub:
|
||||
JitSpew(JitSpew_IonInvalidate, "#%" PRIuSIZE " baseline stub frame @ %p", frameno, it.fp());
|
||||
break;
|
||||
|
@ -138,8 +138,7 @@ IonGetPropertyIC::update(JSContext* cx, HandleScript outerScript, IonGetProperty
|
||||
ic->monitoredResult() ? CanAttachGetter::Yes : CanAttachGetter::No;
|
||||
jsbytecode* pc = ic->idempotent() ? nullptr : ic->pc();
|
||||
bool isTemporarilyUnoptimizable;
|
||||
GetPropIRGenerator gen(cx, outerScript, pc, ic->kind(), ICStubEngine::IonIC,
|
||||
&isTemporarilyUnoptimizable,
|
||||
GetPropIRGenerator gen(cx, outerScript, pc, ic->kind(), &isTemporarilyUnoptimizable,
|
||||
val, idVal, canAttachGetter);
|
||||
if (ic->idempotent() ? gen.tryAttachIdempotentStub() : gen.tryAttachStub()) {
|
||||
attached = ic->attachCacheIRStub(cx, gen.writerRef(), gen.cacheKind(),
|
||||
|
@ -34,10 +34,9 @@ enum FrameType
|
||||
// JS frame used by the baseline JIT.
|
||||
JitFrame_BaselineJS,
|
||||
|
||||
// Frame pushed for JIT stubs that make non-tail calls, so that the
|
||||
// Frame pushed by Baseline stubs that make non-tail calls, so that the
|
||||
// return address -> ICEntry mapping works.
|
||||
JitFrame_BaselineStub,
|
||||
JitFrame_IonStub,
|
||||
|
||||
// The entry frame is the initial prologue block transitioning from the VM
|
||||
// into the Ion world.
|
||||
@ -148,9 +147,6 @@ class JitFrameIterator
|
||||
bool isIonJS() const {
|
||||
return type_ == JitFrame_IonJS;
|
||||
}
|
||||
bool isIonStub() const {
|
||||
return type_ == JitFrame_IonStub;
|
||||
}
|
||||
bool isIonICCall() const {
|
||||
return type_ == JitFrame_IonICCall;
|
||||
}
|
||||
|
@ -1219,12 +1219,12 @@ UpdateIonJSFrameForMinorGC(JSTracer* trc, const JitFrameIterator& frame)
|
||||
}
|
||||
|
||||
static void
|
||||
TraceJitStubFrame(JSTracer* trc, const JitFrameIterator& frame)
|
||||
TraceBaselineStubFrame(JSTracer* trc, const JitFrameIterator& frame)
|
||||
{
|
||||
// Trace the ICStub pointer stored in the stub frame. This is necessary
|
||||
// so that we don't destroy the stub code after unlinking the stub.
|
||||
|
||||
MOZ_ASSERT(frame.type() == JitFrame_IonStub || frame.type() == JitFrame_BaselineStub);
|
||||
MOZ_ASSERT(frame.type() == JitFrame_BaselineStub);
|
||||
JitStubFrameLayout* layout = (JitStubFrameLayout*)frame.fp();
|
||||
|
||||
if (ICStub* stub = layout->maybeStubPtr()) {
|
||||
@ -1487,8 +1487,7 @@ TraceJitActivation(JSTracer* trc, const JitActivationIterator& activations)
|
||||
TraceIonJSFrame(trc, frames);
|
||||
break;
|
||||
case JitFrame_BaselineStub:
|
||||
case JitFrame_IonStub:
|
||||
TraceJitStubFrame(trc, frames);
|
||||
TraceBaselineStubFrame(trc, frames);
|
||||
break;
|
||||
case JitFrame_Bailout:
|
||||
TraceBailoutFrame(trc, frames);
|
||||
@ -1559,7 +1558,7 @@ GetPcScript(JSContext* cx, JSScript** scriptRes, jsbytecode** pcRes)
|
||||
if (it.isBaselineStub()) {
|
||||
++it;
|
||||
MOZ_ASSERT(it.isBaselineJS());
|
||||
} else if (it.isIonStub() || it.isIonICCall()) {
|
||||
} else if (it.isIonICCall()) {
|
||||
++it;
|
||||
MOZ_ASSERT(it.isIonJS());
|
||||
}
|
||||
@ -2729,10 +2728,6 @@ JitFrameIterator::dump() const
|
||||
}
|
||||
break;
|
||||
}
|
||||
case JitFrame_IonStub:
|
||||
fprintf(stderr, " Ion stub frame\n");
|
||||
fprintf(stderr, " Frame size: %u\n", unsigned(current()->prevFrameLocalSize()));
|
||||
break;
|
||||
case JitFrame_Rectifier:
|
||||
fprintf(stderr, " Rectifier frame\n");
|
||||
fprintf(stderr, " Frame size: %u\n", unsigned(current()->prevFrameLocalSize()));
|
||||
|
@ -557,10 +557,9 @@ ICStubCompiler::callVM(const VMFunction& fun, MacroAssembler& masm)
|
||||
return false;
|
||||
|
||||
MOZ_ASSERT(fun.expectTailCall == NonTailCall);
|
||||
if (engine_ == Engine::Baseline)
|
||||
EmitBaselineCallVM(code, masm);
|
||||
else
|
||||
EmitIonCallVM(code, fun.explicitStackSlots(), masm);
|
||||
MOZ_ASSERT(engine_ == Engine::Baseline);
|
||||
|
||||
EmitBaselineCallVM(code, masm);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2035,7 +2034,7 @@ ComputeGetPropResult(JSContext* cx, BaselineFrame* frame, JSOp op, HandlePropert
|
||||
{
|
||||
// Handle arguments.length and arguments.callee on optimized arguments, as
|
||||
// it is not an object.
|
||||
if (frame && val.isMagic(JS_OPTIMIZED_ARGUMENTS) && IsOptimizedArguments(frame, val)) {
|
||||
if (val.isMagic(JS_OPTIMIZED_ARGUMENTS) && IsOptimizedArguments(frame, val)) {
|
||||
if (op == JSOP_LENGTH) {
|
||||
res.setInt32(frame->numActualArgs());
|
||||
} else {
|
||||
@ -2060,17 +2059,16 @@ ComputeGetPropResult(JSContext* cx, BaselineFrame* frame, JSOp op, HandlePropert
|
||||
}
|
||||
|
||||
static bool
|
||||
DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
|
||||
DoGetPropFallback(JSContext* cx, BaselineFrame* frame, ICGetProp_Fallback* stub_,
|
||||
MutableHandleValue val, MutableHandleValue res)
|
||||
{
|
||||
SharedStubInfo info(cx, payload, stub_->icEntry());
|
||||
ICStubCompiler::Engine engine = info.engine();
|
||||
SharedStubInfo info(cx, frame, stub_->icEntry());
|
||||
HandleScript script = info.innerScript();
|
||||
|
||||
// This fallback stub may trigger debug mode toggling.
|
||||
DebugModeOSRVolatileStub<ICGetProp_Fallback*> stub(engine, info.maybeFrame(), stub_);
|
||||
DebugModeOSRVolatileStub<ICGetProp_Fallback*> stub(frame, stub_);
|
||||
|
||||
jsbytecode* pc = info.pc();
|
||||
jsbytecode* pc = stub_->icEntry()->pc(script);
|
||||
JSOp op = JSOp(*pc);
|
||||
FallbackICSpew(cx, stub, "GetProp(%s)", CodeName[op]);
|
||||
|
||||
@ -2097,9 +2095,8 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
|
||||
// Discard all stubs in this IC and replace with generic getprop stub.
|
||||
for (ICStubIterator iter = stub->beginChain(); !iter.atEnd(); iter++)
|
||||
iter.unlink(cx);
|
||||
ICGetProp_Generic::Compiler compiler(cx, engine,
|
||||
stub->fallbackMonitorStub()->firstMonitorStub());
|
||||
ICStub* newStub = compiler.getStub(compiler.getStubSpace(info.outerScript(cx)));
|
||||
ICGetProp_Generic::Compiler compiler(cx, stub->fallbackMonitorStub()->firstMonitorStub());
|
||||
ICStub* newStub = compiler.getStub(compiler.getStubSpace(script));
|
||||
if (!newStub)
|
||||
return false;
|
||||
stub->addNewStub(newStub);
|
||||
@ -2108,11 +2105,12 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
|
||||
|
||||
if (!attached && !JitOptions.disableCacheIR) {
|
||||
RootedValue idVal(cx, StringValue(name));
|
||||
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetProp, engine,
|
||||
&isTemporarilyUnoptimizable, val, idVal, CanAttachGetter::Yes);
|
||||
GetPropIRGenerator gen(cx, script, pc, CacheKind::GetProp, &isTemporarilyUnoptimizable,
|
||||
val, idVal, CanAttachGetter::Yes);
|
||||
if (gen.tryAttachStub()) {
|
||||
ICStub* newStub = AttachBaselineCacheIRStub(cx, gen.writerRef(), gen.cacheKind(),
|
||||
engine, info.outerScript(cx), stub);
|
||||
ICStubEngine::Baseline, script,
|
||||
stub);
|
||||
if (newStub) {
|
||||
JitSpew(JitSpew_BaselineIC, " Attached CacheIR stub");
|
||||
attached = true;
|
||||
@ -2124,7 +2122,7 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
|
||||
}
|
||||
}
|
||||
|
||||
if (!ComputeGetPropResult(cx, info.maybeFrame(), op, name, val, res))
|
||||
if (!ComputeGetPropResult(cx, frame, op, name, val, res))
|
||||
return false;
|
||||
|
||||
TypeScript::Monitor(cx, script, pc, res);
|
||||
@ -2147,7 +2145,7 @@ DoGetPropFallback(JSContext* cx, void* payload, ICGetProp_Fallback* stub_,
|
||||
return true;
|
||||
}
|
||||
|
||||
typedef bool (*DoGetPropFallbackFn)(JSContext*, void*, ICGetProp_Fallback*,
|
||||
typedef bool (*DoGetPropFallbackFn)(JSContext*, BaselineFrame*, ICGetProp_Fallback*,
|
||||
MutableHandleValue, MutableHandleValue);
|
||||
static const VMFunction DoGetPropFallbackInfo =
|
||||
FunctionInfo<DoGetPropFallbackFn>(DoGetPropFallback, "DoGetPropFallback", TailCall,
|
||||
@ -2166,7 +2164,7 @@ ICGetProp_Fallback::Compiler::generateStubCode(MacroAssembler& masm)
|
||||
// Push arguments.
|
||||
masm.pushValue(R0);
|
||||
masm.push(ICStubReg);
|
||||
pushStubPayload(masm, R0.scratchReg());
|
||||
masm.pushBaselineFramePtr(BaselineFrameReg, R0.scratchReg());
|
||||
|
||||
if (!tailCallVM(DoGetPropFallbackInfo, masm))
|
||||
return false;
|
||||
@ -2228,19 +2226,19 @@ ICGetProp_Generic::Clone(JSContext* cx, ICStubSpace* space, ICStub* firstMonitor
|
||||
}
|
||||
|
||||
static bool
|
||||
DoGetPropGeneric(JSContext* cx, void* payload, ICGetProp_Generic* stub,
|
||||
DoGetPropGeneric(JSContext* cx, BaselineFrame* frame, ICGetProp_Generic* stub,
|
||||
MutableHandleValue val, MutableHandleValue res)
|
||||
{
|
||||
ICFallbackStub* fallback = stub->getChainFallback();
|
||||
SharedStubInfo info(cx, payload, fallback->icEntry());
|
||||
HandleScript script = info.innerScript();
|
||||
jsbytecode* pc = info.pc();
|
||||
JSScript* script = frame->script();
|
||||
jsbytecode* pc = fallback->icEntry()->pc(script);
|
||||
JSOp op = JSOp(*pc);
|
||||
RootedPropertyName name(cx, script->getName(pc));
|
||||
return ComputeGetPropResult(cx, info.maybeFrame(), op, name, val, res);
|
||||
return ComputeGetPropResult(cx, frame, op, name, val, res);
|
||||
}
|
||||
|
||||
typedef bool (*DoGetPropGenericFn)(JSContext*, void*, ICGetProp_Generic*, MutableHandleValue, MutableHandleValue);
|
||||
typedef bool (*DoGetPropGenericFn)(JSContext*, BaselineFrame*, ICGetProp_Generic*,
|
||||
MutableHandleValue, MutableHandleValue);
|
||||
static const VMFunction DoGetPropGenericInfo =
|
||||
FunctionInfo<DoGetPropGenericFn>(DoGetPropGeneric, "DoGetPropGeneric");
|
||||
|
||||
|
@ -2392,8 +2392,8 @@ class ICGetProp_Generic : public ICMonitoredStub
|
||||
MOZ_MUST_USE bool generateStubCode(MacroAssembler& masm);
|
||||
ICStub* firstMonitorStub_;
|
||||
public:
|
||||
explicit Compiler(JSContext* cx, Engine engine, ICStub* firstMonitorStub)
|
||||
: ICStubCompiler(cx, ICStub::GetProp_Generic, engine),
|
||||
explicit Compiler(JSContext* cx, ICStub* firstMonitorStub)
|
||||
: ICStubCompiler(cx, ICStub::GetProp_Generic, ICStubEngine::Baseline),
|
||||
firstMonitorStub_(firstMonitorStub)
|
||||
{}
|
||||
|
||||
|
@ -150,22 +150,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
|
||||
masm.call(target);
|
||||
}
|
||||
|
||||
inline void
|
||||
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
||||
{
|
||||
uint32_t descriptor = MakeFrameDescriptor(masm.framePushed(), JitFrame_IonStub,
|
||||
ExitFrameLayout::Size());
|
||||
masm.Push(Imm32(descriptor));
|
||||
masm.callJit(target);
|
||||
|
||||
// Remove rest of the frame left on the stack. We remove the return address
|
||||
// which is implicitly popped when returning.
|
||||
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
|
||||
|
||||
// Pop arguments from framePushed.
|
||||
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
|
||||
}
|
||||
|
||||
// Size of vales pushed by EmitEnterStubFrame.
|
||||
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
|
||||
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);
|
||||
|
@ -137,12 +137,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
|
||||
masm.call(target);
|
||||
}
|
||||
|
||||
inline void
|
||||
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
||||
{
|
||||
MOZ_CRASH("Not implemented yet.");
|
||||
}
|
||||
|
||||
// Size of values pushed by EmitEnterStubFrame.
|
||||
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
|
||||
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);
|
||||
|
@ -143,22 +143,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
|
||||
masm.call(target);
|
||||
}
|
||||
|
||||
inline void
|
||||
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
||||
{
|
||||
uint32_t descriptor = MakeFrameDescriptor(masm.framePushed(), JitFrame_IonStub,
|
||||
ExitFrameLayout::Size());
|
||||
masm.Push(Imm32(descriptor));
|
||||
masm.callJit(target);
|
||||
|
||||
// Remove rest of the frame left on the stack. We remove the return address
|
||||
// which is implicitly popped when returning.
|
||||
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
|
||||
|
||||
// Pop arguments from framePushed.
|
||||
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
|
||||
}
|
||||
|
||||
struct BaselineStubFrame {
|
||||
uintptr_t savedFrame;
|
||||
uintptr_t savedStub;
|
||||
|
@ -24,7 +24,6 @@ inline void EmitBaselineTailCallVM(JitCode*, MacroAssembler&, uint32_t) { MOZ_CR
|
||||
inline void EmitIonTailCallVM(JitCode*, MacroAssembler&, uint32_t) { MOZ_CRASH(); }
|
||||
inline void EmitBaselineCreateStubFrameDescriptor(MacroAssembler&, Register, uint32_t) { MOZ_CRASH(); }
|
||||
inline void EmitBaselineCallVM(JitCode*, MacroAssembler&) { MOZ_CRASH(); }
|
||||
inline void EmitIonCallVM(JitCode*, size_t, MacroAssembler&) { MOZ_CRASH(); }
|
||||
inline void EmitBaselineEnterStubFrame(MacroAssembler&, Register) { MOZ_CRASH(); }
|
||||
inline void EmitBaselineLeaveStubFrame(MacroAssembler&, bool v = false) { MOZ_CRASH(); }
|
||||
inline void EmitStowICValues(MacroAssembler&, int) { MOZ_CRASH(); }
|
||||
|
@ -133,28 +133,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
|
||||
masm.call(target);
|
||||
}
|
||||
|
||||
inline void
|
||||
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
||||
{
|
||||
// Stubs often use the return address. Which is actually accounted by the
|
||||
// caller of the stub. Though in the stubcode we fake that is part of the
|
||||
// stub. In order to make it possible to pop it. As a result we have to
|
||||
// fix it here, by subtracting it. Else it would be counted twice.
|
||||
uint32_t framePushed = masm.framePushed() - sizeof(void*);
|
||||
|
||||
uint32_t descriptor = MakeFrameDescriptor(framePushed, JitFrame_IonStub,
|
||||
ExitFrameLayout::Size());
|
||||
masm.Push(Imm32(descriptor));
|
||||
masm.call(target);
|
||||
|
||||
// Remove rest of the frame left on the stack. We remove the return address
|
||||
// which is implicitly poped when returning.
|
||||
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
|
||||
|
||||
// Pop arguments from framePushed.
|
||||
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
|
||||
}
|
||||
|
||||
// Size of vales pushed by EmitEnterStubFrame.
|
||||
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
|
||||
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);
|
||||
|
@ -131,28 +131,6 @@ EmitBaselineCallVM(JitCode* target, MacroAssembler& masm)
|
||||
masm.call(target);
|
||||
}
|
||||
|
||||
inline void
|
||||
EmitIonCallVM(JitCode* target, size_t stackSlots, MacroAssembler& masm)
|
||||
{
|
||||
// Stubs often use the return address. Which is actually accounted by the
|
||||
// caller of the stub. Though in the stubcode we fake that is part of the
|
||||
// stub. In order to make it possible to pop it. As a result we have to
|
||||
// fix it here, by subtracting it. Else it would be counted twice.
|
||||
uint32_t framePushed = masm.framePushed() - sizeof(void*);
|
||||
|
||||
uint32_t descriptor = MakeFrameDescriptor(framePushed, JitFrame_IonStub,
|
||||
ExitFrameLayout::Size());
|
||||
masm.Push(Imm32(descriptor));
|
||||
masm.call(target);
|
||||
|
||||
// Remove rest of the frame left on the stack. We remove the return address
|
||||
// which is implicitly poped when returning.
|
||||
size_t framePop = sizeof(ExitFrameLayout) - sizeof(void*);
|
||||
|
||||
// Pop arguments from framePushed.
|
||||
masm.implicitPop(stackSlots * sizeof(void*) + framePop);
|
||||
}
|
||||
|
||||
// Size of vales pushed by EmitEnterStubFrame.
|
||||
static const uint32_t STUB_FRAME_SIZE = 4 * sizeof(void*);
|
||||
static const uint32_t STUB_FRAME_SAVED_STUB_OFFSET = sizeof(void*);
|
||||
|
@ -5,11 +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/. */
|
||||
|
||||
/*
|
||||
* TODO: Test weakmaps with gray values. Currently these are fixed up by the
|
||||
* cycle collector.
|
||||
*/
|
||||
|
||||
#include "gc/Heap.h"
|
||||
#include "gc/Zone.h"
|
||||
|
||||
@ -31,6 +26,20 @@ BEGIN_TEST(testGCGrayMarking)
|
||||
CHECK(InitGlobals());
|
||||
JSAutoCompartment ac(cx, global1);
|
||||
|
||||
InitGrayRootTracer();
|
||||
|
||||
bool ok = TestMarking() && TestWeakMaps() && TestCCWs();
|
||||
|
||||
global1 = nullptr;
|
||||
global2 = nullptr;
|
||||
RemoveGrayRootTracer();
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool
|
||||
TestMarking()
|
||||
{
|
||||
JSObject* sameTarget = AllocTargetObject();
|
||||
CHECK(sameTarget);
|
||||
|
||||
@ -40,7 +49,7 @@ BEGIN_TEST(testGCGrayMarking)
|
||||
JSObject* crossTarget = AllocTargetObject();
|
||||
CHECK(crossTarget);
|
||||
|
||||
JSObject* crossSource = AllocCrossCompartmentSourceObject(crossTarget);
|
||||
JSObject* crossSource = GetCrossCompartmentWrapper(crossTarget);
|
||||
CHECK(crossSource);
|
||||
|
||||
// Test GC with black roots marks objects black.
|
||||
@ -57,7 +66,6 @@ BEGIN_TEST(testGCGrayMarking)
|
||||
|
||||
// Test GC with black and gray roots marks objects black.
|
||||
|
||||
InitGrayRootTracer();
|
||||
grayRoots.grayRoot1 = sameSource;
|
||||
grayRoots.grayRoot2 = crossSource;
|
||||
|
||||
@ -102,11 +110,221 @@ BEGIN_TEST(testGCGrayMarking)
|
||||
CHECK(IsMarkedBlack(crossSource));
|
||||
CHECK(IsMarkedBlack(crossTarget));
|
||||
|
||||
// Cleanup.
|
||||
return true;
|
||||
}
|
||||
|
||||
global1 = nullptr;
|
||||
global2 = nullptr;
|
||||
RemoveGrayRootTracer();
|
||||
bool
|
||||
TestWeakMaps()
|
||||
{
|
||||
JSObject* weakMap = JS::NewWeakMapObject(cx);
|
||||
CHECK(weakMap);
|
||||
|
||||
JSObject* key = AllocWeakmapKeyObject();
|
||||
CHECK(key);
|
||||
|
||||
JSObject* value = AllocWeakmapKeyObject();
|
||||
CHECK(value);
|
||||
|
||||
{
|
||||
JS::RootedObject rootedMap(cx, weakMap);
|
||||
JS::RootedObject rootedKey(cx, key);
|
||||
JS::RootedValue rootedValue(cx, ObjectValue(*value));
|
||||
CHECK(SetWeakMapEntry(cx, rootedMap, rootedKey, rootedValue));
|
||||
}
|
||||
|
||||
// Test the value of a weakmap entry is marked gray by GC if both the
|
||||
// weakmap and key are marked gray.
|
||||
|
||||
grayRoots.grayRoot1 = weakMap;
|
||||
grayRoots.grayRoot2 = key;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(weakMap));
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
// Test the value of a weakmap entry is marked gray by GC if one of the
|
||||
// weakmap and the key is marked gray and the other black.
|
||||
|
||||
JS::RootedObject blackRoot1(cx);
|
||||
blackRoot1 = weakMap;
|
||||
grayRoots.grayRoot1 = key;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
blackRoot1 = key;
|
||||
grayRoots.grayRoot1 = weakMap;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(weakMap));
|
||||
CHECK(IsMarkedBlack(key));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
// Test the value of a weakmap entry is marked black by GC if both the
|
||||
// weakmap and the key are marked black.
|
||||
|
||||
JS::RootedObject blackRoot2(cx);
|
||||
grayRoots.grayRoot1 = nullptr;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
|
||||
blackRoot1 = weakMap;
|
||||
blackRoot2 = key;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedBlack(key));
|
||||
CHECK(IsMarkedBlack(value));
|
||||
|
||||
blackRoot1 = key;
|
||||
blackRoot2 = weakMap;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedBlack(key));
|
||||
CHECK(IsMarkedBlack(value));
|
||||
|
||||
// Test that a weakmap key is marked gray if it has a gray delegate and the
|
||||
// map is either gray or black.
|
||||
|
||||
JSObject* delegate = AllocDelegateForKey(key);
|
||||
blackRoot1 = weakMap;
|
||||
blackRoot2 = nullptr;
|
||||
grayRoots.grayRoot1 = delegate;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(delegate));
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
blackRoot1 = nullptr;
|
||||
blackRoot2 = nullptr;
|
||||
grayRoots.grayRoot1 = weakMap;
|
||||
grayRoots.grayRoot2 = delegate;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(delegate));
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedGray(weakMap));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
// Test that a weakmap key is marked gray if it has a black delegate but
|
||||
// the map is gray.
|
||||
|
||||
blackRoot1 = delegate;
|
||||
blackRoot2 = nullptr;
|
||||
grayRoots.grayRoot1 = weakMap;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(delegate));
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedGray(weakMap));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
blackRoot1 = delegate;
|
||||
blackRoot2 = nullptr;
|
||||
grayRoots.grayRoot1 = weakMap;
|
||||
grayRoots.grayRoot2 = key;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(delegate));
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedGray(weakMap));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
// Test that a weakmap key is marked black if it has a black delegate and
|
||||
// the map is black.
|
||||
|
||||
blackRoot1 = delegate;
|
||||
blackRoot2 = weakMap;
|
||||
grayRoots.grayRoot1 = nullptr;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(delegate));
|
||||
CHECK(IsMarkedBlack(key));
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedBlack(value));
|
||||
|
||||
blackRoot1 = delegate;
|
||||
blackRoot2 = weakMap;
|
||||
grayRoots.grayRoot1 = key;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(delegate));
|
||||
CHECK(IsMarkedBlack(key));
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedBlack(value));
|
||||
|
||||
// Test what happens if there is a delegate but it is not marked for both
|
||||
// black and gray cases.
|
||||
|
||||
delegate = nullptr;
|
||||
blackRoot1 = key;
|
||||
blackRoot2 = weakMap;
|
||||
grayRoots.grayRoot1 = nullptr;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedBlack(key));
|
||||
CHECK(IsMarkedBlack(weakMap));
|
||||
CHECK(IsMarkedBlack(value));
|
||||
|
||||
CHECK(AllocDelegateForKey(key));
|
||||
blackRoot1 = nullptr;
|
||||
blackRoot2 = nullptr;
|
||||
grayRoots.grayRoot1 = weakMap;
|
||||
grayRoots.grayRoot2 = key;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(key));
|
||||
CHECK(IsMarkedGray(weakMap));
|
||||
CHECK(IsMarkedGray(value));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TestCCWs()
|
||||
{
|
||||
RootedObject target(cx, AllocTargetObject());
|
||||
CHECK(target);
|
||||
|
||||
// Test getting a new wrapper doesn't return a gray wrapper.
|
||||
|
||||
JSObject* wrapper = GetCrossCompartmentWrapper(target);
|
||||
CHECK(wrapper);
|
||||
CHECK(!IsMarkedGray(wrapper));
|
||||
|
||||
// Test getting an existing wrapper doesn't return a gray wrapper.
|
||||
|
||||
grayRoots.grayRoot1 = wrapper;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(wrapper));
|
||||
CHECK(IsMarkedBlack(target));
|
||||
|
||||
CHECK(GetCrossCompartmentWrapper(target) == wrapper);
|
||||
CHECK(!IsMarkedGray(wrapper));
|
||||
|
||||
// Test getting an existing wrapper doesn't return a gray wrapper
|
||||
// during incremental GC.
|
||||
|
||||
JS_GC(cx);
|
||||
CHECK(IsMarkedGray(wrapper));
|
||||
CHECK(IsMarkedBlack(target));
|
||||
|
||||
JS_SetGCParameter(cx, JSGC_MODE, JSGC_MODE_INCREMENTAL);
|
||||
JS::PrepareForFullGC(cx);
|
||||
js::SliceBudget budget(js::WorkBudget(1));
|
||||
cx->runtime()->gc.startDebugGC(GC_NORMAL, budget);
|
||||
CHECK(JS::IsIncrementalGCInProgress(cx));
|
||||
|
||||
CHECK(!IsMarkedBlack(wrapper));
|
||||
CHECK(wrapper->zone()->isGCMarkingBlack());
|
||||
|
||||
CHECK(GetCrossCompartmentWrapper(target) == wrapper);
|
||||
CHECK(IsMarkedBlack(wrapper));
|
||||
|
||||
JS::FinishIncrementalGC(cx, JS::gcreason::API);
|
||||
|
||||
grayRoots.grayRoot1 = nullptr;
|
||||
grayRoots.grayRoot2 = nullptr;
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -152,15 +370,17 @@ static void
|
||||
TraceGrayRoots(JSTracer* trc, void* data)
|
||||
{
|
||||
auto grayRoots = static_cast<GrayRoots*>(data);
|
||||
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot1, "gray root 1");
|
||||
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot2, "gray root 2");
|
||||
if (grayRoots->grayRoot1)
|
||||
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot1, "gray root 1");
|
||||
if (grayRoots->grayRoot2)
|
||||
UnsafeTraceManuallyBarrieredEdge(trc, &grayRoots->grayRoot2, "gray root 2");
|
||||
}
|
||||
|
||||
JSObject*
|
||||
AllocTargetObject()
|
||||
{
|
||||
JS::RootedObject obj(cx, JS_NewPlainObject(cx));
|
||||
cx->zone()->group()->evictNursery();
|
||||
EvictNursery();
|
||||
|
||||
MOZ_ASSERT(obj->compartment() == global1->compartment());
|
||||
return obj;
|
||||
@ -177,14 +397,14 @@ AllocSameCompartmentSourceObject(JSObject* target)
|
||||
if (!JS_DefineProperty(cx, source, "ptr", obj, 0))
|
||||
return nullptr;
|
||||
|
||||
cx->zone()->group()->evictNursery();
|
||||
EvictNursery();
|
||||
|
||||
MOZ_ASSERT(source->compartment() == global1->compartment());
|
||||
return source;
|
||||
}
|
||||
|
||||
JSObject*
|
||||
AllocCrossCompartmentSourceObject(JSObject* target)
|
||||
GetCrossCompartmentWrapper(JSObject* target)
|
||||
{
|
||||
MOZ_ASSERT(target->compartment() == global1->compartment());
|
||||
JS::RootedObject obj(cx, target);
|
||||
@ -192,12 +412,52 @@ AllocCrossCompartmentSourceObject(JSObject* target)
|
||||
if (!JS_WrapObject(cx, &obj))
|
||||
return nullptr;
|
||||
|
||||
cx->zone()->group()->evictNursery();
|
||||
EvictNursery();
|
||||
|
||||
MOZ_ASSERT(obj->compartment() == global2->compartment());
|
||||
return obj;
|
||||
}
|
||||
|
||||
static JSObject*
|
||||
GetKeyDelegate(JSObject* obj)
|
||||
{
|
||||
return static_cast<JSObject*>(obj->as<NativeObject>().getPrivate());
|
||||
}
|
||||
|
||||
JSObject*
|
||||
AllocWeakmapKeyObject()
|
||||
{
|
||||
static const js::ClassExtension KeyClassExtension = {
|
||||
GetKeyDelegate
|
||||
};
|
||||
|
||||
static const js::Class KeyClass = {
|
||||
"keyWithDelegate",
|
||||
JSCLASS_HAS_PRIVATE,
|
||||
JS_NULL_CLASS_OPS,
|
||||
JS_NULL_CLASS_SPEC,
|
||||
&KeyClassExtension,
|
||||
JS_NULL_OBJECT_OPS
|
||||
};
|
||||
|
||||
JS::RootedObject key(cx, JS_NewObject(cx, Jsvalify(&KeyClass)));
|
||||
if (!key)
|
||||
return nullptr;
|
||||
|
||||
EvictNursery();
|
||||
return key;
|
||||
}
|
||||
|
||||
JSObject*
|
||||
AllocDelegateForKey(JSObject* key)
|
||||
{
|
||||
JS::RootedObject obj(cx, JS_NewPlainObject(cx));
|
||||
EvictNursery();
|
||||
|
||||
key->as<NativeObject>().setPrivate(obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
bool
|
||||
IsMarkedBlack(JSObject* obj)
|
||||
{
|
||||
@ -214,6 +474,12 @@ IsMarkedGray(JSObject* obj)
|
||||
return isGray;
|
||||
}
|
||||
|
||||
void
|
||||
EvictNursery()
|
||||
{
|
||||
cx->zone()->group()->evictNursery();
|
||||
}
|
||||
|
||||
bool
|
||||
ZoneGC(JS::Zone* zone)
|
||||
{
|
||||
|
@ -2219,6 +2219,7 @@ class JS_PUBLIC_API(CompartmentCreationOptions)
|
||||
traceGlobal_(nullptr),
|
||||
zoneSpec_(NewZoneInSystemZoneGroup),
|
||||
zonePointer_(nullptr),
|
||||
disableNursery_(false),
|
||||
invisibleToDebugger_(false),
|
||||
mergeable_(false),
|
||||
preserveJitCode_(false),
|
||||
@ -2254,6 +2255,14 @@ class JS_PUBLIC_API(CompartmentCreationOptions)
|
||||
CompartmentCreationOptions& setNewZoneInSystemZoneGroup();
|
||||
CompartmentCreationOptions& setNewZoneInExistingZoneGroup(JSObject* obj);
|
||||
|
||||
// If these options are creating a new zone group, prevent the use of a
|
||||
// generational GC nursery by that group.
|
||||
bool disableNursery() const { return disableNursery_; }
|
||||
CompartmentCreationOptions& setDisableNursery(bool flag) {
|
||||
disableNursery_ = flag;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Certain scopes (i.e. XBL compilation scopes) are implementation details
|
||||
// of the embedding, and references to them should never leak out to script.
|
||||
// This flag causes the this compartment to skip firing onNewGlobalObject
|
||||
@ -2323,6 +2332,7 @@ class JS_PUBLIC_API(CompartmentCreationOptions)
|
||||
JSTraceOp traceGlobal_;
|
||||
ZoneSpecifier zoneSpec_;
|
||||
void* zonePointer_; // Per zoneSpec_, either a Zone, ZoneGroup, or null.
|
||||
bool disableNursery_;
|
||||
bool invisibleToDebugger_;
|
||||
bool mergeable_;
|
||||
bool preserveJitCode_;
|
||||
|
@ -1174,8 +1174,8 @@ JSContext::JSContext(JSRuntime* runtime, const JS::ContextOptions& options)
|
||||
for (size_t i = 0; i < mozilla::ArrayLength(nativeStackQuota); i++)
|
||||
nativeStackQuota[i] = 0;
|
||||
|
||||
if (!TlsContext.get())
|
||||
TlsContext.set(this);
|
||||
MOZ_ASSERT(!TlsContext.get());
|
||||
TlsContext.set(this);
|
||||
}
|
||||
|
||||
JSContext::~JSContext()
|
||||
@ -1205,8 +1205,8 @@ JSContext::~JSContext()
|
||||
DestroyTraceLogger(traceLogger);
|
||||
#endif
|
||||
|
||||
if (TlsContext.get() == this)
|
||||
TlsContext.set(nullptr);
|
||||
MOZ_ASSERT(TlsContext.get() == this);
|
||||
TlsContext.set(nullptr);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1154,7 +1154,7 @@ class MOZ_RAII AutoLockForExclusiveAccess
|
||||
|
||||
void init(JSRuntime* rt) {
|
||||
runtime = rt;
|
||||
if (runtime->numExclusiveThreads) {
|
||||
if (runtime->hasHelperThreadZones()) {
|
||||
runtime->exclusiveAccessLock.lock();
|
||||
} else {
|
||||
MOZ_ASSERT(!runtime->activeThreadHasExclusiveAccess);
|
||||
@ -1174,7 +1174,7 @@ class MOZ_RAII AutoLockForExclusiveAccess
|
||||
init(rt);
|
||||
}
|
||||
~AutoLockForExclusiveAccess() {
|
||||
if (runtime->numExclusiveThreads) {
|
||||
if (runtime->hasHelperThreadZones()) {
|
||||
runtime->exclusiveAccessLock.unlock();
|
||||
} else {
|
||||
MOZ_ASSERT(runtime->activeThreadHasExclusiveAccess);
|
||||
|
@ -443,7 +443,7 @@ JSContext::enterCompartment(
|
||||
{
|
||||
enterCompartmentDepth_++;
|
||||
|
||||
if (!c->zone()->isAtomsZone() && !c->zone()->usedByExclusiveThread)
|
||||
if (!c->zone()->isAtomsZone())
|
||||
enterZoneGroup(c->zone()->group());
|
||||
|
||||
c->enter();
|
||||
@ -479,7 +479,7 @@ JSContext::leaveCompartment(
|
||||
setCompartment(oldCompartment, maybeLock);
|
||||
if (startingCompartment) {
|
||||
startingCompartment->leave();
|
||||
if (!startingCompartment->zone()->isAtomsZone() && !startingCompartment->zone()->usedByExclusiveThread)
|
||||
if (!startingCompartment->zone()->isAtomsZone())
|
||||
leaveZoneGroup(startingCompartment->zone()->group());
|
||||
}
|
||||
}
|
||||
@ -488,14 +488,6 @@ inline void
|
||||
JSContext::setCompartment(JSCompartment* comp,
|
||||
const js::AutoLockForExclusiveAccess* maybeLock /* = nullptr */)
|
||||
{
|
||||
// Contexts operating on helper threads can only be in the atoms zone or in exclusive zones.
|
||||
MOZ_ASSERT_IF(helperThread() && !runtime_->isAtomsCompartment(comp),
|
||||
comp->zone()->usedByExclusiveThread);
|
||||
|
||||
// Normal JSContexts cannot enter exclusive zones.
|
||||
MOZ_ASSERT_IF(this == runtime()->activeContext() && comp,
|
||||
!comp->zone()->usedByExclusiveThread);
|
||||
|
||||
// Only one thread can be in the atoms compartment at a time.
|
||||
MOZ_ASSERT_IF(runtime_->isAtomsCompartment(comp), maybeLock != nullptr);
|
||||
MOZ_ASSERT_IF(runtime_->isAtomsCompartment(comp) || runtime_->isAtomsCompartment(compartment_),
|
||||
@ -510,9 +502,8 @@ JSContext::setCompartment(JSCompartment* comp,
|
||||
MOZ_ASSERT_IF(compartment_, compartment_->hasBeenEntered());
|
||||
MOZ_ASSERT_IF(comp, comp->hasBeenEntered());
|
||||
|
||||
// This context must have exclusive access to the zone's group. There is an
|
||||
// exception, for now, for zones used by exclusive threads.
|
||||
MOZ_ASSERT_IF(comp && !comp->zone()->isAtomsZone() && !comp->zone()->usedByExclusiveThread,
|
||||
// This context must have exclusive access to the zone's group.
|
||||
MOZ_ASSERT_IF(comp && !comp->zone()->isAtomsZone(),
|
||||
comp->zone()->group()->ownedByCurrentThread());
|
||||
|
||||
compartment_ = comp;
|
||||
|
@ -116,6 +116,7 @@ JSCompartment::wrap(JSContext* cx, JS::MutableHandleValue vp)
|
||||
* that we get the same answer.
|
||||
*/
|
||||
#ifdef DEBUG
|
||||
MOZ_ASSERT(!JS::ObjectIsMarkedGray(&vp.toObject()));
|
||||
JS::RootedObject cacheResult(cx);
|
||||
#endif
|
||||
JS::RootedValue v(cx, vp);
|
||||
|
@ -3031,9 +3031,9 @@ GCRuntime::maybeAllocTriggerZoneGC(Zone* zone, const AutoLockGC& lock)
|
||||
bool
|
||||
GCRuntime::triggerZoneGC(Zone* zone, JS::gcreason::Reason reason)
|
||||
{
|
||||
/* Zones in use by a thread with an exclusive context can't be collected. */
|
||||
/* Zones in use by a helper thread can't be collected. */
|
||||
if (!CurrentThreadCanAccessRuntime(rt)) {
|
||||
MOZ_ASSERT(zone->usedByExclusiveThread || zone->isAtomsZone());
|
||||
MOZ_ASSERT(zone->usedByHelperThread() || zone->isAtomsZone());
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -3050,7 +3050,7 @@ GCRuntime::triggerZoneGC(Zone* zone, JS::gcreason::Reason reason)
|
||||
|
||||
if (zone->isAtomsZone()) {
|
||||
/* We can't do a zone GC of the atoms compartment. */
|
||||
if (TlsContext.get()->keepAtoms || rt->exclusiveThreadsPresent()) {
|
||||
if (TlsContext.get()->keepAtoms || rt->hasHelperThreadZones()) {
|
||||
/* Skip GC and retrigger later, since atoms zone won't be collected
|
||||
* if keepAtoms is true. */
|
||||
fullGCForAtomsRequested_ = true;
|
||||
@ -3492,14 +3492,6 @@ Zone::sweepCompartments(FreeOp* fop, bool keepAtleastOne, bool destroyingRuntime
|
||||
void
|
||||
GCRuntime::sweepZones(FreeOp* fop, ZoneGroup* group, bool destroyingRuntime)
|
||||
{
|
||||
MOZ_ASSERT_IF(destroyingRuntime, numActiveZoneIters == 0);
|
||||
MOZ_ASSERT_IF(destroyingRuntime, arenasEmptyAtShutdown);
|
||||
|
||||
if (rt->gc.numActiveZoneIters)
|
||||
return;
|
||||
|
||||
assertBackgroundSweepingFinished();
|
||||
|
||||
JSZoneCallback callback = rt->destroyZoneCallback;
|
||||
|
||||
Zone** read = group->zones().begin();
|
||||
@ -3547,6 +3539,14 @@ GCRuntime::sweepZones(FreeOp* fop, ZoneGroup* group, bool destroyingRuntime)
|
||||
void
|
||||
GCRuntime::sweepZoneGroups(FreeOp* fop, bool destroyingRuntime)
|
||||
{
|
||||
MOZ_ASSERT_IF(destroyingRuntime, numActiveZoneIters == 0);
|
||||
MOZ_ASSERT_IF(destroyingRuntime, arenasEmptyAtShutdown);
|
||||
|
||||
if (rt->gc.numActiveZoneIters)
|
||||
return;
|
||||
|
||||
assertBackgroundSweepingFinished();
|
||||
|
||||
ZoneGroup** read = groups.ref().begin();
|
||||
ZoneGroup** end = groups.ref().end();
|
||||
ZoneGroup** write = read;
|
||||
@ -3853,7 +3853,7 @@ GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoLockForExclusiveAcces
|
||||
* the other collected zones are using are marked, and we can update the
|
||||
* set of atoms in use by the other collected zones at the end of the GC.
|
||||
*/
|
||||
if (!TlsContext.get()->keepAtoms || rt->exclusiveThreadsPresent()) {
|
||||
if (!TlsContext.get()->keepAtoms || rt->hasHelperThreadZones()) {
|
||||
Zone* atomsZone = rt->atomsCompartment(lock)->zone();
|
||||
if (atomsZone->isGCScheduled()) {
|
||||
MOZ_ASSERT(!atomsZone->isCollecting());
|
||||
@ -6290,7 +6290,7 @@ GCRuntime::gcCycle(bool nonincrementalByAPI, SliceBudget& budget, JS::gcreason::
|
||||
|
||||
// We don't allow off-thread parsing to start while we're doing an
|
||||
// incremental GC.
|
||||
MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->exclusiveThreadsPresent());
|
||||
MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->hasHelperThreadZones());
|
||||
|
||||
auto result = budgetIncrementalGC(nonincrementalByAPI, reason, budget, session.lock);
|
||||
|
||||
@ -6683,7 +6683,7 @@ ZoneGroup::minorGC(JS::gcreason::Reason reason, gcstats::Phase phase)
|
||||
|
||||
{
|
||||
AutoLockGC lock(runtime);
|
||||
for (ZonesIter zone(runtime, WithAtoms); !zone.done(); zone.next())
|
||||
for (ZonesInGroupIter zone(this); !zone.done(); zone.next())
|
||||
runtime->gc.maybeAllocTriggerZoneGC(zone, lock);
|
||||
}
|
||||
}
|
||||
@ -6790,7 +6790,10 @@ js::NewCompartment(JSContext* cx, JSPrincipals* principals,
|
||||
break;
|
||||
}
|
||||
|
||||
if (!group) {
|
||||
if (group) {
|
||||
// Take over ownership of the group while we create the compartment/zone.
|
||||
group->enter();
|
||||
} else {
|
||||
MOZ_ASSERT(!zone);
|
||||
group = cx->new_<ZoneGroup>(rt);
|
||||
if (!group)
|
||||
@ -6798,7 +6801,11 @@ js::NewCompartment(JSContext* cx, JSPrincipals* principals,
|
||||
|
||||
groupHolder.reset(group);
|
||||
|
||||
if (!group->init(rt->gc.tunables.gcMaxNurseryBytes())) {
|
||||
size_t nurseryBytes =
|
||||
options.creationOptions().disableNursery()
|
||||
? 0
|
||||
: rt->gc.tunables.gcMaxNurseryBytes();
|
||||
if (!group->init(nurseryBytes)) {
|
||||
ReportOutOfMemory(cx);
|
||||
return nullptr;
|
||||
}
|
||||
@ -6865,6 +6872,7 @@ js::NewCompartment(JSContext* cx, JSPrincipals* principals,
|
||||
|
||||
zoneHolder.forget();
|
||||
groupHolder.forget();
|
||||
group->leave();
|
||||
return compartment.forget();
|
||||
}
|
||||
|
||||
@ -7823,16 +7831,23 @@ js::gc::detail::CellIsMarkedGrayIfKnown(const Cell* cell)
|
||||
if (!cell->isTenured())
|
||||
return false;
|
||||
|
||||
// We ignore the gray marking state of cells and return false in two cases:
|
||||
// We ignore the gray marking state of cells and return false in the
|
||||
// following cases:
|
||||
//
|
||||
// 1) When OOM has caused us to clear the gcGrayBitsValid_ flag.
|
||||
//
|
||||
// 2) When we are in an incremental GC and examine a cell that is in a zone
|
||||
// that is not being collected. Gray targets of CCWs that are marked black
|
||||
// by a barrier will eventually be marked black in the next GC slice.
|
||||
//
|
||||
// 3) When we are not on the runtime's active thread. Helper threads might
|
||||
// call this while parsing, and they are not allowed to inspect the
|
||||
// runtime's incremental state. The objects being operated on are not able
|
||||
// to be collected and will not be marked any color.
|
||||
auto tc = &cell->asTenured();
|
||||
auto rt = tc->runtimeFromActiveCooperatingThread();
|
||||
if (!rt->gc.areGrayBitsValid() ||
|
||||
auto rt = tc->runtimeFromAnyThread();
|
||||
if (!CurrentThreadCanAccessRuntime(rt) ||
|
||||
!rt->gc.areGrayBitsValid() ||
|
||||
(rt->gc.isIncrementalGCInProgress() && !tc->zone()->wasGCStarted()))
|
||||
{
|
||||
return false;
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
namespace js {
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
|
||||
/* static */ mozilla::Atomic<size_t> AutoNoteSingleThreadedRegion::count(0);
|
||||
|
||||
@ -47,7 +47,7 @@ CheckActiveThread<Helper>::check() const
|
||||
return;
|
||||
|
||||
JSContext* cx = TlsContext.get();
|
||||
MOZ_ASSERT(cx == cx->runtime()->activeContext());
|
||||
MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
|
||||
#endif // XP_WIN
|
||||
}
|
||||
|
||||
@ -63,10 +63,22 @@ CheckZoneGroup<Helper>::check() const
|
||||
return;
|
||||
|
||||
if (group) {
|
||||
// This check is disabled for now because helper thread parse tasks
|
||||
// access data in the same zone group that the single active thread is
|
||||
// using. This will be fixed soon (bug 1323066).
|
||||
//MOZ_ASSERT(group->context && group->context == TlsContext.get());
|
||||
if (group->usedByHelperThread) {
|
||||
MOZ_ASSERT(group->ownedByCurrentThread());
|
||||
} else {
|
||||
// This check is disabled on windows for the same reason as in
|
||||
// CheckActiveThread.
|
||||
#ifndef XP_WIN
|
||||
// In a cooperatively scheduled runtime the active thread is
|
||||
// permitted access to all zone groups --- even those it has not
|
||||
// entered --- for GC and similar purposes. Since all other
|
||||
// cooperative threads are suspended, these accesses are threadsafe
|
||||
// if the zone group is not in use by a helper thread which is not
|
||||
// cooperatively scheduled.
|
||||
JSContext* cx = TlsContext.get();
|
||||
MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
// |group| will be null for data in the atoms zone. This is protected
|
||||
// by the exclusive access lock.
|
||||
@ -104,6 +116,6 @@ template class CheckGlobalLock<GlobalLock::ExclusiveAccessLock, AllowedHelperThr
|
||||
template class CheckGlobalLock<GlobalLock::ExclusiveAccessLock, AllowedHelperThread::GCTask>;
|
||||
template class CheckGlobalLock<GlobalLock::HelperThreadLock, AllowedHelperThread::None>;
|
||||
|
||||
#endif // DEBUG
|
||||
#endif // JS_HAS_PROTECTED_DATA_CHECKS
|
||||
|
||||
} // namespace js
|
||||
|
@ -23,11 +23,12 @@ namespace js {
|
||||
// associated with the data, consider using the ExclusiveData class instead.
|
||||
// Otherwise, ProtectedData should be used to document whatever synchronization
|
||||
// method is used.
|
||||
//
|
||||
// Note that several of the checks below are currently disabled
|
||||
// (e.g. ThreadLocalData, ZoneGroupData). These will be fixed soon (bug 1323066),
|
||||
// but for now this class is largely documenting how we would like data to be
|
||||
// protected, rather than how it actually is protected.
|
||||
|
||||
// Protected data checks are enabled in debug builds, except on android where
|
||||
// they cause some permatimeouts in automation.
|
||||
#if defined(DEBUG) && !defined(ANDROID)
|
||||
#define JS_HAS_PROTECTED_DATA_CHECKS
|
||||
#endif
|
||||
|
||||
#define DECLARE_ONE_BOOL_OPERATOR(OP, T) \
|
||||
template <typename U> \
|
||||
@ -50,7 +51,7 @@ namespace js {
|
||||
class MOZ_RAII AutoNoteSingleThreadedRegion
|
||||
{
|
||||
public:
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
static mozilla::Atomic<size_t> count;
|
||||
AutoNoteSingleThreadedRegion() { count++; }
|
||||
~AutoNoteSingleThreadedRegion() { count--; }
|
||||
@ -70,7 +71,7 @@ class ProtectedData
|
||||
template <typename... Args>
|
||||
explicit ProtectedData(const Check& check, Args&&... args)
|
||||
: value(mozilla::Forward<Args>(args)...)
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
, check(check)
|
||||
#endif
|
||||
{}
|
||||
@ -95,7 +96,7 @@ class ProtectedData
|
||||
T operator --(int) { return ref()--; }
|
||||
|
||||
T& ref() {
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
if (!AutoNoteSingleThreadedRegion::count)
|
||||
check.check();
|
||||
#endif
|
||||
@ -103,7 +104,7 @@ class ProtectedData
|
||||
}
|
||||
|
||||
const T& ref() const {
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
if (!AutoNoteSingleThreadedRegion::count)
|
||||
check.check();
|
||||
#endif
|
||||
@ -115,7 +116,7 @@ class ProtectedData
|
||||
|
||||
private:
|
||||
T value;
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
Check check;
|
||||
#endif
|
||||
};
|
||||
@ -156,7 +157,7 @@ class ProtectedDataZoneGroupArg : public ProtectedData<Check, T>
|
||||
|
||||
class CheckUnprotected
|
||||
{
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
public:
|
||||
inline void check() const {}
|
||||
#endif
|
||||
@ -170,7 +171,7 @@ using UnprotectedData = ProtectedDataNoCheckArgs<CheckUnprotected, T>;
|
||||
|
||||
class CheckThreadLocal
|
||||
{
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
Thread::Id id;
|
||||
|
||||
public:
|
||||
@ -179,10 +180,7 @@ class CheckThreadLocal
|
||||
{}
|
||||
|
||||
inline void check() const {
|
||||
// This check is currently disabled because JSContexts used for off
|
||||
// thread parsing are created on different threads than where they run.
|
||||
// This will be fixed soon (bug 1323066).
|
||||
//MOZ_ASSERT(id == ThisThread::GetId());
|
||||
MOZ_ASSERT(id == ThisThread::GetId());
|
||||
}
|
||||
#endif
|
||||
};
|
||||
@ -226,7 +224,7 @@ using ActiveThreadOrIonCompileData =
|
||||
template <AllowedHelperThread Helper>
|
||||
class CheckZoneGroup
|
||||
{
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
ZoneGroup* group;
|
||||
|
||||
public:
|
||||
@ -239,7 +237,8 @@ class CheckZoneGroup
|
||||
};
|
||||
|
||||
// Data which may only be accessed by threads with exclusive access to the
|
||||
// associated zone group.
|
||||
// associated zone group, or by the runtime's cooperatively scheduled
|
||||
// active thread for zone groups which are not in use by a helper thread.
|
||||
template <typename T>
|
||||
using ZoneGroupData =
|
||||
ProtectedDataZoneGroupArg<CheckZoneGroup<AllowedHelperThread::None>, T>;
|
||||
@ -267,7 +266,7 @@ enum class GlobalLock
|
||||
template <GlobalLock Lock, AllowedHelperThread Helper>
|
||||
class CheckGlobalLock
|
||||
{
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
public:
|
||||
void check() const;
|
||||
#endif
|
||||
@ -310,7 +309,7 @@ class ProtectedDataWriteOnce
|
||||
template <typename... Args>
|
||||
explicit ProtectedDataWriteOnce(Args&&... args)
|
||||
: value(mozilla::Forward<Args>(args)...)
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
, nwrites(0)
|
||||
#endif
|
||||
{}
|
||||
@ -330,7 +329,7 @@ class ProtectedDataWriteOnce
|
||||
const T& ref() const { return value; }
|
||||
|
||||
T& writeRef() {
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
if (!AutoNoteSingleThreadedRegion::count)
|
||||
check.check();
|
||||
// Despite the WriteOnce name, actually allow two writes to accommodate
|
||||
@ -342,7 +341,7 @@ class ProtectedDataWriteOnce
|
||||
|
||||
private:
|
||||
T value;
|
||||
#ifdef DEBUG
|
||||
#ifdef JS_HAS_PROTECTED_DATA_CHECKS
|
||||
Check check;
|
||||
size_t nwrites;
|
||||
#endif
|
||||
|
@ -1487,8 +1487,10 @@ ArrayBufferViewObject::trace(JSTracer* trc, JSObject* objArg)
|
||||
// We can't use a direct forwarding pointer here, as there might
|
||||
// not be enough bytes available, and other views might have data
|
||||
// pointers whose forwarding pointers would overlap this one.
|
||||
Nursery& nursery = obj->zoneFromAnyThread()->group()->nursery();
|
||||
nursery.maybeSetForwardingPointer(trc, srcData, dstData, /* direct = */ false);
|
||||
if (trc->isTenuringTracer()) {
|
||||
Nursery& nursery = obj->zoneFromAnyThread()->group()->nursery();
|
||||
nursery.maybeSetForwardingPointer(trc, srcData, dstData, /* direct = */ false);
|
||||
}
|
||||
} else {
|
||||
MOZ_ASSERT_IF(buf.dataPointer() == nullptr, offset == 0);
|
||||
|
||||
|
@ -290,27 +290,27 @@ static const JSClass parseTaskGlobalClass = {
|
||||
&parseTaskGlobalClassOps
|
||||
};
|
||||
|
||||
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, const char16_t* chars, size_t length,
|
||||
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
: kind(kind), cx(cx), options(initCx), chars(chars), length(length),
|
||||
: kind(kind), options(cx), chars(chars), length(length),
|
||||
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
|
||||
exclusiveContextGlobal(exclusiveContextGlobal),
|
||||
parseGlobal(parseGlobal),
|
||||
callback(callback), callbackData(callbackData),
|
||||
script(nullptr), sourceObject(nullptr),
|
||||
errors(cx), overRecursed(false), outOfMemory(false)
|
||||
overRecursed(false), outOfMemory(false)
|
||||
{
|
||||
}
|
||||
|
||||
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
|
||||
JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
: kind(kind), cx(cx), options(initCx), buffer(&buffer), cursor(cursor),
|
||||
: kind(kind), options(cx), buffer(&buffer), cursor(cursor),
|
||||
alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
|
||||
exclusiveContextGlobal(exclusiveContextGlobal),
|
||||
parseGlobal(parseGlobal),
|
||||
callback(callback), callbackData(callbackData),
|
||||
script(nullptr), sourceObject(nullptr),
|
||||
errors(cx), overRecursed(false), outOfMemory(false)
|
||||
overRecursed(false), outOfMemory(false)
|
||||
{
|
||||
}
|
||||
|
||||
@ -326,8 +326,7 @@ ParseTask::init(JSContext* cx, const ReadOnlyCompileOptions& options)
|
||||
void
|
||||
ParseTask::activate(JSRuntime* rt)
|
||||
{
|
||||
rt->setUsedByExclusiveThread(exclusiveContextGlobal->zone());
|
||||
cx->enterCompartmentOf(exclusiveContextGlobal);
|
||||
rt->setUsedByHelperThread(parseGlobal->zone());
|
||||
}
|
||||
|
||||
bool
|
||||
@ -344,9 +343,6 @@ ParseTask::finish(JSContext* cx)
|
||||
|
||||
ParseTask::~ParseTask()
|
||||
{
|
||||
// ParseTask takes over ownership of its input exclusive context.
|
||||
js_delete(cx);
|
||||
|
||||
for (size_t i = 0; i < errors.length(); i++)
|
||||
js_delete(errors[i]);
|
||||
}
|
||||
@ -354,26 +350,26 @@ ParseTask::~ParseTask()
|
||||
void
|
||||
ParseTask::trace(JSTracer* trc)
|
||||
{
|
||||
if (!cx->runtimeMatches(trc->runtime()))
|
||||
if (parseGlobal->runtimeFromAnyThread() != trc->runtime())
|
||||
return;
|
||||
|
||||
TraceManuallyBarrieredEdge(trc, &exclusiveContextGlobal, "ParseTask::exclusiveContextGlobal");
|
||||
TraceManuallyBarrieredEdge(trc, &parseGlobal, "ParseTask::parseGlobal");
|
||||
if (script)
|
||||
TraceManuallyBarrieredEdge(trc, &script, "ParseTask::script");
|
||||
if (sourceObject)
|
||||
TraceManuallyBarrieredEdge(trc, &sourceObject, "ParseTask::sourceObject");
|
||||
}
|
||||
|
||||
ScriptParseTask::ScriptParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, const char16_t* chars, size_t length,
|
||||
ScriptParseTask::ScriptParseTask(JSContext* cx, JSObject* parseGlobal,
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
: ParseTask(ParseTaskKind::Script, cx, exclusiveContextGlobal, initCx, chars, length, callback,
|
||||
: ParseTask(ParseTaskKind::Script, cx, parseGlobal, chars, length, callback,
|
||||
callbackData)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ScriptParseTask::parse()
|
||||
ScriptParseTask::parse(JSContext* cx)
|
||||
{
|
||||
SourceBufferHolder srcBuf(chars, length, SourceBufferHolder::NoOwnership);
|
||||
script = frontend::CompileGlobalScript(cx, alloc, ScopeKind::Global,
|
||||
@ -382,16 +378,16 @@ ScriptParseTask::parse()
|
||||
/* sourceObjectOut = */ &sourceObject);
|
||||
}
|
||||
|
||||
ModuleParseTask::ModuleParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, const char16_t* chars, size_t length,
|
||||
ModuleParseTask::ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
: ParseTask(ParseTaskKind::Module, cx, exclusiveContextGlobal, initCx, chars, length, callback,
|
||||
: ParseTask(ParseTaskKind::Module, cx, parseGlobal, chars, length, callback,
|
||||
callbackData)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ModuleParseTask::parse()
|
||||
ModuleParseTask::parse(JSContext* cx)
|
||||
{
|
||||
SourceBufferHolder srcBuf(chars, length, SourceBufferHolder::NoOwnership);
|
||||
ModuleObject* module = frontend::CompileModule(cx, options, srcBuf, alloc, &sourceObject);
|
||||
@ -399,16 +395,16 @@ ModuleParseTask::parse()
|
||||
script = module->script();
|
||||
}
|
||||
|
||||
ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
|
||||
JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
: ParseTask(ParseTaskKind::ScriptDecode, cx, exclusiveContextGlobal, initCx,
|
||||
: ParseTask(ParseTaskKind::ScriptDecode, cx, parseGlobal,
|
||||
buffer, cursor, callback, callbackData)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
ScriptDecodeTask::parse()
|
||||
ScriptDecodeTask::parse(JSContext* cx)
|
||||
{
|
||||
RootedScript resultScript(cx);
|
||||
XDROffThreadDecoder decoder(cx, alloc, &options, /* sourceObjectOut = */ &sourceObject,
|
||||
@ -541,7 +537,8 @@ CreateGlobalForOffThreadParse(JSContext* cx, ParseTaskKind kind, const gc::AutoS
|
||||
|
||||
creationOptions.setInvisibleToDebugger(true)
|
||||
.setMergeable(true)
|
||||
.setNewZoneInSystemZoneGroup();
|
||||
.setNewZoneInNewZoneGroup()
|
||||
.setDisableNursery(true);
|
||||
|
||||
// Don't falsely inherit the host's global trace hook.
|
||||
creationOptions.setTrace(nullptr);
|
||||
@ -605,17 +602,10 @@ StartOffThreadParseTask(JSContext* cx, const ReadOnlyCompileOptions& options,
|
||||
if (!global)
|
||||
return false;
|
||||
|
||||
ScopedJSDeletePtr<JSContext> helpercx(
|
||||
cx->new_<JSContext>(cx->runtime(), cx->options()));
|
||||
if (!helpercx)
|
||||
return false;
|
||||
|
||||
ScopedJSDeletePtr<ParseTask> task(taskFunctor(helpercx.get(), global));
|
||||
ScopedJSDeletePtr<ParseTask> task(taskFunctor(global));
|
||||
if (!task)
|
||||
return false;
|
||||
|
||||
helpercx.forget();
|
||||
|
||||
if (!task->init(cx, options) || !QueueOffThreadParseTask(cx, task))
|
||||
return false;
|
||||
|
||||
@ -630,8 +620,8 @@ js::StartOffThreadParseScript(JSContext* cx, const ReadOnlyCompileOptions& optio
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
{
|
||||
auto functor = [&](JSContext* helpercx, JSObject* global) -> ScriptParseTask* {
|
||||
return cx->new_<ScriptParseTask>(helpercx, global, cx, chars, length,
|
||||
auto functor = [&](JSObject* global) -> ScriptParseTask* {
|
||||
return cx->new_<ScriptParseTask>(cx, global, chars, length,
|
||||
callback, callbackData);
|
||||
};
|
||||
return StartOffThreadParseTask(cx, options, ParseTaskKind::Script, functor);
|
||||
@ -642,8 +632,8 @@ js::StartOffThreadParseModule(JSContext* cx, const ReadOnlyCompileOptions& optio
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
{
|
||||
auto functor = [&](JSContext* helpercx, JSObject* global) -> ModuleParseTask* {
|
||||
return cx->new_<ModuleParseTask>(helpercx, global, cx, chars, length,
|
||||
auto functor = [&](JSObject* global) -> ModuleParseTask* {
|
||||
return cx->new_<ModuleParseTask>(cx, global, chars, length,
|
||||
callback, callbackData);
|
||||
};
|
||||
return StartOffThreadParseTask(cx, options, ParseTaskKind::Module, functor);
|
||||
@ -654,8 +644,8 @@ js::StartOffThreadDecodeScript(JSContext* cx, const ReadOnlyCompileOptions& opti
|
||||
JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData)
|
||||
{
|
||||
auto functor = [&](JSContext* helpercx, JSObject* global) -> ScriptDecodeTask* {
|
||||
return cx->new_<ScriptDecodeTask>(helpercx, global, cx, buffer, cursor,
|
||||
auto functor = [&](JSObject* global) -> ScriptDecodeTask* {
|
||||
return cx->new_<ScriptDecodeTask>(cx, global, buffer, cursor,
|
||||
callback, callbackData);
|
||||
};
|
||||
return StartOffThreadParseTask(cx, options, ParseTaskKind::ScriptDecode, functor);
|
||||
@ -674,7 +664,7 @@ js::EnqueuePendingParseTasksAfterGC(JSRuntime* rt)
|
||||
|
||||
for (size_t i = 0; i < waiting.length(); i++) {
|
||||
ParseTask* task = waiting[i];
|
||||
if (task->runtimeMatches(rt) && !task->exclusiveContextGlobal->zone()->wasGCStarted()) {
|
||||
if (task->runtimeMatches(rt) && !task->parseGlobal->zone()->wasGCStarted()) {
|
||||
AutoEnterOOMUnsafeRegion oomUnsafe;
|
||||
if (!newTasks.append(task))
|
||||
oomUnsafe.crash("EnqueuePendingParseTasksAfterGC");
|
||||
@ -1241,8 +1231,7 @@ LeaveParseTaskZone(JSRuntime* rt, ParseTask* task)
|
||||
{
|
||||
// Mark the zone as no longer in use by an JSContext, and available
|
||||
// to be collected by the GC.
|
||||
task->cx->leaveCompartment(task->cx->compartment());
|
||||
rt->clearUsedByExclusiveThread(task->cx->zone());
|
||||
rt->clearUsedByHelperThread(task->parseGlobal->zone());
|
||||
}
|
||||
|
||||
ParseTask*
|
||||
@ -1378,12 +1367,13 @@ GlobalHelperThreadState::mergeParseTaskCompartment(JSContext* cx, ParseTask* par
|
||||
JS::AutoAssertNoGC nogc(cx);
|
||||
|
||||
LeaveParseTaskZone(cx->runtime(), parseTask);
|
||||
AutoCompartment ac(cx, parseTask->parseGlobal);
|
||||
|
||||
{
|
||||
// Generator functions don't have Function.prototype as prototype but a
|
||||
// different function object, so the IdentifyStandardPrototype trick
|
||||
// below won't work. Just special-case it.
|
||||
GlobalObject* parseGlobal = &parseTask->exclusiveContextGlobal->as<GlobalObject>();
|
||||
GlobalObject* parseGlobal = &parseTask->parseGlobal->as<GlobalObject>();
|
||||
JSObject* parseTaskStarGenFunctionProto = parseGlobal->getStarGeneratorFunctionPrototype();
|
||||
|
||||
// Module objects don't have standard prototypes either.
|
||||
@ -1395,7 +1385,8 @@ GlobalHelperThreadState::mergeParseTaskCompartment(JSContext* cx, ParseTask* par
|
||||
// to the corresponding prototype in the new compartment. This will briefly
|
||||
// create cross compartment pointers, which will be fixed by the
|
||||
// MergeCompartments call below.
|
||||
for (auto group = parseTask->cx->zone()->cellIter<ObjectGroup>(); !group.done(); group.next()) {
|
||||
Zone* parseZone = parseTask->parseGlobal->zone();
|
||||
for (auto group = parseZone->cellIter<ObjectGroup>(); !group.done(); group.next()) {
|
||||
TaggedProto proto(group->proto());
|
||||
if (!proto.isObject())
|
||||
continue;
|
||||
@ -1426,7 +1417,7 @@ GlobalHelperThreadState::mergeParseTaskCompartment(JSContext* cx, ParseTask* par
|
||||
}
|
||||
|
||||
// Move the parsed script and all its contents into the desired compartment.
|
||||
gc::MergeCompartments(parseTask->cx->compartment(), dest);
|
||||
gc::MergeCompartments(parseTask->parseGlobal->compartment(), dest);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1636,20 +1627,16 @@ js::PauseCurrentHelperThread()
|
||||
HelperThreadState().wait(lock, GlobalHelperThreadState::PAUSE);
|
||||
}
|
||||
|
||||
void
|
||||
JSContext::setHelperThread(HelperThread* thread)
|
||||
{
|
||||
helperThread_ = thread;
|
||||
}
|
||||
|
||||
bool
|
||||
JSContext::addPendingCompileError(frontend::CompileError** error)
|
||||
{
|
||||
UniquePtr<frontend::CompileError> errorPtr(new_<frontend::CompileError>());
|
||||
if (!errorPtr)
|
||||
return false;
|
||||
if (!helperThread()->parseTask()->errors.append(errorPtr.get()))
|
||||
if (!helperThread()->parseTask()->errors.append(errorPtr.get())) {
|
||||
ReportOutOfMemory(this);
|
||||
return false;
|
||||
}
|
||||
*error = errorPtr.release();
|
||||
return true;
|
||||
}
|
||||
@ -1677,18 +1664,16 @@ HelperThread::handleParseWorkload(AutoLockHelperThreadState& locked, uintptr_t s
|
||||
|
||||
currentTask.emplace(HelperThreadState().parseWorklist(locked).popCopy());
|
||||
ParseTask* task = parseTask();
|
||||
task->cx->setHelperThread(this);
|
||||
|
||||
for (size_t i = 0; i < ArrayLength(task->cx->nativeStackLimit); i++)
|
||||
task->cx->nativeStackLimit[i] = stackLimit;
|
||||
|
||||
JSContext* oldcx = TlsContext.get();
|
||||
TlsContext.set(task->cx);
|
||||
{
|
||||
AutoUnlockHelperThreadState unlock(locked);
|
||||
task->parse();
|
||||
AutoSetContextRuntime ascr(task->parseGlobal->runtimeFromAnyThread());
|
||||
|
||||
JSContext* cx = TlsContext.get();
|
||||
AutoCompartment ac(cx, task->parseGlobal);
|
||||
|
||||
task->parse(cx);
|
||||
}
|
||||
TlsContext.set(oldcx);
|
||||
|
||||
// The callback is invoked while we are still off thread.
|
||||
task->callback(task, task->callbackData);
|
||||
@ -1891,6 +1876,12 @@ HelperThread::handleGCHelperWorkload(AutoLockHelperThreadState& locked)
|
||||
HelperThreadState().notifyAll(GlobalHelperThreadState::CONSUMER, locked);
|
||||
}
|
||||
|
||||
void
|
||||
JSContext::setHelperThread(HelperThread* thread)
|
||||
{
|
||||
helperThread_ = thread;
|
||||
}
|
||||
|
||||
void
|
||||
HelperThread::threadLoop()
|
||||
{
|
||||
@ -1900,6 +1891,7 @@ HelperThread::threadLoop()
|
||||
AutoLockHelperThreadState lock;
|
||||
|
||||
JSContext cx(nullptr, JS::ContextOptions());
|
||||
cx.setHelperThread(this);
|
||||
|
||||
// Compute the thread's stack limit, for over-recursed checks.
|
||||
uintptr_t stackLimit = GetNativeStackBase();
|
||||
|
@ -568,7 +568,6 @@ class MOZ_RAII AutoUnlockHelperThreadState : public UnlockGuard<Mutex>
|
||||
struct ParseTask
|
||||
{
|
||||
ParseTaskKind kind;
|
||||
JSContext* cx;
|
||||
OwningCompileOptions options;
|
||||
// Anonymous union, the only correct interpretation is provided by the
|
||||
// ParseTaskKind value, or from the virtual parse function.
|
||||
@ -587,8 +586,8 @@ struct ParseTask
|
||||
};
|
||||
LifoAlloc alloc;
|
||||
|
||||
// Rooted pointer to the global object used by 'cx'.
|
||||
JSObject* exclusiveContextGlobal;
|
||||
// Rooted pointer to the global object to use while parsing.
|
||||
JSObject* parseGlobal;
|
||||
|
||||
// Callback invoked off thread when the parse finishes.
|
||||
JS::OffThreadCompileCallback callback;
|
||||
@ -604,24 +603,24 @@ struct ParseTask
|
||||
|
||||
// Any errors or warnings produced during compilation. These are reported
|
||||
// when finishing the script.
|
||||
Vector<frontend::CompileError*> errors;
|
||||
Vector<frontend::CompileError*, 0, SystemAllocPolicy> errors;
|
||||
bool overRecursed;
|
||||
bool outOfMemory;
|
||||
|
||||
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, const char16_t* chars, size_t length,
|
||||
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData);
|
||||
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
|
||||
JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData);
|
||||
bool init(JSContext* cx, const ReadOnlyCompileOptions& options);
|
||||
|
||||
void activate(JSRuntime* rt);
|
||||
virtual void parse() = 0;
|
||||
virtual void parse(JSContext* cx) = 0;
|
||||
bool finish(JSContext* cx);
|
||||
|
||||
bool runtimeMatches(JSRuntime* rt) {
|
||||
return cx->runtimeMatches(rt);
|
||||
return parseGlobal->runtimeFromAnyThread() == rt;
|
||||
}
|
||||
|
||||
virtual ~ParseTask();
|
||||
@ -631,26 +630,26 @@ struct ParseTask
|
||||
|
||||
struct ScriptParseTask : public ParseTask
|
||||
{
|
||||
ScriptParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, const char16_t* chars, size_t length,
|
||||
ScriptParseTask(JSContext* cx, JSObject* parseGlobal,
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData);
|
||||
void parse() override;
|
||||
void parse(JSContext* cx) override;
|
||||
};
|
||||
|
||||
struct ModuleParseTask : public ParseTask
|
||||
{
|
||||
ModuleParseTask(JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, const char16_t* chars, size_t length,
|
||||
ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
|
||||
const char16_t* chars, size_t length,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData);
|
||||
void parse() override;
|
||||
void parse(JSContext* cx) override;
|
||||
};
|
||||
|
||||
struct ScriptDecodeTask : public ParseTask
|
||||
{
|
||||
ScriptDecodeTask(JSContext* cx, JSObject* exclusiveContextGlobal,
|
||||
JSContext* initCx, JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
|
||||
JS::TranscodeBuffer& buffer, size_t cursor,
|
||||
JS::OffThreadCompileCallback callback, void* callbackData);
|
||||
void parse() override;
|
||||
void parse(JSContext* cx) override;
|
||||
};
|
||||
|
||||
// Return whether, if a new parse task was started, it would need to wait for
|
||||
|
@ -483,10 +483,7 @@ NativeObject::growSlotsDontReportOOM(JSContext* cx, NativeObject* obj, uint32_t
|
||||
static void
|
||||
FreeSlots(JSContext* cx, HeapSlot* slots)
|
||||
{
|
||||
// Note: off thread parse tasks do not have access to GGC nursery allocated things.
|
||||
if (!cx->helperThread())
|
||||
return cx->nursery().freeBuffer(slots);
|
||||
js_free(slots);
|
||||
return cx->nursery().freeBuffer(slots);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -133,7 +133,7 @@ JSRuntime::JSRuntime(JSRuntime* parentRuntime)
|
||||
#ifdef DEBUG
|
||||
activeThreadHasExclusiveAccess(false),
|
||||
#endif
|
||||
numExclusiveThreads(0),
|
||||
numHelperThreadZones(0),
|
||||
numCompartments(0),
|
||||
localeCallbacks(nullptr),
|
||||
defaultLocale(nullptr),
|
||||
@ -306,7 +306,7 @@ JSRuntime::destroyRuntime()
|
||||
MOZ_ASSERT(ionLazyLinkListSize_ == 0);
|
||||
MOZ_ASSERT(ionLazyLinkList().isEmpty());
|
||||
|
||||
MOZ_ASSERT(!numExclusiveThreads);
|
||||
MOZ_ASSERT(!hasHelperThreadZones());
|
||||
AutoLockForExclusiveAccess lock(this);
|
||||
|
||||
/*
|
||||
@ -752,20 +752,20 @@ JSRuntime::activeGCInAtomsZone()
|
||||
}
|
||||
|
||||
void
|
||||
JSRuntime::setUsedByExclusiveThread(Zone* zone)
|
||||
JSRuntime::setUsedByHelperThread(Zone* zone)
|
||||
{
|
||||
MOZ_ASSERT(!zone->usedByExclusiveThread);
|
||||
MOZ_ASSERT(!zone->group()->usedByHelperThread);
|
||||
MOZ_ASSERT(!zone->wasGCStarted());
|
||||
zone->usedByExclusiveThread = true;
|
||||
numExclusiveThreads++;
|
||||
zone->group()->usedByHelperThread = true;
|
||||
numHelperThreadZones++;
|
||||
}
|
||||
|
||||
void
|
||||
JSRuntime::clearUsedByExclusiveThread(Zone* zone)
|
||||
JSRuntime::clearUsedByHelperThread(Zone* zone)
|
||||
{
|
||||
MOZ_ASSERT(zone->usedByExclusiveThread);
|
||||
zone->usedByExclusiveThread = false;
|
||||
numExclusiveThreads--;
|
||||
MOZ_ASSERT(zone->group()->usedByHelperThread);
|
||||
zone->group()->usedByHelperThread = false;
|
||||
numHelperThreadZones--;
|
||||
if (gc.fullGCForAtomsRequested() && !TlsContext.get())
|
||||
gc.triggerFullGCForAtoms();
|
||||
}
|
||||
@ -782,10 +782,8 @@ js::CurrentThreadCanAccessZone(Zone* zone)
|
||||
if (CurrentThreadCanAccessRuntime(zone->runtime_))
|
||||
return true;
|
||||
|
||||
// Only zones in use by an exclusive thread can be used off thread.
|
||||
// We don't keep track of which thread owns such zones though, so this check
|
||||
// is imperfect.
|
||||
return zone->usedByExclusiveThread;
|
||||
// Only zones marked for use by a helper thread can be used off thread.
|
||||
return zone->usedByHelperThread() && zone->group()->ownedByCurrentThread();
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -571,22 +571,22 @@ struct JSRuntime : public js::MallocProvider<JSRuntime>
|
||||
bool activeThreadHasExclusiveAccess;
|
||||
#endif
|
||||
|
||||
/* Number of non-cooperating threads with exclusive access to some zone. */
|
||||
js::UnprotectedData<size_t> numExclusiveThreads;
|
||||
/* Number of zones which may be operated on by non-cooperating helper threads. */
|
||||
js::UnprotectedData<size_t> numHelperThreadZones;
|
||||
|
||||
friend class js::AutoLockForExclusiveAccess;
|
||||
|
||||
public:
|
||||
void setUsedByExclusiveThread(JS::Zone* zone);
|
||||
void clearUsedByExclusiveThread(JS::Zone* zone);
|
||||
void setUsedByHelperThread(JS::Zone* zone);
|
||||
void clearUsedByHelperThread(JS::Zone* zone);
|
||||
|
||||
bool exclusiveThreadsPresent() const {
|
||||
return numExclusiveThreads > 0;
|
||||
bool hasHelperThreadZones() const {
|
||||
return numHelperThreadZones > 0;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
bool currentThreadHasExclusiveAccess() const {
|
||||
return (!exclusiveThreadsPresent() && activeThreadHasExclusiveAccess) ||
|
||||
return (!hasHelperThreadZones() && activeThreadHasExclusiveAccess) ||
|
||||
exclusiveAccessLock.ownedByCurrentThread();
|
||||
}
|
||||
#endif
|
||||
|
@ -335,414 +335,6 @@ nsParser::GetContentSink()
|
||||
return mSink;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine what DTD mode (and thus what layout nsCompatibility mode)
|
||||
* to use for this document based on the first chunk of data received
|
||||
* from the network (each parsercontext can have its own mode). (No,
|
||||
* this is not an optimal solution -- we really don't need to know until
|
||||
* after we've received the DOCTYPE, and this could easily be part of
|
||||
* the regular parsing process if the parser were designed in a way that
|
||||
* made such modifications easy.)
|
||||
*/
|
||||
|
||||
// Parse the PS production in the SGML spec (excluding the part dealing
|
||||
// with entity references) starting at theIndex into theBuffer, and
|
||||
// return the first index after the end of the production.
|
||||
static int32_t
|
||||
ParsePS(const nsString& aBuffer, int32_t aIndex)
|
||||
{
|
||||
for (;;) {
|
||||
char16_t ch = aBuffer.CharAt(aIndex);
|
||||
if ((ch == char16_t(' ')) || (ch == char16_t('\t')) ||
|
||||
(ch == char16_t('\n')) || (ch == char16_t('\r'))) {
|
||||
++aIndex;
|
||||
} else if (ch == char16_t('-')) {
|
||||
int32_t tmpIndex;
|
||||
if (aBuffer.CharAt(aIndex+1) == char16_t('-') &&
|
||||
kNotFound != (tmpIndex=aBuffer.Find("--",false,aIndex+2,-1))) {
|
||||
aIndex = tmpIndex + 2;
|
||||
} else {
|
||||
return aIndex;
|
||||
}
|
||||
} else {
|
||||
return aIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define PARSE_DTD_HAVE_DOCTYPE (1<<0)
|
||||
#define PARSE_DTD_HAVE_PUBLIC_ID (1<<1)
|
||||
#define PARSE_DTD_HAVE_SYSTEM_ID (1<<2)
|
||||
#define PARSE_DTD_HAVE_INTERNAL_SUBSET (1<<3)
|
||||
|
||||
// return true on success (includes not present), false on failure
|
||||
static bool
|
||||
ParseDocTypeDecl(const nsString &aBuffer,
|
||||
int32_t *aResultFlags,
|
||||
nsString &aPublicID,
|
||||
nsString &aSystemID)
|
||||
{
|
||||
bool haveDoctype = false;
|
||||
*aResultFlags = 0;
|
||||
|
||||
// Skip through any comments and processing instructions
|
||||
// The PI-skipping is a bit of a hack.
|
||||
int32_t theIndex = 0;
|
||||
do {
|
||||
theIndex = aBuffer.FindChar('<', theIndex);
|
||||
if (theIndex == kNotFound) break;
|
||||
char16_t nextChar = aBuffer.CharAt(theIndex+1);
|
||||
if (nextChar == char16_t('!')) {
|
||||
int32_t tmpIndex = theIndex + 2;
|
||||
if (kNotFound !=
|
||||
(theIndex=aBuffer.Find("DOCTYPE", true, tmpIndex, 0))) {
|
||||
haveDoctype = true;
|
||||
theIndex += 7; // skip "DOCTYPE"
|
||||
break;
|
||||
}
|
||||
theIndex = ParsePS(aBuffer, tmpIndex);
|
||||
theIndex = aBuffer.FindChar('>', theIndex);
|
||||
} else if (nextChar == char16_t('?')) {
|
||||
theIndex = aBuffer.FindChar('>', theIndex);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} while (theIndex != kNotFound);
|
||||
|
||||
if (!haveDoctype)
|
||||
return true;
|
||||
*aResultFlags |= PARSE_DTD_HAVE_DOCTYPE;
|
||||
|
||||
theIndex = ParsePS(aBuffer, theIndex);
|
||||
theIndex = aBuffer.Find("HTML", true, theIndex, 0);
|
||||
if (kNotFound == theIndex)
|
||||
return false;
|
||||
theIndex = ParsePS(aBuffer, theIndex+4);
|
||||
int32_t tmpIndex = aBuffer.Find("PUBLIC", true, theIndex, 0);
|
||||
|
||||
if (kNotFound != tmpIndex) {
|
||||
theIndex = ParsePS(aBuffer, tmpIndex+6);
|
||||
|
||||
// We get here only if we've read <!DOCTYPE HTML PUBLIC
|
||||
// (not case sensitive) possibly with comments within.
|
||||
|
||||
// Now find the beginning and end of the public identifier
|
||||
// and the system identifier (if present).
|
||||
|
||||
char16_t lit = aBuffer.CharAt(theIndex);
|
||||
if ((lit != char16_t('\"')) && (lit != char16_t('\'')))
|
||||
return false;
|
||||
|
||||
// Start is the first character, excluding the quote, and End is
|
||||
// the final quote, so there are (end-start) characters.
|
||||
|
||||
int32_t PublicIDStart = theIndex + 1;
|
||||
int32_t PublicIDEnd = aBuffer.FindChar(lit, PublicIDStart);
|
||||
if (kNotFound == PublicIDEnd)
|
||||
return false;
|
||||
theIndex = ParsePS(aBuffer, PublicIDEnd + 1);
|
||||
char16_t next = aBuffer.CharAt(theIndex);
|
||||
if (next == char16_t('>')) {
|
||||
// There was a public identifier, but no system
|
||||
// identifier,
|
||||
// so do nothing.
|
||||
// This is needed to avoid the else at the end, and it's
|
||||
// also the most common case.
|
||||
} else if ((next == char16_t('\"')) ||
|
||||
(next == char16_t('\''))) {
|
||||
// We found a system identifier.
|
||||
*aResultFlags |= PARSE_DTD_HAVE_SYSTEM_ID;
|
||||
int32_t SystemIDStart = theIndex + 1;
|
||||
int32_t SystemIDEnd = aBuffer.FindChar(next, SystemIDStart);
|
||||
if (kNotFound == SystemIDEnd)
|
||||
return false;
|
||||
aSystemID =
|
||||
Substring(aBuffer, SystemIDStart, SystemIDEnd - SystemIDStart);
|
||||
} else if (next == char16_t('[')) {
|
||||
// We found an internal subset.
|
||||
*aResultFlags |= PARSE_DTD_HAVE_INTERNAL_SUBSET;
|
||||
} else {
|
||||
// Something's wrong.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Since a public ID is a minimum literal, we must trim
|
||||
// and collapse whitespace
|
||||
aPublicID = Substring(aBuffer, PublicIDStart, PublicIDEnd - PublicIDStart);
|
||||
aPublicID.CompressWhitespace(true, true);
|
||||
*aResultFlags |= PARSE_DTD_HAVE_PUBLIC_ID;
|
||||
} else {
|
||||
tmpIndex=aBuffer.Find("SYSTEM", true, theIndex, 0);
|
||||
if (kNotFound != tmpIndex) {
|
||||
// DOCTYPES with system ID but no Public ID
|
||||
*aResultFlags |= PARSE_DTD_HAVE_SYSTEM_ID;
|
||||
|
||||
theIndex = ParsePS(aBuffer, tmpIndex+6);
|
||||
char16_t next = aBuffer.CharAt(theIndex);
|
||||
if (next != char16_t('\"') && next != char16_t('\''))
|
||||
return false;
|
||||
|
||||
int32_t SystemIDStart = theIndex + 1;
|
||||
int32_t SystemIDEnd = aBuffer.FindChar(next, SystemIDStart);
|
||||
|
||||
if (kNotFound == SystemIDEnd)
|
||||
return false;
|
||||
aSystemID =
|
||||
Substring(aBuffer, SystemIDStart, SystemIDEnd - SystemIDStart);
|
||||
theIndex = ParsePS(aBuffer, SystemIDEnd + 1);
|
||||
}
|
||||
|
||||
char16_t nextChar = aBuffer.CharAt(theIndex);
|
||||
if (nextChar == char16_t('['))
|
||||
*aResultFlags |= PARSE_DTD_HAVE_INTERNAL_SUBSET;
|
||||
else if (nextChar != char16_t('>'))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
struct PubIDInfo
|
||||
{
|
||||
enum eMode {
|
||||
eQuirks, /* always quirks mode, unless there's an internal subset */
|
||||
eAlmostStandards,/* eCompatibility_AlmostStandards */
|
||||
eFullStandards /* eCompatibility_FullStandards */
|
||||
/*
|
||||
* public IDs that should trigger strict mode are not listed
|
||||
* since we want all future public IDs to trigger strict mode as
|
||||
* well
|
||||
*/
|
||||
};
|
||||
|
||||
const char* name;
|
||||
eMode mode_if_no_sysid;
|
||||
eMode mode_if_sysid;
|
||||
};
|
||||
|
||||
#define ELEMENTS_OF(array_) (sizeof(array_)/sizeof(array_[0]))
|
||||
|
||||
// These must be in nsCRT::strcmp order so binary-search can be used.
|
||||
// This is verified, |#ifdef DEBUG|, below.
|
||||
|
||||
// Even though public identifiers should be case sensitive, we will do
|
||||
// all comparisons after converting to lower case in order to do
|
||||
// case-insensitive comparison since there are a number of existing web
|
||||
// sites that use the incorrect case. Therefore all of the public
|
||||
// identifiers below are in lower case (with the correct case following,
|
||||
// in comments). The case is verified, |#ifdef DEBUG|, below.
|
||||
static const PubIDInfo kPublicIDs[] = {
|
||||
{"+//silmaril//dtd html pro v0r11 19970101//en" /* "+//Silmaril//dtd html Pro v0r11 19970101//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//advasoft ltd//dtd html 3.0 aswedit + extensions//en" /* "-//AdvaSoft Ltd//DTD HTML 3.0 asWedit + extensions//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//as//dtd html 3.0 aswedit + extensions//en" /* "-//AS//DTD HTML 3.0 asWedit + extensions//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.0 level 1//en" /* "-//IETF//DTD HTML 2.0 Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.0 level 2//en" /* "-//IETF//DTD HTML 2.0 Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.0 strict level 1//en" /* "-//IETF//DTD HTML 2.0 Strict Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.0 strict level 2//en" /* "-//IETF//DTD HTML 2.0 Strict Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.0 strict//en" /* "-//IETF//DTD HTML 2.0 Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.0//en" /* "-//IETF//DTD HTML 2.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 2.1e//en" /* "-//IETF//DTD HTML 2.1E//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 3.0//en" /* "-//IETF//DTD HTML 3.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 3.0//en//" /* "-//IETF//DTD HTML 3.0//EN//" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 3.2 final//en" /* "-//IETF//DTD HTML 3.2 Final//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 3.2//en" /* "-//IETF//DTD HTML 3.2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html 3//en" /* "-//IETF//DTD HTML 3//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 0//en" /* "-//IETF//DTD HTML Level 0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 0//en//2.0" /* "-//IETF//DTD HTML Level 0//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 1//en" /* "-//IETF//DTD HTML Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 1//en//2.0" /* "-//IETF//DTD HTML Level 1//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 2//en" /* "-//IETF//DTD HTML Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 2//en//2.0" /* "-//IETF//DTD HTML Level 2//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 3//en" /* "-//IETF//DTD HTML Level 3//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html level 3//en//3.0" /* "-//IETF//DTD HTML Level 3//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 0//en" /* "-//IETF//DTD HTML Strict Level 0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 0//en//2.0" /* "-//IETF//DTD HTML Strict Level 0//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 1//en" /* "-//IETF//DTD HTML Strict Level 1//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 1//en//2.0" /* "-//IETF//DTD HTML Strict Level 1//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 2//en" /* "-//IETF//DTD HTML Strict Level 2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 2//en//2.0" /* "-//IETF//DTD HTML Strict Level 2//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 3//en" /* "-//IETF//DTD HTML Strict Level 3//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict level 3//en//3.0" /* "-//IETF//DTD HTML Strict Level 3//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict//en" /* "-//IETF//DTD HTML Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict//en//2.0" /* "-//IETF//DTD HTML Strict//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html strict//en//3.0" /* "-//IETF//DTD HTML Strict//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html//en" /* "-//IETF//DTD HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html//en//2.0" /* "-//IETF//DTD HTML//EN//2.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//ietf//dtd html//en//3.0" /* "-//IETF//DTD HTML//EN//3.0" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//metrius//dtd metrius presentational//en" /* "-//Metrius//DTD Metrius Presentational//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//microsoft//dtd internet explorer 2.0 html strict//en" /* "-//Microsoft//DTD Internet Explorer 2.0 HTML Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//microsoft//dtd internet explorer 2.0 html//en" /* "-//Microsoft//DTD Internet Explorer 2.0 HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//microsoft//dtd internet explorer 2.0 tables//en" /* "-//Microsoft//DTD Internet Explorer 2.0 Tables//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//microsoft//dtd internet explorer 3.0 html strict//en" /* "-//Microsoft//DTD Internet Explorer 3.0 HTML Strict//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//microsoft//dtd internet explorer 3.0 html//en" /* "-//Microsoft//DTD Internet Explorer 3.0 HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//microsoft//dtd internet explorer 3.0 tables//en" /* "-//Microsoft//DTD Internet Explorer 3.0 Tables//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//netscape comm. corp.//dtd html//en" /* "-//Netscape Comm. Corp.//DTD HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//netscape comm. corp.//dtd strict html//en" /* "-//Netscape Comm. Corp.//DTD Strict HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//o'reilly and associates//dtd html 2.0//en" /* "-//O'Reilly and Associates//DTD HTML 2.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//o'reilly and associates//dtd html extended 1.0//en" /* "-//O'Reilly and Associates//DTD HTML Extended 1.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//o'reilly and associates//dtd html extended relaxed 1.0//en" /* "-//O'Reilly and Associates//DTD HTML Extended Relaxed 1.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//en" /* "-//SoftQuad Software//DTD HoTMetaL PRO 6.0::19990601::extensions to HTML 4.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//en" /* "-//SoftQuad//DTD HoTMetaL PRO 4.0::19971010::extensions to HTML 4.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//spyglass//dtd html 2.0 extended//en" /* "-//Spyglass//DTD HTML 2.0 Extended//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//sq//dtd html 2.0 hotmetal + extensions//en" /* "-//SQ//DTD HTML 2.0 HoTMetaL + extensions//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//sun microsystems corp.//dtd hotjava html//en" /* "-//Sun Microsystems Corp.//DTD HotJava HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//sun microsystems corp.//dtd hotjava strict html//en" /* "-//Sun Microsystems Corp.//DTD HotJava Strict HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 3 1995-03-24//en" /* "-//W3C//DTD HTML 3 1995-03-24//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 3.2 draft//en" /* "-//W3C//DTD HTML 3.2 Draft//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 3.2 final//en" /* "-//W3C//DTD HTML 3.2 Final//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 3.2//en" /* "-//W3C//DTD HTML 3.2//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 3.2s draft//en" /* "-//W3C//DTD HTML 3.2S Draft//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 4.0 frameset//en" /* "-//W3C//DTD HTML 4.0 Frameset//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 4.0 transitional//en" /* "-//W3C//DTD HTML 4.0 Transitional//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html 4.01 frameset//en" /* "-//W3C//DTD HTML 4.01 Frameset//EN" */, PubIDInfo::eQuirks, PubIDInfo::eAlmostStandards},
|
||||
{"-//w3c//dtd html 4.01 transitional//en" /* "-//W3C//DTD HTML 4.01 Transitional//EN" */, PubIDInfo::eQuirks, PubIDInfo::eAlmostStandards},
|
||||
{"-//w3c//dtd html experimental 19960712//en" /* "-//W3C//DTD HTML Experimental 19960712//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd html experimental 970421//en" /* "-//W3C//DTD HTML Experimental 970421//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd w3 html//en" /* "-//W3C//DTD W3 HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3c//dtd xhtml 1.0 frameset//en" /* "-//W3C//DTD XHTML 1.0 Frameset//EN" */, PubIDInfo::eAlmostStandards, PubIDInfo::eAlmostStandards},
|
||||
{"-//w3c//dtd xhtml 1.0 transitional//en" /* "-//W3C//DTD XHTML 1.0 Transitional//EN" */, PubIDInfo::eAlmostStandards, PubIDInfo::eAlmostStandards},
|
||||
{"-//w3o//dtd w3 html 3.0//en" /* "-//W3O//DTD W3 HTML 3.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3o//dtd w3 html 3.0//en//" /* "-//W3O//DTD W3 HTML 3.0//EN//" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//w3o//dtd w3 html strict 3.0//en//" /* "-//W3O//DTD W3 HTML Strict 3.0//EN//" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//webtechs//dtd mozilla html 2.0//en" /* "-//WebTechs//DTD Mozilla HTML 2.0//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-//webtechs//dtd mozilla html//en" /* "-//WebTechs//DTD Mozilla HTML//EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"-/w3c/dtd html 4.0 transitional/en" /* "-/W3C/DTD HTML 4.0 Transitional/EN" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
{"html" /* "HTML" */, PubIDInfo::eQuirks, PubIDInfo::eQuirks},
|
||||
};
|
||||
|
||||
#ifdef DEBUG
|
||||
static void
|
||||
VerifyPublicIDs()
|
||||
{
|
||||
static bool gVerified = false;
|
||||
if (!gVerified) {
|
||||
gVerified = true;
|
||||
uint32_t i;
|
||||
for (i = 0; i < ELEMENTS_OF(kPublicIDs) - 1; ++i) {
|
||||
if (nsCRT::strcmp(kPublicIDs[i].name, kPublicIDs[i+1].name) >= 0) {
|
||||
NS_NOTREACHED("doctypes out of order");
|
||||
printf("Doctypes %s and %s out of order.\n",
|
||||
kPublicIDs[i].name, kPublicIDs[i+1].name);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < ELEMENTS_OF(kPublicIDs); ++i) {
|
||||
nsAutoCString lcPubID(kPublicIDs[i].name);
|
||||
ToLowerCase(lcPubID);
|
||||
if (nsCRT::strcmp(kPublicIDs[i].name, lcPubID.get()) != 0) {
|
||||
NS_NOTREACHED("doctype not lower case");
|
||||
printf("Doctype %s not lower case.\n", kPublicIDs[i].name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
|
||||
struct PublicIdComparator
|
||||
{
|
||||
const nsAutoCString& mPublicId;
|
||||
explicit PublicIdComparator(const nsAutoCString& aPublicId)
|
||||
: mPublicId(aPublicId) {}
|
||||
int operator()(const PubIDInfo& aInfo) const {
|
||||
return nsCRT::strcmp(mPublicId.get(), aInfo.name);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
static void
|
||||
DetermineHTMLParseMode(const nsString& aBuffer,
|
||||
nsDTDMode& aParseMode,
|
||||
eParserDocType& aDocType)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
VerifyPublicIDs();
|
||||
#endif
|
||||
int32_t resultFlags;
|
||||
nsAutoString publicIDUCS2, sysIDUCS2;
|
||||
if (ParseDocTypeDecl(aBuffer, &resultFlags, publicIDUCS2, sysIDUCS2)) {
|
||||
if (!(resultFlags & PARSE_DTD_HAVE_DOCTYPE)) {
|
||||
// no DOCTYPE
|
||||
aParseMode = eDTDMode_quirks;
|
||||
aDocType = eHTML_Quirks;
|
||||
} else if ((resultFlags & PARSE_DTD_HAVE_INTERNAL_SUBSET) ||
|
||||
!(resultFlags & PARSE_DTD_HAVE_PUBLIC_ID)) {
|
||||
// A doctype with an internal subset is always full_standards.
|
||||
// A doctype without a public ID is always full_standards.
|
||||
aDocType = eHTML_Strict;
|
||||
aParseMode = eDTDMode_full_standards;
|
||||
|
||||
// Special hack for IBM's custom DOCTYPE.
|
||||
if (!(resultFlags & PARSE_DTD_HAVE_INTERNAL_SUBSET) &&
|
||||
sysIDUCS2.EqualsLiteral(
|
||||
"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd")) {
|
||||
aParseMode = eDTDMode_quirks;
|
||||
aDocType = eHTML_Quirks;
|
||||
}
|
||||
|
||||
} else {
|
||||
// We have to check our list of public IDs to see what to do.
|
||||
// Yes, we want UCS2 to ASCII lossy conversion.
|
||||
nsAutoCString publicID;
|
||||
publicID.AssignWithConversion(publicIDUCS2);
|
||||
|
||||
// See comment above definition of kPublicIDs about case
|
||||
// sensitivity.
|
||||
ToLowerCase(publicID);
|
||||
|
||||
// Binary search to see if we can find the correct public ID.
|
||||
size_t index;
|
||||
bool found = BinarySearchIf(kPublicIDs, 0, ArrayLength(kPublicIDs),
|
||||
PublicIdComparator(publicID), &index);
|
||||
if (!found) {
|
||||
// The DOCTYPE is not in our list, so it must be full_standards.
|
||||
aParseMode = eDTDMode_full_standards;
|
||||
aDocType = eHTML_Strict;
|
||||
return;
|
||||
}
|
||||
|
||||
switch ((resultFlags & PARSE_DTD_HAVE_SYSTEM_ID)
|
||||
? kPublicIDs[index].mode_if_sysid
|
||||
: kPublicIDs[index].mode_if_no_sysid)
|
||||
{
|
||||
case PubIDInfo::eQuirks:
|
||||
aParseMode = eDTDMode_quirks;
|
||||
aDocType = eHTML_Quirks;
|
||||
break;
|
||||
case PubIDInfo::eAlmostStandards:
|
||||
aParseMode = eDTDMode_almost_standards;
|
||||
aDocType = eHTML_Strict;
|
||||
break;
|
||||
case PubIDInfo::eFullStandards:
|
||||
aParseMode = eDTDMode_full_standards;
|
||||
aDocType = eHTML_Strict;
|
||||
break;
|
||||
default:
|
||||
NS_NOTREACHED("no other cases!");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// badly formed DOCTYPE -> quirks
|
||||
aParseMode = eDTDMode_quirks;
|
||||
aDocType = eHTML_Quirks;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
DetermineParseMode(const nsString& aBuffer, nsDTDMode& aParseMode,
|
||||
eParserDocType& aDocType, const nsACString& aMimeType)
|
||||
{
|
||||
if (aMimeType.EqualsLiteral(TEXT_HTML)) {
|
||||
DetermineHTMLParseMode(aBuffer, aParseMode, aDocType);
|
||||
} else if (nsContentUtils::IsPlainTextType(aMimeType)) {
|
||||
aDocType = ePlainText;
|
||||
aParseMode = eDTDMode_quirks;
|
||||
} else { // Some form of XML
|
||||
aDocType = eXML;
|
||||
aParseMode = eDTDMode_full_standards;
|
||||
}
|
||||
}
|
||||
|
||||
static nsIDTD*
|
||||
FindSuitableDTD(CParserContext& aParserContext)
|
||||
{
|
||||
@ -849,15 +441,14 @@ nsParser::WillBuildModel(nsString& aFilename)
|
||||
|
||||
if (eDTDMode_unknown == mParserContext->mDTDMode ||
|
||||
eDTDMode_autodetect == mParserContext->mDTDMode) {
|
||||
char16_t buf[1025];
|
||||
nsFixedString theBuffer(buf, 1024, 0);
|
||||
|
||||
// Grab 1024 characters, starting at the first non-whitespace
|
||||
// character, to look for the doctype in.
|
||||
mParserContext->mScanner->Peek(theBuffer, 1024, mParserContext->mScanner->FirstNonWhitespacePosition());
|
||||
DetermineParseMode(theBuffer, mParserContext->mDTDMode,
|
||||
mParserContext->mDocType, mParserContext->mMimeType);
|
||||
}
|
||||
if (mIsAboutBlank) {
|
||||
mParserContext->mDTDMode = eDTDMode_quirks;
|
||||
mParserContext->mDocType = eHTML_Quirks;
|
||||
} else {
|
||||
mParserContext->mDTDMode = eDTDMode_full_standards;
|
||||
mParserContext->mDocType = eXML;
|
||||
}
|
||||
} // else XML fragment with nested parser context
|
||||
|
||||
NS_ASSERTION(!mDTD || !mParserContext->mPrevContext,
|
||||
"Clobbering DTD for non-root parser context!");
|
||||
|
@ -329,70 +329,6 @@ nsresult nsScanner::GetChar(char16_t& aChar) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* peek ahead to consume next char from scanner's internal
|
||||
* input buffer
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
nsresult nsScanner::Peek(char16_t& aChar, uint32_t aOffset) {
|
||||
aChar = 0;
|
||||
|
||||
if (!mSlidingBuffer || mCurrentPosition == mEndPosition) {
|
||||
return NS_ERROR_HTMLPARSER_EOF;
|
||||
}
|
||||
|
||||
if (aOffset > 0) {
|
||||
if (mCountRemaining <= aOffset)
|
||||
return NS_ERROR_HTMLPARSER_EOF;
|
||||
|
||||
nsScannerIterator pos = mCurrentPosition;
|
||||
pos.advance(aOffset);
|
||||
aChar=*pos;
|
||||
}
|
||||
else {
|
||||
aChar=*mCurrentPosition;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsScanner::Peek(nsAString& aStr, int32_t aNumChars, int32_t aOffset)
|
||||
{
|
||||
if (!mSlidingBuffer || mCurrentPosition == mEndPosition) {
|
||||
return NS_ERROR_HTMLPARSER_EOF;
|
||||
}
|
||||
|
||||
nsScannerIterator start, end;
|
||||
|
||||
start = mCurrentPosition;
|
||||
|
||||
if ((int32_t)mCountRemaining <= aOffset) {
|
||||
return NS_ERROR_HTMLPARSER_EOF;
|
||||
}
|
||||
|
||||
if (aOffset > 0) {
|
||||
start.advance(aOffset);
|
||||
}
|
||||
|
||||
if (mCountRemaining < uint32_t(aNumChars + aOffset)) {
|
||||
end = mEndPosition;
|
||||
}
|
||||
else {
|
||||
end = start;
|
||||
end.advance(aNumChars);
|
||||
}
|
||||
|
||||
if (!CopyUnicodeTo(start, end, aStr)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void nsScanner::BindSubstring(nsScannerSubstring& aSubstring, const nsScannerIterator& aStart, const nsScannerIterator& aEnd)
|
||||
{
|
||||
aSubstring.Rebind(*mSlidingBuffer, aStart, aEnd);
|
||||
|
@ -60,18 +60,6 @@ class nsScanner {
|
||||
*/
|
||||
nsresult GetChar(char16_t& ch);
|
||||
|
||||
/**
|
||||
* peek ahead to consume next char from scanner's internal
|
||||
* input buffer
|
||||
*
|
||||
* @update gess 3/25/98
|
||||
* @param ch is the char to accept new value
|
||||
* @return error code reflecting read status
|
||||
*/
|
||||
nsresult Peek(char16_t& ch, uint32_t aOffset=0);
|
||||
|
||||
nsresult Peek(nsAString& aStr, int32_t aNumChars, int32_t aOffset = 0);
|
||||
|
||||
/**
|
||||
* Records current offset position in input stream. This allows us
|
||||
* to back up to this point if the need should arise, such as when
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "nsScannerString.h"
|
||||
#include "mozilla/CheckedInt.h"
|
||||
|
||||
|
||||
/**
|
||||
@ -472,7 +473,13 @@ CopyUnicodeTo( const nsScannerIterator& aSrcStart,
|
||||
nsAString& aDest )
|
||||
{
|
||||
nsAString::iterator writer;
|
||||
if (!aDest.SetLength(Distance(aSrcStart, aSrcEnd), mozilla::fallible)) {
|
||||
|
||||
mozilla::CheckedInt<nsAString::size_type> distance(Distance(aSrcStart, aSrcEnd));
|
||||
if (!distance.isValid()) {
|
||||
return false; // overflow detected
|
||||
}
|
||||
|
||||
if (!aDest.SetLength(distance.value(), mozilla::fallible)) {
|
||||
aDest.Truncate();
|
||||
return false; // out of memory
|
||||
}
|
||||
@ -505,8 +512,14 @@ AppendUnicodeTo( const nsScannerIterator& aSrcStart,
|
||||
nsAString& aDest )
|
||||
{
|
||||
nsAString::iterator writer;
|
||||
uint32_t oldLength = aDest.Length();
|
||||
if (!aDest.SetLength(oldLength + Distance(aSrcStart, aSrcEnd), mozilla::fallible))
|
||||
const nsAString::size_type oldLength = aDest.Length();
|
||||
CheckedInt<nsAString::size_type> newLen(Distance(aSrcStart, aSrcEnd));
|
||||
newLen += oldLength;
|
||||
if (!newLen.isValid()) {
|
||||
return false; // overflow detected
|
||||
}
|
||||
|
||||
if (!aDest.SetLength(newLen.value(), mozilla::fallible))
|
||||
return false; // out of memory
|
||||
aDest.BeginWriting(writer).advance(oldLength);
|
||||
nsScannerIterator fromBegin(aSrcStart);
|
||||
|
@ -1157,4 +1157,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
||||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1495638976632000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1495728091984000);
|
||||
|
@ -79,6 +79,7 @@ abeestrada.com: did not receive HSTS header
|
||||
abilitylist.org: did not receive HSTS header
|
||||
abioniere.de: could not connect to host
|
||||
abnarnro.com: could not connect to host
|
||||
abolitionistsociety.com: could not connect to host
|
||||
about.ge: could not connect to host
|
||||
aboutmyip.info: did not receive HSTS header
|
||||
aboutmyproperty.ca: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
@ -143,6 +144,7 @@ ahmedabadflowermall.com: did not receive HSTS header
|
||||
ahoynetwork.com: could not connect to host
|
||||
ahri.ovh: could not connect to host
|
||||
aidanwoods.com: did not receive HSTS header
|
||||
airbnb.com: did not receive HSTS header
|
||||
aircomms.com: did not receive HSTS header
|
||||
airproto.com: did not receive HSTS header
|
||||
aishnair.com: could not connect to host
|
||||
@ -288,6 +290,7 @@ ars-design.net: could not connect to host
|
||||
ars.toscana.it: max-age too low: 0
|
||||
artiming.com: could not connect to host
|
||||
artistnetwork.nl: did not receive HSTS header
|
||||
artofeyes.nl: did not receive HSTS header
|
||||
arturkohut.com: could not connect to host
|
||||
arvamus.eu: could not connect to host
|
||||
as.se: could not connect to host
|
||||
@ -361,9 +364,8 @@ axeny.com: did not receive HSTS header
|
||||
az.search.yahoo.com: did not receive HSTS header
|
||||
azprep.us: could not connect to host
|
||||
azuxul.fr: could not connect to host
|
||||
b303.me: did not receive HSTS header
|
||||
b3orion.com: max-age too low: 0
|
||||
baby-click.de: could not connect to host
|
||||
baby-click.de: did not receive HSTS header
|
||||
babybic.hu: did not receive HSTS header
|
||||
babyhouse.xyz: could not connect to host
|
||||
babysaying.me: could not connect to host
|
||||
@ -502,7 +504,6 @@ blog-ritaline.com: could not connect to host
|
||||
blog.cyveillance.com: did not receive HSTS header
|
||||
blog.lookout.com: did not receive HSTS header
|
||||
bloglikepro.com: could not connect to host
|
||||
blogreen.org: could not connect to host
|
||||
blubbablasen.de: could not connect to host
|
||||
blucas.org: did not receive HSTS header
|
||||
blueglobalmedia.com: max-age too low: 0
|
||||
@ -529,6 +530,7 @@ bonigo.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_
|
||||
bonitabrazilian.co.nz: did not receive HSTS header
|
||||
bookcelerator.com: did not receive HSTS header
|
||||
booked.holiday: could not connect to host
|
||||
bookingapp.nl: did not receive HSTS header
|
||||
bookourdjs.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
boomerang.com: could not connect to host
|
||||
boosterlearnpro.com: did not receive HSTS header
|
||||
@ -574,6 +576,7 @@ budgetthostels.nl: did not receive HSTS header
|
||||
budskap.eu: could not connect to host
|
||||
bugs.chromium.org: did not receive HSTS header (error ignored - included regardless)
|
||||
bugtrack.io: did not receive HSTS header
|
||||
bugwie.com: did not receive HSTS header
|
||||
buhler.pro: did not receive HSTS header
|
||||
buildci.asia: could not connect to host
|
||||
buildsaver.co.za: did not receive HSTS header
|
||||
@ -597,9 +600,12 @@ buttercoin.com: could not connect to host
|
||||
butterfieldstraining.com: did not receive HSTS header
|
||||
buybaby.eu: did not receive HSTS header
|
||||
buyfox.de: did not receive HSTS header
|
||||
bw.codes: could not connect to host
|
||||
bws16.de: did not receive HSTS header
|
||||
by4cqb.cn: could not connect to host
|
||||
bypassed.press: could not connect to host
|
||||
bypassed.today: did not receive HSTS header
|
||||
bypassed.works: did not receive HSTS header
|
||||
bypassed.world: did not receive HSTS header
|
||||
bypro.xyz: could not connect to host
|
||||
bysymphony.com: max-age too low: 0
|
||||
@ -620,6 +626,7 @@ cake.care: could not connect to host
|
||||
calendarr.com: did not receive HSTS header
|
||||
calgaryconstructionjobs.com: did not receive HSTS header
|
||||
calix.com: max-age too low: 0
|
||||
call.me: did not receive HSTS header
|
||||
calltrackingreports.com: could not connect to host
|
||||
calvin.me: max-age too low: 2592000
|
||||
calvinallen.net: did not receive HSTS header
|
||||
@ -630,7 +637,6 @@ cancelmyprofile.com: did not receive HSTS header
|
||||
candicontrols.com: did not receive HSTS header
|
||||
candratech.com: could not connect to host
|
||||
candylion.rocks: could not connect to host
|
||||
canfly.org: did not receive HSTS header
|
||||
cannyfoxx.me: could not connect to host
|
||||
canyonshoa.com: did not receive HSTS header
|
||||
capecycles.co.za: did not receive HSTS header
|
||||
@ -734,6 +740,7 @@ christianbro.gq: could not connect to host
|
||||
christophercolumbusfoundation.gov: could not connect to host
|
||||
christophheich.me: could not connect to host
|
||||
chrisupjohn.com: could not connect to host
|
||||
chromaryu.net: could not connect to host
|
||||
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
|
||||
chrome.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
chromiumbugs.appspot.com: did not receive HSTS header (error ignored - included regardless)
|
||||
@ -758,7 +765,6 @@ clara-baumert.de: could not connect to host
|
||||
classicsandexotics.com: did not receive HSTS header
|
||||
classicspublishing.com: could not connect to host
|
||||
clcleaningco.com: could not connect to host
|
||||
cldly.com: could not connect to host
|
||||
cleanexperts.co.uk: could not connect to host
|
||||
cleaningsquad.ca: could not connect to host
|
||||
cleanmta.com: could not connect to host
|
||||
@ -780,7 +786,6 @@ cloudcy.net: could not connect to host
|
||||
clouddesktop.co.nz: could not connect to host
|
||||
cloudey.net: did not receive HSTS header
|
||||
cloudflare.com: did not receive HSTS header
|
||||
cloudily.com: could not connect to host
|
||||
cloudimag.es: could not connect to host
|
||||
cloudlink.club: could not connect to host
|
||||
cloudns.com.au: could not connect to host
|
||||
@ -814,11 +819,11 @@ codeco.pw: could not connect to host
|
||||
codeforce.io: could not connect to host
|
||||
codelayer.ca: could not connect to host
|
||||
codepoet.de: could not connect to host
|
||||
codepult.com: could not connect to host
|
||||
codepx.com: did not receive HSTS header
|
||||
codereview.appspot.com: did not receive HSTS header (error ignored - included regardless)
|
||||
codereview.chromium.org: did not receive HSTS header (error ignored - included regardless)
|
||||
codiva.io: max-age too low: 2592000
|
||||
codymoniz.com: could not connect to host
|
||||
coffeeetc.co.uk: did not receive HSTS header
|
||||
coffeestrategies.com: max-age too low: 2592000
|
||||
coiffeurschnittstelle.ch: did not receive HSTS header
|
||||
@ -840,6 +845,7 @@ compalytics.com: could not connect to host
|
||||
comparejewelleryprices.co.uk: could not connect to host
|
||||
completeid.com: max-age too low: 86400
|
||||
completionist.audio: could not connect to host
|
||||
compraneta.com: could not connect to host
|
||||
compucorner.com.mx: could not connect to host
|
||||
concord-group.co.jp: did not receive HSTS header
|
||||
condesaelectronics.com: max-age too low: 0
|
||||
@ -854,7 +860,6 @@ contarkos.xyz: could not connect to host
|
||||
content-api-dev.azurewebsites.net: could not connect to host
|
||||
continuumgaming.com: could not connect to host
|
||||
controlcenter.gigahost.dk: did not receive HSTS header
|
||||
convert.zone: could not connect to host
|
||||
coolchevy.org.ua: did not receive HSTS header
|
||||
cor-ser.es: could not connect to host
|
||||
coralproject.net: did not receive HSTS header
|
||||
@ -920,7 +925,9 @@ csgoelemental.com: could not connect to host
|
||||
csgokings.eu: could not connect to host
|
||||
csohack.tk: could not connect to host
|
||||
cspbuilder.info: could not connect to host
|
||||
csru.net: could not connect to host
|
||||
csvape.com: did not receive HSTS header
|
||||
ct-status.org: could not connect to host
|
||||
ct.search.yahoo.com: did not receive HSTS header
|
||||
cthulhuden.com: could not connect to host
|
||||
cubeserver.eu: could not connect to host
|
||||
@ -941,6 +948,7 @@ cycleluxembourg.lu: did not receive HSTS header
|
||||
cydia-search.io: could not connect to host
|
||||
cyph.com: did not receive HSTS header
|
||||
cyphertite.com: could not connect to host
|
||||
czerno.com: could not connect to host
|
||||
czlx.co: could not connect to host
|
||||
dad256.tk: could not connect to host
|
||||
dadtheimpaler.com: could not connect to host
|
||||
@ -1009,6 +1017,7 @@ debian-vhost.de: did not receive HSTS header
|
||||
debiton.dk: could not connect to host
|
||||
debtkit.co.uk: did not receive HSTS header
|
||||
decafu.co: could not connect to host
|
||||
decesus.com: could not connect to host
|
||||
decibelios.li: could not connect to host
|
||||
deco.me: could not connect to host
|
||||
dedicatutiempo.es: could not connect to host
|
||||
@ -1045,13 +1054,14 @@ designgears.com: did not receive HSTS header
|
||||
designthinking.or.jp: did not receive HSTS header
|
||||
despora.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
destinationbijoux.fr: could not connect to host
|
||||
destom.be: could not connect to host
|
||||
detector.exposed: could not connect to host
|
||||
devcu.net: did not receive HSTS header
|
||||
deviltracks.net: could not connect to host
|
||||
devincrow.me: could not connect to host
|
||||
devtub.com: did not receive HSTS header
|
||||
devuan.org: did not receive HSTS header
|
||||
dhpcs.com: did not receive HSTS header
|
||||
dhpiggott.net: did not receive HSTS header
|
||||
diablotine.rocks: could not connect to host
|
||||
diarbag.us: did not receive HSTS header
|
||||
diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
@ -1093,6 +1103,7 @@ docset.io: could not connect to host
|
||||
docufiel.com: could not connect to host
|
||||
doeswindowssuckforeveryoneorjustme.com: could not connect to host
|
||||
dogbox.se: did not receive HSTS header
|
||||
dogmap.jp: could not connect to host
|
||||
dohosting.ru: could not connect to host
|
||||
dokan.online: could not connect to host
|
||||
dollarstore24.com: could not connect to host
|
||||
@ -1134,8 +1145,6 @@ drtroyhendrickson.com: could not connect to host
|
||||
drumbandesperanto.nl: could not connect to host
|
||||
ds-christiansen.de: did not receive HSTS header
|
||||
dshiv.io: could not connect to host
|
||||
dubrovskiy.net: could not connect to host
|
||||
dubrovskiy.pro: could not connect to host
|
||||
duesee.org: could not connect to host
|
||||
dullsir.com: did not receive HSTS header
|
||||
duria.de: max-age too low: 3600
|
||||
@ -1150,7 +1159,6 @@ dymersion.com: did not receive HSTS header
|
||||
dzimejl.sk: did not receive HSTS header
|
||||
dzlibs.io: could not connect to host
|
||||
dzndk.org: could not connect to host
|
||||
dzyabchenko.com: could not connect to host
|
||||
e-aut.net: did not receive HSTS header
|
||||
e-deca2.org: did not receive HSTS header
|
||||
e-sa.com: did not receive HSTS header
|
||||
@ -1194,7 +1202,6 @@ ehito.ovh: could not connect to host
|
||||
ehrenamt-skpfcw.de: could not connect to host
|
||||
eicfood.com: could not connect to host
|
||||
eidolonhost.com: did not receive HSTS header
|
||||
eimanavicius.lt: could not connect to host
|
||||
ekbanden.nl: could not connect to host
|
||||
elaintehtaat.fi: did not receive HSTS header
|
||||
elan-organics.com: did not receive HSTS header
|
||||
@ -1216,10 +1223,11 @@ elnutricionista.es: did not receive HSTS header
|
||||
eloanpersonal.com: max-age too low: 0
|
||||
elpo.xyz: could not connect to host
|
||||
elsamakhin.com: could not connect to host
|
||||
elsitar.com: did not receive HSTS header
|
||||
elsitar.com: could not connect to host
|
||||
email.lookout.com: could not connect to host
|
||||
emanatepixels.com: could not connect to host
|
||||
emeldi-commerce.com: max-age too low: 0
|
||||
emilyhorsman.com: could not connect to host
|
||||
eminovic.me: could not connect to host
|
||||
emjainteractive.com: did not receive HSTS header
|
||||
emjimadhu.com: could not connect to host
|
||||
@ -1291,7 +1299,7 @@ estoic.net: could not connect to host
|
||||
et-buchholz.de: could not connect to host
|
||||
etdonline.co.uk: could not connect to host
|
||||
eternitylove.us: could not connect to host
|
||||
ethanfaust.com: could not connect to host
|
||||
eth9.net: max-age too low: 0
|
||||
ethicalexploiting.com: could not connect to host
|
||||
etsysecure.com: could not connect to host
|
||||
etula.ga: could not connect to host
|
||||
@ -1307,7 +1315,6 @@ everybooks.com: max-age too low: 60
|
||||
everything.place: could not connect to host
|
||||
evin.ml: could not connect to host
|
||||
evites.me: could not connect to host
|
||||
evolutionlending.co.uk: could not connect to host
|
||||
evomon.com: could not connect to host
|
||||
evossd.tk: could not connect to host
|
||||
ewuchuan.com: could not connect to host
|
||||
@ -1349,7 +1356,6 @@ falkp.no: did not receive HSTS header
|
||||
fallenangelspirits.uk: could not connect to host
|
||||
familie-sprink.de: could not connect to host
|
||||
familie-zimmermann.at: could not connect to host
|
||||
fantopia.club: could not connect to host
|
||||
fanyl.cn: could not connect to host
|
||||
farhadexchange.com: did not receive HSTS header
|
||||
farhood.org: could not connect to host
|
||||
@ -1402,7 +1408,6 @@ fireorbit.de: did not receive HSTS header
|
||||
firstdogonthemoon.com.au: did not receive HSTS header
|
||||
firstforex.co.uk: did not receive HSTS header
|
||||
fish2.me: did not receive HSTS header
|
||||
fistu.la: could not connect to host
|
||||
fit4medien.de: did not receive HSTS header
|
||||
fitbylo.com: did not receive HSTS header
|
||||
fitiapp.com: could not connect to host
|
||||
@ -1427,7 +1432,6 @@ florianlillpopp.de: max-age too low: 10
|
||||
floridaescapes.co.uk: did not receive HSTS header
|
||||
flouartistique.ch: could not connect to host
|
||||
flow.pe: could not connect to host
|
||||
flow.su: could not connect to host
|
||||
flowersandclouds.com: could not connect to host
|
||||
flowlo.me: could not connect to host
|
||||
flushstudios.com: did not receive HSTS header
|
||||
@ -1475,7 +1479,6 @@ freesounding.com: could not connect to host
|
||||
freesounding.ru: could not connect to host
|
||||
freethought.org.au: could not connect to host
|
||||
freeutopia.org: did not receive HSTS header
|
||||
freezion.com: could not connect to host
|
||||
frenzel.dk: could not connect to host
|
||||
freqlabs.com: could not connect to host
|
||||
freshfind.xyz: could not connect to host
|
||||
@ -1534,6 +1537,7 @@ gamehacks.me: could not connect to host
|
||||
gameink.net: max-age too low: 0
|
||||
gamenected.com: could not connect to host
|
||||
gamenected.de: could not connect to host
|
||||
gamepader.com: could not connect to host
|
||||
gameparade.de: could not connect to host
|
||||
gamepiece.com: could not connect to host
|
||||
gamerslair.org: did not receive HSTS header
|
||||
@ -1651,7 +1655,6 @@ googleplex.com: did not receive HSTS header (error ignored - included regardless
|
||||
goolok.com: could not connect to host
|
||||
gorilla-gym.site: could not connect to host
|
||||
goto.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
goto.world: did not receive HSTS header
|
||||
gotowned.org: did not receive HSTS header
|
||||
gotspot.com: could not connect to host
|
||||
gottcode.org: did not receive HSTS header
|
||||
@ -1667,6 +1670,8 @@ granary-demo.appspot.com: did not receive HSTS header
|
||||
grandmascookieblog.com: did not receive HSTS header
|
||||
grantedby.me: could not connect to host
|
||||
graph.no: did not receive HSTS header
|
||||
graphire.io: could not connect to host
|
||||
graphsearchengine.com: could not connect to host
|
||||
gravito.nl: did not receive HSTS header
|
||||
gravity-net.de: could not connect to host
|
||||
graycell.net: could not connect to host
|
||||
@ -1677,7 +1682,7 @@ greenhillantiques.co.uk: did not receive HSTS header
|
||||
greenvines.com.tw: did not receive HSTS header
|
||||
greg.red: could not connect to host
|
||||
gregorytlee.me: did not receive HSTS header
|
||||
gremots.com: did not receive HSTS header
|
||||
gremots.com: could not connect to host
|
||||
greplin.com: could not connect to host
|
||||
gresb.com: did not receive HSTS header
|
||||
gribani.com: could not connect to host
|
||||
@ -1701,7 +1706,6 @@ guilde-vindicta.fr: did not receive HSTS header
|
||||
gulenet.com: could not connect to host
|
||||
gunnarhafdal.com: did not receive HSTS header
|
||||
gurom.lv: could not connect to host
|
||||
gurueffect.com: did not receive HSTS header
|
||||
gurusupe.com: could not connect to host
|
||||
gussi.is: did not receive HSTS header
|
||||
gvt2.com: could not connect to host (error ignored - included regardless)
|
||||
@ -1715,7 +1719,6 @@ gyboche.science: could not connect to host
|
||||
gycis.me: could not connect to host
|
||||
gypthecat.com: max-age too low: 604800
|
||||
gyz.io: could not connect to host
|
||||
gzitech.com: could not connect to host
|
||||
h2check.org: could not connect to host
|
||||
haarkliniek.com: did not receive HSTS header
|
||||
habanaavenue.com: did not receive HSTS header
|
||||
@ -1726,7 +1729,6 @@ hack.li: did not receive HSTS header
|
||||
hacker.one: could not connect to host
|
||||
hackerforever.com: did not receive HSTS header
|
||||
hackerone-ext-adroll.com: could not connect to host
|
||||
hackerpoints.com: could not connect to host
|
||||
hackest.org: did not receive HSTS header
|
||||
hackit.im: could not connect to host
|
||||
hadzic.co: could not connect to host
|
||||
@ -1745,7 +1747,6 @@ hang333.pw: did not receive HSTS header
|
||||
hansen.hn: could not connect to host
|
||||
hao2taiwan.com: max-age too low: 0
|
||||
haoyugao.com: could not connect to host
|
||||
haozi.me: could not connect to host
|
||||
hapissl.com: could not connect to host
|
||||
happyfabric.me: did not receive HSTS header
|
||||
happygastro.com: could not connect to host
|
||||
@ -1811,9 +1812,9 @@ hillcity.org.nz: did not receive HSTS header
|
||||
hilnu.tk: could not connect to host
|
||||
hipercultura.com: did not receive HSTS header
|
||||
hiphopconvention.nl: could not connect to host
|
||||
hirake55.com: could not connect to host
|
||||
hitoy.org: did not receive HSTS header
|
||||
hittipps.com: did not receive HSTS header
|
||||
hjw-kunstwerk.de: could not connect to host
|
||||
hlyue.com: did not receive HSTS header
|
||||
hmm.nyc: could not connect to host
|
||||
hn.search.yahoo.com: did not receive HSTS header
|
||||
@ -1844,7 +1845,6 @@ hotchoc.io: did not receive HSTS header
|
||||
houkago-step.com: did not receive HSTS header
|
||||
housemaadiah.org: did not receive HSTS header
|
||||
housingstudents.org.uk: could not connect to host
|
||||
howbigismybuilding.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
howrandom.org: could not connect to host
|
||||
howtocuremysciatica.com: could not connect to host
|
||||
hr-intranet.com: did not receive HSTS header
|
||||
@ -1874,7 +1874,6 @@ hydronium.ga: could not connect to host
|
||||
hydronium.me: could not connect to host
|
||||
hydronium.tk: could not connect to host
|
||||
hyper69.com: did not receive HSTS header
|
||||
hypnoresults.com.au: did not receive HSTS header
|
||||
i-jp.net: could not connect to host
|
||||
i-partners.sk: did not receive HSTS header
|
||||
iamokay.nl: did not receive HSTS header
|
||||
@ -1928,7 +1927,6 @@ imakepoems.net: could not connect to host
|
||||
ime.moe: could not connect to host
|
||||
imguoguo.com: did not receive HSTS header
|
||||
imim.pw: did not receive HSTS header
|
||||
imjiangtao.com: did not receive HSTS header
|
||||
immersionwealth.com: could not connect to host
|
||||
immoprotect.ca: did not receive HSTS header
|
||||
immortals-co.com: did not receive HSTS header
|
||||
@ -1936,7 +1934,9 @@ immoverkauf24.at: did not receive HSTS header
|
||||
immoverkauf24.de: did not receive HSTS header
|
||||
immunicity.info: could not connect to host
|
||||
immunicity.press: could not connect to host
|
||||
immunicity.today: did not receive HSTS header
|
||||
immunicity.top: could not connect to host
|
||||
immunicity.works: did not receive HSTS header
|
||||
immunicity.world: did not receive HSTS header
|
||||
imolug.org: did not receive HSTS header
|
||||
imouto.my: max-age too low: 5184000
|
||||
@ -2044,6 +2044,7 @@ izzzorgconcerten.nl: could not connect to host
|
||||
ja-publications.com: did not receive HSTS header
|
||||
jabbari.io: did not receive HSTS header
|
||||
jackalworks.com: could not connect to host
|
||||
jackyyf.com: could not connect to host
|
||||
jacobparry.ca: did not receive HSTS header
|
||||
jagido.de: did not receive HSTS header
|
||||
jahliveradio.com: could not connect to host
|
||||
@ -2082,7 +2083,7 @@ jasonsansone.com: [Exception... "Component returned failure code: 0x80004005 (NS
|
||||
jastoria.pl: could not connect to host
|
||||
jayblock.com: did not receive HSTS header
|
||||
jayschulman.com: could not connect to host
|
||||
jayscoaching.com: could not connect to host
|
||||
jayscoaching.com: did not receive HSTS header
|
||||
jayshao.com: did not receive HSTS header
|
||||
jazzinutrecht.info: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
jazzncheese.com: could not connect to host
|
||||
@ -2156,6 +2157,7 @@ junaos.xyz: did not receive HSTS header
|
||||
junge-selbsthilfe.info: could not connect to host
|
||||
junqtion.com: could not connect to host
|
||||
jupp0r.de: did not receive HSTS header
|
||||
justanothercompany.name: could not connect to host
|
||||
justlikethat.hosting: did not receive HSTS header
|
||||
justnaw.co.uk: could not connect to host
|
||||
justudin.com: did not receive HSTS header
|
||||
@ -2167,7 +2169,6 @@ jznet.org: max-age too low: 86400
|
||||
k-dev.de: could not connect to host
|
||||
ka-clan.com: could not connect to host
|
||||
kabuabc.com: did not receive HSTS header
|
||||
kabus.org: could not connect to host
|
||||
kadioglumakina.com.tr: did not receive HSTS header
|
||||
kaela.design: could not connect to host
|
||||
kahopoon.net: could not connect to host
|
||||
@ -2200,6 +2201,7 @@ keeley.gq: could not connect to host
|
||||
keeley.ml: could not connect to host
|
||||
keeleysam.me: could not connect to host
|
||||
keepclean.me: could not connect to host
|
||||
kellyandantony.com: could not connect to host
|
||||
kenderbeton-magyarorszag.hu: did not receive HSTS header
|
||||
kenderbetonmagyarorszag.hu: did not receive HSTS header
|
||||
kenderhaz-magyarorszag.hu: did not receive HSTS header
|
||||
@ -2276,7 +2278,6 @@ krayx.com: could not connect to host
|
||||
kreavis.com: did not receive HSTS header
|
||||
kredite.sale: could not connect to host
|
||||
kriegt.es: could not connect to host
|
||||
kristikala.nl: could not connect to host
|
||||
kristjanrang.eu: did not receive HSTS header
|
||||
krmela.com: could not connect to host
|
||||
kroetenfuchs.de: could not connect to host
|
||||
@ -2313,7 +2314,6 @@ labordata.io: did not receive HSTS header
|
||||
labrador-retrievers.com.au: did not receive HSTS header
|
||||
labs.moscow: did not receive HSTS header
|
||||
lachlankidson.net: did not receive HSTS header
|
||||
lacicloud.net: could not connect to host
|
||||
lacledeslan.ninja: could not connect to host
|
||||
lacocinadelila.com: did not receive HSTS header
|
||||
ladbroke.net: did not receive HSTS header
|
||||
@ -2345,7 +2345,7 @@ leadership9.com: could not connect to host
|
||||
leardev.de: did not receive HSTS header
|
||||
learnfrenchfluently.com: did not receive HSTS header
|
||||
learningorder.com: could not connect to host
|
||||
learntube.cz: could not connect to host
|
||||
lebal.se: could not connect to host
|
||||
lechiennoir.net: did not receive HSTS header
|
||||
ledgerscope.net: could not connect to host
|
||||
leermotorrijden.nl: max-age too low: 300
|
||||
@ -2371,6 +2371,7 @@ les-corsaires.net: could not connect to host
|
||||
lesdouceursdeliyana.com: could not connect to host
|
||||
lesperlesdunet.fr: could not connect to host
|
||||
letras.mus.br: did not receive HSTS header
|
||||
lets.ninja: could not connect to host
|
||||
letsmultiplayerplay.com: did not receive HSTS header
|
||||
letustravel.tk: could not connect to host
|
||||
levelum.com: did not receive HSTS header
|
||||
@ -2396,14 +2397,12 @@ librechan.net: could not connect to host
|
||||
libscode.com: could not connect to host
|
||||
lidl-selection.at: could not connect to host
|
||||
lidow.eu: could not connect to host
|
||||
lifebetweenlives.com.au: did not receive HSTS header
|
||||
lifeguard.aecom.com: did not receive HSTS header
|
||||
lifeinitsownway.com: did not receive HSTS header
|
||||
lifeskillsdirect.com: did not receive HSTS header
|
||||
lifestylehunter.co.uk: did not receive HSTS header
|
||||
lifetimemoneymachine.com: did not receive HSTS header
|
||||
lifi.digital: did not receive HSTS header
|
||||
lifi.is: could not connect to host
|
||||
lightarmory.com: could not connect to host
|
||||
lightpaste.com: could not connect to host
|
||||
lightworx.io: did not receive HSTS header
|
||||
@ -2516,6 +2515,7 @@ madebymagnitude.com: did not receive HSTS header
|
||||
maderwin.com: could not connect to host
|
||||
mae-berlinistanbul.com: could not connect to host
|
||||
mafamane.com: could not connect to host
|
||||
maff.scot: did not receive HSTS header
|
||||
mafiareturns.com: max-age too low: 2592000
|
||||
magenx.com: did not receive HSTS header
|
||||
magicbroccoli.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
@ -2542,7 +2542,6 @@ manifestbin.com: did not receive HSTS header
|
||||
manningbrothers.com: did not receive HSTS header
|
||||
mannsolutions.co.uk: did not receive HSTS header
|
||||
mansion-note.com: did not receive HSTS header
|
||||
manufacturing.gov: could not connect to host
|
||||
maomaofuli.vip: could not connect to host
|
||||
marchagen.nl: did not receive HSTS header
|
||||
marcontrol.com: did not receive HSTS header
|
||||
@ -2551,11 +2550,11 @@ marcuskoh.com: could not connect to host
|
||||
mariannematthew.com: could not connect to host
|
||||
marie-curie.fr: could not connect to host
|
||||
marie-elisabeth.dk: did not receive HSTS header
|
||||
marie.club: could not connect to host
|
||||
mario.party: did not receive HSTS header
|
||||
markaconnor.com: could not connect to host
|
||||
markayapilandirma.com: could not connect to host
|
||||
market.android.com: did not receive HSTS header (error ignored - included regardless)
|
||||
markprof.ru: could not connect to host
|
||||
markrego.com: could not connect to host
|
||||
marktboten.de: did not receive HSTS header
|
||||
markus-dev.com: did not receive HSTS header
|
||||
@ -2624,7 +2623,6 @@ mein-gesundheitsmanager.com: did not receive HSTS header
|
||||
meincenter-meinemeinung.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
meincloudspeicher.de: could not connect to host
|
||||
meinebo.it: could not connect to host
|
||||
meizufans.eu: did not receive HSTS header
|
||||
melted.pw: could not connect to host
|
||||
members.mayfirst.org: did not receive HSTS header
|
||||
mensmaximus.de: did not receive HSTS header
|
||||
@ -2641,6 +2639,7 @@ mesmoque.com: did not receive HSTS header
|
||||
metagrader.com: could not connect to host
|
||||
metebalci.com: did not receive HSTS header
|
||||
meteorapp.space: could not connect to host
|
||||
meteosherbrooke.com: could not connect to host
|
||||
meteosky.net: could not connect to host
|
||||
metin2blog.de: did not receive HSTS header
|
||||
metis.pw: could not connect to host
|
||||
@ -2759,7 +2758,6 @@ moy-gorod.od.ua: did not receive HSTS header
|
||||
moy.cat: did not receive HSTS header
|
||||
mp3juices.is: could not connect to host
|
||||
mqas.net: could not connect to host
|
||||
mremallin.ca: could not connect to host
|
||||
mrettich.org: did not receive HSTS header
|
||||
mrnonz.com: max-age too low: 0
|
||||
mrpopat.in: did not receive HSTS header
|
||||
@ -2817,7 +2815,6 @@ myphonebox.de: could not connect to host
|
||||
myraytech.net: did not receive HSTS header
|
||||
mysecretrewards.com: did not receive HSTS header
|
||||
mystery-science-theater-3000.de: did not receive HSTS header
|
||||
mythslegendscollection.com: did not receive HSTS header
|
||||
myvirtualserver.com: max-age too low: 2592000
|
||||
myzone.com: did not receive HSTS header
|
||||
n0psled.nl: could not connect to host
|
||||
@ -2840,7 +2837,6 @@ nanogeneinc.com: could not connect to host
|
||||
nanto.eu: could not connect to host
|
||||
narada.com.ua: could not connect to host
|
||||
nargileh.nl: could not connect to host
|
||||
nassi.me: could not connect to host
|
||||
natalia-fadeeva.ru: could not connect to host
|
||||
natalia.io: could not connect to host
|
||||
natalt.org: did not receive HSTS header
|
||||
@ -2866,7 +2862,7 @@ neilgreen.net: did not receive HSTS header
|
||||
neko-life.com: did not receive HSTS header
|
||||
neko-system.com: did not receive HSTS header
|
||||
nemno.de: could not connect to host
|
||||
nemovement.org: did not receive HSTS header
|
||||
nemovement.org: could not connect to host
|
||||
neonisi.com: could not connect to host
|
||||
nepustil.net: did not receive HSTS header
|
||||
netba.net: could not connect to host
|
||||
@ -3041,6 +3037,7 @@ onlinepollsph.com: could not connect to host
|
||||
onlinespielothek.com: did not receive HSTS header
|
||||
onlinewetten.de: could not connect to host
|
||||
onlyshopstation.com: did not receive HSTS header
|
||||
onlyzero.net: could not connect to host
|
||||
ononpay.com: did not receive HSTS header
|
||||
onpatient.com: did not receive HSTS header
|
||||
ontras.com: could not connect to host
|
||||
@ -3082,6 +3079,7 @@ orionfcu.com: did not receive HSTS header
|
||||
orleika.ml: could not connect to host
|
||||
orthodoxy.lt: did not receive HSTS header
|
||||
osaiyuwu.com: could not connect to host
|
||||
oshell.me: could not connect to host
|
||||
oslfoundation.org: could not connect to host
|
||||
oslinux.net: did not receive HSTS header
|
||||
osp.cx: could not connect to host
|
||||
@ -3154,7 +3152,6 @@ passwordbox.com: did not receive HSTS header
|
||||
passwordrevelator.net: did not receive HSTS header
|
||||
passwords.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
pastaf.com: could not connect to host
|
||||
paste.fedoraproject.org: did not receive HSTS header
|
||||
paste.linode.com: could not connect to host
|
||||
pastebin.linode.com: could not connect to host
|
||||
pastenib.com: could not connect to host
|
||||
@ -3222,7 +3219,7 @@ pickr.co: could not connect to host
|
||||
picotronic.biz: could not connect to host
|
||||
picscare.co.uk: did not receive HSTS header
|
||||
pieperhome.de: could not connect to host
|
||||
pijuice.com: could not connect to host
|
||||
piggott.me.uk: did not receive HSTS header
|
||||
pilgermaske.org: did not receive HSTS header
|
||||
piligrimname.com: could not connect to host
|
||||
pillowandpepper.com: did not receive HSTS header
|
||||
@ -3252,6 +3249,7 @@ plaettliaktion.ch: did not receive HSTS header
|
||||
planpharmacy.com: could not connect to host
|
||||
platform.lookout.com: could not connect to host
|
||||
play.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
playflick.com: did not receive HSTS header
|
||||
playkh.com: did not receive HSTS header
|
||||
playmaker.io: could not connect to host
|
||||
playmyplay.com: did not receive HSTS header
|
||||
@ -3287,9 +3285,9 @@ pontualcomp.com: max-age too low: 2592000
|
||||
poolsandstuff.com: did not receive HSTS header
|
||||
poon.tech: could not connect to host
|
||||
portalplatform.net: did not receive HSTS header
|
||||
portalzine.de: did not receive HSTS header
|
||||
poshpak.com: max-age too low: 86400
|
||||
postcodewise.co.uk: did not receive HSTS header
|
||||
posterspy.com: did not receive HSTS header
|
||||
postscheduler.org: could not connect to host
|
||||
posylka.de: did not receive HSTS header
|
||||
poussinooz.fr: could not connect to host
|
||||
@ -3319,7 +3317,6 @@ pro-zone.com: could not connect to host
|
||||
prodpad.com: did not receive HSTS header
|
||||
professionalboundaries.com: did not receive HSTS header
|
||||
profi-durchgangsmelder.de: did not receive HSTS header
|
||||
profpay.com: could not connect to host
|
||||
profundr.com: could not connect to host
|
||||
progblog.net: could not connect to host
|
||||
progg.no: could not connect to host
|
||||
@ -3331,6 +3328,7 @@ prontocleaners.co.uk: could not connect to host
|
||||
prontolight.com: did not receive HSTS header
|
||||
prontomovers.co.uk: could not connect to host
|
||||
propactrading.com: could not connect to host
|
||||
proposalonline.com: did not receive HSTS header
|
||||
prosocialmachines.com: could not connect to host
|
||||
prosoft.sk: did not receive HSTS header
|
||||
prosperident.com: did not receive HSTS header
|
||||
@ -3354,7 +3352,7 @@ puneflowermall.com: did not receive HSTS header
|
||||
purewebmasters.com: could not connect to host
|
||||
purplemoon.mobi: did not receive HSTS header
|
||||
purplestar.mobi: did not receive HSTS header
|
||||
pushapp.org: did not receive HSTS header
|
||||
pushapp.org: could not connect to host
|
||||
pwd.ovh: could not connect to host
|
||||
pwdgen.net: could not connect to host
|
||||
pwnies.dk: could not connect to host
|
||||
@ -3411,6 +3409,7 @@ raspass.me: could not connect to host
|
||||
rastreador.com.es: did not receive HSTS header
|
||||
ratajczak.fr: could not connect to host
|
||||
rate-esport.de: could not connect to host
|
||||
rationalism.com: could not connect to host
|
||||
raulfraile.net: could not connect to host
|
||||
raven.lipetsk.ru: could not connect to host
|
||||
rawet.se: did not receive HSTS header
|
||||
@ -3429,6 +3428,7 @@ realmic.net: could not connect to host
|
||||
realmofespionage.com: could not connect to host
|
||||
reardenporn.com: could not connect to host
|
||||
recommended.reviews: could not connect to host
|
||||
redable.hosting: could not connect to host
|
||||
redar.xyz: did not receive HSTS header
|
||||
reddiseals.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
reddit.com: did not receive HSTS header
|
||||
@ -3469,6 +3469,7 @@ reserve-online.net: did not receive HSTS header
|
||||
respice.xyz: could not connect to host
|
||||
respostas.com.br: did not receive HSTS header
|
||||
restchart.com: did not receive HSTS header
|
||||
reth.ch: could not connect to host
|
||||
retrotracks.net: max-age too low: 0
|
||||
revealdata.com: did not receive HSTS header
|
||||
revello.org: did not receive HSTS header
|
||||
@ -3476,7 +3477,6 @@ reverie.pw: could not connect to host
|
||||
reviews.anime.my: max-age too low: 5184000
|
||||
revtut.net: did not receive HSTS header
|
||||
rewardstock.com: max-age too low: 0
|
||||
rezun.cloud: did not receive HSTS header
|
||||
rhapsodhy.hu: could not connect to host
|
||||
rhdigital.pro: could not connect to host
|
||||
rhering.de: could not connect to host
|
||||
@ -3618,7 +3618,11 @@ schadegarant.net: could not connect to host
|
||||
schmitz.link: could not connect to host
|
||||
schnell-gold.com: could not connect to host
|
||||
schoop.me: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
schrauger.run: could not connect to host
|
||||
schrauger.com: did not receive HSTS header
|
||||
schrauger.info: did not receive HSTS header
|
||||
schrauger.net: did not receive HSTS header
|
||||
schrauger.org: did not receive HSTS header
|
||||
schrauger.run: did not receive HSTS header
|
||||
schreiber-netzwerk.eu: did not receive HSTS header
|
||||
schrodinger.io: could not connect to host
|
||||
schulterglatzen-altenwalde.de: could not connect to host
|
||||
@ -3739,7 +3743,6 @@ siddhant.me: could not connect to host
|
||||
siebens.net: could not connect to host
|
||||
sifls.com: could not connect to host
|
||||
sig6.org: could not connect to host
|
||||
sigabrt.org: could not connect to host
|
||||
sigterm.no: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
silentcircle.com: did not receive HSTS header
|
||||
silentcircle.org: could not connect to host
|
||||
@ -3779,6 +3782,7 @@ skullhouse.nyc: did not receive HSTS header
|
||||
skyflix.me: did not receive HSTS header
|
||||
skyoy.com: did not receive HSTS header
|
||||
slash-dev.de: did not receive HSTS header
|
||||
slashand.co: did not receive HSTS header
|
||||
slashem.me: did not receive HSTS header
|
||||
slattery.co: could not connect to host
|
||||
sleep10.com: could not connect to host
|
||||
@ -3789,6 +3793,7 @@ slope.haus: could not connect to host
|
||||
slovakiana.sk: did not receive HSTS header
|
||||
sluitkampzeist.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
slycurity.de: did not receive HSTS header
|
||||
sm.ms: did not receive HSTS header
|
||||
smart-mirror.de: did not receive HSTS header
|
||||
smart-ov.nl: could not connect to host
|
||||
smartcoin.com.br: could not connect to host
|
||||
@ -3806,6 +3811,7 @@ smove.sg: did not receive HSTS header
|
||||
smusg.com: did not receive HSTS header
|
||||
snailing.org: could not connect to host
|
||||
snakehosting.dk: did not receive HSTS header
|
||||
snapappointments.com: did not receive HSTS header
|
||||
snapappts.com: could not connect to host
|
||||
snapworks.net: did not receive HSTS header
|
||||
sneberger.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
@ -3827,7 +3833,7 @@ socialhams.net: did not receive HSTS header
|
||||
socialhead.io: could not connect to host
|
||||
socialspirit.com.br: did not receive HSTS header
|
||||
sockeye.cc: could not connect to host
|
||||
socomponents.co.uk: could not connect to host
|
||||
socomponents.co.uk: did not receive HSTS header
|
||||
sodacore.com: could not connect to host
|
||||
soe-server.com: could not connect to host
|
||||
sogeek.me: did not receive HSTS header
|
||||
@ -3923,6 +3929,10 @@ stderr.cc: could not connect to host
|
||||
stefanweiser.de: did not receive HSTS header
|
||||
stephanierxo.com: did not receive HSTS header
|
||||
stephenandburns.com: did not receive HSTS header
|
||||
stephenschrauger.com: did not receive HSTS header
|
||||
stephenschrauger.info: did not receive HSTS header
|
||||
stephenschrauger.net: did not receive HSTS header
|
||||
stephenschrauger.org: did not receive HSTS header
|
||||
stevensononthe.net: did not receive HSTS header
|
||||
stewartremodelingadvantage.com: did not receive HSTS header
|
||||
stig.io: did not receive HSTS header
|
||||
@ -3944,7 +3954,6 @@ stpatricksguild.com: did not receive HSTS header
|
||||
stqry.com: did not receive HSTS header
|
||||
str0.at: did not receive HSTS header
|
||||
strasweb.fr: did not receive HSTS header
|
||||
streamchan.org: could not connect to host
|
||||
streamingeverywhere.com: did not receive HSTS header
|
||||
streamingmagazin.de: could not connect to host
|
||||
streampanel.net: did not receive HSTS header
|
||||
@ -3979,7 +3988,6 @@ suksit.com: could not connect to host
|
||||
sumoatm.com: did not receive HSTS header
|
||||
sumoscout.de: did not receive HSTS header
|
||||
suncountrymarine.com: did not receive HSTS header
|
||||
sunflyer.cn: did not receive HSTS header
|
||||
sunnyfruit.ru: did not receive HSTS header
|
||||
sunshinepress.org: could not connect to host
|
||||
supcro.com: could not connect to host
|
||||
@ -4082,6 +4090,7 @@ tegelsensanitaironline.nl: did not receive HSTS header
|
||||
tekshrek.com: did not receive HSTS header
|
||||
telefonnummer.online: could not connect to host
|
||||
telefoonnummerinfo.nl: could not connect to host
|
||||
telling.xyz: could not connect to host
|
||||
temehu.com: did not receive HSTS header
|
||||
tempcraft.net: could not connect to host
|
||||
tendertool.nl: could not connect to host
|
||||
@ -4162,12 +4171,11 @@ thirty5.net: did not receive HSTS header
|
||||
thisisacompletetest.ga: could not connect to host
|
||||
thisisforager.com: did not receive HSTS header
|
||||
thiswebhost.com: did not receive HSTS header
|
||||
thomasgriffin.io: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
thomaskliszowski.fr: did not receive HSTS header
|
||||
thomaswoo.com: could not connect to host
|
||||
thorncreek.net: did not receive HSTS header
|
||||
thriveapproach.co.uk: did not receive HSTS header
|
||||
thrx.net: could not connect to host
|
||||
throughthelookingglasslens.co.uk: could not connect to host
|
||||
thumbtack.com: did not receive HSTS header
|
||||
thusoy.com: did not receive HSTS header
|
||||
tibbitshall.ca: did not receive HSTS header
|
||||
@ -4183,6 +4191,7 @@ tikutiku.pl: max-age too low: 0
|
||||
tildebot.com: could not connect to host
|
||||
tilkah.com.au: could not connect to host
|
||||
tillcraft.com: could not connect to host
|
||||
tillseasyscore.com: could not connect to host
|
||||
timbeilby.com: could not connect to host
|
||||
timbuktutimber.com: did not receive HSTS header
|
||||
timcamara.com: did not receive HSTS header
|
||||
@ -4202,6 +4211,7 @@ titouan.co: did not receive HSTS header
|
||||
tittelbach.at: did not receive HSTS header
|
||||
titties.ml: could not connect to host
|
||||
tkarstens.de: did not receive HSTS header
|
||||
tkn.tokyo: could not connect to host
|
||||
tlo.hosting: could not connect to host
|
||||
tlo.link: did not receive HSTS header
|
||||
tlo.network: could not connect to host
|
||||
@ -4262,15 +4272,16 @@ transportal.sk: did not receive HSTS header
|
||||
travelinsurance.co.nz: did not receive HSTS header
|
||||
treeby.net: could not connect to host
|
||||
trendberry.ru: could not connect to host
|
||||
trik.es: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
trinityaffirmations.com: max-age too low: 0
|
||||
trinitycore.org: max-age too low: 2592000
|
||||
tripdelta.com: did not receive HSTS header
|
||||
trixies-wish.nz: could not connect to host
|
||||
trollme.me: could not connect to host
|
||||
trufflemonkey.co.uk: did not receive HSTS header
|
||||
trunkjunk.co: did not receive HSTS header
|
||||
trusteecar.com: did not receive HSTS header
|
||||
trustmeimfancy.com: could not connect to host
|
||||
truthmessages.pw: could not connect to host
|
||||
trybind.com: could not connect to host
|
||||
tryoneday.co: did not receive HSTS header
|
||||
ts2.se: could not connect to host
|
||||
@ -4309,7 +4320,6 @@ txclimbers.com: could not connect to host
|
||||
txf.pw: could not connect to host
|
||||
ty2u.com: did not receive HSTS header
|
||||
tylian.net: max-age too low: 0
|
||||
typingrevolution.com: did not receive HSTS header
|
||||
tyrelius.com: did not receive HSTS header
|
||||
tyroproducts.eu: did not receive HSTS header
|
||||
tzappa.net: could not connect to host
|
||||
@ -4324,7 +4334,6 @@ uega.net: did not receive HSTS header
|
||||
ueu.me: could not connect to host
|
||||
ufgaming.com: did not receive HSTS header
|
||||
ufotable.uk: did not receive HSTS header
|
||||
uhm.io: did not receive HSTS header
|
||||
ui8.net: max-age too low: 86400
|
||||
ukas.com: did not receive HSTS header
|
||||
ukdropshipment.co.uk: did not receive HSTS header
|
||||
@ -4336,10 +4345,10 @@ ulmo.dk: could not connect to host
|
||||
ultros.io: did not receive HSTS header
|
||||
umidev.com: did not receive HSTS header
|
||||
umie.cc: did not receive HSTS header
|
||||
umwandeln-online.de: could not connect to host
|
||||
unbanthe.net: could not connect to host
|
||||
unblocked-networks.org: could not connect to host
|
||||
unblocked.host: could not connect to host
|
||||
unblocked.today: did not receive HSTS header
|
||||
unblocked.win: could not connect to host
|
||||
unblocked.works: did not receive HSTS header
|
||||
unblocked.world: did not receive HSTS header
|
||||
@ -4380,6 +4389,7 @@ uscitizenship.info: did not receive HSTS header
|
||||
uscurrency.gov: did not receive HSTS header
|
||||
used-in.jp: did not receive HSTS header
|
||||
usercare.com: did not receive HSTS header
|
||||
userify.com: max-age too low: 0
|
||||
ustr.gov: max-age too low: 86400
|
||||
utleieplassen.no: could not connect to host
|
||||
utopiagalaxy.space: could not connect to host
|
||||
@ -4415,6 +4425,7 @@ vbulletin-russia.com: could not connect to host
|
||||
vbulletinrussia.com: could not connect to host
|
||||
vcdove.com: did not receive HSTS header
|
||||
vcr.re: could not connect to host
|
||||
ve3oat.ca: could not connect to host
|
||||
veblen.com: could not connect to host
|
||||
vechkasov.ru: did not receive HSTS header
|
||||
vehent.org: did not receive HSTS header
|
||||
@ -4441,6 +4452,7 @@ vincentkooijman.at: did not receive HSTS header
|
||||
vincentkooijman.nl: did not receive HSTS header
|
||||
vincentpancol.com: could not connect to host
|
||||
vintageheartcoffee.com: did not receive HSTS header
|
||||
vinyculture.com: could not connect to host
|
||||
vio.no: did not receive HSTS header
|
||||
viperdns.com: could not connect to host
|
||||
vipi.es: could not connect to host
|
||||
@ -4456,7 +4468,6 @@ vlora.city: could not connect to host
|
||||
vm0.eu: did not receive HSTS header
|
||||
vmrdev.com: could not connect to host
|
||||
voceinveste.com: did not receive HSTS header
|
||||
vodpay.com: could not connect to host
|
||||
vodpay.net: could not connect to host
|
||||
vodpay.org: could not connect to host
|
||||
voicesuk.co.uk: did not receive HSTS header
|
||||
@ -4465,6 +4476,7 @@ voidpay.net: could not connect to host
|
||||
voidpay.org: could not connect to host
|
||||
volcrado.com: did not receive HSTS header
|
||||
vortexhobbies.com: did not receive HSTS header
|
||||
voshod.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
vosjesweb.nl: could not connect to host
|
||||
vox.vg: did not receive HSTS header
|
||||
vpl.me: did not receive HSTS header
|
||||
@ -4480,7 +4492,6 @@ w4a.fr: did not receive HSTS header
|
||||
w4xzr.top: could not connect to host
|
||||
w4xzr.xyz: could not connect to host
|
||||
wachtwoordencheck.nl: could not connect to host
|
||||
waixingrenfuli.vip: could not connect to host
|
||||
waixingrenfuli7.vip: could not connect to host
|
||||
wakapp.de: could not connect to host
|
||||
walkeryoung.ca: could not connect to host
|
||||
@ -4508,6 +4519,7 @@ wavefrontsystemstech.com: could not connect to host
|
||||
wayne.cloud: did not receive HSTS header
|
||||
wealthfactory.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
wear2work.nl: did not receive HSTS header
|
||||
wearepapermill.co: did not receive HSTS header
|
||||
weaverhairextensions.nl: could not connect to host
|
||||
web-industry.fr: could not connect to host
|
||||
web-torrent.com: max-age too low: 0
|
||||
@ -4532,14 +4544,13 @@ webmaniabr.com: did not receive HSTS header
|
||||
webmarketingfestival.it: did not receive HSTS header
|
||||
webnosql.com: could not connect to host
|
||||
webperformance.ru: max-age too low: 3600
|
||||
websenat.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
webstory.xyz: could not connect to host
|
||||
webswitch.io: could not connect to host
|
||||
webtechgadgetry.com: did not receive HSTS header
|
||||
webtiles.co.uk: could not connect to host
|
||||
webtobesocial.de: could not connect to host
|
||||
webwork.pw: could not connect to host
|
||||
weddingenvelopes.co.uk: did not receive HSTS header
|
||||
weissman.agency: did not receive HSTS header
|
||||
weizenke.im: could not connect to host
|
||||
wellastore.ru: did not receive HSTS header
|
||||
wellsolveit.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
@ -4598,7 +4609,6 @@ winaes.com: did not receive HSTS header
|
||||
winclient.cn: could not connect to host
|
||||
winecodeavocado.com: could not connect to host
|
||||
winged.io: could not connect to host
|
||||
wingos.net: could not connect to host
|
||||
wingumd.net: could not connect to host
|
||||
winpack.cf: could not connect to host
|
||||
winpack.eu.org: could not connect to host
|
||||
@ -4638,7 +4648,6 @@ wowapi.org: could not connect to host
|
||||
wphostingspot.com: did not receive HSTS header
|
||||
wpmetadatastandardsproject.org: could not connect to host
|
||||
writeapp.me: did not receive HSTS header
|
||||
wsa.poznan.pl: could not connect to host
|
||||
wsscompany.com.ve: could not connect to host
|
||||
wufu.org: did not receive HSTS header
|
||||
wuhengmin.com: did not receive HSTS header
|
||||
@ -4702,6 +4711,7 @@ xn--80aaihqncaejjobbu6v.xn--p1ai: max-age too low: 6000
|
||||
xn--9pr52k0p5a.com: did not receive HSTS header
|
||||
xn--datenrettung-mnchen-jbc.com: did not receive HSTS header
|
||||
xn--dmonenjger-q5ag.net: could not connect to host
|
||||
xn--jp-6l5cs1yf3ivjsglphyv.net: could not connect to host
|
||||
xn--lgb3a8bcpn.cf: could not connect to host
|
||||
xn--lgb3a8bcpn.ga: could not connect to host
|
||||
xn--lgb3a8bcpn.gq: could not connect to host
|
||||
@ -4716,7 +4726,6 @@ xobox.me: could not connect to host
|
||||
xoffy.com: did not receive HSTS header
|
||||
xombra.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 121" data: no]
|
||||
xpi.fr: could not connect to host
|
||||
xps2pdf.co.uk: could not connect to host
|
||||
xsmobile.de: could not connect to host
|
||||
xtream-hosting.com: could not connect to host
|
||||
xtream-hosting.de: could not connect to host
|
||||
@ -4760,6 +4769,7 @@ yoloprod.fr: could not connect to host
|
||||
yoloseo.com: could not connect to host
|
||||
youcontrol.ru: could not connect to host
|
||||
youngandunited.nl: did not receive HSTS header
|
||||
yourcomputer.expert: did not receive HSTS header
|
||||
yoursecondphone.co: could not connect to host
|
||||
yourstrongbox.com: could not connect to host
|
||||
ypiresia.fr: could not connect to host
|
||||
@ -4782,7 +4792,7 @@ zachgibbens.org: could not connect to host
|
||||
zadieheimlich.com: did not receive HSTS header
|
||||
zamorano.edu: could not connect to host
|
||||
zap.yt: could not connect to host
|
||||
zarooba.com: did not receive HSTS header
|
||||
zarooba.com: could not connect to host
|
||||
zbigniewgalucki.eu: did not receive HSTS header
|
||||
zbp.at: did not receive HSTS header
|
||||
zebrababy.cn: did not receive HSTS header
|
||||
@ -4820,7 +4830,6 @@ zqhong.com: could not connect to host
|
||||
ztan.tk: could not connect to host
|
||||
ztcaoll222.cn: did not receive HSTS header
|
||||
zten.org: could not connect to host
|
||||
zulu7.com: could not connect to host
|
||||
zuolan.me: did not receive HSTS header
|
||||
zvncloud.com: did not receive HSTS header
|
||||
zwollemagazine.nl: did not receive HSTS header
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -247,10 +247,10 @@ struct FixWeakMappingGrayBitsTracer : public js::WeakMapTracer
|
||||
void trace(JSObject* aMap, JS::GCCellPtr aKey, JS::GCCellPtr aValue) override
|
||||
{
|
||||
// If nothing that could be held alive by this entry is marked gray, return.
|
||||
bool delegateMightNeedMarking = aKey && JS::GCThingIsMarkedGray(aKey);
|
||||
bool keyMightNeedMarking = aKey && JS::GCThingIsMarkedGray(aKey);
|
||||
bool valueMightNeedMarking = aValue && JS::GCThingIsMarkedGray(aValue) &&
|
||||
aValue.kind() != JS::TraceKind::String;
|
||||
if (!delegateMightNeedMarking && !valueMightNeedMarking) {
|
||||
if (!keyMightNeedMarking && !valueMightNeedMarking) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -258,9 +258,11 @@ struct FixWeakMappingGrayBitsTracer : public js::WeakMapTracer
|
||||
aKey = nullptr;
|
||||
}
|
||||
|
||||
if (delegateMightNeedMarking && aKey.is<JSObject>()) {
|
||||
if (keyMightNeedMarking && aKey.is<JSObject>()) {
|
||||
JSObject* kdelegate = js::GetWeakmapKeyDelegate(&aKey.as<JSObject>());
|
||||
if (kdelegate && !JS::ObjectIsMarkedGray(kdelegate)) {
|
||||
if (kdelegate && !JS::ObjectIsMarkedGray(kdelegate) &&
|
||||
(!aMap || !JS::ObjectIsMarkedGray(aMap)))
|
||||
{
|
||||
if (JS::UnmarkGrayGCThingRecursively(aKey)) {
|
||||
mAnyMarked = true;
|
||||
}
|
||||
|
@ -26,6 +26,7 @@
|
||||
#define USE_LINUX_QUOTACTL
|
||||
#include <sys/mount.h>
|
||||
#include <sys/quota.h>
|
||||
#include <sys/sysmacros.h>
|
||||
#ifndef BLOCK_SIZE
|
||||
#define BLOCK_SIZE 1024 /* kernel block size */
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user