Commit 0e474278 authored by Alberto Garcia's avatar Alberto Garcia
Browse files

New upstream version 2.14.1

parent 5a9aa333
......@@ -531,7 +531,7 @@ If this signal is not handled the inspector view will be automatically
attached to the inspected view, so you only need to handle this signal
if you want to attach the inspector view yourself (for example, to add
the inspector view to a browser tab).</p>
<p>To prevent the inspector vew from being attached you can connect to this
<p>To prevent the inspector view from being attached you can connect to this
signal and simply return <a href="../glib/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>.</p>
<div class="refsect3">
<a name="WebKitWebInspector-attach.parameters"></a><h4>Parameters</h4>
......
......@@ -14,7 +14,7 @@
<div class="titlepage">
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">WebKit2GTK+ Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">for WebKit2GTK+ 2.14.0</p></div>
<div><p class="releaseinfo">for WebKit2GTK+ 2.14.1</p></div>
</div>
<hr>
</div>
......
......@@ -177,7 +177,7 @@ against at application run time.</p>
<hr>
<div class="refsect2">
<a name="WEBKIT-MICRO-VERSION:CAPS"></a><h3>WEBKIT_MICRO_VERSION</h3>
<pre class="programlisting">#define WEBKIT_MICRO_VERSION (0)
<pre class="programlisting">#define WEBKIT_MICRO_VERSION (1)
</pre>
<p>Like <a class="link" href="webkit2gtk-4.0-WebKitVersion.html#webkit-get-micro-version" title="webkit_get_micro_version ()"><code class="function">webkit_get_micro_version()</code></a>, but from the headers used at
application compile time, rather than from the library linked
......
......@@ -14,7 +14,7 @@
<div class="titlepage">
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">WebKitDOMGTK+ Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">for WebKitDOMGTK+ 2.14.0</p></div>
<div><p class="releaseinfo">for WebKitDOMGTK+ 2.14.1</p></div>
</div>
<hr>
</div>
......
==================
WebKitGTK+ 2.14.1
==================
What's new in WebKitGTK+ 2.14.1?
- MiniBrowser and jsc binaries are now installed in pkglibexecdir instead of bindir.
- Improve performance when resizing a window with multiple web views in X11.
- Check whether GDK can use GL before using gdk_cairo_draw_from_gl() in Wayland.
- Updated default UserAgent string or better compatibility.
- Fix a crash on github.com in IntlDateTimeFormat::resolvedOptions when using the C locale.
- Fix BadDamage X errors when closing the web view in X11.
- Fix UIProcess crash when using Japanese input method.
- Fix build with clang due to missing header includes.
- Fix the build with USE_REDIRECTED_XCOMPOSITE_WINDOW disabled.
- Fix several crashes and rendering issues.
- Translation updates: German.
==================
WebKitGTK+ 2.14.0
==================
......
/*
* Copyright (C) 2008, 2013-2015 Apple Inc.
* Copyright (C) 2008, 2013-2016 Apple Inc.
* Copyright (C) 2009, 2010 University of Szeged
* All rights reserved.
*
......@@ -314,6 +314,11 @@ public:
m_assembler.subs(dest, dest, src);
}
void sub32(RegisterID left, RegisterID right, RegisterID dest)
{
m_assembler.subs(dest, left, right);
}
void sub32(TrustedImm32 imm, RegisterID dest)
{
m_assembler.subs(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
......
/*
* Copyright (C) 2012, 2014, 2015 Apple Inc. All rights reserved.
* Copyright (C) 2012, 2014-2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -705,6 +705,11 @@ public:
m_assembler.sub<32>(dest, dest, src);
}
void sub32(RegisterID left, RegisterID right, RegisterID dest)
{
m_assembler.sub<32>(dest, left, right);
}
void sub32(TrustedImm32 imm, RegisterID dest)
{
if (isUInt12(imm.m_value)) {
......
/*
* Copyright (C) 2009-2010, 2014-2015 Apple Inc. All rights reserved.
* Copyright (C) 2009-2010, 2014-2016 Apple Inc. All rights reserved.
* Copyright (C) 2010 University of Szeged
*
* Redistribution and use in source and binary forms, with or without
......@@ -462,6 +462,11 @@ public:
m_assembler.sub(dest, dest, src);
}
void sub32(RegisterID left, RegisterID right, RegisterID dest)
{
m_assembler.sub(dest, left, right);
}
void sub32(TrustedImm32 imm, RegisterID dest)
{
ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value);
......
/*
* Copyright (C) 2013 Cisco Systems, Inc. All rights reserved.
* Copyright (C) 2009-2011 STMicroelectronics. All rights reserved.
* Copyright (C) 2008, 2014 Apple Inc. All rights reserved.
* Copyright (C) 2008, 2014, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
......@@ -419,6 +419,17 @@ public:
m_assembler.sublRegReg(src, dest);
}
void sub32(RegisterID left, RegisterID right, RegisterID dest)
{
if (dest == right) {
neg32(dest);
add32(left, dest);
return;
}
move(left, dest);
sub32(right, dest);
}
void sub32(TrustedImm32 imm, AbsoluteAddress address)
{
if (!imm.m_value)
......
......@@ -560,7 +560,18 @@ public:
{
m_assembler.subl_rr(src, dest);
}
void sub32(RegisterID left, RegisterID right, RegisterID dest)
{
if (dest == right) {
neg32(dest);
add32(left, dest);
return;
}
move(left, dest);
sub32(right, dest);
}
void sub32(TrustedImm32 imm, RegisterID dest)
{
if (imm.m_value == 1)
......
......@@ -170,6 +170,9 @@ Sub32 U:G:32, UZD:G:32
x86: Addr, Tmp
x86: Tmp, Addr
arm64: Sub32 U:G:32, U:G:32, D:G:32
Tmp, Tmp, Tmp
64: Sub64 U:G:64, UD:G:64
Tmp, Tmp
x86: Imm, Addr
......@@ -177,6 +180,9 @@ Sub32 U:G:32, UZD:G:32
x86: Addr, Tmp
x86: Tmp, Addr
arm64: Sub64 U:G:64, U:G:64, D:G:64
Tmp, Tmp, Tmp
SubDouble U:F:64, U:F:64, D:F:64
arm64: Tmp, Tmp, Tmp
x86: Tmp, Addr, Tmp
......
......@@ -2170,6 +2170,39 @@ void testSubArgsFloatWithEffectfulDoubleConversion(float a, float b)
CHECK(isIdentical(effect, static_cast<double>(a) - static_cast<double>(b)));
}
 
void testTernarySubInstructionSelection(B3::Opcode valueModifier, Type valueType, Air::Opcode expectedOpcode)
{
Procedure proc;
BasicBlock* root = proc.addBlock();
Value* left = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0);
Value* right = root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1);
if (valueModifier == Trunc) {
left = root->appendNew<Value>(proc, valueModifier, valueType, Origin(), left);
right = root->appendNew<Value>(proc, valueModifier, valueType, Origin(), right);
}
root->appendNewControlValue(
proc, Return, Origin(),
root->appendNew<Value>(proc, Sub, Origin(), left, right));
lowerToAirForTesting(proc);
auto block = proc.code()[0];
unsigned numberOfSubInstructions = 0;
for (auto instruction : *block) {
if (instruction.opcode == expectedOpcode) {
CHECK_EQ(instruction.args.size(), 3ul);
CHECK_EQ(instruction.args[0].kind(), Air::Arg::Tmp);
CHECK_EQ(instruction.args[1].kind(), Air::Arg::Tmp);
CHECK_EQ(instruction.args[2].kind(), Air::Arg::Tmp);
numberOfSubInstructions++;
}
}
CHECK_EQ(numberOfSubInstructions, 1ul);
}
void testNegDouble(double a)
{
Procedure proc;
......@@ -14425,6 +14458,11 @@ void run(const char* filter)
RUN(testBranchBitAndImmFusion(Load, Int64, 1, Air::BranchTest32, Air::Arg::Addr));
}
 
if (isARM64()) {
RUN(testTernarySubInstructionSelection(Identity, Int64, Air::Sub64));
RUN(testTernarySubInstructionSelection(Trunc, Int32, Air::Sub32));
}
if (tasks.isEmpty())
usage();
 
......
......@@ -2485,7 +2485,7 @@ void CodeBlock::visitWeakly(SlotVisitor& visitor)
if (!setByMe)
return;
if (Heap::isMarked(this))
if (Heap::isMarkedConcurrently(this))
return;
if (shouldVisitStrongly()) {
......@@ -2628,7 +2628,7 @@ static std::chrono::milliseconds timeToLive(JITCode::JITType jitType)
bool CodeBlock::shouldJettisonDueToOldAge()
{
if (Heap::isMarked(this))
if (Heap::isMarkedConcurrently(this))
return false;
if (UNLIKELY(Options::forceCodeBlockToJettisonDueToOldAge()))
......@@ -2643,10 +2643,10 @@ bool CodeBlock::shouldJettisonDueToOldAge()
#if ENABLE(DFG_JIT)
static bool shouldMarkTransition(DFG::WeakReferenceTransition& transition)
{
if (transition.m_codeOrigin && !Heap::isMarked(transition.m_codeOrigin.get()))
if (transition.m_codeOrigin && !Heap::isMarkedConcurrently(transition.m_codeOrigin.get()))
return false;
if (!Heap::isMarked(transition.m_from.get()))
if (!Heap::isMarkedConcurrently(transition.m_from.get()))
return false;
return true;
......@@ -2677,7 +2677,7 @@ void CodeBlock::propagateTransitions(SlotVisitor& visitor)
m_vm->heap.structureIDTable().get(oldStructureID);
Structure* newStructure =
m_vm->heap.structureIDTable().get(newStructureID);
if (Heap::isMarked(oldStructure))
if (Heap::isMarkedConcurrently(oldStructure))
visitor.appendUnbarrieredReadOnlyPointer(newStructure);
else
allAreMarkedSoFar = false;
......@@ -2749,14 +2749,14 @@ void CodeBlock::determineLiveness(SlotVisitor& visitor)
// GC we still have not proved liveness, then this code block is toast.
bool allAreLiveSoFar = true;
for (unsigned i = 0; i < dfgCommon->weakReferences.size(); ++i) {
if (!Heap::isMarked(dfgCommon->weakReferences[i].get())) {
if (!Heap::isMarkedConcurrently(dfgCommon->weakReferences[i].get())) {
allAreLiveSoFar = false;
break;
}
}
if (allAreLiveSoFar) {
for (unsigned i = 0; i < dfgCommon->weakStructureReferences.size(); ++i) {
if (!Heap::isMarked(dfgCommon->weakStructureReferences[i].get())) {
if (!Heap::isMarkedConcurrently(dfgCommon->weakStructureReferences[i].get())) {
allAreLiveSoFar = false;
break;
}
......
......@@ -555,7 +555,7 @@ bool AccessCase::propagateTransitions(SlotVisitor& visitor) const
switch (m_type) {
case Transition:
if (Heap::isMarked(m_structure->previousID()))
if (Heap::isMarkedConcurrently(m_structure->previousID()))
visitor.appendUnbarrieredReadOnlyPointer(m_structure.get());
else
result = false;
......
......@@ -298,7 +298,7 @@ private:
{
int64_t kindAsInt = static_cast<int64_t>(kind);
ASSERT(kindAsInt < (1 << topShift));
return kindAsInt | (payload.isTop() << topShift) | (payload.valueImpl() << valueShift);
return kindAsInt | (static_cast<uint64_t>(payload.isTop()) << topShift) | (bitwise_cast<uint64_t>(payload.valueImpl()) << valueShift);
}
// The layout of the value is:
......
......@@ -434,6 +434,11 @@ private:
fixEdge<StringUse>(node->child1());
else if (node->child1()->shouldSpeculateStringOrOther())
fixEdge<StringOrOtherUse>(node->child1());
else {
WatchpointSet* masqueradesAsUndefinedWatchpoint = m_graph.globalObjectFor(node->origin.semantic)->masqueradesAsUndefinedWatchpoint();
if (masqueradesAsUndefinedWatchpoint->isStillValid())
m_graph.watchpoints().addLazily(masqueradesAsUndefinedWatchpoint);
}
break;
}
......@@ -978,6 +983,11 @@ private:
fixEdge<StringUse>(node->child1());
else if (node->child1()->shouldSpeculateStringOrOther())
fixEdge<StringOrOtherUse>(node->child1());
else {
WatchpointSet* masqueradesAsUndefinedWatchpoint = m_graph.globalObjectFor(node->origin.semantic)->masqueradesAsUndefinedWatchpoint();
if (masqueradesAsUndefinedWatchpoint->isStillValid())
m_graph.watchpoints().addLazily(masqueradesAsUndefinedWatchpoint);
}
break;
}
......
......@@ -1685,24 +1685,18 @@ void SpeculativeJIT::compileLogicalNot(Node* node)
case UntypedUse: {
JSValueOperand arg1(this, node->child1());
GPRTemporary resultPayload(this, Reuse, arg1, PayloadWord);
GPRReg arg1TagGPR = arg1.tagGPR();
GPRReg arg1PayloadGPR = arg1.payloadGPR();
JSValueRegs arg1Regs = arg1.jsValueRegs();
GPRReg resultPayloadGPR = resultPayload.gpr();
arg1.use();
GPRTemporary result(this);
GPRTemporary temp(this);
FPRTemporary valueFPR(this);
FPRTemporary tempFPR(this);
JITCompiler::Jump slowCase = m_jit.branch32(JITCompiler::NotEqual, arg1TagGPR, TrustedImm32(JSValue::BooleanTag));
m_jit.move(arg1PayloadGPR, resultPayloadGPR);
GPRReg resultGPR = result.gpr();
addSlowPathGenerator(
slowPathCall(
slowCase, this, operationConvertJSValueToBoolean, resultPayloadGPR, arg1Regs, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
m_jit.xor32(TrustedImm32(1), resultPayloadGPR);
booleanResult(resultPayloadGPR, node, UseChildrenCalledExplicitly);
bool shouldCheckMasqueradesAsUndefined = !masqueradesAsUndefinedWatchpointIsStillValid();
JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic);
bool negateResult = true;
m_jit.emitConvertValueToBoolean(arg1.jsValueRegs(), resultGPR, temp.gpr(), valueFPR.fpr(), tempFPR.fpr(), shouldCheckMasqueradesAsUndefined, globalObject, negateResult);
booleanResult(resultGPR, node);
return;
}
case StringUse:
......@@ -1834,30 +1828,22 @@ void SpeculativeJIT::emitBranch(Node* node)
case UntypedUse: {
JSValueOperand value(this, node->child1());
value.fill();
GPRReg valueTagGPR = value.tagGPR();
GPRReg valuePayloadGPR = value.payloadGPR();
FPRTemporary valueFPR(this);
FPRTemporary tempFPR(this);
GPRTemporary result(this);
GPRTemporary temp(this);
JSValueRegs valueRegs = value.jsValueRegs();
GPRReg resultGPR = result.gpr();
use(node->child1());
JITCompiler::Jump fastPath = m_jit.branch32(JITCompiler::Equal, valueTagGPR, JITCompiler::TrustedImm32(JSValue::Int32Tag));
JITCompiler::Jump slowPath = m_jit.branch32(JITCompiler::NotEqual, valueTagGPR, JITCompiler::TrustedImm32(JSValue::BooleanTag));
fastPath.link(&m_jit);
branchTest32(JITCompiler::Zero, valuePayloadGPR, notTaken);
bool shouldCheckMasqueradesAsUndefined = !masqueradesAsUndefinedWatchpointIsStillValid();
JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic);
m_jit.emitConvertValueToBoolean(valueRegs, resultGPR, temp.gpr(), valueFPR.fpr(), tempFPR.fpr(), shouldCheckMasqueradesAsUndefined, globalObject);
branchTest32(JITCompiler::Zero, resultGPR, notTaken);
jump(taken, ForceJump);
slowPath.link(&m_jit);
silentSpillAllRegisters(resultGPR);
callOperation(operationConvertJSValueToBoolean, resultGPR, value.jsValueRegs());
silentFillAllRegisters(resultGPR);
branchTest32(JITCompiler::NonZero, resultGPR, taken);
jump(notTaken);
noResult(node, UseChildrenCalledExplicitly);
return;
}
......
......@@ -1838,18 +1838,22 @@ void SpeculativeJIT::compileLogicalNot(Node* node)
GPRReg arg1GPR = arg1.gpr();
GPRReg resultGPR = result.gpr();
arg1.use();
m_jit.move(arg1GPR, resultGPR);
m_jit.xor64(TrustedImm32(static_cast<int32_t>(ValueFalse)), resultGPR);
JITCompiler::Jump slowCase = m_jit.branchTest64(JITCompiler::NonZero, resultGPR, TrustedImm32(static_cast<int32_t>(~1)));
addSlowPathGenerator(
slowPathCall(slowCase, this, operationConvertJSValueToBoolean, resultGPR, arg1GPR, NeedToSpill, ExceptionCheckRequirement::CheckNotNeeded));
m_jit.xor64(TrustedImm32(static_cast<int32_t>(ValueTrue)), resultGPR);
jsValueResult(resultGPR, node, DataFormatJSBoolean, UseChildrenCalledExplicitly);
FPRTemporary valueFPR(this);
FPRTemporary tempFPR(this);
bool shouldCheckMasqueradesAsUndefined = !masqueradesAsUndefinedWatchpointIsStillValid();
JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic);
Optional<GPRTemporary> scratch;
GPRReg scratchGPR = InvalidGPRReg;
if (shouldCheckMasqueradesAsUndefined) {
scratch = GPRTemporary(this);
scratchGPR = scratch->gpr();
}
bool negateResult = true;
m_jit.emitConvertValueToBoolean(JSValueRegs(arg1GPR), resultGPR, scratchGPR, valueFPR.fpr(), tempFPR.fpr(), shouldCheckMasqueradesAsUndefined, globalObject, negateResult);
m_jit.or32(TrustedImm32(ValueFalse), resultGPR);
jsValueResult(resultGPR, node, DataFormatJSBoolean);
return;
}
case StringUse:
......@@ -1992,7 +1996,20 @@ void SpeculativeJIT::emitBranch(Node* node)
value.use();
} else {
GPRTemporary result(this);
FPRTemporary fprValue(this);
FPRTemporary fprTemp(this);
Optional<GPRTemporary> scratch;
GPRReg scratchGPR = InvalidGPRReg;
bool shouldCheckMasqueradesAsUndefined = !masqueradesAsUndefinedWatchpointIsStillValid();
if (shouldCheckMasqueradesAsUndefined) {
scratch = GPRTemporary(this);
scratchGPR = scratch->gpr();
}
GPRReg resultGPR = result.gpr();
FPRReg valueFPR = fprValue.fpr();
FPRReg tempFPR = fprTemp.fpr();
if (node->child1()->prediction() & SpecInt32Only) {
branch64(MacroAssembler::Equal, valueGPR, MacroAssembler::TrustedImm64(JSValue::encode(jsNumber(0))), notTaken);
......@@ -2005,10 +2022,9 @@ void SpeculativeJIT::emitBranch(Node* node)
}
value.use();
silentSpillAllRegisters(resultGPR);
callOperation(operationConvertJSValueToBoolean, resultGPR, valueGPR);
silentFillAllRegisters(resultGPR);
JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic);
m_jit.emitConvertValueToBoolean(JSValueRegs(valueGPR), resultGPR, scratchGPR, valueFPR, tempFPR, shouldCheckMasqueradesAsUndefined, globalObject);
branchTest32(MacroAssembler::NonZero, resultGPR, taken);
jump(notTaken);
......
......@@ -34,6 +34,8 @@ class LargeAllocation;
class MarkedBlock;
class WeakSet;
typedef uint32_t HeapVersion;
// This is how we abstract over either MarkedBlock& or LargeAllocation&. Put things in here as you
// find need for them.
......@@ -71,7 +73,7 @@ public:
return *bitwise_cast<LargeAllocation*>(m_encodedPointer - isLargeAllocationBit);
}
void flipIfNecessary(uint64_t heapVersion);
void flipIfNecessary(HeapVersion);
void flipIfNecessary();
bool isMarked() const;
......
......@@ -73,7 +73,7 @@ inline WeakSet& CellContainer::weakSet() const
return markedBlock().weakSet();
}
inline void CellContainer::flipIfNecessary(uint64_t heapVersion)
inline void CellContainer::flipIfNecessary(HeapVersion heapVersion)
{
if (!isLargeAllocation())
markedBlock().flipIfNecessary(heapVersion);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment