<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[205717] releases/WebKitGTK/webkit-2.14</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/205717">205717</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-09-09 01:55:20 -0700 (Fri, 09 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/205462">r205462</a> - Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
https://bugs.webkit.org/show_bug.cgi?id=160125

Reviewed by Geoffrey Garen and Keith Miller.
JSTests:

Most of the things I did properly covered by existing tests, but I found some simple cases of
unshifting that had sketchy coverage.

* stress/array-storage-array-unshift.js: Added.
* stress/contiguous-array-unshift.js: Added.
* stress/double-array-unshift.js: Added.
* stress/int32-array-unshift.js: Added.

Source/bmalloc:

I needed to tryMemalign, so I added such a thing.

* bmalloc/Allocator.cpp:
(bmalloc::Allocator::allocate):
(bmalloc::Allocator::tryAllocate):
(bmalloc::Allocator::allocateImpl):
* bmalloc/Allocator.h:
* bmalloc/Cache.h:
(bmalloc::Cache::tryAllocate):
* bmalloc/bmalloc.h:
(bmalloc::api::tryMemalign):

Source/JavaScriptCore:

In order to make the GC concurrent (bug 149432), we would either need to enable concurrent
copying or we would need to not copy. Concurrent copying carries a 1-2% throughput overhead
from the barriers alone. Considering that MarkedSpace does a decent job of avoiding
fragmentation, it's unlikely that it's worth paying 1-2% throughput for copying. So, we want
to get rid of copied space. This change moves copied space's biggest client over to marked
space.

Moving butterflies to marked space means having them use the new Auxiliary HeapCell
allocation path. This is a fairly mechanical change, but it caused performance regressions
everywhere, so this change also fixes MarkedSpace's performance issues.

At a high level the mechanical changes are:

- We use AuxiliaryBarrier instead of CopyBarrier.

- We use tryAllocateAuxiliary instead of tryAllocateStorage. I got rid of the silly
  CheckedBoolean stuff, since it's so much more trouble than it's worth.

- The JITs have to emit inlined marked space allocations instead of inline copy space
  allocations.

- Everyone has to get used to zeroing their butterflies after allocation instead of relying
  on them being pre-zeroed by the GC. Copied space would zero things for you, while marked
  space doesn't.

That's about 1/3 of this change. But this led to performance problems, which I fixed with
optimizations that amounted to a major MarkedSpace rewrite:

- MarkedSpace always causes internal fragmentation for array allocations because the vector
  length we choose when we resize usually leads to a cell size that doesn't correspond to any
  size class. I got around this by making array allocations usually round up vectorLength to
  the maximum allowed by the size class that we would have allocated in. Also,
  ensureLengthSlow() and friends first make sure that the requested length can't just be
  fulfilled with the current allocation size. This safeguard means that not every array
  allocation has to do size class queries. For example, the fast path of new Array(length)
  never does any size class queries, under the assumption that (1) the speed gained from
  avoiding an ensureLengthSlow() call, which then just changes the vectorLength by doing the
  size class query, is too small to offset the speed lost by doing the query on every
  allocation and (2) new Array(length) is a pretty good hint that resizing is not very
  likely.

- Size classes in MarkedSpace were way too precise, which led to external fragmentation. This
  changes MarkedSpace size classes to use a linear progression for very small sizes followed
  by a geometric progression that naturally transitions to a hyperbolic progression. We want
  hyperbolic sizes when we get close to blockSize: for example the largest size we want is
  payloadSize / 2 rounded down, to ensure we get exactly two cells with minimal slop. The
  next size down should be payloadSize / 3 rounded down, and so on. After the last precise
  size (80 bytes), we proceed using a geometric progression, but round up each size to
  minimize slop at the end of the block. This naturally causes the geometric progression to
  turn hyperbolic for large sizes. The size class configuration happens at VM start-up, so
  it can be controlled with runtime options. I found that a base of 1.4 works pretty well.

- Large allocations caused massive internal fragmentation, since the smallest large
  allocation had to use exactly blockSize, and the largest small allocation used
  blockSize / 2. The next size up - the first large allocation size to require two blocks -
  also had 50% internal fragmentation. This is because we required large allocations to be
  blockSize aligned, so that MarkedBlock::blockFor() would work. I decided to rewrite all of
  that. Cells no longer have to be owned by a MarkedBlock. They can now alternatively be
  owned by a LargeAllocation. These two things are abstracted as CellContainer. You know that
  a cell is owned by a LargeAllocation if the MarkedBlock::atomSize / 2 bit is set.
  Basically, large allocations are deliberately misaligned by 8 bytes. This actually works
  out great since (1) typed arrays won't use large allocations anyway since they have their
  own malloc fallback and (2) large array butterflies already have a 8 byte header, which
  means that the 8 byte base misalignment aligns the large array payload on a 16 byte
  boundary. I took extreme care to make sure that the isLargeAllocation bit checks are as
  rare as possible; for example, ExecState::vm() skips the check because we know that callees
  must be small allocations. It's also possible to use template tricks to do one check for
  cell container kind, and then invoke a function specialized for MarkedBlock or a function
  specialized for LargeAllocation. LargeAllocation includes stubs for all MarkedBlock methods
  that get used from functions that are template-specialized like this. That's mostly to
  speed up the GC marking code. Most other code can use CellContainer API or HeapCell API
  directly. That's another thing: HeapCell, the common base of JSCell and auxiliary
  allocations, is now smart enough to do a lot of things for you, like HeapCell::vm(),
  HeapCell::heap(), HeapCell::isLargeAllocation(), and HeapCell::cellContainer(). The size
  cutoff for large allocations is runtime-configurable, so long as you don't choose something
  so small that callees end up large. I found that 400 bytes is roughly optimal. This means
  that the MarkedBlock size classes end up being:

  16, 32, 48, 64, 80, 112, 160, 224, 320

  The next size class would have been 432, but that's above the 400 byte cutoff. All of this
  is configurable with --sizeClassProgression and --largeAllocationCutoff. You can see what
  size classes you end up with by doing --dumpSizeClasses=true.

- Copied space uses 64KB blocks, while marked space used to use 16KB blocks. Allocating a lot
  of stuff in 16KB blocks was slower than allocating it in 64KB blocks because the GC had a
  lot of per-block overhead. I removed this overhead: It's now 2x faster to scan all
  MarkedBlocks because the list that contains the interesting meta-data is allocated on the
  side, for better locality during a sequential walk. It's no longer necessary to scan
  MarkedBlocks to find WeakSets, since the sets of WeakSets for eden scan and full scan are
  maintained on-the-fly. It's no longer necessary to scan all MarkedBlocks to clear mark
  bits because we now use versioned mark bits: to clear then, just increment the 64-bit
  heap version. It's no longer necessary to scan retired MarkedBlocks while allocating
  because marking retires them on-the-fly. It's no longer necessary to sort all blocks in
  the IncrementalSweeper's snapshot because blocks now know if they are in the snapshot. Put
  together, these optimizations allowed me to reduce block size to 16KB without losing much
  performance. There is some small perf loss on JetStream/splay, but not enough to hurt
  JetStream overall. I tried reducing block sizes further, to 4KB, since that is a
  progression on membuster. That's not possible yet, since there is still enough per-block
  overhead yet that such a reduction hurts JetStream too much. I filed a bug about improving
  this further: https://bugs.webkit.org/show_bug.cgi?id=161581.

- Even after all of that, copying butterflies was still faster because it allowed us to skip
  sweeping dead space. A good GC allocates over dead bytes without explicitly freeing them,
  so the GC pause is O(size of live), not O(size of live + dead). O(dead) is usually much
  larger than O(live), especially in an eden collection. Copying satisfies this premise while
  mark+sweep does not. So, I invented a new kind of allocator: bump'n'pop. Previously, our
  MarkedSpace allocator was a freelist pop. That's simple and easy to inline but requires
  that we walk the block to build a free list. This means walking dead space. The new
  allocator allows totally free MarkedBlocks to simply set up a bump-pointer arena instead.
  The allocator is a hybrid of bump-pointer and freelist pop. It tries bump first. The bump
  pointer always bumps by cellSize, so the result of filling a block with bumping looks as if
  we had used freelist popping to fill it. Additionally, each MarkedBlock now has a bit to
  quickly tell if the block is entirely free. This makes sweeping O(1) whenever a MarkedBlock
  is completely empty, which is the common case because of the generational hypothesis: the
  number of objects that survive an eden collection is a tiny fraction of the number of
  objects that had been allocated, and this fraction is so small that there are typically
  fewer than one survivors per MarkedBlock. This change was enough to make this change a net
  win over tip-of-tree.

- FTL now shares the same allocation fast paths as everything else, which is great, because
  bump'n'pop has gnarly control flow. We don't really want B3 to have to think about that
  control flow, since it won't be able to improve the machine code we write ourselves. GC
  fast paths are best written in assembly. So, I've empowered B3 to have even better support
  for Patchpoint terminals. It's now totally fine for a Patchpoint terminal to be non-Void.
  So, the new FTL allocation fast paths are just Patchpoint terminals that call through to
  AssemblyHelpers::emitAllocate(). B3 still reasons about things like constant-folding the
  size class calculation and constant-hoisting the allocator. Also, I gave the FTL the
  ability to constant-fold some allocator logic (in case we first assume that we're doing a
  variable-length allocation but then realize that the length is known). I think it makes
  sense to have constant folding rules in FTL::Output, or whatever the B3 IR builder is,
  since this makes lowering easier (you can constant fold during lowering more easily) and it
  reduces the amount of malloc traffic. In the future, we could teach B3 how to better
  constant-fold this code. That would require allowing loads to be constant-folded, which is
  doable but hella tricky.

- It used to be that if a logical object allocation required two physical allocations (first
  the butterfly and then the cell), then the JIT would emit the code in such a way that a
  failure in the second fast path would cause us to forget the successful first physical
  allocation. This was pointlessly wasteful. It turns out that it's very cheap to devote a
  register to storing either the butterfly or null, because the butterfly register is anyway
  going to be free inside the first allocation. The only overhead here is zeroing the
  butterfly register. With that in place, we can just pass the butterfly-or-null to the slow
  path, which can then either allocate a butterfly or not. So now we never waste a successful
  allocation. This patch implements such a solution both in DFG (where it's easy to do this
  since we control registers already) and in FTL (where it's annoying, because mutable
  &quot;butterfly-or-null&quot; variables are hard to say in SSA; also I realized that we had code
  duplicated the JSArray allocation utility, so I deduplicated it). This came up because in
  one version of this patch, this wastage would resonate with some Kraken benchmark: the
  benchmark would always allocate N small things followed by one bigger thing. The problem
  was I accidentally adjusted the various fixed overheads in MarkedBlock in such a way that
  the JSObject size class, which both the small and big thing shared for their cell, could
  hold exactly N cells per MarkedBlock. Then the benchmark would always call slow path when
  it allocated the big thing. So, it would end up having to allocate the big thing's large
  butterfly twice, every single time! Ouch!

- It used to be that we zeroed CopiedBlocks using memset, and so array allocations enjoyed
  amortization of the cost of zeroing. This doesn't work anymore - it's now up to the client
  of the allocator to initialize the object to whatever state they need. It used to be that
  we would just use a dumb loop. I initially changed this so that we would end up in memset
  for large allocations, but this didn't actually help performance that much. I got a much
  better result by playing with different memsets written in assembly. First I wrote one
  using non-temporal stores. That was a small speed-up over memset. Then I tried the classic
  &quot;rep stos&quot; approach, and holy cow that version was fast. It's a ~20% speed-up on array
  allocation microbenchmarks. So, this patch adds code paths to do &quot;rep stos&quot; on x86_64, or
  memset, or use a loop, as appropriate, for both &quot;contiguous&quot; arrays (holes are zero) and
  double arrays (holes are PNaN). Note that the JIT always emits either a loop or a flat slab
  of stores (if the size is known), but those paths in the JIT won't trigger for
  NewArrayWithSize() if the size is large, since that takes us to the
  operationNewArrayWithSize() slow path, which calls into JSArray::create(). That's why the
  optimizations here are all in JSArray::create() - that's the hot place for large arrays
  that need to be filled with holes.

All of this put together gives us neutral perf on JetStream,  membuster, and PLT3, a ~1%
regression on Speedometer, and up to a 4% regression Kraken. The Kraken regression is
because Kraken was allocating exactly 1024 element arrays at a rate of 400MB/sec. This is a
best-case scenario for bump allocation. I think that we should fix bmalloc to make up the
difference, but take the hit for now because it's a crazy corner case. By comparison, the
alternative approach of using a copy barrier would have cost us 1-2%. That's the real
apples-to-apples comparison if your premise is that we should have a concurrent GC. After we
finish removing copied space, we will be barrier-ready for concurrent GC: we already have a
marking barrier and we simply won't need a copying barrier. This change gets us there for
the purposes of our benchmarks, since the remaining clients of copied space are not very
important. On the other hand, if we keep copying, then getting barrier-ready would mean
adding back the copy barrier, which costs more perf.

We might get bigger speed-ups once we remove CopiedSpace altogether. That requires moving
typed arrays and a few other weird things over to Aux MarkedSpace.

This also includes some header sanitization. The introduction of AuxiliaryBarrier, HeapCell,
and CellContainer meant that I had to include those files from everywhere. Fortunately,
just including JSCInlines.h (instead of manually including the files that includes) is
usually enough. So, I made most of JSC's cpp files include JSCInlines.h, which is something
that we were already basically doing. In places where JSCInlines.h would be too much, I just
included HeapInlines.h. This got weird, because we previously included HeapInlines.h from
JSObject.h. That's bad because it led to some circular dependencies, so I fixed it - but that
meant having to manually include HeapInlines.h from the places that previously got it
implicitly via JSObject.h. But that led to more problems for some reason: I started getting
build errors because non-JSC files were having trouble including Opcode.h. That's just silly,
since Opcode.h is meant to be an internal JSC header. So, I made it an internal header and
made it impossible to include it from outside JSC. This was a lot of work, but it was
necessary to get the patch to build on all ports. It's also a net win. There were many places
in WebCore that were transitively including a *ton* of JSC headers just because of the
JSObject.h-&gt;HeapInlines.h edge and a bunch of dependency edges that arose from some public
(for WebCore) JSC headers needing Interpreter.h or Opcode.h for bad reasons.

* API/JSManagedValue.mm:
(-[JSManagedValue initWithValue:]):
* API/JSTypedArray.cpp:
* API/ObjCCallbackFunction.mm:
* API/tests/testapi.mm:
(testObjectiveCAPI):
(testWeakValue): Deleted.
* CMakeLists.txt:
* JavaScriptCore.xcodeproj/project.pbxproj:
* Scripts/builtins/builtins_generate_combined_implementation.py:
(BuiltinsCombinedImplementationGenerator.generate_secondary_header_includes):
* Scripts/builtins/builtins_generate_internals_wrapper_implementation.py:
(BuiltinsInternalsWrapperImplementationGenerator.generate_secondary_header_includes):
* Scripts/builtins/builtins_generate_separate_implementation.py:
(BuiltinsSeparateImplementationGenerator.generate_secondary_header_includes):
* assembler/AbstractMacroAssembler.h:
(JSC::AbstractMacroAssembler::JumpList::link):
(JSC::AbstractMacroAssembler::JumpList::linkTo):
* assembler/MacroAssembler.h:
* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::add32):
* assembler/MacroAssemblerCodeRef.cpp: Added.
(JSC::MacroAssemblerCodePtr::createLLIntCodePtr):
(JSC::MacroAssemblerCodePtr::dumpWithName):
(JSC::MacroAssemblerCodePtr::dump):
(JSC::MacroAssemblerCodeRef::createLLIntCodeRef):
(JSC::MacroAssemblerCodeRef::dump):
* assembler/MacroAssemblerCodeRef.h:
(JSC::MacroAssemblerCodePtr::createLLIntCodePtr): Deleted.
(JSC::MacroAssemblerCodePtr::dumpWithName): Deleted.
(JSC::MacroAssemblerCodePtr::dump): Deleted.
(JSC::MacroAssemblerCodeRef::createLLIntCodeRef): Deleted.
(JSC::MacroAssemblerCodeRef::dump): Deleted.
* b3/B3BasicBlock.cpp:
(JSC::B3::BasicBlock::appendBoolConstant):
* b3/B3BasicBlock.h:
* b3/B3DuplicateTails.cpp:
* b3/B3StackmapGenerationParams.h:
* b3/testb3.cpp:
(JSC::B3::testPatchpointTerminalReturnValue):
(JSC::B3::run):
* bindings/ScriptValue.cpp:
* bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
* bytecode/BytecodeBasicBlock.cpp:
* bytecode/BytecodeLivenessAnalysis.cpp:
* bytecode/BytecodeUseDef.h:
* bytecode/CallLinkInfo.cpp:
(JSC::CallLinkInfo::callTypeFor):
* bytecode/CallLinkInfo.h:
(JSC::CallLinkInfo::callTypeFor): Deleted.
* bytecode/CallLinkStatus.cpp:
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::finishCreation):
(JSC::CodeBlock::clearLLIntGetByIdCache):
(JSC::CodeBlock::predictedMachineCodeSize):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::jitCodeMap): Deleted.
(JSC::clearLLIntGetByIdCache): Deleted.
* bytecode/ExecutionCounter.h:
* bytecode/Instruction.h:
* bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
(JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
* bytecode/ObjectAllocationProfile.h:
(JSC::ObjectAllocationProfile::isNull):
(JSC::ObjectAllocationProfile::initialize):
* bytecode/Opcode.h:
(JSC::padOpcodeName):
* bytecode/PolymorphicAccess.cpp:
(JSC::AccessCase::generateImpl):
(JSC::PolymorphicAccess::regenerate):
* bytecode/PolymorphicAccess.h:
* bytecode/PreciseJumpTargets.cpp:
* bytecode/StructureStubInfo.cpp:
* bytecode/StructureStubInfo.h:
* bytecode/UnlinkedCodeBlock.cpp:
(JSC::UnlinkedCodeBlock::vm): Deleted.
* bytecode/UnlinkedCodeBlock.h:
* bytecode/UnlinkedInstructionStream.cpp:
* bytecode/UnlinkedInstructionStream.h:
* dfg/DFGOperations.cpp:
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::emitAllocateRawObject):
(JSC::DFG::SpeculativeJIT::compileMakeRope):
(JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
(JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::emitAllocateJSCell):
(JSC::DFG::SpeculativeJIT::emitAllocateJSObject):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
(JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
(JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize):
* dfg/DFGStrengthReductionPhase.cpp:
(JSC::DFG::StrengthReductionPhase::handleNode):
* ftl/FTLAbstractHeapRepository.h:
* ftl/FTLCompile.cpp:
* ftl/FTLJITFinalizer.cpp:
* ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileCreateDirectArguments):
(JSC::FTL::DFG::LowerDFGToB3::compileCreateRest):
(JSC::FTL::DFG::LowerDFGToB3::allocateArrayWithSize):
(JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSize):
(JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
(JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject):
(JSC::FTL::DFG::LowerDFGToB3::initializeArrayElements):
(JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl):
(JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell):
(JSC::FTL::DFG::LowerDFGToB3::allocateCell):
(JSC::FTL::DFG::LowerDFGToB3::allocateObject):
(JSC::FTL::DFG::LowerDFGToB3::allocatorForSize):
(JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject):
(JSC::FTL::DFG::LowerDFGToB3::allocateJSArray):
(JSC::FTL::DFG::LowerDFGToB3::compileAllocateArrayWithSize): Deleted.
* ftl/FTLOutput.cpp:
(JSC::FTL::Output::constBool):
(JSC::FTL::Output::add):
(JSC::FTL::Output::shl):
(JSC::FTL::Output::aShr):
(JSC::FTL::Output::lShr):
(JSC::FTL::Output::zeroExt):
(JSC::FTL::Output::equal):
(JSC::FTL::Output::notEqual):
(JSC::FTL::Output::above):
(JSC::FTL::Output::aboveOrEqual):
(JSC::FTL::Output::below):
(JSC::FTL::Output::belowOrEqual):
(JSC::FTL::Output::greaterThan):
(JSC::FTL::Output::greaterThanOrEqual):
(JSC::FTL::Output::lessThan):
(JSC::FTL::Output::lessThanOrEqual):
(JSC::FTL::Output::select):
(JSC::FTL::Output::appendSuccessor):
(JSC::FTL::Output::addIncomingToPhi):
* ftl/FTLOutput.h:
* ftl/FTLValueFromBlock.h:
(JSC::FTL::ValueFromBlock::operator bool):
(JSC::FTL::ValueFromBlock::ValueFromBlock): Deleted.
* ftl/FTLWeightedTarget.h:
(JSC::FTL::WeightedTarget::frequentedBlock):
* heap/CellContainer.h: Added.
(JSC::CellContainer::CellContainer):
(JSC::CellContainer::operator bool):
(JSC::CellContainer::isMarkedBlock):
(JSC::CellContainer::isLargeAllocation):
(JSC::CellContainer::markedBlock):
(JSC::CellContainer::largeAllocation):
* heap/CellContainerInlines.h: Added.
(JSC::CellContainer::isMarked):
(JSC::CellContainer::isMarkedOrNewlyAllocated):
(JSC::CellContainer::noteMarked):
(JSC::CellContainer::cellSize):
(JSC::CellContainer::weakSet):
(JSC::CellContainer::flipIfNecessary):
* heap/ConservativeRoots.cpp:
(JSC::ConservativeRoots::ConservativeRoots):
(JSC::ConservativeRoots::~ConservativeRoots):
(JSC::ConservativeRoots::grow):
(JSC::ConservativeRoots::genericAddPointer):
(JSC::ConservativeRoots::genericAddSpan):
* heap/ConservativeRoots.h:
(JSC::ConservativeRoots::roots):
* heap/CopyToken.h:
* heap/FreeList.cpp: Added.
(JSC::FreeList::dump):
* heap/FreeList.h: Added.
(JSC::FreeList::FreeList):
(JSC::FreeList::list):
(JSC::FreeList::bump):
(JSC::FreeList::operator==):
(JSC::FreeList::operator!=):
(JSC::FreeList::operator bool):
(JSC::FreeList::allocationWillFail):
(JSC::FreeList::allocationWillSucceed):
* heap/GCTypeMap.h: Added.
(JSC::GCTypeMap::operator[]):
* heap/Heap.cpp:
(JSC::Heap::Heap):
(JSC::Heap::lastChanceToFinalize):
(JSC::Heap::finalizeUnconditionalFinalizers):
(JSC::Heap::markRoots):
(JSC::Heap::copyBackingStores):
(JSC::Heap::gatherStackRoots):
(JSC::Heap::gatherJSStackRoots):
(JSC::Heap::gatherScratchBufferRoots):
(JSC::Heap::clearLivenessData):
(JSC::Heap::visitSmallStrings):
(JSC::Heap::visitConservativeRoots):
(JSC::Heap::removeDeadCompilerWorklistEntries):
(JSC::Heap::gatherExtraHeapSnapshotData):
(JSC::Heap::removeDeadHeapSnapshotNodes):
(JSC::Heap::visitProtectedObjects):
(JSC::Heap::visitArgumentBuffers):
(JSC::Heap::visitException):
(JSC::Heap::visitStrongHandles):
(JSC::Heap::visitHandleStack):
(JSC::Heap::visitSamplingProfiler):
(JSC::Heap::traceCodeBlocksAndJITStubRoutines):
(JSC::Heap::converge):
(JSC::Heap::visitWeakHandles):
(JSC::Heap::updateObjectCounts):
(JSC::Heap::clearUnmarkedExecutables):
(JSC::Heap::deleteUnmarkedCompiledCode):
(JSC::Heap::collectAllGarbage):
(JSC::Heap::collect):
(JSC::Heap::collectWithoutAnySweep):
(JSC::Heap::collectImpl):
(JSC::Heap::suspendCompilerThreads):
(JSC::Heap::willStartCollection):
(JSC::Heap::flushOldStructureIDTables):
(JSC::Heap::flushWriteBarrierBuffer):
(JSC::Heap::stopAllocation):
(JSC::Heap::prepareForMarking):
(JSC::Heap::reapWeakHandles):
(JSC::Heap::pruneStaleEntriesFromWeakGCMaps):
(JSC::Heap::sweepArrayBuffers):
(JSC::MarkedBlockSnapshotFunctor::MarkedBlockSnapshotFunctor):
(JSC::MarkedBlockSnapshotFunctor::operator()):
(JSC::Heap::snapshotMarkedSpace):
(JSC::Heap::deleteSourceProviderCaches):
(JSC::Heap::notifyIncrementalSweeper):
(JSC::Heap::writeBarrierCurrentlyExecutingCodeBlocks):
(JSC::Heap::resetAllocators):
(JSC::Heap::updateAllocationLimits):
(JSC::Heap::didFinishCollection):
(JSC::Heap::resumeCompilerThreads):
(JSC::Zombify::visit):
(JSC::Heap::forEachCodeBlockImpl):
* heap/Heap.h:
(JSC::Heap::allocatorForObjectWithoutDestructor):
(JSC::Heap::allocatorForObjectWithDestructor):
(JSC::Heap::allocatorForAuxiliaryData):
(JSC::Heap::jitStubRoutines):
(JSC::Heap::codeBlockSet):
(JSC::Heap::storageAllocator): Deleted.
* heap/HeapCell.h:
(JSC::HeapCell::isZapped): Deleted.
* heap/HeapCellInlines.h: Added.
(JSC::HeapCell::isLargeAllocation):
(JSC::HeapCell::cellContainer):
(JSC::HeapCell::markedBlock):
(JSC::HeapCell::largeAllocation):
(JSC::HeapCell::heap):
(JSC::HeapCell::vm):
(JSC::HeapCell::cellSize):
(JSC::HeapCell::allocatorAttributes):
(JSC::HeapCell::destructionMode):
(JSC::HeapCell::cellKind):
* heap/HeapInlines.h:
(JSC::Heap::heap):
(JSC::Heap::isLive):
(JSC::Heap::isMarked):
(JSC::Heap::testAndSetMarked):
(JSC::Heap::setMarked):
(JSC::Heap::cellSize):
(JSC::Heap::forEachCodeBlock):
(JSC::Heap::allocateObjectOfType):
(JSC::Heap::subspaceForObjectOfType):
(JSC::Heap::allocatorForObjectOfType):
(JSC::Heap::allocateAuxiliary):
(JSC::Heap::tryAllocateAuxiliary):
(JSC::Heap::tryReallocateAuxiliary):
(JSC::Heap::isPointerGCObject): Deleted.
(JSC::Heap::isValueGCObject): Deleted.
* heap/HeapOperation.cpp: Added.
(WTF::printInternal):
* heap/HeapOperation.h:
* heap/HeapUtil.h: Added.
(JSC::HeapUtil::findGCObjectPointersForMarking):
(JSC::HeapUtil::isPointerGCObjectJSCell):
(JSC::HeapUtil::isValueGCObject):
* heap/IncrementalSweeper.cpp:
(JSC::IncrementalSweeper::sweepNextBlock):
* heap/IncrementalSweeper.h:
* heap/LargeAllocation.cpp: Added.
(JSC::LargeAllocation::tryCreate):
(JSC::LargeAllocation::LargeAllocation):
(JSC::LargeAllocation::lastChanceToFinalize):
(JSC::LargeAllocation::shrink):
(JSC::LargeAllocation::visitWeakSet):
(JSC::LargeAllocation::reapWeakSet):
(JSC::LargeAllocation::flip):
(JSC::LargeAllocation::isEmpty):
(JSC::LargeAllocation::sweep):
(JSC::LargeAllocation::destroy):
(JSC::LargeAllocation::dump):
* heap/LargeAllocation.h: Added.
(JSC::LargeAllocation::fromCell):
(JSC::LargeAllocation::cell):
(JSC::LargeAllocation::isLargeAllocation):
(JSC::LargeAllocation::heap):
(JSC::LargeAllocation::vm):
(JSC::LargeAllocation::weakSet):
(JSC::LargeAllocation::clearNewlyAllocated):
(JSC::LargeAllocation::isNewlyAllocated):
(JSC::LargeAllocation::isMarked):
(JSC::LargeAllocation::isMarkedOrNewlyAllocated):
(JSC::LargeAllocation::isLive):
(JSC::LargeAllocation::hasValidCell):
(JSC::LargeAllocation::cellSize):
(JSC::LargeAllocation::aboveLowerBound):
(JSC::LargeAllocation::belowUpperBound):
(JSC::LargeAllocation::contains):
(JSC::LargeAllocation::attributes):
(JSC::LargeAllocation::flipIfNecessary):
(JSC::LargeAllocation::flipIfNecessaryConcurrently):
(JSC::LargeAllocation::testAndSetMarked):
(JSC::LargeAllocation::setMarked):
(JSC::LargeAllocation::clearMarked):
(JSC::LargeAllocation::noteMarked):
(JSC::LargeAllocation::headerSize):
* heap/MarkedAllocator.cpp:
(JSC::MarkedAllocator::MarkedAllocator):
(JSC::MarkedAllocator::isPagedOut):
(JSC::MarkedAllocator::retire):
(JSC::MarkedAllocator::filterNextBlock):
(JSC::MarkedAllocator::setNextBlockToSweep):
(JSC::MarkedAllocator::tryAllocateWithoutCollectingImpl):
(JSC::MarkedAllocator::tryAllocateWithoutCollecting):
(JSC::MarkedAllocator::allocateSlowCase):
(JSC::MarkedAllocator::tryAllocateSlowCase):
(JSC::MarkedAllocator::allocateSlowCaseImpl):
(JSC::blockHeaderSize):
(JSC::MarkedAllocator::blockSizeForBytes):
(JSC::MarkedAllocator::tryAllocateBlock):
(JSC::MarkedAllocator::addBlock):
(JSC::MarkedAllocator::removeBlock):
(JSC::MarkedAllocator::stopAllocating):
(JSC::MarkedAllocator::reset):
(JSC::MarkedAllocator::lastChanceToFinalize):
(JSC::MarkedAllocator::setFreeList):
(JSC::isListPagedOut): Deleted.
(JSC::MarkedAllocator::tryAllocateHelper): Deleted.
(JSC::MarkedAllocator::tryPopFreeList): Deleted.
(JSC::MarkedAllocator::tryAllocate): Deleted.
(JSC::MarkedAllocator::allocateBlock): Deleted.
* heap/MarkedAllocator.h:
(JSC::MarkedAllocator::takeLastActiveBlock):
(JSC::MarkedAllocator::offsetOfFreeList):
(JSC::MarkedAllocator::offsetOfCellSize):
(JSC::MarkedAllocator::tryAllocate):
(JSC::MarkedAllocator::allocate):
(JSC::MarkedAllocator::forEachBlock):
(JSC::MarkedAllocator::offsetOfFreeListHead): Deleted.
(JSC::MarkedAllocator::MarkedAllocator): Deleted.
(JSC::MarkedAllocator::init): Deleted.
(JSC::MarkedAllocator::stopAllocating): Deleted.
* heap/MarkedBlock.cpp:
(JSC::MarkedBlock::tryCreate):
(JSC::MarkedBlock::Handle::Handle):
(JSC::MarkedBlock::Handle::~Handle):
(JSC::MarkedBlock::MarkedBlock):
(JSC::MarkedBlock::Handle::specializedSweep):
(JSC::MarkedBlock::Handle::sweep):
(JSC::MarkedBlock::Handle::sweepHelperSelectScribbleMode):
(JSC::MarkedBlock::Handle::sweepHelperSelectStateAndSweepMode):
(JSC::MarkedBlock::Handle::unsweepWithNoNewlyAllocated):
(JSC::SetNewlyAllocatedFunctor::SetNewlyAllocatedFunctor):
(JSC::SetNewlyAllocatedFunctor::operator()):
(JSC::MarkedBlock::Handle::stopAllocating):
(JSC::MarkedBlock::Handle::lastChanceToFinalize):
(JSC::MarkedBlock::Handle::resumeAllocating):
(JSC::MarkedBlock::Handle::zap):
(JSC::MarkedBlock::Handle::forEachFreeCell):
(JSC::MarkedBlock::flipIfNecessary):
(JSC::MarkedBlock::Handle::flipIfNecessary):
(JSC::MarkedBlock::flipIfNecessarySlow):
(JSC::MarkedBlock::flipIfNecessaryConcurrentlySlow):
(JSC::MarkedBlock::clearMarks):
(JSC::MarkedBlock::assertFlipped):
(JSC::MarkedBlock::needsFlip):
(JSC::MarkedBlock::Handle::needsFlip):
(JSC::MarkedBlock::Handle::willRemoveBlock):
(JSC::MarkedBlock::Handle::didConsumeFreeList):
(JSC::MarkedBlock::markCount):
(JSC::MarkedBlock::Handle::isEmpty):
(JSC::MarkedBlock::clearHasAnyMarked):
(JSC::MarkedBlock::noteMarkedSlow):
(WTF::printInternal):
(JSC::MarkedBlock::create): Deleted.
(JSC::MarkedBlock::destroy): Deleted.
(JSC::MarkedBlock::callDestructor): Deleted.
(JSC::MarkedBlock::specializedSweep): Deleted.
(JSC::MarkedBlock::sweep): Deleted.
(JSC::MarkedBlock::sweepHelper): Deleted.
(JSC::MarkedBlock::stopAllocating): Deleted.
(JSC::MarkedBlock::clearMarksWithCollectionType): Deleted.
(JSC::MarkedBlock::lastChanceToFinalize): Deleted.
(JSC::MarkedBlock::resumeAllocating): Deleted.
(JSC::MarkedBlock::didRetireBlock): Deleted.
* heap/MarkedBlock.h:
(JSC::MarkedBlock::VoidFunctor::returnValue):
(JSC::MarkedBlock::CountFunctor::CountFunctor):
(JSC::MarkedBlock::CountFunctor::count):
(JSC::MarkedBlock::CountFunctor::returnValue):
(JSC::MarkedBlock::Handle::hasAnyNewlyAllocated):
(JSC::MarkedBlock::Handle::isOnBlocksToSweep):
(JSC::MarkedBlock::Handle::setIsOnBlocksToSweep):
(JSC::MarkedBlock::Handle::state):
(JSC::MarkedBlock::needsDestruction):
(JSC::MarkedBlock::handle):
(JSC::MarkedBlock::Handle::block):
(JSC::MarkedBlock::firstAtom):
(JSC::MarkedBlock::atoms):
(JSC::MarkedBlock::isAtomAligned):
(JSC::MarkedBlock::Handle::cellAlign):
(JSC::MarkedBlock::blockFor):
(JSC::MarkedBlock::Handle::allocator):
(JSC::MarkedBlock::Handle::heap):
(JSC::MarkedBlock::Handle::vm):
(JSC::MarkedBlock::vm):
(JSC::MarkedBlock::Handle::weakSet):
(JSC::MarkedBlock::weakSet):
(JSC::MarkedBlock::Handle::shrink):
(JSC::MarkedBlock::Handle::visitWeakSet):
(JSC::MarkedBlock::Handle::reapWeakSet):
(JSC::MarkedBlock::Handle::cellSize):
(JSC::MarkedBlock::cellSize):
(JSC::MarkedBlock::Handle::attributes):
(JSC::MarkedBlock::attributes):
(JSC::MarkedBlock::Handle::needsDestruction):
(JSC::MarkedBlock::Handle::destruction):
(JSC::MarkedBlock::Handle::cellKind):
(JSC::MarkedBlock::Handle::markCount):
(JSC::MarkedBlock::Handle::size):
(JSC::MarkedBlock::atomNumber):
(JSC::MarkedBlock::flipIfNecessary):
(JSC::MarkedBlock::flipIfNecessaryConcurrently):
(JSC::MarkedBlock::Handle::flipIfNecessary):
(JSC::MarkedBlock::Handle::flipIfNecessaryConcurrently):
(JSC::MarkedBlock::Handle::flipForEdenCollection):
(JSC::MarkedBlock::assertFlipped):
(JSC::MarkedBlock::Handle::assertFlipped):
(JSC::MarkedBlock::isMarked):
(JSC::MarkedBlock::testAndSetMarked):
(JSC::MarkedBlock::Handle::isNewlyAllocated):
(JSC::MarkedBlock::Handle::setNewlyAllocated):
(JSC::MarkedBlock::Handle::clearNewlyAllocated):
(JSC::MarkedBlock::Handle::isMarkedOrNewlyAllocated):
(JSC::MarkedBlock::isMarkedOrNewlyAllocated):
(JSC::MarkedBlock::Handle::isLive):
(JSC::MarkedBlock::isAtom):
(JSC::MarkedBlock::Handle::isLiveCell):
(JSC::MarkedBlock::Handle::forEachCell):
(JSC::MarkedBlock::Handle::forEachLiveCell):
(JSC::MarkedBlock::Handle::forEachDeadCell):
(JSC::MarkedBlock::Handle::needsSweeping):
(JSC::MarkedBlock::Handle::isAllocated):
(JSC::MarkedBlock::Handle::isMarked):
(JSC::MarkedBlock::Handle::isFreeListed):
(JSC::MarkedBlock::hasAnyMarked):
(JSC::MarkedBlock::noteMarked):
(WTF::MarkedBlockHash::hash):
(JSC::MarkedBlock::FreeList::FreeList): Deleted.
(JSC::MarkedBlock::allocator): Deleted.
(JSC::MarkedBlock::heap): Deleted.
(JSC::MarkedBlock::shrink): Deleted.
(JSC::MarkedBlock::visitWeakSet): Deleted.
(JSC::MarkedBlock::reapWeakSet): Deleted.
(JSC::MarkedBlock::willRemoveBlock): Deleted.
(JSC::MarkedBlock::didConsumeFreeList): Deleted.
(JSC::MarkedBlock::markCount): Deleted.
(JSC::MarkedBlock::isEmpty): Deleted.
(JSC::MarkedBlock::destruction): Deleted.
(JSC::MarkedBlock::cellKind): Deleted.
(JSC::MarkedBlock::size): Deleted.
(JSC::MarkedBlock::capacity): Deleted.
(JSC::MarkedBlock::setMarked): Deleted.
(JSC::MarkedBlock::clearMarked): Deleted.
(JSC::MarkedBlock::isNewlyAllocated): Deleted.
(JSC::MarkedBlock::setNewlyAllocated): Deleted.
(JSC::MarkedBlock::clearNewlyAllocated): Deleted.
(JSC::MarkedBlock::isLive): Deleted.
(JSC::MarkedBlock::isLiveCell): Deleted.
(JSC::MarkedBlock::forEachCell): Deleted.
(JSC::MarkedBlock::forEachLiveCell): Deleted.
(JSC::MarkedBlock::forEachDeadCell): Deleted.
(JSC::MarkedBlock::needsSweeping): Deleted.
(JSC::MarkedBlock::isAllocated): Deleted.
(JSC::MarkedBlock::isMarkedOrRetired): Deleted.
* heap/MarkedSpace.cpp:
(JSC::MarkedSpace::initializeSizeClassForStepSize):
(JSC::MarkedSpace::MarkedSpace):
(JSC::MarkedSpace::~MarkedSpace):
(JSC::MarkedSpace::lastChanceToFinalize):
(JSC::MarkedSpace::allocate):
(JSC::MarkedSpace::tryAllocate):
(JSC::MarkedSpace::allocateLarge):
(JSC::MarkedSpace::tryAllocateLarge):
(JSC::MarkedSpace::sweep):
(JSC::MarkedSpace::sweepLargeAllocations):
(JSC::MarkedSpace::zombifySweep):
(JSC::MarkedSpace::resetAllocators):
(JSC::MarkedSpace::visitWeakSets):
(JSC::MarkedSpace::reapWeakSets):
(JSC::MarkedSpace::stopAllocating):
(JSC::MarkedSpace::prepareForMarking):
(JSC::MarkedSpace::resumeAllocating):
(JSC::MarkedSpace::isPagedOut):
(JSC::MarkedSpace::freeBlock):
(JSC::MarkedSpace::freeOrShrinkBlock):
(JSC::MarkedSpace::shrink):
(JSC::MarkedSpace::clearNewlyAllocated):
(JSC::VerifyMarked::operator()):
(JSC::MarkedSpace::flip):
(JSC::MarkedSpace::objectCount):
(JSC::MarkedSpace::size):
(JSC::MarkedSpace::capacity):
(JSC::MarkedSpace::addActiveWeakSet):
(JSC::MarkedSpace::didAddBlock):
(JSC::MarkedSpace::didAllocateInBlock):
(JSC::MarkedSpace::forEachAllocator): Deleted.
(JSC::VerifyMarkedOrRetired::operator()): Deleted.
(JSC::MarkedSpace::clearMarks): Deleted.
* heap/MarkedSpace.h:
(JSC::MarkedSpace::sizeClassToIndex):
(JSC::MarkedSpace::indexToSizeClass):
(JSC::MarkedSpace::version):
(JSC::MarkedSpace::blocksWithNewObjects):
(JSC::MarkedSpace::largeAllocations):
(JSC::MarkedSpace::largeAllocationsNurseryOffset):
(JSC::MarkedSpace::largeAllocationsOffsetForThisCollection):
(JSC::MarkedSpace::largeAllocationsForThisCollectionBegin):
(JSC::MarkedSpace::largeAllocationsForThisCollectionEnd):
(JSC::MarkedSpace::largeAllocationsForThisCollectionSize):
(JSC::MarkedSpace::forEachLiveCell):
(JSC::MarkedSpace::forEachDeadCell):
(JSC::MarkedSpace::allocatorFor):
(JSC::MarkedSpace::destructorAllocatorFor):
(JSC::MarkedSpace::auxiliaryAllocatorFor):
(JSC::MarkedSpace::allocateWithoutDestructor):
(JSC::MarkedSpace::allocateWithDestructor):
(JSC::MarkedSpace::allocateAuxiliary):
(JSC::MarkedSpace::tryAllocateAuxiliary):
(JSC::MarkedSpace::forEachBlock):
(JSC::MarkedSpace::forEachAllocator):
(JSC::MarkedSpace::optimalSizeFor):
(JSC::MarkedSpace::didAddBlock): Deleted.
(JSC::MarkedSpace::didAllocateInBlock): Deleted.
(JSC::MarkedSpace::objectCount): Deleted.
(JSC::MarkedSpace::size): Deleted.
(JSC::MarkedSpace::capacity): Deleted.
* heap/SlotVisitor.cpp:
(JSC::SlotVisitor::SlotVisitor):
(JSC::SlotVisitor::didStartMarking):
(JSC::SlotVisitor::reset):
(JSC::SlotVisitor::append):
(JSC::SlotVisitor::appendJSCellOrAuxiliary):
(JSC::SlotVisitor::setMarkedAndAppendToMarkStack):
(JSC::SlotVisitor::appendToMarkStack):
(JSC::SlotVisitor::markAuxiliary):
(JSC::SlotVisitor::noteLiveAuxiliaryCell):
(JSC::SlotVisitor::visitChildren):
* heap/SlotVisitor.h:
* heap/WeakBlock.cpp:
(JSC::WeakBlock::create):
(JSC::WeakBlock::WeakBlock):
(JSC::WeakBlock::visit):
(JSC::WeakBlock::reap):
* heap/WeakBlock.h:
(JSC::WeakBlock::disconnectContainer):
(JSC::WeakBlock::disconnectMarkedBlock): Deleted.
* heap/WeakSet.cpp:
(JSC::WeakSet::~WeakSet):
(JSC::WeakSet::sweep):
(JSC::WeakSet::shrink):
(JSC::WeakSet::addAllocator):
* heap/WeakSet.h:
(JSC::WeakSet::container):
(JSC::WeakSet::setContainer):
(JSC::WeakSet::WeakSet):
(JSC::WeakSet::visit):
(JSC::WeakSet::shrink): Deleted.
* heap/WeakSetInlines.h:
(JSC::WeakSet::allocate):
* inspector/InjectedScriptManager.cpp:
* inspector/JSGlobalObjectInspectorController.cpp:
* inspector/JSJavaScriptCallFrame.cpp:
* inspector/ScriptDebugServer.cpp:
* inspector/agents/InspectorDebuggerAgent.cpp:
* interpreter/CachedCall.h:
(JSC::CachedCall::CachedCall):
* interpreter/Interpreter.cpp:
(JSC::loadVarargs):
(JSC::StackFrame::sourceID): Deleted.
(JSC::StackFrame::sourceURL): Deleted.
(JSC::StackFrame::functionName): Deleted.
(JSC::StackFrame::computeLineAndColumn): Deleted.
(JSC::StackFrame::toString): Deleted.
* interpreter/Interpreter.h:
(JSC::StackFrame::isNative): Deleted.
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
(JSC::AssemblyHelpers::emitAllocate):
(JSC::AssemblyHelpers::emitAllocateJSCell):
(JSC::AssemblyHelpers::emitAllocateJSObject):
(JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize):
(JSC::AssemblyHelpers::emitAllocateVariableSized):
* jit/GCAwareJITStubRoutine.cpp:
(JSC::GCAwareJITStubRoutine::GCAwareJITStubRoutine):
* jit/JIT.cpp:
(JSC::JIT::compileCTINativeCall):
(JSC::JIT::link):
* jit/JIT.h:
(JSC::JIT::compileCTINativeCall): Deleted.
* jit/JITExceptions.cpp:
(JSC::genericUnwind):
* jit/JITExceptions.h:
* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_new_object):
(JSC::JIT::emitSlow_op_new_object):
(JSC::JIT::emit_op_create_this):
(JSC::JIT::emitSlow_op_create_this):
* jit/JITOpcodes32_64.cpp:
(JSC::JIT::emit_op_new_object):
(JSC::JIT::emitSlow_op_new_object):
(JSC::JIT::emit_op_create_this):
(JSC::JIT::emitSlow_op_create_this):
* jit/JITOperations.cpp:
* jit/JITOperations.h:
* jit/JITPropertyAccess.cpp:
(JSC::JIT::emitWriteBarrier):
* jit/JITThunks.cpp:
* jit/JITThunks.h:
* jsc.cpp:
(functionDescribeArray):
(main):
* llint/LLIntData.cpp:
(JSC::LLInt::Data::performAssertions):
* llint/LLIntExceptions.cpp:
* llint/LLIntThunks.cpp:
* llint/LLIntThunks.h:
* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter.cpp:
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:
* parser/ModuleAnalyzer.cpp:
* parser/NodeConstructors.h:
* parser/Nodes.h:
* profiler/ProfilerBytecode.cpp:
* profiler/ProfilerBytecode.h:
* profiler/ProfilerBytecodeSequence.cpp:
* runtime/ArrayConventions.h:
(JSC::indexingHeaderForArrayStorage):
(JSC::baseIndexingHeaderForArrayStorage):
(JSC::indexingHeaderForArray): Deleted.
(JSC::baseIndexingHeaderForArray): Deleted.
* runtime/ArrayPrototype.cpp:
(JSC::arrayProtoFuncSplice):
(JSC::concatAppendOne):
(JSC::arrayProtoPrivateFuncConcatMemcpy):
* runtime/ArrayStorage.h:
(JSC::ArrayStorage::vectorLength):
(JSC::ArrayStorage::totalSizeFor):
(JSC::ArrayStorage::totalSize):
(JSC::ArrayStorage::availableVectorLength):
(JSC::ArrayStorage::optimalVectorLength):
(JSC::ArrayStorage::sizeFor): Deleted.
* runtime/AuxiliaryBarrier.h: Added.
(JSC::AuxiliaryBarrier::AuxiliaryBarrier):
(JSC::AuxiliaryBarrier::clear):
(JSC::AuxiliaryBarrier::get):
(JSC::AuxiliaryBarrier::slot):
(JSC::AuxiliaryBarrier::operator bool):
(JSC::AuxiliaryBarrier::setWithoutBarrier):
* runtime/AuxiliaryBarrierInlines.h: Added.
(JSC::AuxiliaryBarrier&lt;T&gt;::AuxiliaryBarrier):
(JSC::AuxiliaryBarrier&lt;T&gt;::set):
* runtime/Butterfly.h:
* runtime/ButterflyInlines.h:
(JSC::Butterfly::availableContiguousVectorLength):
(JSC::Butterfly::optimalContiguousVectorLength):
(JSC::Butterfly::createUninitialized):
(JSC::Butterfly::growArrayRight):
* runtime/ClonedArguments.cpp:
(JSC::ClonedArguments::createEmpty):
* runtime/CommonSlowPathsExceptions.cpp:
* runtime/CommonSlowPathsExceptions.h:
* runtime/DataView.cpp:
* runtime/DirectArguments.h:
* runtime/ECMAScriptSpecInternalFunctions.cpp:
* runtime/Error.cpp:
* runtime/Error.h:
* runtime/ErrorInstance.cpp:
* runtime/ErrorInstance.h:
* runtime/Exception.cpp:
* runtime/Exception.h:
* runtime/GeneratorFrame.cpp:
* runtime/GeneratorPrototype.cpp:
* runtime/InternalFunction.cpp:
(JSC::InternalFunction::InternalFunction):
* runtime/IntlCollator.cpp:
* runtime/IntlCollatorConstructor.cpp:
* runtime/IntlCollatorPrototype.cpp:
* runtime/IntlDateTimeFormat.cpp:
* runtime/IntlDateTimeFormatConstructor.cpp:
* runtime/IntlDateTimeFormatPrototype.cpp:
* runtime/IntlNumberFormat.cpp:
* runtime/IntlNumberFormatConstructor.cpp:
* runtime/IntlNumberFormatPrototype.cpp:
* runtime/IntlObject.cpp:
* runtime/IteratorPrototype.cpp:
* runtime/JSArray.cpp:
(JSC::JSArray::tryCreateUninitialized):
(JSC::JSArray::setLengthWritable):
(JSC::JSArray::unshiftCountSlowCase):
(JSC::JSArray::setLengthWithArrayStorage):
(JSC::JSArray::appendMemcpy):
(JSC::JSArray::setLength):
(JSC::JSArray::pop):
(JSC::JSArray::push):
(JSC::JSArray::fastSlice):
(JSC::JSArray::shiftCountWithArrayStorage):
(JSC::JSArray::shiftCountWithAnyIndexingType):
(JSC::JSArray::unshiftCountWithArrayStorage):
(JSC::JSArray::fillArgList):
(JSC::JSArray::copyToArguments):
* runtime/JSArray.h:
(JSC::createContiguousArrayButterfly):
(JSC::createArrayButterfly):
(JSC::JSArray::create):
(JSC::JSArray::tryCreateUninitialized): Deleted.
* runtime/JSArrayBufferView.h:
* runtime/JSCInlines.h:
* runtime/JSCJSValue.cpp:
(JSC::JSValue::dumpInContextAssumingStructure):
* runtime/JSCallee.cpp:
(JSC::JSCallee::JSCallee):
* runtime/JSCell.cpp:
(JSC::JSCell::estimatedSize):
* runtime/JSCell.h:
(JSC::JSCell::cellStateOffset): Deleted.
* runtime/JSCellInlines.h:
(JSC::ExecState::vm):
(JSC::JSCell::classInfo):
(JSC::JSCell::callDestructor):
(JSC::JSCell::vm): Deleted.
* runtime/JSFunction.cpp:
(JSC::JSFunction::create):
(JSC::JSFunction::allocateAndInitializeRareData):
(JSC::JSFunction::initializeRareData):
(JSC::JSFunction::getOwnPropertySlot):
(JSC::JSFunction::put):
(JSC::JSFunction::deleteProperty):
(JSC::JSFunction::defineOwnProperty):
(JSC::JSFunction::setFunctionName):
(JSC::JSFunction::reifyLength):
(JSC::JSFunction::reifyName):
(JSC::JSFunction::reifyLazyPropertyIfNeeded):
(JSC::JSFunction::reifyBoundNameIfNeeded):
* runtime/JSFunction.h:
* runtime/JSFunctionInlines.h:
(JSC::JSFunction::createWithInvalidatedReallocationWatchpoint):
(JSC::JSFunction::JSFunction):
* runtime/JSGenericTypedArrayViewInlines.h:
(JSC::JSGenericTypedArrayView&lt;Adaptor&gt;::slowDownAndWasteMemory):
* runtime/JSInternalPromise.cpp:
* runtime/JSInternalPromiseConstructor.cpp:
* runtime/JSInternalPromiseDeferred.cpp:
* runtime/JSInternalPromisePrototype.cpp:
* runtime/JSJob.cpp:
* runtime/JSMapIterator.cpp:
* runtime/JSModuleNamespaceObject.cpp:
* runtime/JSModuleRecord.cpp:
* runtime/JSObject.cpp:
(JSC::JSObject::visitButterfly):
(JSC::JSObject::notifyPresenceOfIndexedAccessors):
(JSC::JSObject::createInitialIndexedStorage):
(JSC::JSObject::createInitialUndecided):
(JSC::JSObject::createInitialInt32):
(JSC::JSObject::createInitialDouble):
(JSC::JSObject::createInitialContiguous):
(JSC::JSObject::createArrayStorage):
(JSC::JSObject::createInitialArrayStorage):
(JSC::JSObject::convertUndecidedToInt32):
(JSC::JSObject::convertUndecidedToContiguous):
(JSC::JSObject::convertUndecidedToArrayStorage):
(JSC::JSObject::convertInt32ToDouble):
(JSC::JSObject::convertInt32ToArrayStorage):
(JSC::JSObject::convertDoubleToArrayStorage):
(JSC::JSObject::convertContiguousToArrayStorage):
(JSC::JSObject::putByIndexBeyondVectorLength):
(JSC::JSObject::putDirectIndexBeyondVectorLength):
(JSC::JSObject::getNewVectorLength):
(JSC::JSObject::increaseVectorLength):
(JSC::JSObject::ensureLengthSlow):
(JSC::JSObject::growOutOfLineStorage):
(JSC::JSObject::copyButterfly): Deleted.
(JSC::JSObject::copyBackingStore): Deleted.
* runtime/JSObject.h:
(JSC::JSObject::globalObject):
(JSC::JSObject::putDirectInternal):
(JSC::JSObject::setStructureAndReallocateStorageIfNecessary): Deleted.
* runtime/JSObjectInlines.h:
* runtime/JSPromise.cpp:
* runtime/JSPromiseConstructor.cpp:
* runtime/JSPromiseDeferred.cpp:
* runtime/JSPromisePrototype.cpp:
* runtime/JSPropertyNameIterator.cpp:
* runtime/JSScope.cpp:
(JSC::JSScope::resolve):
* runtime/JSScope.h:
(JSC::JSScope::globalObject):
(JSC::JSScope::vm): Deleted.
* runtime/JSSetIterator.cpp:
* runtime/JSStringIterator.cpp:
* runtime/JSTemplateRegistryKey.cpp:
* runtime/JSTypedArrayViewConstructor.cpp:
* runtime/JSTypedArrayViewPrototype.cpp:
* runtime/JSWeakMap.cpp:
* runtime/JSWeakSet.cpp:
* runtime/MapConstructor.cpp:
* runtime/MapIteratorPrototype.cpp:
* runtime/MapPrototype.cpp:
* runtime/NativeErrorConstructor.cpp:
* runtime/NativeStdFunctionCell.cpp:
* runtime/Operations.h:
(JSC::scribbleFreeCells):
(JSC::scribble):
* runtime/Options.h:
* runtime/PropertyTable.cpp:
* runtime/ProxyConstructor.cpp:
* runtime/ProxyObject.cpp:
* runtime/ProxyRevoke.cpp:
* runtime/RegExp.cpp:
(JSC::RegExp::match):
(JSC::RegExp::matchConcurrently):
(JSC::RegExp::matchCompareWithInterpreter):
* runtime/RegExp.h:
* runtime/RegExpConstructor.h:
* runtime/RegExpInlines.h:
(JSC::RegExp::matchInline):
* runtime/RegExpMatchesArray.h:
(JSC::tryCreateUninitializedRegExpMatchesArray):
(JSC::createRegExpMatchesArray):
* runtime/RegExpPrototype.cpp:
(JSC::genericSplit):
* runtime/RuntimeType.cpp:
* runtime/SamplingProfiler.cpp:
(JSC::SamplingProfiler::processUnverifiedStackTraces):
* runtime/SetConstructor.cpp:
* runtime/SetIteratorPrototype.cpp:
* runtime/SetPrototype.cpp:
* runtime/StackFrame.cpp: Added.
(JSC::StackFrame::sourceID):
(JSC::StackFrame::sourceURL):
(JSC::StackFrame::functionName):
(JSC::StackFrame::computeLineAndColumn):
(JSC::StackFrame::toString):
* runtime/StackFrame.h: Added.
(JSC::StackFrame::isNative):
* runtime/StringConstructor.cpp:
* runtime/StringIteratorPrototype.cpp:
* runtime/StructureInlines.h:
(JSC::Structure::propertyTable):
* runtime/TemplateRegistry.cpp:
* runtime/TestRunnerUtils.cpp:
(JSC::finalizeStatsAtEndOfTesting):
* runtime/TestRunnerUtils.h:
* runtime/TypeProfilerLog.cpp:
* runtime/TypeSet.cpp:
* runtime/VM.cpp:
(JSC::VM::VM):
(JSC::VM::ensureStackCapacityForCLoop):
(JSC::VM::isSafeToRecurseSoftCLoop):
* runtime/VM.h:
* runtime/VMEntryScope.h:
* runtime/VMInlines.h:
(JSC::VM::ensureStackCapacityFor):
(JSC::VM::isSafeToRecurseSoft):
* runtime/WeakMapConstructor.cpp:
* runtime/WeakMapData.cpp:
* runtime/WeakMapPrototype.cpp:
* runtime/WeakSetConstructor.cpp:
* runtime/WeakSetPrototype.cpp:
* testRegExp.cpp:
(testOneRegExp):
* tools/JSDollarVM.cpp:
* tools/JSDollarVMPrototype.cpp:
(JSC::JSDollarVMPrototype::isInObjectSpace):

Source/WebCore:

No new tests because no new WebCore behavior.

Just rewiring #includes.

* ForwardingHeaders/heap/HeapInlines.h: Added.
* ForwardingHeaders/interpreter/Interpreter.h: Removed.
* ForwardingHeaders/runtime/AuxiliaryBarrierInlines.h: Added.
* Modules/indexeddb/IDBCursorWithValue.cpp:
* Modules/indexeddb/client/TransactionOperation.cpp:
* Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
* bindings/js/JSApplePayPaymentAuthorizedEventCustom.cpp:
* bindings/js/JSApplePayPaymentMethodSelectedEventCustom.cpp:
* bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp:
* bindings/js/JSApplePayShippingMethodSelectedEventCustom.cpp:
* bindings/js/JSClientRectCustom.cpp:
* bindings/js/JSDOMBinding.cpp:
* bindings/js/JSDOMBinding.h:
* bindings/js/JSDeviceMotionEventCustom.cpp:
* bindings/js/JSDeviceOrientationEventCustom.cpp:
* bindings/js/JSErrorEventCustom.cpp:
* bindings/js/JSIDBCursorWithValueCustom.cpp:
* bindings/js/JSIDBIndexCustom.cpp:
* bindings/js/JSPopStateEventCustom.cpp:
* bindings/js/JSWebGL2RenderingContextCustom.cpp:
* bindings/js/JSWorkerGlobalScopeCustom.cpp:
* bindings/js/WorkerScriptController.cpp:
* contentextensions/ContentExtensionParser.cpp:
* dom/ErrorEvent.cpp:
* html/HTMLCanvasElement.cpp:
* html/MediaDocument.cpp:
* inspector/CommandLineAPIModule.cpp:
* loader/EmptyClients.cpp:
* page/CaptionUserPreferences.cpp:
* page/Frame.cpp:
* page/PageGroup.cpp:
* page/UserContentController.cpp:
* platform/mock/mediasource/MockBox.cpp:
* testing/GCObservation.cpp:

Source/WebKit2:

Just rewiring some #includes.

* UIProcess/ViewGestureController.cpp:
* UIProcess/WebPageProxy.cpp:
* UIProcess/WebProcessPool.cpp:
* UIProcess/WebProcessProxy.cpp:
* WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp:
* WebProcess/Plugins/Netscape/JSNPObject.cpp:

Source/WTF:

I needed tryFastAlignedMalloc() so I added it.

* wtf/FastMalloc.cpp:
(WTF::tryFastAlignedMalloc):
* wtf/FastMalloc.h:
* wtf/ParkingLot.cpp:
(WTF::ParkingLot::forEachImpl):
(WTF::ParkingLot::forEach): Deleted.
* wtf/ParkingLot.h:
(WTF::ParkingLot::parkConditionally):
(WTF::ParkingLot::unparkOne):
(WTF::ParkingLot::forEach):
* wtf/ScopedLambda.h:
(WTF::scopedLambdaRef):
* wtf/SentinelLinkedList.h:
(WTF::SentinelLinkedList::forEach):
(WTF::RawNode&gt;::takeFrom):
* wtf/SimpleStats.h:
(WTF::SimpleStats::operator bool):
(WTF::SimpleStats::operator!): Deleted.

Tools:

* DumpRenderTree/TestRunner.cpp:
* DumpRenderTree/mac/DumpRenderTree.mm:
(DumpRenderTreeMain):
* Scripts/run-jsc-stress-tests:
* TestWebKitAPI/Tests/WTF/Vector.cpp:
(TestWebKitAPI::TEST):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214JSTestsChangeLog">releases/WebKitGTK/webkit-2.14/JSTests/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIJSManagedValuemm">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSManagedValue.mm</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIJSTypedArraycpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSTypedArray.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIObjCCallbackFunctionmm">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/ObjCCallbackFunction.mm</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIteststestapimm">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/tests/testapi.mm</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreCMakeListstxt">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_combined_implementationpy">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_internals_wrapper_implementationpy">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_internals_wrapper_implementation.py</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_separate_implementationpy">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerAbstractMacroAssemblerh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssembler.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerARM64h">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerCodeRefh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3BasicBlockcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3BasicBlockh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3DuplicateTailscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3DuplicateTails.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3StackmapGenerationParamsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3StackmapGenerationParams.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreb3testb3cpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/testb3.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebindingsScriptValuecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bindings/ScriptValue.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeAdaptiveInferredPropertyValueWatchpointBasecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeBytecodeLivenessAnalysiscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeBytecodeRewritercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeRewriter.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeBytecodeUseDefh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeUseDef.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCallLinkInfocpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCallLinkInfoh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCallLinkStatuscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCodeBlockcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCodeBlockh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeExecutionCounterh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ExecutionCounter.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeInstructionh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Instruction.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeLLIntPrototypeLoadAdaptiveStructureWatchpointcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeObjectAllocationProfileh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ObjectAllocationProfile.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeOpcodeh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Opcode.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodePolymorphicAccesscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodePolymorphicAccessh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeStructureStubInfocpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeStructureStubInfoh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeSuperSamplercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeSuperSamplerh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedCodeBlockh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedInstructionStreamcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedInstructionStreamh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGCallArrayAllocatorSlowPathGeneratorh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGOperationscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGOperationsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJITcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJITh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGStrengthReductionPhasecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLAbstractHeapRepositoryh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLCompilecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLCompile.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLJITFinalizercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLLowerDFGToB3cpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLOutputcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLOutputh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLValueFromBlockh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLValueFromBlock.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLWeightedTargeth">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLWeightedTarget.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapConservativeRootscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapConservativeRootsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapCopyTokenh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CopyToken.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeaph">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapCellh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCell.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapOperationh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapIncrementalSweepercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapIncrementalSweeperh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedAllocatorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedAllocatorh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedBlockcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedBlockh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedSpacecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedSpaceh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapSlotVisitorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapSlotVisitorh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakBlockcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakBlockh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakSetcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakSeth">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakSetInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSetInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorInjectedScriptManagercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorJSGlobalObjectInspectorControllercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorJSJavaScriptCallFramecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorScriptDebugServercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinterpreterCachedCallh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/CachedCall.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinterpreterInterpretercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreinterpreterInterpreterh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitAssemblyHelpersh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/AssemblyHelpers.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitCCallHelpersh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/CCallHelpers.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitGCAwareJITStubRoutinecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITExceptionscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITExceptionsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOpcodescpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOpcodes32_64cpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOperationscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOperationsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITPropertyAccesscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITPropertyAccess.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITThunkscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITThunksh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorejsccpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jsc.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntDatacpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntData.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntExceptionscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntExceptions.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntThunkscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntThunksh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpreterasm">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpretercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpreter32_64asm">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpreter64asm">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreparserModuleAnalyzercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/ModuleAnalyzer.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreparserNodeConstructorsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/NodeConstructors.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreparserNodesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/Nodes.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreprofilerProfilerBytecodecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreprofilerProfilerBytecodeh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreprofilerProfilerBytecodeSequencecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecodeSequence.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayConventionsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayStorageh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayStorage.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeButterflyh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Butterfly.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeButterflyInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ButterflyInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeClonedArgumentscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ClonedArguments.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeCommonSlowPathsExceptionscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeCommonSlowPathsExceptionsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeDataViewcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DataView.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeDirectArgumentsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DirectArguments.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeECMAScriptSpecInternalFunctionscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ECMAScriptSpecInternalFunctions.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorInstancecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorInstanceh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeExceptioncpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeExceptionh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeGeneratorPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/GeneratorPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeInternalFunctioncpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/InternalFunction.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlCollatorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlCollatorConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlCollatorPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlDateTimeFormatcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlDateTimeFormatConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlDateTimeFormatPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlNumberFormatcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlNumberFormatConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlNumberFormatPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlObjectcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIteratorPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IteratorPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSArraycpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSArrayh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSArrayBufferViewh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArrayBufferView.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCJSValuecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCJSValue.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCalleecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCallee.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCellcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCellh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCellInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCellInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSFunctioncpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSFunctionh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSFunctionInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunctionInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSGenericTypedArrayViewInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromisecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromise.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromiseConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromiseDeferredcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseDeferred.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromisePrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromisePrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSJobcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSJob.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSMapIteratorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSMapIterator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSModuleNamespaceObjectcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSModuleRecordcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleRecord.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSObjectcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSObjecth">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSObjectInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObjectInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromisecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromise.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromiseConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromiseDeferredcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromisePrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPropertyNameIteratorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSScopecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSScopeh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSSetIteratorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSSetIterator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSStringIteratorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSStringIterator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSTemplateRegistryKeycpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTemplateRegistryKey.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSTypedArrayViewConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSTypedArrayViewPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSWeakMapcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakMap.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSWeakSetcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakSet.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeMapConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeMapIteratorPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapIteratorPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeMapPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeNativeErrorConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeNativeStdFunctionCellcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeStdFunctionCell.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeOperationsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Operations.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeOptionscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeOptionsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimePropertyTablecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/PropertyTable.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeProxyConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeProxyObjectcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeProxyRevokecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyRevoke.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExph">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpConstructorh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpConstructor.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpMatchesArrayh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpMatchesArray.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRuntimeTypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RuntimeType.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSamplingProfilercpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SamplingProfiler.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSetConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSetIteratorPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetIteratorPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSetPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStringConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStringIteratorPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringIteratorPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStructureInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StructureInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTemplateRegistrycpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TemplateRegistry.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTestRunnerUtilscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTestRunnerUtilsh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeThrowScopecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ThrowScope.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTypeProfilerLogcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeProfilerLog.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTypeSetcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeSet.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMEntryScopeh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMEntryScope.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakMapConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakMapDatacpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapData.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakMapPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakSetConstructorcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetConstructor.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakSetPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoretestRegExpcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/testRegExp.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoretoolsJSDollarVMcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVM.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoretoolsJSDollarVMPrototypecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFChangeLog">releases/WebKitGTK/webkit-2.14/Source/WTF/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfFastMalloccpp">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfFastMalloch">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfParkingLotcpp">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfParkingLoth">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfScopedLambdah">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ScopedLambda.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfSentinelLinkedListh">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SentinelLinkedList.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWTFwtfSimpleStatsh">releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SimpleStats.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbIDBCursorWithValuecpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/IDBCursorWithValue.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbclientTransactionOperationcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/client/TransactionOperation.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbserverSQLiteIDBBackingStorecpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayPaymentAuthorizedEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentAuthorizedEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayPaymentMethodSelectedEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentMethodSelectedEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingContactSelectedEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingMethodSelectedEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingMethodSelectedEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSClientRectCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSClientRectCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDOMBindingcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDOMBindingh">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDeviceMotionEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceMotionEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDeviceOrientationEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceOrientationEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSErrorEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSErrorEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSIDBCursorWithValueCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBCursorWithValueCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSIDBIndexCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBIndexCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSPerformanceTimingCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPerformanceTimingCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSPopStateEventCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPopStateEventCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSWebGL2RenderingContextCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSWorkerGlobalScopeCustomcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorebindingsjsWorkerScriptControllercpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/WorkerScriptController.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorecontentextensionsContentExtensionParsercpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/contentextensions/ContentExtensionParser.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoredomErrorEventcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/dom/ErrorEvent.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorehtmlHTMLCanvasElementcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/html/HTMLCanvasElement.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorehtmlMediaDocumentcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/html/MediaDocument.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreinspectorCommandLineAPIModulecpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/inspector/CommandLineAPIModule.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreloaderEmptyClientscpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/loader/EmptyClients.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorepageCaptionUserPreferencescpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/page/CaptionUserPreferences.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorepageFramecpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/page/Frame.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorepagePageGroupcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/page/PageGroup.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCorepageUserContentControllercpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/page/UserContentController.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformmockmediasourceMockBoxcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/mock/mediasource/MockBox.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoretestingGCObservationcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/testing/GCObservation.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2ChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebKit2/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2UIProcessViewGestureControllercpp">releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/ViewGestureController.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2UIProcessWebPageProxycpp">releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2UIProcessWebProcessPoolcpp">releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessPool.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2UIProcessWebProcessProxycpp">releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessProxy.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2WebProcessInjectedBundleDOMInjectedBundleRangeHandlecpp">releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebKit2WebProcessPluginsNetscapeJSNPObjectcpp">releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourcebmallocChangeLog">releases/WebKitGTK/webkit-2.14/Source/bmalloc/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourcebmallocbmallocAllocatorcpp">releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourcebmallocbmallocAllocatorh">releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourcebmallocbmallocCacheh">releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Cache.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214Sourcebmallocbmallocbmalloch">releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/bmalloc.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214ToolsChangeLog">releases/WebKitGTK/webkit-2.14/Tools/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214ToolsDumpRenderTreeTestRunnercpp">releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/TestRunner.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214ToolsDumpRenderTreemacDumpRenderTreemm">releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/mac/DumpRenderTree.mm</a></li>
<li><a href="#releasesWebKitGTKwebkit214ToolsScriptsrunjscstresstests">releases/WebKitGTK/webkit-2.14/Tools/Scripts/run-jsc-stress-tests</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214JSTestsstressarraystoragearrayunshiftjs">releases/WebKitGTK/webkit-2.14/JSTests/stress/array-storage-array-unshift.js</a></li>
<li><a href="#releasesWebKitGTKwebkit214JSTestsstresscontiguousarrayunshiftjs">releases/WebKitGTK/webkit-2.14/JSTests/stress/contiguous-array-unshift.js</a></li>
<li><a href="#releasesWebKitGTKwebkit214JSTestsstressdoublearrayunshiftjs">releases/WebKitGTK/webkit-2.14/JSTests/stress/double-array-unshift.js</a></li>
<li><a href="#releasesWebKitGTKwebkit214JSTestsstressint32arrayunshiftjs">releases/WebKitGTK/webkit-2.14/JSTests/stress/int32-array-unshift.js</a></li>
<li><a href="#releasesWebKitGTKwebkit214JSTestsstressunshiftarraystoragejs">releases/WebKitGTK/webkit-2.14/JSTests/stress/unshift-array-storage.js</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerCodeRefcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapCellContainerh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainer.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapCellContainerInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainerInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapFreeListcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapFreeListh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapGCTypeMaph">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/GCTypeMap.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapCellInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCellInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapOperationcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapUtilh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapUtil.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapLargeAllocationcpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreheapLargeAllocationh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayConventionscpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeAuxiliaryBarrierh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrier.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeAuxiliaryBarrierInlinesh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrierInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStackFramecpp">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStackFrameh">releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreForwardingHeadersheapHeapInlinesh">releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/heap/HeapInlines.h</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreForwardingHeadersruntimeAuxiliaryBarrierInlinesh">releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/runtime/AuxiliaryBarrierInlines.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreForwardingHeadersinterpreterInterpreterh">releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/interpreter/Interpreter.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit214JSTestsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/JSTests/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/JSTests/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/JSTests/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+        
+        Most of the things I did properly covered by existing tests, but I found some simple cases of
+        unshifting that had sketchy coverage.
+
+        * stress/array-storage-array-unshift.js: Added.
+        * stress/contiguous-array-unshift.js: Added.
+        * stress/double-array-unshift.js: Added.
+        * stress/int32-array-unshift.js: Added.
+
</ins><span class="cx"> 2016-09-01  JF Bastien  &lt;jfbastien@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         GetByIdWithThis/GetByValWithThis should have ValueProfiles so that they can predict their result types
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214JSTestsstressarraystoragearrayunshiftjs"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/JSTests/stress/array-storage-array-unshift.js (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/JSTests/stress/array-storage-array-unshift.js                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/JSTests/stress/array-storage-array-unshift.js        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+//@ runDefault
+var x = [2.5, 1.5];
+x.length = 1000000000;
+x.length = 2;
+Array.prototype.unshift.call(x, 3.5);
+if (x.toString() != &quot;3.5,2.5,1.5&quot;)
+    throw &quot;Error: bad result: &quot; + describe(x);
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214JSTestsstresscontiguousarrayunshiftjs"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/JSTests/stress/contiguous-array-unshift.js (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/JSTests/stress/contiguous-array-unshift.js                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/JSTests/stress/contiguous-array-unshift.js        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+//@ runDefault
+var x = ['b', 'a'];
+Array.prototype.unshift.call(x, 'c');
+if (x.toString() != &quot;c,b,a&quot;)
+    throw &quot;Error: bad result: &quot; + describe(x);
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214JSTestsstressdoublearrayunshiftjs"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/JSTests/stress/double-array-unshift.js (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/JSTests/stress/double-array-unshift.js                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/JSTests/stress/double-array-unshift.js        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+//@ runDefault
+var x = [2.5, 1.5];
+Array.prototype.unshift.call(x, 3.5);
+if (x.toString() != &quot;3.5,2.5,1.5&quot;)
+    throw &quot;Error: bad result: &quot; + describe(x);
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214JSTestsstressint32arrayunshiftjs"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/JSTests/stress/int32-array-unshift.js (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/JSTests/stress/int32-array-unshift.js                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/JSTests/stress/int32-array-unshift.js        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+//@ runDefault
+var x = [2, 1];
+Array.prototype.unshift.call(x, 3);
+if (x.toString() != &quot;3,2,1&quot;)
+    throw &quot;Error: bad result: &quot; + describe(x);
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214JSTestsstressunshiftarraystoragejs"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/JSTests/stress/unshift-array-storage.js (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/JSTests/stress/unshift-array-storage.js                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/JSTests/stress/unshift-array-storage.js        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+//@ runMiscFTLNoCJITTest(&quot;--scribbleFreeCells=true&quot;, &quot;--deferGCShouldCollectWithProbability=true&quot;, &quot;--deferGCProbability=1&quot;)
+
+// Create some array storage.
+var array = [];
+ensureArrayStorage(array);
+
+for (var i = 0; i &lt; 1000; ++i)
+    array.push(i);
+
+array.unshift(1, 2, 3, 4); // This will crash if we aren't careful about when we GC during unshift.
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIJSManagedValuemm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSManagedValue.mm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSManagedValue.mm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSManagedValue.mm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -213,6 +213,7 @@
</span><span class="cx">     m_owners = [[NSMapTable alloc] initWithKeyOptions:weakIDOptions valueOptions:integerOptions capacity:1];
</span><span class="cx"> 
</span><span class="cx">     JSC::JSValue jsValue = toJS(exec, [value JSValueRef]);
</span><ins>+    dataLog(&quot;Creating managed value with value &quot;, jsValue, &quot;\n&quot;);
</ins><span class="cx">     if (jsValue.isObject())
</span><span class="cx">         m_weakValue.setObject(JSC::jsCast&lt;JSC::JSObject*&gt;(jsValue.asCell()), self);
</span><span class="cx">     else if (jsValue.isString())
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIJSTypedArraycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSTypedArray.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSTypedArray.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/JSTypedArray.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> #include &quot;ClassInfo.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;JSArrayBufferViewInlines.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSDataView.h&quot;
</span><span class="cx"> #include &quot;JSGenericTypedArrayViewInlines.h&quot;
</span><span class="cx"> #include &quot;JSTypedArrays.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIObjCCallbackFunctionmm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/ObjCCallbackFunction.mm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/ObjCCallbackFunction.mm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/ObjCCallbackFunction.mm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,9 +31,8 @@
</span><span class="cx"> #import &quot;APICallbackFunction.h&quot;
</span><span class="cx"> #import &quot;APICast.h&quot;
</span><span class="cx"> #import &quot;Error.h&quot;
</span><del>-#import &quot;JSCJSValueInlines.h&quot;
</del><span class="cx"> #import &quot;JSCell.h&quot;
</span><del>-#import &quot;JSCellInlines.h&quot;
</del><ins>+#import &quot;JSCInlines.h&quot;
</ins><span class="cx"> #import &quot;JSContextInternal.h&quot;
</span><span class="cx"> #import &quot;JSWrapperMap.h&quot;
</span><span class="cx"> #import &quot;JSValueInternal.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreAPIteststestapimm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/tests/testapi.mm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/tests/testapi.mm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/API/tests/testapi.mm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -510,33 +510,6 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-// This test is flaky. Since GC marks C stack and registers as roots conservatively,
-// objects not referenced logically can be accidentally marked and alive.
-// To avoid this situation as possible as we can,
-// 1. run this test first before stack is polluted,
-// 2. extract this test as a function to suppress stack height.
-static void testWeakValue()
-{
-    @autoreleasepool {
-        JSVirtualMachine *vm = [[JSVirtualMachine alloc] init];
-        TestObject *testObject = [TestObject testObject];
-        JSManagedValue *weakValue;
-        @autoreleasepool {
-            JSContext *context = [[JSContext alloc] initWithVirtualMachine:vm];
-            context[@&quot;testObject&quot;] = testObject;
-            weakValue = [[JSManagedValue alloc] initWithValue:context[@&quot;testObject&quot;]];
-        }
-
-        @autoreleasepool {
-            JSContext *context = [[JSContext alloc] initWithVirtualMachine:vm];
-            context[@&quot;testObject&quot;] = testObject;
-            JSSynchronousGarbageCollectForDebugging([context JSGlobalContextRef]);
-            checkResult(@&quot;weak value == nil&quot;, ![weakValue value]);
-            checkResult(@&quot;root is still alive&quot;, !context[@&quot;testObject&quot;].isUndefined);
-        }
-    }
-}
-
</del><span class="cx"> static void testObjectiveCAPIMain()
</span><span class="cx"> {
</span><span class="cx">     @autoreleasepool {
</span><span class="lines">@@ -1513,7 +1486,6 @@
</span><span class="cx"> {
</span><span class="cx">     NSLog(@&quot;Testing Objective-C API&quot;);
</span><span class="cx">     checkNegativeNSIntegers();
</span><del>-    testWeakValue();
</del><span class="cx">     testObjectiveCAPIMain();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/CMakeLists.txt (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/CMakeLists.txt        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/CMakeLists.txt        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx">     assembler/MacroAssembler.cpp
</span><span class="cx">     assembler/MacroAssemblerARM.cpp
</span><span class="cx">     assembler/MacroAssemblerARMv7.cpp
</span><ins>+    assembler/MacroAssemblerCodeRef.cpp
</ins><span class="cx">     assembler/MacroAssemblerPrinter.cpp
</span><span class="cx">     assembler/MacroAssemblerX86Common.cpp
</span><span class="cx"> 
</span><span class="lines">@@ -447,6 +448,7 @@
</span><span class="cx">     heap/DestructionMode.cpp
</span><span class="cx">     heap/EdenGCActivityCallback.cpp
</span><span class="cx">     heap/FullGCActivityCallback.cpp
</span><ins>+    heap/FreeList.cpp
</ins><span class="cx">     heap/GCActivityCallback.cpp
</span><span class="cx">     heap/GCLogging.cpp
</span><span class="cx">     heap/HandleSet.cpp
</span><span class="lines">@@ -454,6 +456,7 @@
</span><span class="cx">     heap/Heap.cpp
</span><span class="cx">     heap/HeapCell.cpp
</span><span class="cx">     heap/HeapHelperPool.cpp
</span><ins>+    heap/HeapOperation.cpp
</ins><span class="cx">     heap/HeapProfiler.cpp
</span><span class="cx">     heap/HeapSnapshot.cpp
</span><span class="cx">     heap/HeapSnapshotBuilder.cpp
</span><span class="lines">@@ -462,6 +465,7 @@
</span><span class="cx">     heap/HeapVerifier.cpp
</span><span class="cx">     heap/IncrementalSweeper.cpp
</span><span class="cx">     heap/JITStubRoutineSet.cpp
</span><ins>+    heap/LargeAllocation.cpp
</ins><span class="cx">     heap/LiveObjectList.cpp
</span><span class="cx">     heap/MachineStackMarker.cpp
</span><span class="cx">     heap/MarkStack.cpp
</span><span class="lines">@@ -619,6 +623,7 @@
</span><span class="cx">     runtime/ArrayBufferNeuteringWatchpoint.cpp
</span><span class="cx">     runtime/ArrayBufferView.cpp
</span><span class="cx">     runtime/ArrayConstructor.cpp
</span><ins>+    runtime/ArrayConventions.cpp
</ins><span class="cx">     runtime/ArrayIteratorPrototype.cpp
</span><span class="cx">     runtime/ArrayPrototype.cpp
</span><span class="cx">     runtime/BasicBlockLocation.cpp
</span><span class="lines">@@ -799,6 +804,7 @@
</span><span class="cx">     runtime/SimpleTypedArrayController.cpp
</span><span class="cx">     runtime/SmallStrings.cpp
</span><span class="cx">     runtime/SparseArrayValueMap.cpp
</span><ins>+    runtime/StackFrame.cpp
</ins><span class="cx">     runtime/StrictEvalActivation.cpp
</span><span class="cx">     runtime/StringConstructor.cpp
</span><span class="cx">     runtime/StringIteratorPrototype.cpp
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,1098 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+
+        In order to make the GC concurrent (bug 149432), we would either need to enable concurrent
+        copying or we would need to not copy. Concurrent copying carries a 1-2% throughput overhead
+        from the barriers alone. Considering that MarkedSpace does a decent job of avoiding
+        fragmentation, it's unlikely that it's worth paying 1-2% throughput for copying. So, we want
+        to get rid of copied space. This change moves copied space's biggest client over to marked
+        space.
+        
+        Moving butterflies to marked space means having them use the new Auxiliary HeapCell
+        allocation path. This is a fairly mechanical change, but it caused performance regressions
+        everywhere, so this change also fixes MarkedSpace's performance issues.
+        
+        At a high level the mechanical changes are:
+        
+        - We use AuxiliaryBarrier instead of CopyBarrier.
+        
+        - We use tryAllocateAuxiliary instead of tryAllocateStorage. I got rid of the silly
+          CheckedBoolean stuff, since it's so much more trouble than it's worth.
+        
+        - The JITs have to emit inlined marked space allocations instead of inline copy space
+          allocations.
+        
+        - Everyone has to get used to zeroing their butterflies after allocation instead of relying
+          on them being pre-zeroed by the GC. Copied space would zero things for you, while marked
+          space doesn't.
+        
+        That's about 1/3 of this change. But this led to performance problems, which I fixed with
+        optimizations that amounted to a major MarkedSpace rewrite:
+        
+        - MarkedSpace always causes internal fragmentation for array allocations because the vector
+          length we choose when we resize usually leads to a cell size that doesn't correspond to any
+          size class. I got around this by making array allocations usually round up vectorLength to
+          the maximum allowed by the size class that we would have allocated in. Also,
+          ensureLengthSlow() and friends first make sure that the requested length can't just be
+          fulfilled with the current allocation size. This safeguard means that not every array
+          allocation has to do size class queries. For example, the fast path of new Array(length)
+          never does any size class queries, under the assumption that (1) the speed gained from
+          avoiding an ensureLengthSlow() call, which then just changes the vectorLength by doing the
+          size class query, is too small to offset the speed lost by doing the query on every
+          allocation and (2) new Array(length) is a pretty good hint that resizing is not very
+          likely.
+        
+        - Size classes in MarkedSpace were way too precise, which led to external fragmentation. This
+          changes MarkedSpace size classes to use a linear progression for very small sizes followed
+          by a geometric progression that naturally transitions to a hyperbolic progression. We want
+          hyperbolic sizes when we get close to blockSize: for example the largest size we want is
+          payloadSize / 2 rounded down, to ensure we get exactly two cells with minimal slop. The
+          next size down should be payloadSize / 3 rounded down, and so on. After the last precise
+          size (80 bytes), we proceed using a geometric progression, but round up each size to
+          minimize slop at the end of the block. This naturally causes the geometric progression to
+          turn hyperbolic for large sizes. The size class configuration happens at VM start-up, so
+          it can be controlled with runtime options. I found that a base of 1.4 works pretty well.
+        
+        - Large allocations caused massive internal fragmentation, since the smallest large
+          allocation had to use exactly blockSize, and the largest small allocation used
+          blockSize / 2. The next size up - the first large allocation size to require two blocks -
+          also had 50% internal fragmentation. This is because we required large allocations to be
+          blockSize aligned, so that MarkedBlock::blockFor() would work. I decided to rewrite all of
+          that. Cells no longer have to be owned by a MarkedBlock. They can now alternatively be
+          owned by a LargeAllocation. These two things are abstracted as CellContainer. You know that
+          a cell is owned by a LargeAllocation if the MarkedBlock::atomSize / 2 bit is set.
+          Basically, large allocations are deliberately misaligned by 8 bytes. This actually works
+          out great since (1) typed arrays won't use large allocations anyway since they have their
+          own malloc fallback and (2) large array butterflies already have a 8 byte header, which
+          means that the 8 byte base misalignment aligns the large array payload on a 16 byte
+          boundary. I took extreme care to make sure that the isLargeAllocation bit checks are as
+          rare as possible; for example, ExecState::vm() skips the check because we know that callees
+          must be small allocations. It's also possible to use template tricks to do one check for
+          cell container kind, and then invoke a function specialized for MarkedBlock or a function
+          specialized for LargeAllocation. LargeAllocation includes stubs for all MarkedBlock methods
+          that get used from functions that are template-specialized like this. That's mostly to
+          speed up the GC marking code. Most other code can use CellContainer API or HeapCell API
+          directly. That's another thing: HeapCell, the common base of JSCell and auxiliary
+          allocations, is now smart enough to do a lot of things for you, like HeapCell::vm(),
+          HeapCell::heap(), HeapCell::isLargeAllocation(), and HeapCell::cellContainer(). The size
+          cutoff for large allocations is runtime-configurable, so long as you don't choose something
+          so small that callees end up large. I found that 400 bytes is roughly optimal. This means
+          that the MarkedBlock size classes end up being:
+          
+          16, 32, 48, 64, 80, 112, 160, 224, 320
+          
+          The next size class would have been 432, but that's above the 400 byte cutoff. All of this
+          is configurable with --sizeClassProgression and --largeAllocationCutoff. You can see what
+          size classes you end up with by doing --dumpSizeClasses=true.
+        
+        - Copied space uses 64KB blocks, while marked space used to use 16KB blocks. Allocating a lot
+          of stuff in 16KB blocks was slower than allocating it in 64KB blocks because the GC had a
+          lot of per-block overhead. I removed this overhead: It's now 2x faster to scan all
+          MarkedBlocks because the list that contains the interesting meta-data is allocated on the
+          side, for better locality during a sequential walk. It's no longer necessary to scan
+          MarkedBlocks to find WeakSets, since the sets of WeakSets for eden scan and full scan are
+          maintained on-the-fly. It's no longer necessary to scan all MarkedBlocks to clear mark
+          bits because we now use versioned mark bits: to clear then, just increment the 64-bit
+          heap version. It's no longer necessary to scan retired MarkedBlocks while allocating
+          because marking retires them on-the-fly. It's no longer necessary to sort all blocks in
+          the IncrementalSweeper's snapshot because blocks now know if they are in the snapshot. Put
+          together, these optimizations allowed me to reduce block size to 16KB without losing much
+          performance. There is some small perf loss on JetStream/splay, but not enough to hurt
+          JetStream overall. I tried reducing block sizes further, to 4KB, since that is a
+          progression on membuster. That's not possible yet, since there is still enough per-block
+          overhead yet that such a reduction hurts JetStream too much. I filed a bug about improving
+          this further: https://bugs.webkit.org/show_bug.cgi?id=161581.
+        
+        - Even after all of that, copying butterflies was still faster because it allowed us to skip
+          sweeping dead space. A good GC allocates over dead bytes without explicitly freeing them,
+          so the GC pause is O(size of live), not O(size of live + dead). O(dead) is usually much
+          larger than O(live), especially in an eden collection. Copying satisfies this premise while
+          mark+sweep does not. So, I invented a new kind of allocator: bump'n'pop. Previously, our
+          MarkedSpace allocator was a freelist pop. That's simple and easy to inline but requires
+          that we walk the block to build a free list. This means walking dead space. The new
+          allocator allows totally free MarkedBlocks to simply set up a bump-pointer arena instead.
+          The allocator is a hybrid of bump-pointer and freelist pop. It tries bump first. The bump
+          pointer always bumps by cellSize, so the result of filling a block with bumping looks as if
+          we had used freelist popping to fill it. Additionally, each MarkedBlock now has a bit to
+          quickly tell if the block is entirely free. This makes sweeping O(1) whenever a MarkedBlock
+          is completely empty, which is the common case because of the generational hypothesis: the
+          number of objects that survive an eden collection is a tiny fraction of the number of
+          objects that had been allocated, and this fraction is so small that there are typically
+          fewer than one survivors per MarkedBlock. This change was enough to make this change a net
+          win over tip-of-tree.
+        
+        - FTL now shares the same allocation fast paths as everything else, which is great, because
+          bump'n'pop has gnarly control flow. We don't really want B3 to have to think about that
+          control flow, since it won't be able to improve the machine code we write ourselves. GC
+          fast paths are best written in assembly. So, I've empowered B3 to have even better support
+          for Patchpoint terminals. It's now totally fine for a Patchpoint terminal to be non-Void.
+          So, the new FTL allocation fast paths are just Patchpoint terminals that call through to
+          AssemblyHelpers::emitAllocate(). B3 still reasons about things like constant-folding the
+          size class calculation and constant-hoisting the allocator. Also, I gave the FTL the
+          ability to constant-fold some allocator logic (in case we first assume that we're doing a
+          variable-length allocation but then realize that the length is known). I think it makes
+          sense to have constant folding rules in FTL::Output, or whatever the B3 IR builder is,
+          since this makes lowering easier (you can constant fold during lowering more easily) and it
+          reduces the amount of malloc traffic. In the future, we could teach B3 how to better
+          constant-fold this code. That would require allowing loads to be constant-folded, which is
+          doable but hella tricky.
+        
+        - It used to be that if a logical object allocation required two physical allocations (first
+          the butterfly and then the cell), then the JIT would emit the code in such a way that a
+          failure in the second fast path would cause us to forget the successful first physical
+          allocation. This was pointlessly wasteful. It turns out that it's very cheap to devote a
+          register to storing either the butterfly or null, because the butterfly register is anyway
+          going to be free inside the first allocation. The only overhead here is zeroing the
+          butterfly register. With that in place, we can just pass the butterfly-or-null to the slow
+          path, which can then either allocate a butterfly or not. So now we never waste a successful
+          allocation. This patch implements such a solution both in DFG (where it's easy to do this
+          since we control registers already) and in FTL (where it's annoying, because mutable
+          &quot;butterfly-or-null&quot; variables are hard to say in SSA; also I realized that we had code
+          duplicated the JSArray allocation utility, so I deduplicated it). This came up because in
+          one version of this patch, this wastage would resonate with some Kraken benchmark: the
+          benchmark would always allocate N small things followed by one bigger thing. The problem
+          was I accidentally adjusted the various fixed overheads in MarkedBlock in such a way that
+          the JSObject size class, which both the small and big thing shared for their cell, could
+          hold exactly N cells per MarkedBlock. Then the benchmark would always call slow path when
+          it allocated the big thing. So, it would end up having to allocate the big thing's large
+          butterfly twice, every single time! Ouch!
+        
+        - It used to be that we zeroed CopiedBlocks using memset, and so array allocations enjoyed
+          amortization of the cost of zeroing. This doesn't work anymore - it's now up to the client
+          of the allocator to initialize the object to whatever state they need. It used to be that
+          we would just use a dumb loop. I initially changed this so that we would end up in memset
+          for large allocations, but this didn't actually help performance that much. I got a much
+          better result by playing with different memsets written in assembly. First I wrote one
+          using non-temporal stores. That was a small speed-up over memset. Then I tried the classic
+          &quot;rep stos&quot; approach, and holy cow that version was fast. It's a ~20% speed-up on array
+          allocation microbenchmarks. So, this patch adds code paths to do &quot;rep stos&quot; on x86_64, or
+          memset, or use a loop, as appropriate, for both &quot;contiguous&quot; arrays (holes are zero) and
+          double arrays (holes are PNaN). Note that the JIT always emits either a loop or a flat slab
+          of stores (if the size is known), but those paths in the JIT won't trigger for
+          NewArrayWithSize() if the size is large, since that takes us to the
+          operationNewArrayWithSize() slow path, which calls into JSArray::create(). That's why the
+          optimizations here are all in JSArray::create() - that's the hot place for large arrays
+          that need to be filled with holes.
+        
+        All of this put together gives us neutral perf on JetStream,  membuster, and PLT3, a ~1%
+        regression on Speedometer, and up to a 4% regression Kraken. The Kraken regression is
+        because Kraken was allocating exactly 1024 element arrays at a rate of 400MB/sec. This is a
+        best-case scenario for bump allocation. I think that we should fix bmalloc to make up the
+        difference, but take the hit for now because it's a crazy corner case. By comparison, the
+        alternative approach of using a copy barrier would have cost us 1-2%. That's the real
+        apples-to-apples comparison if your premise is that we should have a concurrent GC. After we
+        finish removing copied space, we will be barrier-ready for concurrent GC: we already have a
+        marking barrier and we simply won't need a copying barrier. This change gets us there for
+        the purposes of our benchmarks, since the remaining clients of copied space are not very
+        important. On the other hand, if we keep copying, then getting barrier-ready would mean
+        adding back the copy barrier, which costs more perf.
+        
+        We might get bigger speed-ups once we remove CopiedSpace altogether. That requires moving
+        typed arrays and a few other weird things over to Aux MarkedSpace.
+        
+        This also includes some header sanitization. The introduction of AuxiliaryBarrier, HeapCell,
+        and CellContainer meant that I had to include those files from everywhere. Fortunately,
+        just including JSCInlines.h (instead of manually including the files that includes) is
+        usually enough. So, I made most of JSC's cpp files include JSCInlines.h, which is something
+        that we were already basically doing. In places where JSCInlines.h would be too much, I just
+        included HeapInlines.h. This got weird, because we previously included HeapInlines.h from
+        JSObject.h. That's bad because it led to some circular dependencies, so I fixed it - but that
+        meant having to manually include HeapInlines.h from the places that previously got it
+        implicitly via JSObject.h. But that led to more problems for some reason: I started getting
+        build errors because non-JSC files were having trouble including Opcode.h. That's just silly,
+        since Opcode.h is meant to be an internal JSC header. So, I made it an internal header and
+        made it impossible to include it from outside JSC. This was a lot of work, but it was
+        necessary to get the patch to build on all ports. It's also a net win. There were many places
+        in WebCore that were transitively including a *ton* of JSC headers just because of the
+        JSObject.h-&gt;HeapInlines.h edge and a bunch of dependency edges that arose from some public
+        (for WebCore) JSC headers needing Interpreter.h or Opcode.h for bad reasons.
+
+        * API/JSManagedValue.mm:
+        (-[JSManagedValue initWithValue:]):
+        * API/JSTypedArray.cpp:
+        * API/ObjCCallbackFunction.mm:
+        * API/tests/testapi.mm:
+        (testObjectiveCAPI):
+        (testWeakValue): Deleted.
+        * CMakeLists.txt:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * Scripts/builtins/builtins_generate_combined_implementation.py:
+        (BuiltinsCombinedImplementationGenerator.generate_secondary_header_includes):
+        * Scripts/builtins/builtins_generate_internals_wrapper_implementation.py:
+        (BuiltinsInternalsWrapperImplementationGenerator.generate_secondary_header_includes):
+        * Scripts/builtins/builtins_generate_separate_implementation.py:
+        (BuiltinsSeparateImplementationGenerator.generate_secondary_header_includes):
+        * assembler/AbstractMacroAssembler.h:
+        (JSC::AbstractMacroAssembler::JumpList::link):
+        (JSC::AbstractMacroAssembler::JumpList::linkTo):
+        * assembler/MacroAssembler.h:
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::add32):
+        * assembler/MacroAssemblerCodeRef.cpp: Added.
+        (JSC::MacroAssemblerCodePtr::createLLIntCodePtr):
+        (JSC::MacroAssemblerCodePtr::dumpWithName):
+        (JSC::MacroAssemblerCodePtr::dump):
+        (JSC::MacroAssemblerCodeRef::createLLIntCodeRef):
+        (JSC::MacroAssemblerCodeRef::dump):
+        * assembler/MacroAssemblerCodeRef.h:
+        (JSC::MacroAssemblerCodePtr::createLLIntCodePtr): Deleted.
+        (JSC::MacroAssemblerCodePtr::dumpWithName): Deleted.
+        (JSC::MacroAssemblerCodePtr::dump): Deleted.
+        (JSC::MacroAssemblerCodeRef::createLLIntCodeRef): Deleted.
+        (JSC::MacroAssemblerCodeRef::dump): Deleted.
+        * b3/B3BasicBlock.cpp:
+        (JSC::B3::BasicBlock::appendBoolConstant):
+        * b3/B3BasicBlock.h:
+        * b3/B3DuplicateTails.cpp:
+        * b3/B3StackmapGenerationParams.h:
+        * b3/testb3.cpp:
+        (JSC::B3::testPatchpointTerminalReturnValue):
+        (JSC::B3::run):
+        * bindings/ScriptValue.cpp:
+        * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
+        * bytecode/BytecodeBasicBlock.cpp:
+        * bytecode/BytecodeLivenessAnalysis.cpp:
+        * bytecode/BytecodeUseDef.h:
+        * bytecode/CallLinkInfo.cpp:
+        (JSC::CallLinkInfo::callTypeFor):
+        * bytecode/CallLinkInfo.h:
+        (JSC::CallLinkInfo::callTypeFor): Deleted.
+        * bytecode/CallLinkStatus.cpp:
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::finishCreation):
+        (JSC::CodeBlock::clearLLIntGetByIdCache):
+        (JSC::CodeBlock::predictedMachineCodeSize):
+        * bytecode/CodeBlock.h:
+        (JSC::CodeBlock::jitCodeMap): Deleted.
+        (JSC::clearLLIntGetByIdCache): Deleted.
+        * bytecode/ExecutionCounter.h:
+        * bytecode/Instruction.h:
+        * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
+        (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
+        * bytecode/ObjectAllocationProfile.h:
+        (JSC::ObjectAllocationProfile::isNull):
+        (JSC::ObjectAllocationProfile::initialize):
+        * bytecode/Opcode.h:
+        (JSC::padOpcodeName):
+        * bytecode/PolymorphicAccess.cpp:
+        (JSC::AccessCase::generateImpl):
+        (JSC::PolymorphicAccess::regenerate):
+        * bytecode/PolymorphicAccess.h:
+        * bytecode/PreciseJumpTargets.cpp:
+        * bytecode/StructureStubInfo.cpp:
+        * bytecode/StructureStubInfo.h:
+        * bytecode/UnlinkedCodeBlock.cpp:
+        (JSC::UnlinkedCodeBlock::vm): Deleted.
+        * bytecode/UnlinkedCodeBlock.h:
+        * bytecode/UnlinkedInstructionStream.cpp:
+        * bytecode/UnlinkedInstructionStream.h:
+        * dfg/DFGOperations.cpp:
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::emitAllocateRawObject):
+        (JSC::DFG::SpeculativeJIT::compileMakeRope):
+        (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
+        (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::emitAllocateJSCell):
+        (JSC::DFG::SpeculativeJIT::emitAllocateJSObject):
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+        (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::compile):
+        (JSC::DFG::SpeculativeJIT::compileAllocateNewArrayWithSize):
+        * dfg/DFGStrengthReductionPhase.cpp:
+        (JSC::DFG::StrengthReductionPhase::handleNode):
+        * ftl/FTLAbstractHeapRepository.h:
+        * ftl/FTLCompile.cpp:
+        * ftl/FTLJITFinalizer.cpp:
+        * ftl/FTLLowerDFGToB3.cpp:
+        (JSC::FTL::DFG::LowerDFGToB3::compileCreateDirectArguments):
+        (JSC::FTL::DFG::LowerDFGToB3::compileCreateRest):
+        (JSC::FTL::DFG::LowerDFGToB3::allocateArrayWithSize):
+        (JSC::FTL::DFG::LowerDFGToB3::compileNewArrayWithSize):
+        (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
+        (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeNewObject):
+        (JSC::FTL::DFG::LowerDFGToB3::initializeArrayElements):
+        (JSC::FTL::DFG::LowerDFGToB3::allocatePropertyStorageWithSizeImpl):
+        (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell):
+        (JSC::FTL::DFG::LowerDFGToB3::allocateCell):
+        (JSC::FTL::DFG::LowerDFGToB3::allocateObject):
+        (JSC::FTL::DFG::LowerDFGToB3::allocatorForSize):
+        (JSC::FTL::DFG::LowerDFGToB3::allocateVariableSizedObject):
+        (JSC::FTL::DFG::LowerDFGToB3::allocateJSArray):
+        (JSC::FTL::DFG::LowerDFGToB3::compileAllocateArrayWithSize): Deleted.
+        * ftl/FTLOutput.cpp:
+        (JSC::FTL::Output::constBool):
+        (JSC::FTL::Output::add):
+        (JSC::FTL::Output::shl):
+        (JSC::FTL::Output::aShr):
+        (JSC::FTL::Output::lShr):
+        (JSC::FTL::Output::zeroExt):
+        (JSC::FTL::Output::equal):
+        (JSC::FTL::Output::notEqual):
+        (JSC::FTL::Output::above):
+        (JSC::FTL::Output::aboveOrEqual):
+        (JSC::FTL::Output::below):
+        (JSC::FTL::Output::belowOrEqual):
+        (JSC::FTL::Output::greaterThan):
+        (JSC::FTL::Output::greaterThanOrEqual):
+        (JSC::FTL::Output::lessThan):
+        (JSC::FTL::Output::lessThanOrEqual):
+        (JSC::FTL::Output::select):
+        (JSC::FTL::Output::appendSuccessor):
+        (JSC::FTL::Output::addIncomingToPhi):
+        * ftl/FTLOutput.h:
+        * ftl/FTLValueFromBlock.h:
+        (JSC::FTL::ValueFromBlock::operator bool):
+        (JSC::FTL::ValueFromBlock::ValueFromBlock): Deleted.
+        * ftl/FTLWeightedTarget.h:
+        (JSC::FTL::WeightedTarget::frequentedBlock):
+        * heap/CellContainer.h: Added.
+        (JSC::CellContainer::CellContainer):
+        (JSC::CellContainer::operator bool):
+        (JSC::CellContainer::isMarkedBlock):
+        (JSC::CellContainer::isLargeAllocation):
+        (JSC::CellContainer::markedBlock):
+        (JSC::CellContainer::largeAllocation):
+        * heap/CellContainerInlines.h: Added.
+        (JSC::CellContainer::isMarked):
+        (JSC::CellContainer::isMarkedOrNewlyAllocated):
+        (JSC::CellContainer::noteMarked):
+        (JSC::CellContainer::cellSize):
+        (JSC::CellContainer::weakSet):
+        (JSC::CellContainer::flipIfNecessary):
+        * heap/ConservativeRoots.cpp:
+        (JSC::ConservativeRoots::ConservativeRoots):
+        (JSC::ConservativeRoots::~ConservativeRoots):
+        (JSC::ConservativeRoots::grow):
+        (JSC::ConservativeRoots::genericAddPointer):
+        (JSC::ConservativeRoots::genericAddSpan):
+        * heap/ConservativeRoots.h:
+        (JSC::ConservativeRoots::roots):
+        * heap/CopyToken.h:
+        * heap/FreeList.cpp: Added.
+        (JSC::FreeList::dump):
+        * heap/FreeList.h: Added.
+        (JSC::FreeList::FreeList):
+        (JSC::FreeList::list):
+        (JSC::FreeList::bump):
+        (JSC::FreeList::operator==):
+        (JSC::FreeList::operator!=):
+        (JSC::FreeList::operator bool):
+        (JSC::FreeList::allocationWillFail):
+        (JSC::FreeList::allocationWillSucceed):
+        * heap/GCTypeMap.h: Added.
+        (JSC::GCTypeMap::operator[]):
+        * heap/Heap.cpp:
+        (JSC::Heap::Heap):
+        (JSC::Heap::lastChanceToFinalize):
+        (JSC::Heap::finalizeUnconditionalFinalizers):
+        (JSC::Heap::markRoots):
+        (JSC::Heap::copyBackingStores):
+        (JSC::Heap::gatherStackRoots):
+        (JSC::Heap::gatherJSStackRoots):
+        (JSC::Heap::gatherScratchBufferRoots):
+        (JSC::Heap::clearLivenessData):
+        (JSC::Heap::visitSmallStrings):
+        (JSC::Heap::visitConservativeRoots):
+        (JSC::Heap::removeDeadCompilerWorklistEntries):
+        (JSC::Heap::gatherExtraHeapSnapshotData):
+        (JSC::Heap::removeDeadHeapSnapshotNodes):
+        (JSC::Heap::visitProtectedObjects):
+        (JSC::Heap::visitArgumentBuffers):
+        (JSC::Heap::visitException):
+        (JSC::Heap::visitStrongHandles):
+        (JSC::Heap::visitHandleStack):
+        (JSC::Heap::visitSamplingProfiler):
+        (JSC::Heap::traceCodeBlocksAndJITStubRoutines):
+        (JSC::Heap::converge):
+        (JSC::Heap::visitWeakHandles):
+        (JSC::Heap::updateObjectCounts):
+        (JSC::Heap::clearUnmarkedExecutables):
+        (JSC::Heap::deleteUnmarkedCompiledCode):
+        (JSC::Heap::collectAllGarbage):
+        (JSC::Heap::collect):
+        (JSC::Heap::collectWithoutAnySweep):
+        (JSC::Heap::collectImpl):
+        (JSC::Heap::suspendCompilerThreads):
+        (JSC::Heap::willStartCollection):
+        (JSC::Heap::flushOldStructureIDTables):
+        (JSC::Heap::flushWriteBarrierBuffer):
+        (JSC::Heap::stopAllocation):
+        (JSC::Heap::prepareForMarking):
+        (JSC::Heap::reapWeakHandles):
+        (JSC::Heap::pruneStaleEntriesFromWeakGCMaps):
+        (JSC::Heap::sweepArrayBuffers):
+        (JSC::MarkedBlockSnapshotFunctor::MarkedBlockSnapshotFunctor):
+        (JSC::MarkedBlockSnapshotFunctor::operator()):
+        (JSC::Heap::snapshotMarkedSpace):
+        (JSC::Heap::deleteSourceProviderCaches):
+        (JSC::Heap::notifyIncrementalSweeper):
+        (JSC::Heap::writeBarrierCurrentlyExecutingCodeBlocks):
+        (JSC::Heap::resetAllocators):
+        (JSC::Heap::updateAllocationLimits):
+        (JSC::Heap::didFinishCollection):
+        (JSC::Heap::resumeCompilerThreads):
+        (JSC::Zombify::visit):
+        (JSC::Heap::forEachCodeBlockImpl):
+        * heap/Heap.h:
+        (JSC::Heap::allocatorForObjectWithoutDestructor):
+        (JSC::Heap::allocatorForObjectWithDestructor):
+        (JSC::Heap::allocatorForAuxiliaryData):
+        (JSC::Heap::jitStubRoutines):
+        (JSC::Heap::codeBlockSet):
+        (JSC::Heap::storageAllocator): Deleted.
+        * heap/HeapCell.h:
+        (JSC::HeapCell::isZapped): Deleted.
+        * heap/HeapCellInlines.h: Added.
+        (JSC::HeapCell::isLargeAllocation):
+        (JSC::HeapCell::cellContainer):
+        (JSC::HeapCell::markedBlock):
+        (JSC::HeapCell::largeAllocation):
+        (JSC::HeapCell::heap):
+        (JSC::HeapCell::vm):
+        (JSC::HeapCell::cellSize):
+        (JSC::HeapCell::allocatorAttributes):
+        (JSC::HeapCell::destructionMode):
+        (JSC::HeapCell::cellKind):
+        * heap/HeapInlines.h:
+        (JSC::Heap::heap):
+        (JSC::Heap::isLive):
+        (JSC::Heap::isMarked):
+        (JSC::Heap::testAndSetMarked):
+        (JSC::Heap::setMarked):
+        (JSC::Heap::cellSize):
+        (JSC::Heap::forEachCodeBlock):
+        (JSC::Heap::allocateObjectOfType):
+        (JSC::Heap::subspaceForObjectOfType):
+        (JSC::Heap::allocatorForObjectOfType):
+        (JSC::Heap::allocateAuxiliary):
+        (JSC::Heap::tryAllocateAuxiliary):
+        (JSC::Heap::tryReallocateAuxiliary):
+        (JSC::Heap::isPointerGCObject): Deleted.
+        (JSC::Heap::isValueGCObject): Deleted.
+        * heap/HeapOperation.cpp: Added.
+        (WTF::printInternal):
+        * heap/HeapOperation.h:
+        * heap/HeapUtil.h: Added.
+        (JSC::HeapUtil::findGCObjectPointersForMarking):
+        (JSC::HeapUtil::isPointerGCObjectJSCell):
+        (JSC::HeapUtil::isValueGCObject):
+        * heap/IncrementalSweeper.cpp:
+        (JSC::IncrementalSweeper::sweepNextBlock):
+        * heap/IncrementalSweeper.h:
+        * heap/LargeAllocation.cpp: Added.
+        (JSC::LargeAllocation::tryCreate):
+        (JSC::LargeAllocation::LargeAllocation):
+        (JSC::LargeAllocation::lastChanceToFinalize):
+        (JSC::LargeAllocation::shrink):
+        (JSC::LargeAllocation::visitWeakSet):
+        (JSC::LargeAllocation::reapWeakSet):
+        (JSC::LargeAllocation::flip):
+        (JSC::LargeAllocation::isEmpty):
+        (JSC::LargeAllocation::sweep):
+        (JSC::LargeAllocation::destroy):
+        (JSC::LargeAllocation::dump):
+        * heap/LargeAllocation.h: Added.
+        (JSC::LargeAllocation::fromCell):
+        (JSC::LargeAllocation::cell):
+        (JSC::LargeAllocation::isLargeAllocation):
+        (JSC::LargeAllocation::heap):
+        (JSC::LargeAllocation::vm):
+        (JSC::LargeAllocation::weakSet):
+        (JSC::LargeAllocation::clearNewlyAllocated):
+        (JSC::LargeAllocation::isNewlyAllocated):
+        (JSC::LargeAllocation::isMarked):
+        (JSC::LargeAllocation::isMarkedOrNewlyAllocated):
+        (JSC::LargeAllocation::isLive):
+        (JSC::LargeAllocation::hasValidCell):
+        (JSC::LargeAllocation::cellSize):
+        (JSC::LargeAllocation::aboveLowerBound):
+        (JSC::LargeAllocation::belowUpperBound):
+        (JSC::LargeAllocation::contains):
+        (JSC::LargeAllocation::attributes):
+        (JSC::LargeAllocation::flipIfNecessary):
+        (JSC::LargeAllocation::flipIfNecessaryConcurrently):
+        (JSC::LargeAllocation::testAndSetMarked):
+        (JSC::LargeAllocation::setMarked):
+        (JSC::LargeAllocation::clearMarked):
+        (JSC::LargeAllocation::noteMarked):
+        (JSC::LargeAllocation::headerSize):
+        * heap/MarkedAllocator.cpp:
+        (JSC::MarkedAllocator::MarkedAllocator):
+        (JSC::MarkedAllocator::isPagedOut):
+        (JSC::MarkedAllocator::retire):
+        (JSC::MarkedAllocator::filterNextBlock):
+        (JSC::MarkedAllocator::setNextBlockToSweep):
+        (JSC::MarkedAllocator::tryAllocateWithoutCollectingImpl):
+        (JSC::MarkedAllocator::tryAllocateWithoutCollecting):
+        (JSC::MarkedAllocator::allocateSlowCase):
+        (JSC::MarkedAllocator::tryAllocateSlowCase):
+        (JSC::MarkedAllocator::allocateSlowCaseImpl):
+        (JSC::blockHeaderSize):
+        (JSC::MarkedAllocator::blockSizeForBytes):
+        (JSC::MarkedAllocator::tryAllocateBlock):
+        (JSC::MarkedAllocator::addBlock):
+        (JSC::MarkedAllocator::removeBlock):
+        (JSC::MarkedAllocator::stopAllocating):
+        (JSC::MarkedAllocator::reset):
+        (JSC::MarkedAllocator::lastChanceToFinalize):
+        (JSC::MarkedAllocator::setFreeList):
+        (JSC::isListPagedOut): Deleted.
+        (JSC::MarkedAllocator::tryAllocateHelper): Deleted.
+        (JSC::MarkedAllocator::tryPopFreeList): Deleted.
+        (JSC::MarkedAllocator::tryAllocate): Deleted.
+        (JSC::MarkedAllocator::allocateBlock): Deleted.
+        * heap/MarkedAllocator.h:
+        (JSC::MarkedAllocator::takeLastActiveBlock):
+        (JSC::MarkedAllocator::offsetOfFreeList):
+        (JSC::MarkedAllocator::offsetOfCellSize):
+        (JSC::MarkedAllocator::tryAllocate):
+        (JSC::MarkedAllocator::allocate):
+        (JSC::MarkedAllocator::forEachBlock):
+        (JSC::MarkedAllocator::offsetOfFreeListHead): Deleted.
+        (JSC::MarkedAllocator::MarkedAllocator): Deleted.
+        (JSC::MarkedAllocator::init): Deleted.
+        (JSC::MarkedAllocator::stopAllocating): Deleted.
+        * heap/MarkedBlock.cpp:
+        (JSC::MarkedBlock::tryCreate):
+        (JSC::MarkedBlock::Handle::Handle):
+        (JSC::MarkedBlock::Handle::~Handle):
+        (JSC::MarkedBlock::MarkedBlock):
+        (JSC::MarkedBlock::Handle::specializedSweep):
+        (JSC::MarkedBlock::Handle::sweep):
+        (JSC::MarkedBlock::Handle::sweepHelperSelectScribbleMode):
+        (JSC::MarkedBlock::Handle::sweepHelperSelectStateAndSweepMode):
+        (JSC::MarkedBlock::Handle::unsweepWithNoNewlyAllocated):
+        (JSC::SetNewlyAllocatedFunctor::SetNewlyAllocatedFunctor):
+        (JSC::SetNewlyAllocatedFunctor::operator()):
+        (JSC::MarkedBlock::Handle::stopAllocating):
+        (JSC::MarkedBlock::Handle::lastChanceToFinalize):
+        (JSC::MarkedBlock::Handle::resumeAllocating):
+        (JSC::MarkedBlock::Handle::zap):
+        (JSC::MarkedBlock::Handle::forEachFreeCell):
+        (JSC::MarkedBlock::flipIfNecessary):
+        (JSC::MarkedBlock::Handle::flipIfNecessary):
+        (JSC::MarkedBlock::flipIfNecessarySlow):
+        (JSC::MarkedBlock::flipIfNecessaryConcurrentlySlow):
+        (JSC::MarkedBlock::clearMarks):
+        (JSC::MarkedBlock::assertFlipped):
+        (JSC::MarkedBlock::needsFlip):
+        (JSC::MarkedBlock::Handle::needsFlip):
+        (JSC::MarkedBlock::Handle::willRemoveBlock):
+        (JSC::MarkedBlock::Handle::didConsumeFreeList):
+        (JSC::MarkedBlock::markCount):
+        (JSC::MarkedBlock::Handle::isEmpty):
+        (JSC::MarkedBlock::clearHasAnyMarked):
+        (JSC::MarkedBlock::noteMarkedSlow):
+        (WTF::printInternal):
+        (JSC::MarkedBlock::create): Deleted.
+        (JSC::MarkedBlock::destroy): Deleted.
+        (JSC::MarkedBlock::callDestructor): Deleted.
+        (JSC::MarkedBlock::specializedSweep): Deleted.
+        (JSC::MarkedBlock::sweep): Deleted.
+        (JSC::MarkedBlock::sweepHelper): Deleted.
+        (JSC::MarkedBlock::stopAllocating): Deleted.
+        (JSC::MarkedBlock::clearMarksWithCollectionType): Deleted.
+        (JSC::MarkedBlock::lastChanceToFinalize): Deleted.
+        (JSC::MarkedBlock::resumeAllocating): Deleted.
+        (JSC::MarkedBlock::didRetireBlock): Deleted.
+        * heap/MarkedBlock.h:
+        (JSC::MarkedBlock::VoidFunctor::returnValue):
+        (JSC::MarkedBlock::CountFunctor::CountFunctor):
+        (JSC::MarkedBlock::CountFunctor::count):
+        (JSC::MarkedBlock::CountFunctor::returnValue):
+        (JSC::MarkedBlock::Handle::hasAnyNewlyAllocated):
+        (JSC::MarkedBlock::Handle::isOnBlocksToSweep):
+        (JSC::MarkedBlock::Handle::setIsOnBlocksToSweep):
+        (JSC::MarkedBlock::Handle::state):
+        (JSC::MarkedBlock::needsDestruction):
+        (JSC::MarkedBlock::handle):
+        (JSC::MarkedBlock::Handle::block):
+        (JSC::MarkedBlock::firstAtom):
+        (JSC::MarkedBlock::atoms):
+        (JSC::MarkedBlock::isAtomAligned):
+        (JSC::MarkedBlock::Handle::cellAlign):
+        (JSC::MarkedBlock::blockFor):
+        (JSC::MarkedBlock::Handle::allocator):
+        (JSC::MarkedBlock::Handle::heap):
+        (JSC::MarkedBlock::Handle::vm):
+        (JSC::MarkedBlock::vm):
+        (JSC::MarkedBlock::Handle::weakSet):
+        (JSC::MarkedBlock::weakSet):
+        (JSC::MarkedBlock::Handle::shrink):
+        (JSC::MarkedBlock::Handle::visitWeakSet):
+        (JSC::MarkedBlock::Handle::reapWeakSet):
+        (JSC::MarkedBlock::Handle::cellSize):
+        (JSC::MarkedBlock::cellSize):
+        (JSC::MarkedBlock::Handle::attributes):
+        (JSC::MarkedBlock::attributes):
+        (JSC::MarkedBlock::Handle::needsDestruction):
+        (JSC::MarkedBlock::Handle::destruction):
+        (JSC::MarkedBlock::Handle::cellKind):
+        (JSC::MarkedBlock::Handle::markCount):
+        (JSC::MarkedBlock::Handle::size):
+        (JSC::MarkedBlock::atomNumber):
+        (JSC::MarkedBlock::flipIfNecessary):
+        (JSC::MarkedBlock::flipIfNecessaryConcurrently):
+        (JSC::MarkedBlock::Handle::flipIfNecessary):
+        (JSC::MarkedBlock::Handle::flipIfNecessaryConcurrently):
+        (JSC::MarkedBlock::Handle::flipForEdenCollection):
+        (JSC::MarkedBlock::assertFlipped):
+        (JSC::MarkedBlock::Handle::assertFlipped):
+        (JSC::MarkedBlock::isMarked):
+        (JSC::MarkedBlock::testAndSetMarked):
+        (JSC::MarkedBlock::Handle::isNewlyAllocated):
+        (JSC::MarkedBlock::Handle::setNewlyAllocated):
+        (JSC::MarkedBlock::Handle::clearNewlyAllocated):
+        (JSC::MarkedBlock::Handle::isMarkedOrNewlyAllocated):
+        (JSC::MarkedBlock::isMarkedOrNewlyAllocated):
+        (JSC::MarkedBlock::Handle::isLive):
+        (JSC::MarkedBlock::isAtom):
+        (JSC::MarkedBlock::Handle::isLiveCell):
+        (JSC::MarkedBlock::Handle::forEachCell):
+        (JSC::MarkedBlock::Handle::forEachLiveCell):
+        (JSC::MarkedBlock::Handle::forEachDeadCell):
+        (JSC::MarkedBlock::Handle::needsSweeping):
+        (JSC::MarkedBlock::Handle::isAllocated):
+        (JSC::MarkedBlock::Handle::isMarked):
+        (JSC::MarkedBlock::Handle::isFreeListed):
+        (JSC::MarkedBlock::hasAnyMarked):
+        (JSC::MarkedBlock::noteMarked):
+        (WTF::MarkedBlockHash::hash):
+        (JSC::MarkedBlock::FreeList::FreeList): Deleted.
+        (JSC::MarkedBlock::allocator): Deleted.
+        (JSC::MarkedBlock::heap): Deleted.
+        (JSC::MarkedBlock::shrink): Deleted.
+        (JSC::MarkedBlock::visitWeakSet): Deleted.
+        (JSC::MarkedBlock::reapWeakSet): Deleted.
+        (JSC::MarkedBlock::willRemoveBlock): Deleted.
+        (JSC::MarkedBlock::didConsumeFreeList): Deleted.
+        (JSC::MarkedBlock::markCount): Deleted.
+        (JSC::MarkedBlock::isEmpty): Deleted.
+        (JSC::MarkedBlock::destruction): Deleted.
+        (JSC::MarkedBlock::cellKind): Deleted.
+        (JSC::MarkedBlock::size): Deleted.
+        (JSC::MarkedBlock::capacity): Deleted.
+        (JSC::MarkedBlock::setMarked): Deleted.
+        (JSC::MarkedBlock::clearMarked): Deleted.
+        (JSC::MarkedBlock::isNewlyAllocated): Deleted.
+        (JSC::MarkedBlock::setNewlyAllocated): Deleted.
+        (JSC::MarkedBlock::clearNewlyAllocated): Deleted.
+        (JSC::MarkedBlock::isLive): Deleted.
+        (JSC::MarkedBlock::isLiveCell): Deleted.
+        (JSC::MarkedBlock::forEachCell): Deleted.
+        (JSC::MarkedBlock::forEachLiveCell): Deleted.
+        (JSC::MarkedBlock::forEachDeadCell): Deleted.
+        (JSC::MarkedBlock::needsSweeping): Deleted.
+        (JSC::MarkedBlock::isAllocated): Deleted.
+        (JSC::MarkedBlock::isMarkedOrRetired): Deleted.
+        * heap/MarkedSpace.cpp:
+        (JSC::MarkedSpace::initializeSizeClassForStepSize):
+        (JSC::MarkedSpace::MarkedSpace):
+        (JSC::MarkedSpace::~MarkedSpace):
+        (JSC::MarkedSpace::lastChanceToFinalize):
+        (JSC::MarkedSpace::allocate):
+        (JSC::MarkedSpace::tryAllocate):
+        (JSC::MarkedSpace::allocateLarge):
+        (JSC::MarkedSpace::tryAllocateLarge):
+        (JSC::MarkedSpace::sweep):
+        (JSC::MarkedSpace::sweepLargeAllocations):
+        (JSC::MarkedSpace::zombifySweep):
+        (JSC::MarkedSpace::resetAllocators):
+        (JSC::MarkedSpace::visitWeakSets):
+        (JSC::MarkedSpace::reapWeakSets):
+        (JSC::MarkedSpace::stopAllocating):
+        (JSC::MarkedSpace::prepareForMarking):
+        (JSC::MarkedSpace::resumeAllocating):
+        (JSC::MarkedSpace::isPagedOut):
+        (JSC::MarkedSpace::freeBlock):
+        (JSC::MarkedSpace::freeOrShrinkBlock):
+        (JSC::MarkedSpace::shrink):
+        (JSC::MarkedSpace::clearNewlyAllocated):
+        (JSC::VerifyMarked::operator()):
+        (JSC::MarkedSpace::flip):
+        (JSC::MarkedSpace::objectCount):
+        (JSC::MarkedSpace::size):
+        (JSC::MarkedSpace::capacity):
+        (JSC::MarkedSpace::addActiveWeakSet):
+        (JSC::MarkedSpace::didAddBlock):
+        (JSC::MarkedSpace::didAllocateInBlock):
+        (JSC::MarkedSpace::forEachAllocator): Deleted.
+        (JSC::VerifyMarkedOrRetired::operator()): Deleted.
+        (JSC::MarkedSpace::clearMarks): Deleted.
+        * heap/MarkedSpace.h:
+        (JSC::MarkedSpace::sizeClassToIndex):
+        (JSC::MarkedSpace::indexToSizeClass):
+        (JSC::MarkedSpace::version):
+        (JSC::MarkedSpace::blocksWithNewObjects):
+        (JSC::MarkedSpace::largeAllocations):
+        (JSC::MarkedSpace::largeAllocationsNurseryOffset):
+        (JSC::MarkedSpace::largeAllocationsOffsetForThisCollection):
+        (JSC::MarkedSpace::largeAllocationsForThisCollectionBegin):
+        (JSC::MarkedSpace::largeAllocationsForThisCollectionEnd):
+        (JSC::MarkedSpace::largeAllocationsForThisCollectionSize):
+        (JSC::MarkedSpace::forEachLiveCell):
+        (JSC::MarkedSpace::forEachDeadCell):
+        (JSC::MarkedSpace::allocatorFor):
+        (JSC::MarkedSpace::destructorAllocatorFor):
+        (JSC::MarkedSpace::auxiliaryAllocatorFor):
+        (JSC::MarkedSpace::allocateWithoutDestructor):
+        (JSC::MarkedSpace::allocateWithDestructor):
+        (JSC::MarkedSpace::allocateAuxiliary):
+        (JSC::MarkedSpace::tryAllocateAuxiliary):
+        (JSC::MarkedSpace::forEachBlock):
+        (JSC::MarkedSpace::forEachAllocator):
+        (JSC::MarkedSpace::optimalSizeFor):
+        (JSC::MarkedSpace::didAddBlock): Deleted.
+        (JSC::MarkedSpace::didAllocateInBlock): Deleted.
+        (JSC::MarkedSpace::objectCount): Deleted.
+        (JSC::MarkedSpace::size): Deleted.
+        (JSC::MarkedSpace::capacity): Deleted.
+        * heap/SlotVisitor.cpp:
+        (JSC::SlotVisitor::SlotVisitor):
+        (JSC::SlotVisitor::didStartMarking):
+        (JSC::SlotVisitor::reset):
+        (JSC::SlotVisitor::append):
+        (JSC::SlotVisitor::appendJSCellOrAuxiliary):
+        (JSC::SlotVisitor::setMarkedAndAppendToMarkStack):
+        (JSC::SlotVisitor::appendToMarkStack):
+        (JSC::SlotVisitor::markAuxiliary):
+        (JSC::SlotVisitor::noteLiveAuxiliaryCell):
+        (JSC::SlotVisitor::visitChildren):
+        * heap/SlotVisitor.h:
+        * heap/WeakBlock.cpp:
+        (JSC::WeakBlock::create):
+        (JSC::WeakBlock::WeakBlock):
+        (JSC::WeakBlock::visit):
+        (JSC::WeakBlock::reap):
+        * heap/WeakBlock.h:
+        (JSC::WeakBlock::disconnectContainer):
+        (JSC::WeakBlock::disconnectMarkedBlock): Deleted.
+        * heap/WeakSet.cpp:
+        (JSC::WeakSet::~WeakSet):
+        (JSC::WeakSet::sweep):
+        (JSC::WeakSet::shrink):
+        (JSC::WeakSet::addAllocator):
+        * heap/WeakSet.h:
+        (JSC::WeakSet::container):
+        (JSC::WeakSet::setContainer):
+        (JSC::WeakSet::WeakSet):
+        (JSC::WeakSet::visit):
+        (JSC::WeakSet::shrink): Deleted.
+        * heap/WeakSetInlines.h:
+        (JSC::WeakSet::allocate):
+        * inspector/InjectedScriptManager.cpp:
+        * inspector/JSGlobalObjectInspectorController.cpp:
+        * inspector/JSJavaScriptCallFrame.cpp:
+        * inspector/ScriptDebugServer.cpp:
+        * inspector/agents/InspectorDebuggerAgent.cpp:
+        * interpreter/CachedCall.h:
+        (JSC::CachedCall::CachedCall):
+        * interpreter/Interpreter.cpp:
+        (JSC::loadVarargs):
+        (JSC::StackFrame::sourceID): Deleted.
+        (JSC::StackFrame::sourceURL): Deleted.
+        (JSC::StackFrame::functionName): Deleted.
+        (JSC::StackFrame::computeLineAndColumn): Deleted.
+        (JSC::StackFrame::toString): Deleted.
+        * interpreter/Interpreter.h:
+        (JSC::StackFrame::isNative): Deleted.
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
+        (JSC::AssemblyHelpers::emitAllocate):
+        (JSC::AssemblyHelpers::emitAllocateJSCell):
+        (JSC::AssemblyHelpers::emitAllocateJSObject):
+        (JSC::AssemblyHelpers::emitAllocateJSObjectWithKnownSize):
+        (JSC::AssemblyHelpers::emitAllocateVariableSized):
+        * jit/GCAwareJITStubRoutine.cpp:
+        (JSC::GCAwareJITStubRoutine::GCAwareJITStubRoutine):
+        * jit/JIT.cpp:
+        (JSC::JIT::compileCTINativeCall):
+        (JSC::JIT::link):
+        * jit/JIT.h:
+        (JSC::JIT::compileCTINativeCall): Deleted.
+        * jit/JITExceptions.cpp:
+        (JSC::genericUnwind):
+        * jit/JITExceptions.h:
+        * jit/JITOpcodes.cpp:
+        (JSC::JIT::emit_op_new_object):
+        (JSC::JIT::emitSlow_op_new_object):
+        (JSC::JIT::emit_op_create_this):
+        (JSC::JIT::emitSlow_op_create_this):
+        * jit/JITOpcodes32_64.cpp:
+        (JSC::JIT::emit_op_new_object):
+        (JSC::JIT::emitSlow_op_new_object):
+        (JSC::JIT::emit_op_create_this):
+        (JSC::JIT::emitSlow_op_create_this):
+        * jit/JITOperations.cpp:
+        * jit/JITOperations.h:
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::emitWriteBarrier):
+        * jit/JITThunks.cpp:
+        * jit/JITThunks.h:
+        * jsc.cpp:
+        (functionDescribeArray):
+        (main):
+        * llint/LLIntData.cpp:
+        (JSC::LLInt::Data::performAssertions):
+        * llint/LLIntExceptions.cpp:
+        * llint/LLIntThunks.cpp:
+        * llint/LLIntThunks.h:
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter.cpp:
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+        * parser/ModuleAnalyzer.cpp:
+        * parser/NodeConstructors.h:
+        * parser/Nodes.h:
+        * profiler/ProfilerBytecode.cpp:
+        * profiler/ProfilerBytecode.h:
+        * profiler/ProfilerBytecodeSequence.cpp:
+        * runtime/ArrayConventions.h:
+        (JSC::indexingHeaderForArrayStorage):
+        (JSC::baseIndexingHeaderForArrayStorage):
+        (JSC::indexingHeaderForArray): Deleted.
+        (JSC::baseIndexingHeaderForArray): Deleted.
+        * runtime/ArrayPrototype.cpp:
+        (JSC::arrayProtoFuncSplice):
+        (JSC::concatAppendOne):
+        (JSC::arrayProtoPrivateFuncConcatMemcpy):
+        * runtime/ArrayStorage.h:
+        (JSC::ArrayStorage::vectorLength):
+        (JSC::ArrayStorage::totalSizeFor):
+        (JSC::ArrayStorage::totalSize):
+        (JSC::ArrayStorage::availableVectorLength):
+        (JSC::ArrayStorage::optimalVectorLength):
+        (JSC::ArrayStorage::sizeFor): Deleted.
+        * runtime/AuxiliaryBarrier.h: Added.
+        (JSC::AuxiliaryBarrier::AuxiliaryBarrier):
+        (JSC::AuxiliaryBarrier::clear):
+        (JSC::AuxiliaryBarrier::get):
+        (JSC::AuxiliaryBarrier::slot):
+        (JSC::AuxiliaryBarrier::operator bool):
+        (JSC::AuxiliaryBarrier::setWithoutBarrier):
+        * runtime/AuxiliaryBarrierInlines.h: Added.
+        (JSC::AuxiliaryBarrier&lt;T&gt;::AuxiliaryBarrier):
+        (JSC::AuxiliaryBarrier&lt;T&gt;::set):
+        * runtime/Butterfly.h:
+        * runtime/ButterflyInlines.h:
+        (JSC::Butterfly::availableContiguousVectorLength):
+        (JSC::Butterfly::optimalContiguousVectorLength):
+        (JSC::Butterfly::createUninitialized):
+        (JSC::Butterfly::growArrayRight):
+        * runtime/ClonedArguments.cpp:
+        (JSC::ClonedArguments::createEmpty):
+        * runtime/CommonSlowPathsExceptions.cpp:
+        * runtime/CommonSlowPathsExceptions.h:
+        * runtime/DataView.cpp:
+        * runtime/DirectArguments.h:
+        * runtime/ECMAScriptSpecInternalFunctions.cpp:
+        * runtime/Error.cpp:
+        * runtime/Error.h:
+        * runtime/ErrorInstance.cpp:
+        * runtime/ErrorInstance.h:
+        * runtime/Exception.cpp:
+        * runtime/Exception.h:
+        * runtime/GeneratorFrame.cpp:
+        * runtime/GeneratorPrototype.cpp:
+        * runtime/InternalFunction.cpp:
+        (JSC::InternalFunction::InternalFunction):
+        * runtime/IntlCollator.cpp:
+        * runtime/IntlCollatorConstructor.cpp:
+        * runtime/IntlCollatorPrototype.cpp:
+        * runtime/IntlDateTimeFormat.cpp:
+        * runtime/IntlDateTimeFormatConstructor.cpp:
+        * runtime/IntlDateTimeFormatPrototype.cpp:
+        * runtime/IntlNumberFormat.cpp:
+        * runtime/IntlNumberFormatConstructor.cpp:
+        * runtime/IntlNumberFormatPrototype.cpp:
+        * runtime/IntlObject.cpp:
+        * runtime/IteratorPrototype.cpp:
+        * runtime/JSArray.cpp:
+        (JSC::JSArray::tryCreateUninitialized):
+        (JSC::JSArray::setLengthWritable):
+        (JSC::JSArray::unshiftCountSlowCase):
+        (JSC::JSArray::setLengthWithArrayStorage):
+        (JSC::JSArray::appendMemcpy):
+        (JSC::JSArray::setLength):
+        (JSC::JSArray::pop):
+        (JSC::JSArray::push):
+        (JSC::JSArray::fastSlice):
+        (JSC::JSArray::shiftCountWithArrayStorage):
+        (JSC::JSArray::shiftCountWithAnyIndexingType):
+        (JSC::JSArray::unshiftCountWithArrayStorage):
+        (JSC::JSArray::fillArgList):
+        (JSC::JSArray::copyToArguments):
+        * runtime/JSArray.h:
+        (JSC::createContiguousArrayButterfly):
+        (JSC::createArrayButterfly):
+        (JSC::JSArray::create):
+        (JSC::JSArray::tryCreateUninitialized): Deleted.
+        * runtime/JSArrayBufferView.h:
+        * runtime/JSCInlines.h:
+        * runtime/JSCJSValue.cpp:
+        (JSC::JSValue::dumpInContextAssumingStructure):
+        * runtime/JSCallee.cpp:
+        (JSC::JSCallee::JSCallee):
+        * runtime/JSCell.cpp:
+        (JSC::JSCell::estimatedSize):
+        * runtime/JSCell.h:
+        (JSC::JSCell::cellStateOffset): Deleted.
+        * runtime/JSCellInlines.h:
+        (JSC::ExecState::vm):
+        (JSC::JSCell::classInfo):
+        (JSC::JSCell::callDestructor):
+        (JSC::JSCell::vm): Deleted.
+        * runtime/JSFunction.cpp:
+        (JSC::JSFunction::create):
+        (JSC::JSFunction::allocateAndInitializeRareData):
+        (JSC::JSFunction::initializeRareData):
+        (JSC::JSFunction::getOwnPropertySlot):
+        (JSC::JSFunction::put):
+        (JSC::JSFunction::deleteProperty):
+        (JSC::JSFunction::defineOwnProperty):
+        (JSC::JSFunction::setFunctionName):
+        (JSC::JSFunction::reifyLength):
+        (JSC::JSFunction::reifyName):
+        (JSC::JSFunction::reifyLazyPropertyIfNeeded):
+        (JSC::JSFunction::reifyBoundNameIfNeeded):
+        * runtime/JSFunction.h:
+        * runtime/JSFunctionInlines.h:
+        (JSC::JSFunction::createWithInvalidatedReallocationWatchpoint):
+        (JSC::JSFunction::JSFunction):
+        * runtime/JSGenericTypedArrayViewInlines.h:
+        (JSC::JSGenericTypedArrayView&lt;Adaptor&gt;::slowDownAndWasteMemory):
+        * runtime/JSInternalPromise.cpp:
+        * runtime/JSInternalPromiseConstructor.cpp:
+        * runtime/JSInternalPromiseDeferred.cpp:
+        * runtime/JSInternalPromisePrototype.cpp:
+        * runtime/JSJob.cpp:
+        * runtime/JSMapIterator.cpp:
+        * runtime/JSModuleNamespaceObject.cpp:
+        * runtime/JSModuleRecord.cpp:
+        * runtime/JSObject.cpp:
+        (JSC::JSObject::visitButterfly):
+        (JSC::JSObject::notifyPresenceOfIndexedAccessors):
+        (JSC::JSObject::createInitialIndexedStorage):
+        (JSC::JSObject::createInitialUndecided):
+        (JSC::JSObject::createInitialInt32):
+        (JSC::JSObject::createInitialDouble):
+        (JSC::JSObject::createInitialContiguous):
+        (JSC::JSObject::createArrayStorage):
+        (JSC::JSObject::createInitialArrayStorage):
+        (JSC::JSObject::convertUndecidedToInt32):
+        (JSC::JSObject::convertUndecidedToContiguous):
+        (JSC::JSObject::convertUndecidedToArrayStorage):
+        (JSC::JSObject::convertInt32ToDouble):
+        (JSC::JSObject::convertInt32ToArrayStorage):
+        (JSC::JSObject::convertDoubleToArrayStorage):
+        (JSC::JSObject::convertContiguousToArrayStorage):
+        (JSC::JSObject::putByIndexBeyondVectorLength):
+        (JSC::JSObject::putDirectIndexBeyondVectorLength):
+        (JSC::JSObject::getNewVectorLength):
+        (JSC::JSObject::increaseVectorLength):
+        (JSC::JSObject::ensureLengthSlow):
+        (JSC::JSObject::growOutOfLineStorage):
+        (JSC::JSObject::copyButterfly): Deleted.
+        (JSC::JSObject::copyBackingStore): Deleted.
+        * runtime/JSObject.h:
+        (JSC::JSObject::globalObject):
+        (JSC::JSObject::putDirectInternal):
+        (JSC::JSObject::setStructureAndReallocateStorageIfNecessary): Deleted.
+        * runtime/JSObjectInlines.h:
+        * runtime/JSPromise.cpp:
+        * runtime/JSPromiseConstructor.cpp:
+        * runtime/JSPromiseDeferred.cpp:
+        * runtime/JSPromisePrototype.cpp:
+        * runtime/JSPropertyNameIterator.cpp:
+        * runtime/JSScope.cpp:
+        (JSC::JSScope::resolve):
+        * runtime/JSScope.h:
+        (JSC::JSScope::globalObject):
+        (JSC::JSScope::vm): Deleted.
+        * runtime/JSSetIterator.cpp:
+        * runtime/JSStringIterator.cpp:
+        * runtime/JSTemplateRegistryKey.cpp:
+        * runtime/JSTypedArrayViewConstructor.cpp:
+        * runtime/JSTypedArrayViewPrototype.cpp:
+        * runtime/JSWeakMap.cpp:
+        * runtime/JSWeakSet.cpp:
+        * runtime/MapConstructor.cpp:
+        * runtime/MapIteratorPrototype.cpp:
+        * runtime/MapPrototype.cpp:
+        * runtime/NativeErrorConstructor.cpp:
+        * runtime/NativeStdFunctionCell.cpp:
+        * runtime/Operations.h:
+        (JSC::scribbleFreeCells):
+        (JSC::scribble):
+        * runtime/Options.h:
+        * runtime/PropertyTable.cpp:
+        * runtime/ProxyConstructor.cpp:
+        * runtime/ProxyObject.cpp:
+        * runtime/ProxyRevoke.cpp:
+        * runtime/RegExp.cpp:
+        (JSC::RegExp::match):
+        (JSC::RegExp::matchConcurrently):
+        (JSC::RegExp::matchCompareWithInterpreter):
+        * runtime/RegExp.h:
+        * runtime/RegExpConstructor.h:
+        * runtime/RegExpInlines.h:
+        (JSC::RegExp::matchInline):
+        * runtime/RegExpMatchesArray.h:
+        (JSC::tryCreateUninitializedRegExpMatchesArray):
+        (JSC::createRegExpMatchesArray):
+        * runtime/RegExpPrototype.cpp:
+        (JSC::genericSplit):
+        * runtime/RuntimeType.cpp:
+        * runtime/SamplingProfiler.cpp:
+        (JSC::SamplingProfiler::processUnverifiedStackTraces):
+        * runtime/SetConstructor.cpp:
+        * runtime/SetIteratorPrototype.cpp:
+        * runtime/SetPrototype.cpp:
+        * runtime/StackFrame.cpp: Added.
+        (JSC::StackFrame::sourceID):
+        (JSC::StackFrame::sourceURL):
+        (JSC::StackFrame::functionName):
+        (JSC::StackFrame::computeLineAndColumn):
+        (JSC::StackFrame::toString):
+        * runtime/StackFrame.h: Added.
+        (JSC::StackFrame::isNative):
+        * runtime/StringConstructor.cpp:
+        * runtime/StringIteratorPrototype.cpp:
+        * runtime/StructureInlines.h:
+        (JSC::Structure::propertyTable):
+        * runtime/TemplateRegistry.cpp:
+        * runtime/TestRunnerUtils.cpp:
+        (JSC::finalizeStatsAtEndOfTesting):
+        * runtime/TestRunnerUtils.h:
+        * runtime/TypeProfilerLog.cpp:
+        * runtime/TypeSet.cpp:
+        * runtime/VM.cpp:
+        (JSC::VM::VM):
+        (JSC::VM::ensureStackCapacityForCLoop):
+        (JSC::VM::isSafeToRecurseSoftCLoop):
+        * runtime/VM.h:
+        * runtime/VMEntryScope.h:
+        * runtime/VMInlines.h:
+        (JSC::VM::ensureStackCapacityFor):
+        (JSC::VM::isSafeToRecurseSoft):
+        * runtime/WeakMapConstructor.cpp:
+        * runtime/WeakMapData.cpp:
+        * runtime/WeakMapPrototype.cpp:
+        * runtime/WeakSetConstructor.cpp:
+        * runtime/WeakSetPrototype.cpp:
+        * testRegExp.cpp:
+        (testOneRegExp):
+        * tools/JSDollarVM.cpp:
+        * tools/JSDollarVMPrototype.cpp:
+        (JSC::JSDollarVMPrototype::isInObjectSpace):
+
</ins><span class="cx"> 2016-09-03  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Use ASCIILiteral in some more places
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -88,6 +88,11 @@
</span><span class="cx">                 0F04396D1B03DC0B009598B7 /* DFGCombinedLiveness.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F04396B1B03DC0B009598B7 /* DFGCombinedLiveness.cpp */; };
</span><span class="cx">                 0F04396E1B03DC0B009598B7 /* DFGCombinedLiveness.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F04396C1B03DC0B009598B7 /* DFGCombinedLiveness.h */; };
</span><span class="cx">                 0F05C3B41683CF9200BAF45B /* DFGArrayifySlowPathGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F05C3B21683CF8F00BAF45B /* DFGArrayifySlowPathGenerator.h */; };
</span><ins>+                0F070A471D543A8B006E7232 /* CellContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F070A421D543A89006E7232 /* CellContainer.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F070A481D543A90006E7232 /* CellContainerInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F070A431D543A89006E7232 /* CellContainerInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F070A491D543A93006E7232 /* HeapCellInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F070A441D543A89006E7232 /* HeapCellInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F070A4A1D543A95006E7232 /* LargeAllocation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F070A451D543A89006E7232 /* LargeAllocation.cpp */; };
+                0F070A4B1D543A98006E7232 /* LargeAllocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F070A461D543A89006E7232 /* LargeAllocation.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 0F0776BF14FF002B00102332 /* JITCompilationEffort.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F0776BD14FF002800102332 /* JITCompilationEffort.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F0A75221B94BFA900110660 /* InferredType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F0A75201B94BFA900110660 /* InferredType.cpp */; };
</span><span class="cx">                 0F0A75231B94BFA900110660 /* InferredType.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F0A75211B94BFA900110660 /* InferredType.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -323,6 +328,8 @@
</span><span class="cx">                 0F38B01817CFE75500B144D3 /* DFGCompilationKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F38B01417CFE75500B144D3 /* DFGCompilationKey.h */; };
</span><span class="cx">                 0F38B01917CFE75500B144D3 /* DFGCompilationMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F38B01517CFE75500B144D3 /* DFGCompilationMode.cpp */; };
</span><span class="cx">                 0F38B01A17CFE75500B144D3 /* DFGCompilationMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F38B01617CFE75500B144D3 /* DFGCompilationMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0F38D2A21D44196800680499 /* AuxiliaryBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F38D2A01D44196600680499 /* AuxiliaryBarrier.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F38D2A31D44196D00680499 /* AuxiliaryBarrierInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F38D2A11D44196600680499 /* AuxiliaryBarrierInlines.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 0F392C891B46188400844728 /* DFGOSRExitFuzz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F392C871B46188400844728 /* DFGOSRExitFuzz.cpp */; };
</span><span class="cx">                 0F392C8A1B46188400844728 /* DFGOSRExitFuzz.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F392C881B46188400844728 /* DFGOSRExitFuzz.h */; };
</span><span class="cx">                 0F3A1BF91A9ECB7D000DE01A /* DFGPutStackSinkingPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F3A1BF71A9ECB7D000DE01A /* DFGPutStackSinkingPhase.cpp */; };
</span><span class="lines">@@ -364,9 +371,9 @@
</span><span class="cx">                 0F4680CA14BBB16C00BFE272 /* LLIntCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680C514BBB16900BFE272 /* LLIntCommon.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F4680CB14BBB17200BFE272 /* LLIntOfflineAsmConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680C614BBB16900BFE272 /* LLIntOfflineAsmConfig.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F4680CC14BBB17A00BFE272 /* LowLevelInterpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F4680C714BBB16900BFE272 /* LowLevelInterpreter.cpp */; };
</span><del>-                0F4680CD14BBB17D00BFE272 /* LowLevelInterpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680C814BBB16900BFE272 /* LowLevelInterpreter.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                0F4680CD14BBB17D00BFE272 /* LowLevelInterpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680C814BBB16900BFE272 /* LowLevelInterpreter.h */; };
</ins><span class="cx">                 0F4680D214BBD16500BFE272 /* LLIntData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F4680CE14BBB3D100BFE272 /* LLIntData.cpp */; };
</span><del>-                0F4680D314BBD16700BFE272 /* LLIntData.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680CF14BBB3D100BFE272 /* LLIntData.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                0F4680D314BBD16700BFE272 /* LLIntData.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680CF14BBB3D100BFE272 /* LLIntData.h */; };
</ins><span class="cx">                 0F4680D414BBD24900BFE272 /* HostCallReturnValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F4680D014BBC5F800BFE272 /* HostCallReturnValue.cpp */; };
</span><span class="cx">                 0F4680D514BBD24B00BFE272 /* HostCallReturnValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4680D114BBC5F800BFE272 /* HostCallReturnValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F485321187750560083B687 /* DFGArithMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F48531F187750560083B687 /* DFGArithMode.cpp */; };
</span><span class="lines">@@ -386,6 +393,8 @@
</span><span class="cx">                 0F4F29DF18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F4F29DD18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.cpp */; };
</span><span class="cx">                 0F4F29E018B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4F29DE18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h */; };
</span><span class="cx">                 0F50AF3C193E8B3900674EE8 /* DFGStructureClobberState.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F50AF3B193E8B3900674EE8 /* DFGStructureClobberState.h */; };
</span><ins>+                0F5513A61D5A682C00C32BD8 /* FreeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F5513A51D5A682A00C32BD8 /* FreeList.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F5513A81D5A68CD00C32BD8 /* FreeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F5513A71D5A68CB00C32BD8 /* FreeList.cpp */; };
</ins><span class="cx">                 0F5541B11613C1FB00CE3E25 /* SpecialPointer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F5541AF1613C1FB00CE3E25 /* SpecialPointer.cpp */; };
</span><span class="cx">                 0F5541B21613C1FB00CE3E25 /* SpecialPointer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F5541B01613C1FB00CE3E25 /* SpecialPointer.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F55989817C86C5800A1E543 /* ToNativeFromValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F55989717C86C5600A1E543 /* ToNativeFromValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -458,6 +467,9 @@
</span><span class="cx">                 0F6B8AE51C4EFE1700969052 /* B3FixSSA.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B8AE11C4EFE1700969052 /* B3FixSSA.h */; };
</span><span class="cx">                 0F6C73501AC9F99F00BE1682 /* VariableWriteFireDetail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6C734E1AC9F99F00BE1682 /* VariableWriteFireDetail.cpp */; };
</span><span class="cx">                 0F6C73511AC9F99F00BE1682 /* VariableWriteFireDetail.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6C734F1AC9F99F00BE1682 /* VariableWriteFireDetail.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0F6DB7E91D6124B500CDBF8E /* StackFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6DB7E81D6124B200CDBF8E /* StackFrame.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                0F6DB7EA1D6124B800CDBF8E /* StackFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6DB7E71D6124B200CDBF8E /* StackFrame.cpp */; };
+                0F6DB7EC1D617D1100CDBF8E /* MacroAssemblerCodeRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6DB7EB1D617D0F00CDBF8E /* MacroAssemblerCodeRef.cpp */; };
</ins><span class="cx">                 0F6E845A19030BEF00562741 /* DFGVariableAccessData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6E845919030BEF00562741 /* DFGVariableAccessData.cpp */; };
</span><span class="cx">                 0F6FC750196110A800E1D02D /* ComplexGetStatus.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6FC74E196110A800E1D02D /* ComplexGetStatus.cpp */; };
</span><span class="cx">                 0F6FC751196110A800E1D02D /* ComplexGetStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6FC74F196110A800E1D02D /* ComplexGetStatus.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -493,6 +505,8 @@
</span><span class="cx">                 0F8335B71639C1E6001443B5 /* ArrayAllocationProfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F8335B41639C1E3001443B5 /* ArrayAllocationProfile.cpp */; };
</span><span class="cx">                 0F8335B81639C1EA001443B5 /* ArrayAllocationProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8335B51639C1E3001443B5 /* ArrayAllocationProfile.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F8364B7164B0C110053329A /* DFGBranchDirection.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F8364B5164B0C0E0053329A /* DFGBranchDirection.h */; };
</span><ins>+                0F86A26D1D6F796500CB0C92 /* HeapOperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F86A26C1D6F796200CB0C92 /* HeapOperation.cpp */; };
+                0F86A26F1D6F7B3300CB0C92 /* GCTypeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F86A26E1D6F7B3100CB0C92 /* GCTypeMap.h */; };
</ins><span class="cx">                 0F86AE201C5311C5006BE8EC /* B3ComputeDivisionMagic.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F86AE1F1C5311C5006BE8EC /* B3ComputeDivisionMagic.h */; };
</span><span class="cx">                 0F885E111849A3BE00F1E3FA /* BytecodeUseDef.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F885E101849A3BE00F1E3FA /* BytecodeUseDef.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F893BDB1936E23C001211F4 /* DFGStructureAbstractValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F893BDA1936E23C001211F4 /* DFGStructureAbstractValue.cpp */; };
</span><span class="lines">@@ -573,6 +587,7 @@
</span><span class="cx">                 0FA7A8EB18B413C80052371D /* Reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FA7A8E918B413C80052371D /* Reg.cpp */; };
</span><span class="cx">                 0FA7A8EC18B413C80052371D /* Reg.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FA7A8EA18B413C80052371D /* Reg.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0FA7A8EE18CE4FD80052371D /* ScratchRegisterAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FA7A8ED18CE4FD80052371D /* ScratchRegisterAllocator.cpp */; };
</span><ins>+                0FADE6731D4D23BE00768457 /* HeapUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FADE6721D4D23BC00768457 /* HeapUtil.h */; };
</ins><span class="cx">                 0FAF7EFD165BA91B000C8455 /* JITDisassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FAF7EFA165BA919000C8455 /* JITDisassembler.cpp */; };
</span><span class="cx">                 0FAF7EFE165BA91F000C8455 /* JITDisassembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FAF7EFB165BA919000C8455 /* JITDisassembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0FB105851675480F00F8AB6E /* ExitKind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB105821675480C00F8AB6E /* ExitKind.cpp */; };
</span><span class="lines">@@ -593,6 +608,7 @@
</span><span class="cx">                 0FB3878F1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB3878C1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp */; };
</span><span class="cx">                 0FB387901BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB3878D1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h */; };
</span><span class="cx">                 0FB387921BFD31A100E3AB1E /* FTLCompile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB387911BFD31A100E3AB1E /* FTLCompile.cpp */; };
</span><ins>+                0FB415841D78FB4C00DF8D09 /* ArrayConventions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB415831D78F98200DF8D09 /* ArrayConventions.cpp */; };
</ins><span class="cx">                 0FB438A319270B1D00E1FBC9 /* StructureSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB438A219270B1D00E1FBC9 /* StructureSet.cpp */; };
</span><span class="cx">                 0FB4FB731BC843140025CA5A /* FTLLazySlowPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB4FB701BC843140025CA5A /* FTLLazySlowPath.cpp */; };
</span><span class="cx">                 0FB4FB741BC843140025CA5A /* FTLLazySlowPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB4FB711BC843140025CA5A /* FTLLazySlowPath.h */; };
</span><span class="lines">@@ -989,7 +1005,7 @@
</span><span class="cx">                 14280865107EC11A0013E7B2 /* BooleanPrototype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC7952340E15EB5600A898AB /* BooleanPrototype.cpp */; };
</span><span class="cx">                 14280870107EC1340013E7B2 /* JSWrapperObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65C7A1710A8EAACB00FA37EA /* JSWrapperObject.cpp */; };
</span><span class="cx">                 14280875107EC13E0013E7B2 /* JSLock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65EA4C99092AF9E20093D800 /* JSLock.cpp */; };
</span><del>-                1429D77C0ED20D7300B89619 /* Interpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1429D77B0ED20D7300B89619 /* Interpreter.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                1429D77C0ED20D7300B89619 /* Interpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1429D77B0ED20D7300B89619 /* Interpreter.h */; };
</ins><span class="cx">                 1429D7D40ED2128200B89619 /* Interpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1429D7D30ED2128200B89619 /* Interpreter.cpp */; };
</span><span class="cx">                 1429D8780ED21ACD00B89619 /* ExceptionHelpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1429D8770ED21ACD00B89619 /* ExceptionHelpers.cpp */; };
</span><span class="cx">                 1429D8DD0ED2205B00B89619 /* CallFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1429D8DB0ED2205B00B89619 /* CallFrame.cpp */; };
</span><span class="lines">@@ -1447,7 +1463,7 @@
</span><span class="cx">                 969A07980ED1D3AE00F1F681 /* EvalCodeCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07920ED1D3AE00F1F681 /* EvalCodeCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 969A07990ED1D3AE00F1F681 /* Instruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07930ED1D3AE00F1F681 /* Instruction.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 969A079A0ED1D3AE00F1F681 /* Opcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 969A07940ED1D3AE00F1F681 /* Opcode.cpp */; };
</span><del>-                969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07950ED1D3AE00F1F681 /* Opcode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><ins>+                969A079B0ED1D3AE00F1F681 /* Opcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 969A07950ED1D3AE00F1F681 /* Opcode.h */; };
</ins><span class="cx">                 978801401471AD920041B016 /* JSDateMath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9788FC221471AD0C0068CE2D /* JSDateMath.cpp */; };
</span><span class="cx">                 978801411471AD920041B016 /* JSDateMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 9788FC231471AD0C0068CE2D /* JSDateMath.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 990DA67F1C8E316A00295159 /* generate_objc_protocol_type_conversions_implementation.py in Headers */ = {isa = PBXBuildFile; fileRef = 990DA67E1C8E311D00295159 /* generate_objc_protocol_type_conversions_implementation.py */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -2311,6 +2327,11 @@
</span><span class="cx">                 0F04396B1B03DC0B009598B7 /* DFGCombinedLiveness.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGCombinedLiveness.cpp; path = dfg/DFGCombinedLiveness.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F04396C1B03DC0B009598B7 /* DFGCombinedLiveness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGCombinedLiveness.h; path = dfg/DFGCombinedLiveness.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F05C3B21683CF8F00BAF45B /* DFGArrayifySlowPathGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGArrayifySlowPathGenerator.h; path = dfg/DFGArrayifySlowPathGenerator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F070A421D543A89006E7232 /* CellContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellContainer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F070A431D543A89006E7232 /* CellContainerInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CellContainerInlines.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F070A441D543A89006E7232 /* HeapCellInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeapCellInlines.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F070A451D543A89006E7232 /* LargeAllocation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LargeAllocation.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F070A461D543A89006E7232 /* LargeAllocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LargeAllocation.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F0776BD14FF002800102332 /* JITCompilationEffort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITCompilationEffort.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F0A75201B94BFA900110660 /* InferredType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InferredType.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F0A75211B94BFA900110660 /* InferredType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InferredType.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2545,6 +2566,8 @@
</span><span class="cx">                 0F38B01417CFE75500B144D3 /* DFGCompilationKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGCompilationKey.h; path = dfg/DFGCompilationKey.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F38B01517CFE75500B144D3 /* DFGCompilationMode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGCompilationMode.cpp; path = dfg/DFGCompilationMode.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F38B01617CFE75500B144D3 /* DFGCompilationMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGCompilationMode.h; path = dfg/DFGCompilationMode.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F38D2A01D44196600680499 /* AuxiliaryBarrier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuxiliaryBarrier.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F38D2A11D44196600680499 /* AuxiliaryBarrierInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuxiliaryBarrierInlines.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F392C871B46188400844728 /* DFGOSRExitFuzz.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGOSRExitFuzz.cpp; path = dfg/DFGOSRExitFuzz.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F392C881B46188400844728 /* DFGOSRExitFuzz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGOSRExitFuzz.h; path = dfg/DFGOSRExitFuzz.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F3A1BF71A9ECB7D000DE01A /* DFGPutStackSinkingPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGPutStackSinkingPhase.cpp; path = dfg/DFGPutStackSinkingPhase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2606,6 +2629,8 @@
</span><span class="cx">                 0F4F29DD18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGStaticExecutionCountEstimationPhase.cpp; path = dfg/DFGStaticExecutionCountEstimationPhase.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F4F29DE18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGStaticExecutionCountEstimationPhase.h; path = dfg/DFGStaticExecutionCountEstimationPhase.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F50AF3B193E8B3900674EE8 /* DFGStructureClobberState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGStructureClobberState.h; path = dfg/DFGStructureClobberState.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F5513A51D5A682A00C32BD8 /* FreeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FreeList.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F5513A71D5A68CB00C32BD8 /* FreeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FreeList.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F5541AF1613C1FB00CE3E25 /* SpecialPointer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialPointer.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F5541B01613C1FB00CE3E25 /* SpecialPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpecialPointer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F55989717C86C5600A1E543 /* ToNativeFromValue.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ToNativeFromValue.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2680,6 +2705,9 @@
</span><span class="cx">                 0F6B8AE11C4EFE1700969052 /* B3FixSSA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3FixSSA.h; path = b3/B3FixSSA.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6C734E1AC9F99F00BE1682 /* VariableWriteFireDetail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableWriteFireDetail.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6C734F1AC9F99F00BE1682 /* VariableWriteFireDetail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableWriteFireDetail.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F6DB7E71D6124B200CDBF8E /* StackFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StackFrame.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F6DB7E81D6124B200CDBF8E /* StackFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StackFrame.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F6DB7EB1D617D0F00CDBF8E /* MacroAssemblerCodeRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MacroAssemblerCodeRef.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F6E845919030BEF00562741 /* DFGVariableAccessData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGVariableAccessData.cpp; path = dfg/DFGVariableAccessData.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6FC74E196110A800E1D02D /* ComplexGetStatus.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ComplexGetStatus.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6FC74F196110A800E1D02D /* ComplexGetStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ComplexGetStatus.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2713,6 +2741,8 @@
</span><span class="cx">                 0F8335B41639C1E3001443B5 /* ArrayAllocationProfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArrayAllocationProfile.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F8335B51639C1E3001443B5 /* ArrayAllocationProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayAllocationProfile.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F8364B5164B0C0E0053329A /* DFGBranchDirection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGBranchDirection.h; path = dfg/DFGBranchDirection.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0F86A26C1D6F796200CB0C92 /* HeapOperation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HeapOperation.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0F86A26E1D6F7B3100CB0C92 /* GCTypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCTypeMap.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0F86AE1F1C5311C5006BE8EC /* B3ComputeDivisionMagic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3ComputeDivisionMagic.h; path = b3/B3ComputeDivisionMagic.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F885E101849A3BE00F1E3FA /* BytecodeUseDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BytecodeUseDef.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F893BDA1936E23C001211F4 /* DFGStructureAbstractValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGStructureAbstractValue.cpp; path = dfg/DFGStructureAbstractValue.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2792,6 +2822,7 @@
</span><span class="cx">                 0FA7A8E918B413C80052371D /* Reg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reg.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FA7A8EA18B413C80052371D /* Reg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reg.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FA7A8ED18CE4FD80052371D /* ScratchRegisterAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScratchRegisterAllocator.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0FADE6721D4D23BC00768457 /* HeapUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeapUtil.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0FAF7EFA165BA919000C8455 /* JITDisassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITDisassembler.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FAF7EFB165BA919000C8455 /* JITDisassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITDisassembler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FB105821675480C00F8AB6E /* ExitKind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExitKind.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2812,6 +2843,7 @@
</span><span class="cx">                 0FB3878C1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AirOptimizeBlockOrder.cpp; path = b3/air/AirOptimizeBlockOrder.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FB3878D1BFBC44D00E3AB1E /* AirOptimizeBlockOrder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AirOptimizeBlockOrder.h; path = b3/air/AirOptimizeBlockOrder.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FB387911BFD31A100E3AB1E /* FTLCompile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLCompile.cpp; path = ftl/FTLCompile.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0FB415831D78F98200DF8D09 /* ArrayConventions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ArrayConventions.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0FB438A219270B1D00E1FBC9 /* StructureSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StructureSet.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FB4B51016B3A964003F696B /* DFGMinifiedID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGMinifiedID.h; path = dfg/DFGMinifiedID.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FB4B51916B62772003F696B /* DFGAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGAllocator.h; path = dfg/DFGAllocator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5233,6 +5265,8 @@
</span><span class="cx">                         children = (
</span><span class="cx">                                 0F9630351D4192C3005609D9 /* AllocatorAttributes.cpp */,
</span><span class="cx">                                 0F9630361D4192C3005609D9 /* AllocatorAttributes.h */,
</span><ins>+                                0F070A421D543A89006E7232 /* CellContainer.h */,
+                                0F070A431D543A89006E7232 /* CellContainerInlines.h */,
</ins><span class="cx">                                 0F1C3DD91BBCE09E00E523E4 /* CellState.h */,
</span><span class="cx">                                 0FD8A31117D4326C00CA2C40 /* CodeBlockSet.cpp */,
</span><span class="cx">                                 0FD8A31217D4326C00CA2C40 /* CodeBlockSet.h */,
</span><span class="lines">@@ -5257,6 +5291,8 @@
</span><span class="cx">                                 0F9630381D4192C3005609D9 /* DestructionMode.h */,
</span><span class="cx">                                 2A83638318D7D0EE0000EBCC /* EdenGCActivityCallback.cpp */,
</span><span class="cx">                                 2A83638418D7D0EE0000EBCC /* EdenGCActivityCallback.h */,
</span><ins>+                                0F5513A71D5A68CB00C32BD8 /* FreeList.cpp */,
+                                0F5513A51D5A682A00C32BD8 /* FreeList.h */,
</ins><span class="cx">                                 2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */,
</span><span class="cx">                                 2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */,
</span><span class="cx">                                 2AACE63A18CA5A0300ED0191 /* GCActivityCallback.cpp */,
</span><span class="lines">@@ -5270,6 +5306,7 @@
</span><span class="cx">                                 2AABCDE618EF294200002096 /* GCLogging.h */,
</span><span class="cx">                                 2A343F7418A1748B0039B085 /* GCSegmentedArray.h */,
</span><span class="cx">                                 2A343F7718A1749D0039B085 /* GCSegmentedArrayInlines.h */,
</span><ins>+                                0F86A26E1D6F7B3100CB0C92 /* GCTypeMap.h */,
</ins><span class="cx">                                 142E312B134FF0A600AFADB5 /* Handle.h */,
</span><span class="cx">                                 C28318FF16FE4B7D00157BFD /* HandleBlock.h */,
</span><span class="cx">                                 C283190116FE533E00157BFD /* HandleBlockInlines.h */,
</span><span class="lines">@@ -5282,11 +5319,13 @@
</span><span class="cx">                                 14BA7A9613AADFF8005B7C2C /* Heap.h */,
</span><span class="cx">                                 DC3D2B0B1D34376E00BA918C /* HeapCell.cpp */,
</span><span class="cx">                                 DC3D2B091D34316100BA918C /* HeapCell.h */,
</span><ins>+                                0F070A441D543A89006E7232 /* HeapCellInlines.h */,
</ins><span class="cx">                                 0F32BD0E1BB34F190093A57F /* HeapHelperPool.cpp */,
</span><span class="cx">                                 0F32BD0F1BB34F190093A57F /* HeapHelperPool.h */,
</span><span class="cx">                                 C2DA778218E259990066FCB6 /* HeapInlines.h */,
</span><span class="cx">                                 2AD8932917E3868F00668276 /* HeapIterationScope.h */,
</span><span class="cx">                                 A5339EC81BB4B4510054F005 /* HeapObserver.h */,
</span><ins>+                                0F86A26C1D6F796200CB0C92 /* HeapOperation.cpp */,
</ins><span class="cx">                                 2A6F462517E959CE00C45C98 /* HeapOperation.h */,
</span><span class="cx">                                 A5398FA91C750D950060A963 /* HeapProfiler.cpp */,
</span><span class="cx">                                 A5398FAA1C750D950060A963 /* HeapProfiler.h */,
</span><span class="lines">@@ -5299,6 +5338,7 @@
</span><span class="cx">                                 C24D31E1161CD695002AA4DB /* HeapStatistics.h */,
</span><span class="cx">                                 C2E526BB1590EF000054E48D /* HeapTimer.cpp */,
</span><span class="cx">                                 C2E526BC1590EF000054E48D /* HeapTimer.h */,
</span><ins>+                                0FADE6721D4D23BC00768457 /* HeapUtil.h */,
</ins><span class="cx">                                 FE7BA60D1A1A7CEC00F1F7B4 /* HeapVerifier.cpp */,
</span><span class="cx">                                 FE7BA60E1A1A7CEC00F1F7B4 /* HeapVerifier.h */,
</span><span class="cx">                                 C25F8BCB157544A900245B71 /* IncrementalSweeper.cpp */,
</span><span class="lines">@@ -5305,6 +5345,8 @@
</span><span class="cx">                                 C25F8BCC157544A900245B71 /* IncrementalSweeper.h */,
</span><span class="cx">                                 0F766D2915A8CC34008F363E /* JITStubRoutineSet.cpp */,
</span><span class="cx">                                 0F766D2A15A8CC34008F363E /* JITStubRoutineSet.h */,
</span><ins>+                                0F070A451D543A89006E7232 /* LargeAllocation.cpp */,
+                                0F070A461D543A89006E7232 /* LargeAllocation.h */,
</ins><span class="cx">                                 0F431736146BAC65007E3890 /* ListableHandler.h */,
</span><span class="cx">                                 FE3913511B794AC900EDAF71 /* LiveObjectData.h */,
</span><span class="cx">                                 FE3913521B794AC900EDAF71 /* LiveObjectList.cpp */,
</span><span class="lines">@@ -5656,6 +5698,7 @@
</span><span class="cx">                                 A7A8AF2817ADB5F3005AB174 /* ArrayBufferView.h */,
</span><span class="cx">                                 BC7952060E15E8A800A898AB /* ArrayConstructor.cpp */,
</span><span class="cx">                                 BC7952070E15E8A800A898AB /* ArrayConstructor.h */,
</span><ins>+                                0FB415831D78F98200DF8D09 /* ArrayConventions.cpp */,
</ins><span class="cx">                                 0FB7F38915ED8E3800F167B2 /* ArrayConventions.h */,
</span><span class="cx">                                 A7BDAEC217F4EA1400F6140C /* ArrayIteratorPrototype.cpp */,
</span><span class="cx">                                 A7BDAEC317F4EA1400F6140C /* ArrayIteratorPrototype.h */,
</span><span class="lines">@@ -5662,6 +5705,8 @@
</span><span class="cx">                                 F692A84D0255597D01FF60F7 /* ArrayPrototype.cpp */,
</span><span class="cx">                                 F692A84E0255597D01FF60F7 /* ArrayPrototype.h */,
</span><span class="cx">                                 0FB7F38A15ED8E3800F167B2 /* ArrayStorage.h */,
</span><ins>+                                0F38D2A01D44196600680499 /* AuxiliaryBarrier.h */,
+                                0F38D2A11D44196600680499 /* AuxiliaryBarrierInlines.h */,
</ins><span class="cx">                                 52678F8C1A031009006A306D /* BasicBlockLocation.cpp */,
</span><span class="cx">                                 52678F8D1A031009006A306D /* BasicBlockLocation.h */,
</span><span class="cx">                                 147B83AA0E6DB8C9004775A4 /* BatchedTransitionOptimizer.h */,
</span><span class="lines">@@ -5826,7 +5871,6 @@
</span><span class="cx">                                 70DC3E081B2DF2C700054299 /* IteratorPrototype.h */,
</span><span class="cx">                                 93ADFCE60CCBD7AC00D30B08 /* JSArray.cpp */,
</span><span class="cx">                                 938772E5038BFE19008635CE /* JSArray.h */,
</span><del>-                                539FB8B91C99DA7C00940FA1 /* JSArrayInlines.h */,
</del><span class="cx">                                 0F2B66B417B6B5AB00A7AE3F /* JSArrayBuffer.cpp */,
</span><span class="cx">                                 0F2B66B517B6B5AB00A7AE3F /* JSArrayBuffer.h */,
</span><span class="cx">                                 0F2B66B617B6B5AB00A7AE3F /* JSArrayBufferConstructor.cpp */,
</span><span class="lines">@@ -5836,6 +5880,7 @@
</span><span class="cx">                                 0F2B66BA17B6B5AB00A7AE3F /* JSArrayBufferView.cpp */,
</span><span class="cx">                                 0F2B66BB17B6B5AB00A7AE3F /* JSArrayBufferView.h */,
</span><span class="cx">                                 0F2B66BC17B6B5AB00A7AE3F /* JSArrayBufferViewInlines.h */,
</span><ins>+                                539FB8B91C99DA7C00940FA1 /* JSArrayInlines.h */,
</ins><span class="cx">                                 86FA9E8F142BBB2D001773B7 /* JSBoundFunction.cpp */,
</span><span class="cx">                                 86FA9E90142BBB2E001773B7 /* JSBoundFunction.h */,
</span><span class="cx">                                 657CF45619BF6662004ACBF2 /* JSCallee.cpp */,
</span><span class="lines">@@ -5904,6 +5949,8 @@
</span><span class="cx">                                 A74DEF90182D991400522C22 /* JSMapIterator.h */,
</span><span class="cx">                                 E3D239C61B829C1C00BBEF67 /* JSModuleEnvironment.cpp */,
</span><span class="cx">                                 E3D239C71B829C1C00BBEF67 /* JSModuleEnvironment.h */,
</span><ins>+                                1879510614C540FFB561C124 /* JSModuleLoader.cpp */,
+                                77B25CB2C3094A92A38E1DB3 /* JSModuleLoader.h */,
</ins><span class="cx">                                 E318CBBE1B8AEF5100A2929D /* JSModuleNamespaceObject.cpp */,
</span><span class="cx">                                 E318CBBF1B8AEF5100A2929D /* JSModuleNamespaceObject.h */,
</span><span class="cx">                                 E39DA4A41B7E8B7C0084F33A /* JSModuleRecord.cpp */,
</span><span class="lines">@@ -6096,6 +6143,8 @@
</span><span class="cx">                                 0F0CD4C315F6B6B50032F1C0 /* SparseArrayValueMap.cpp */,
</span><span class="cx">                                 0FB7F39215ED8E3800F167B2 /* SparseArrayValueMap.h */,
</span><span class="cx">                                 0F3AC751183EA1040032029F /* StackAlignment.h */,
</span><ins>+                                0F6DB7E71D6124B200CDBF8E /* StackFrame.cpp */,
+                                0F6DB7E81D6124B200CDBF8E /* StackFrame.h */,
</ins><span class="cx">                                 A730B6111250068F009D25B1 /* StrictEvalActivation.cpp */,
</span><span class="cx">                                 A730B6101250068F009D25B1 /* StrictEvalActivation.h */,
</span><span class="cx">                                 BC18C3C00E16EE3300B34460 /* StringConstructor.cpp */,
</span><span class="lines">@@ -6184,8 +6233,6 @@
</span><span class="cx">                                 709FB8661AE335C60039D069 /* WeakSetPrototype.h */,
</span><span class="cx">                                 A7DCB77912E3D90500911940 /* WriteBarrier.h */,
</span><span class="cx">                                 C2B6D75218A33793004A9301 /* WriteBarrierInlines.h */,
</span><del>-                                77B25CB2C3094A92A38E1DB3 /* JSModuleLoader.h */,
-                                1879510614C540FFB561C124 /* JSModuleLoader.cpp */,
</del><span class="cx">                         );
</span><span class="cx">                         path = runtime;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="lines">@@ -6628,6 +6675,7 @@
</span><span class="cx">                                 8640923C156EED3B00566CB2 /* MacroAssemblerARM64.h */,
</span><span class="cx">                                 A729009B17976C6000317298 /* MacroAssemblerARMv7.cpp */,
</span><span class="cx">                                 86ADD1440FDDEA980006EEC2 /* MacroAssemblerARMv7.h */,
</span><ins>+                                0F6DB7EB1D617D0F00CDBF8E /* MacroAssemblerCodeRef.cpp */,
</ins><span class="cx">                                 863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */,
</span><span class="cx">                                 86C568DE11A213EE0007F7F0 /* MacroAssemblerMIPS.h */,
</span><span class="cx">                                 FE68C6351B90DDD90042BCB3 /* MacroAssemblerPrinter.cpp */,
</span><span class="lines">@@ -7239,6 +7287,7 @@
</span><span class="cx">                                 99DA00A91BD5993100F4575C /* builtins_generate_separate_header.py in Headers */,
</span><span class="cx">                                 0F338E111BF0276C0013C88F /* B3OpaqueByproduct.h in Headers */,
</span><span class="cx">                                 FEA0C4031CDD7D1D00481991 /* FunctionWhitelist.h in Headers */,
</span><ins>+                                0F6DB7E91D6124B500CDBF8E /* StackFrame.h in Headers */,
</ins><span class="cx">                                 E3A421431D6F58930007C617 /* PreciseJumpTargetsInlines.h in Headers */,
</span><span class="cx">                                 99DA00AA1BD5993100F4575C /* builtins_generate_separate_implementation.py in Headers */,
</span><span class="cx">                                 99DA00A31BD5993100F4575C /* builtins_generator.py in Headers */,
</span><span class="lines">@@ -7331,6 +7380,7 @@
</span><span class="cx">                                 0F338E1C1BF286EA0013C88F /* B3BlockInsertionSet.h in Headers */,
</span><span class="cx">                                 0F9495881C57F47500413A48 /* B3StackSlot.h in Headers */,
</span><span class="cx">                                 C4F4B6F31A05C944005CAB76 /* cpp_generator_templates.py in Headers */,
</span><ins>+                                0F38D2A21D44196800680499 /* AuxiliaryBarrier.h in Headers */,
</ins><span class="cx">                                 5DE6E5B30E1728EC00180407 /* create_hash_table in Headers */,
</span><span class="cx">                                 9959E92B1BD17FA4001AA413 /* cssmin.py in Headers */,
</span><span class="cx">                                 2A111246192FCE79005EE18D /* CustomGetterSetter.h in Headers */,
</span><span class="lines">@@ -7460,6 +7510,7 @@
</span><span class="cx">                                 A7D9A29817A0BC7400EE2618 /* DFGLICMPhase.h in Headers */,
</span><span class="cx">                                 99D6A1161BEAD34D00E25C37 /* RemoteAutomationTarget.h in Headers */,
</span><span class="cx">                                 79C4B15E1BA2158F00FD592E /* DFGLiveCatchVariablePreservationPhase.h in Headers */,
</span><ins>+                                0F86A26F1D6F7B3300CB0C92 /* GCTypeMap.h in Headers */,
</ins><span class="cx">                                 A7D89CFC17A0B8CC00773AD8 /* DFGLivenessAnalysisPhase.h in Headers */,
</span><span class="cx">                                 0FF0F19B16B729FA005DF95B /* DFGLongLivedState.h in Headers */,
</span><span class="cx">                                 0F338DF21BE93AD10013C88F /* B3StackmapValue.h in Headers */,
</span><span class="lines">@@ -7556,6 +7607,7 @@
</span><span class="cx">                                 0FFFC96014EF90BD00C72532 /* DFGVirtualRegisterAllocationPhase.h in Headers */,
</span><span class="cx">                                 0FC97F4218202119002C9B26 /* DFGWatchpointCollectionPhase.h in Headers */,
</span><span class="cx">                                 0FDB2CE8174830A2007B3C1B /* DFGWorklist.h in Headers */,
</span><ins>+                                0F070A491D543A93006E7232 /* HeapCellInlines.h in Headers */,
</ins><span class="cx">                                 0FE050181AA9091100D33B33 /* DirectArguments.h in Headers */,
</span><span class="cx">                                 0FE050161AA9091100D33B33 /* DirectArgumentsOffset.h in Headers */,
</span><span class="cx">                                 0FF42731158EBD54004CB9FF /* Disassembler.h in Headers */,
</span><span class="lines">@@ -7686,6 +7738,7 @@
</span><span class="cx">                                 0FE0501A1AA9091100D33B33 /* GenericArgumentsInlines.h in Headers */,
</span><span class="cx">                                 FE3A06C01C11041A00390FDD /* JITRightShiftGenerator.h in Headers */,
</span><span class="cx">                                 708EBE241CE8F35800453146 /* IntlObjectInlines.h in Headers */,
</span><ins>+                                0F070A481D543A90006E7232 /* CellContainerInlines.h in Headers */,
</ins><span class="cx">                                 FE6029D91D6E1E4F0030204D /* ThrowScopeLocation.h in Headers */,
</span><span class="cx">                                 0FE0501B1AA9091100D33B33 /* GenericOffset.h in Headers */,
</span><span class="cx">                                 0F2B66E017B6B5AB00A7AE3F /* GenericTypedArrayView.h in Headers */,
</span><span class="lines">@@ -7773,6 +7826,7 @@
</span><span class="cx">                                 A1587D6E1B4DC14100D69849 /* IntlDateTimeFormat.h in Headers */,
</span><span class="cx">                                 FE187A0F1C030D6C0038BBCA /* SnippetOperand.h in Headers */,
</span><span class="cx">                                 A1587D701B4DC14100D69849 /* IntlDateTimeFormatConstructor.h in Headers */,
</span><ins>+                                0FADE6731D4D23BE00768457 /* HeapUtil.h in Headers */,
</ins><span class="cx">                                 A1587D751B4DC1C600D69849 /* IntlDateTimeFormatConstructor.lut.h in Headers */,
</span><span class="cx">                                 A5398FAB1C750DA40060A963 /* HeapProfiler.h in Headers */,
</span><span class="cx">                                 A1587D721B4DC14100D69849 /* IntlDateTimeFormatPrototype.h in Headers */,
</span><span class="lines">@@ -7897,6 +7951,7 @@
</span><span class="cx">                                 C25D709C16DE99F400FCA6BC /* JSManagedValue.h in Headers */,
</span><span class="cx">                                 2A4BB7F318A41179008A0FCD /* JSManagedValueInternal.h in Headers */,
</span><span class="cx">                                 A700874217CBE8EB00C3E643 /* JSMap.h in Headers */,
</span><ins>+                                0F38D2A31D44196D00680499 /* AuxiliaryBarrierInlines.h in Headers */,
</ins><span class="cx">                                 A74DEF96182D991400522C22 /* JSMapIterator.h in Headers */,
</span><span class="cx">                                 9959E92D1BD17FA4001AA413 /* jsmin.py in Headers */,
</span><span class="cx">                                 E3D239C91B829C1C00BBEF67 /* JSModuleEnvironment.h in Headers */,
</span><span class="lines">@@ -7934,6 +7989,7 @@
</span><span class="cx">                                 BC18C4270E16F5CD00B34460 /* JSString.h in Headers */,
</span><span class="cx">                                 86E85539111B9968001AF51E /* JSStringBuilder.h in Headers */,
</span><span class="cx">                                 70EC0EC31AA0D7DA00B6AAFA /* JSStringIterator.h in Headers */,
</span><ins>+                                0F070A471D543A8B006E7232 /* CellContainer.h in Headers */,
</ins><span class="cx">                                 2600B5A7152BAAA70091EE5F /* JSStringJoiner.h in Headers */,
</span><span class="cx">                                 BC18C4280E16F5CD00B34460 /* JSStringRef.h in Headers */,
</span><span class="cx">                                 43AB26C61C1A535900D82AE6 /* B3MathExtras.h in Headers */,
</span><span class="lines">@@ -8004,6 +8060,7 @@
</span><span class="cx">                                 14B723B812D7DA6F003BD5ED /* MachineStackMarker.h in Headers */,
</span><span class="cx">                                 86C36EEA0EE1289D00B3DF59 /* MacroAssembler.h in Headers */,
</span><span class="cx">                                 43422A671C16267800E2EB98 /* B3ReduceDoubleToFloat.h in Headers */,
</span><ins>+                                0F070A4B1D543A98006E7232 /* LargeAllocation.h in Headers */,
</ins><span class="cx">                                 86D3B2C610156BDE002865E7 /* MacroAssemblerARM.h in Headers */,
</span><span class="cx">                                 A1A009C01831A22D00CF8711 /* MacroAssemblerARM64.h in Headers */,
</span><span class="cx">                                 86ADD1460FDDEA980006EEC2 /* MacroAssemblerARMv7.h in Headers */,
</span><span class="lines">@@ -8051,6 +8108,7 @@
</span><span class="cx">                                 BC18C4440E16F5CD00B34460 /* NumberPrototype.h in Headers */,
</span><span class="cx">                                 996B73211BDA08EF00331B84 /* NumberPrototype.lut.h in Headers */,
</span><span class="cx">                                 142D3939103E4560007DCB52 /* NumericStrings.h in Headers */,
</span><ins>+                                0F5513A61D5A682C00C32BD8 /* FreeList.h in Headers */,
</ins><span class="cx">                                 A5EA710C19F6DE820098F5EC /* objc_generator.py in Headers */,
</span><span class="cx">                                 C4F4B6F61A05C984005CAB76 /* objc_generator_templates.py in Headers */,
</span><span class="cx">                                 86F3EEBD168CDE930077B92A /* ObjCCallbackFunction.h in Headers */,
</span><span class="lines">@@ -8832,6 +8890,7 @@
</span><span class="cx">                                 0FEC856F1BDACDC70080FF74 /* AirArg.cpp in Sources */,
</span><span class="cx">                                 0F4DE1CE1C4C1B54004D6C11 /* AirFixObviousSpills.cpp in Sources */,
</span><span class="cx">                                 0FEC85711BDACDC70080FF74 /* AirBasicBlock.cpp in Sources */,
</span><ins>+                                0F070A4A1D543A95006E7232 /* LargeAllocation.cpp in Sources */,
</ins><span class="cx">                                 0FEC85731BDACDC70080FF74 /* AirCCallSpecial.cpp in Sources */,
</span><span class="cx">                                 0FEC85751BDACDC70080FF74 /* AirCode.cpp in Sources */,
</span><span class="cx">                                 0F4570381BE44C910062A629 /* AirEliminateDeadCode.cpp in Sources */,
</span><span class="lines">@@ -9092,6 +9151,7 @@
</span><span class="cx">                                 A78A977A179738B8009DF744 /* DFGPlan.cpp in Sources */,
</span><span class="cx">                                 0FBE0F7416C1DB090082C5E8 /* DFGPredictionInjectionPhase.cpp in Sources */,
</span><span class="cx">                                 0FFFC95D14EF90B300C72532 /* DFGPredictionPropagationPhase.cpp in Sources */,
</span><ins>+                                0F86A26D1D6F796500CB0C92 /* HeapOperation.cpp in Sources */,
</ins><span class="cx">                                 0F3E01AA19D353A500F61B7F /* DFGPrePostNumbering.cpp in Sources */,
</span><span class="cx">                                 0F2B9CEC19D0BA7D00B1D1B5 /* DFGPromotedHeapLocation.cpp in Sources */,
</span><span class="cx">                                 0FB17662196B8F9E0091052A /* DFGPureValue.cpp in Sources */,
</span><span class="lines">@@ -9253,6 +9313,7 @@
</span><span class="cx">                                 0FE34C191C4B39AE0003A512 /* AirLogRegisterPressure.cpp in Sources */,
</span><span class="cx">                                 A1B9E2391B4E0D6700BC7FED /* IntlCollator.cpp in Sources */,
</span><span class="cx">                                 A1B9E23B1B4E0D6700BC7FED /* IntlCollatorConstructor.cpp in Sources */,
</span><ins>+                                0F6DB7EA1D6124B800CDBF8E /* StackFrame.cpp in Sources */,
</ins><span class="cx">                                 A1B9E23D1B4E0D6700BC7FED /* IntlCollatorPrototype.cpp in Sources */,
</span><span class="cx">                                 A1587D6D1B4DC14100D69849 /* IntlDateTimeFormat.cpp in Sources */,
</span><span class="cx">                                 A1587D6F1B4DC14100D69849 /* IntlDateTimeFormatConstructor.cpp in Sources */,
</span><span class="lines">@@ -9276,14 +9337,17 @@
</span><span class="cx">                                 146FE51211A710430087AE66 /* JITCall32_64.cpp in Sources */,
</span><span class="cx">                                 0F8F94441667635400D61971 /* JITCode.cpp in Sources */,
</span><span class="cx">                                 0FAF7EFD165BA91B000C8455 /* JITDisassembler.cpp in Sources */,
</span><ins>+                                0F6DB7EC1D617D1100CDBF8E /* MacroAssemblerCodeRef.cpp in Sources */,
</ins><span class="cx">                                 0F46808314BA573100BFE272 /* JITExceptions.cpp in Sources */,
</span><span class="cx">                                 0FB14E1E18124ACE009B6B4D /* JITInlineCacheGenerator.cpp in Sources */,
</span><span class="cx">                                 BCDD51EB0FB8DF74004A8BDC /* JITOpcodes.cpp in Sources */,
</span><span class="cx">                                 A71236E51195F33C00BD2174 /* JITOpcodes32_64.cpp in Sources */,
</span><span class="cx">                                 0F24E54C17EE274900ABB217 /* JITOperations.cpp in Sources */,
</span><ins>+                                0F5513A81D5A68CD00C32BD8 /* FreeList.cpp in Sources */,
</ins><span class="cx">                                 FE99B24A1C24C3D700C82159 /* JITNegGenerator.cpp in Sources */,
</span><span class="cx">                                 86CC85C40EE7A89400288682 /* JITPropertyAccess.cpp in Sources */,
</span><span class="cx">                                 A7C1E8E4112E72EF00A37F98 /* JITPropertyAccess32_64.cpp in Sources */,
</span><ins>+                                0FB415841D78FB4C00DF8D09 /* ArrayConventions.cpp in Sources */,
</ins><span class="cx">                                 0F766D2815A8CC1E008F363E /* JITStubRoutine.cpp in Sources */,
</span><span class="cx">                                 0F766D2B15A8CC38008F363E /* JITStubRoutineSet.cpp in Sources */,
</span><span class="cx">                                 FE4238901BE18C3C00514737 /* JITSubGenerator.cpp in Sources */,
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_combined_implementationpy"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_combined_implementation.py        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -72,6 +72,9 @@
</span><span class="cx">                 (&quot;JavaScriptCore&quot;, &quot;builtins/BuiltinExecutables.h&quot;),
</span><span class="cx">             ),
</span><span class="cx">             ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</span><ins>+                (&quot;JavaScriptCore&quot;, &quot;heap/HeapInlines.h&quot;),
+            ),
+            ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</ins><span class="cx">                 (&quot;JavaScriptCore&quot;, &quot;runtime/Executable.h&quot;),
</span><span class="cx">             ),
</span><span class="cx">             ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_internals_wrapper_implementationpy"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_internals_wrapper_implementation.py (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_internals_wrapper_implementation.py        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_internals_wrapper_implementation.py        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -68,6 +68,9 @@
</span><span class="cx">                 (&quot;WebCore&quot;, &quot;WebCoreJSClientData.h&quot;),
</span><span class="cx">             ),
</span><span class="cx">             ([&quot;WebCore&quot;],
</span><ins>+                (&quot;JavaScriptCore&quot;, &quot;heap/HeapInlines.h&quot;),
+            ),
+            ([&quot;WebCore&quot;],
</ins><span class="cx">                 (&quot;JavaScriptCore&quot;, &quot;heap/SlotVisitorInlines.h&quot;),
</span><span class="cx">             ),
</span><span class="cx">             ([&quot;WebCore&quot;],
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreScriptsbuiltinsbuiltins_generate_separate_implementationpy"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/Scripts/builtins/builtins_generate_separate_implementation.py        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -84,6 +84,9 @@
</span><span class="cx">                 (&quot;JavaScriptCore&quot;, &quot;builtins/BuiltinExecutables.h&quot;),
</span><span class="cx">             ),
</span><span class="cx">             ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</span><ins>+                (&quot;JavaScriptCore&quot;, &quot;heap/HeapInlines.h&quot;),
+            ),
+            ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</ins><span class="cx">                 (&quot;JavaScriptCore&quot;, &quot;runtime/Executable.h&quot;),
</span><span class="cx">             ),
</span><span class="cx">             ([&quot;JavaScriptCore&quot;, &quot;WebCore&quot;],
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerAbstractMacroAssemblerh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -725,20 +725,18 @@
</span><span class="cx">                 append(jump);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        void link(AbstractMacroAssemblerType* masm)
</del><ins>+        void link(AbstractMacroAssemblerType* masm) const
</ins><span class="cx">         {
</span><span class="cx">             size_t size = m_jumps.size();
</span><span class="cx">             for (size_t i = 0; i &lt; size; ++i)
</span><span class="cx">                 m_jumps[i].link(masm);
</span><del>-            m_jumps.clear();
</del><span class="cx">         }
</span><span class="cx">         
</span><del>-        void linkTo(Label label, AbstractMacroAssemblerType* masm)
</del><ins>+        void linkTo(Label label, AbstractMacroAssemblerType* masm) const
</ins><span class="cx">         {
</span><span class="cx">             size_t size = m_jumps.size();
</span><span class="cx">             for (size_t i = 0; i &lt; size; ++i)
</span><span class="cx">                 m_jumps[i].linkTo(label, masm);
</span><del>-            m_jumps.clear();
</del><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         void append(Jump jump)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssembler.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssembler.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssembler.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASSEMBLER)
</span><span class="cx"> 
</span><ins>+#include &quot;JSCJSValue.h&quot;
+
</ins><span class="cx"> #if CPU(ARM_THUMB2)
</span><span class="cx"> #include &quot;MacroAssemblerARMv7.h&quot;
</span><span class="cx"> namespace JSC { typedef MacroAssemblerARMv7 MacroAssemblerBase; };
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerARM64h"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -166,7 +166,10 @@
</span><span class="cx">             m_assembler.add&lt;32&gt;(dest, src, UInt12(imm.m_value));
</span><span class="cx">         else if (isUInt12(-imm.m_value))
</span><span class="cx">             m_assembler.sub&lt;32&gt;(dest, src, UInt12(-imm.m_value));
</span><del>-        else {
</del><ins>+        else if (src != dest) {
+            move(imm, dest);
+            add32(src, dest);
+        } else {
</ins><span class="cx">             move(imm, getCachedDataTempRegisterIDAndInvalidate());
</span><span class="cx">             m_assembler.add&lt;32&gt;(dest, src, dataTempRegister);
</span><span class="cx">         }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerCodeRefcppfromrev205702releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeLLIntPrototypeLoadAdaptiveStructureWatchpointcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.cpp (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;MacroAssemblerCodeRef.h&quot;
+
+#include &quot;JSCInlines.h&quot;
+#include &quot;LLIntData.h&quot;
+
+namespace JSC {
+
+MacroAssemblerCodePtr MacroAssemblerCodePtr::createLLIntCodePtr(OpcodeID codeId)
+{
+    return createFromExecutableAddress(LLInt::getCodePtr(codeId));
+}
+
+void MacroAssemblerCodePtr::dumpWithName(const char* name, PrintStream&amp; out) const
+{
+    if (!m_value) {
+        out.print(name, &quot;(null)&quot;);
+        return;
+    }
+    if (executableAddress() == dataLocation()) {
+        out.print(name, &quot;(&quot;, RawPointer(executableAddress()), &quot;)&quot;);
+        return;
+    }
+    out.print(name, &quot;(executable = &quot;, RawPointer(executableAddress()), &quot;, dataLocation = &quot;, RawPointer(dataLocation()), &quot;)&quot;);
+}
+
+void MacroAssemblerCodePtr::dump(PrintStream&amp; out) const
+{
+    dumpWithName(&quot;CodePtr&quot;, out);
+}
+
+MacroAssemblerCodeRef MacroAssemblerCodeRef::createLLIntCodeRef(OpcodeID codeId)
+{
+    return createSelfManagedCodeRef(MacroAssemblerCodePtr::createFromExecutableAddress(LLInt::getCodePtr(codeId)));
+}
+
+void MacroAssemblerCodeRef::dump(PrintStream&amp; out) const
+{
+    m_codePtr.dumpWithName(&quot;CodeRef&quot;, out);
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreassemblerMacroAssemblerCodeRefh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/assembler/MacroAssemblerCodeRef.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Disassembler.h&quot;
</span><span class="cx"> #include &quot;ExecutableAllocator.h&quot;
</span><del>-#include &quot;LLIntData.h&quot;
</del><span class="cx"> #include &lt;wtf/DataLog.h&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/PrintStream.h&gt;
</span><span class="lines">@@ -53,6 +52,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+enum OpcodeID : unsigned;
+
</ins><span class="cx"> // FunctionPtr:
</span><span class="cx"> //
</span><span class="cx"> // FunctionPtr should be used to wrap pointers to C/C++ functions in JSC
</span><span class="lines">@@ -273,10 +274,7 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static MacroAssemblerCodePtr createLLIntCodePtr(OpcodeID codeId)
-    {
-        return createFromExecutableAddress(LLInt::getCodePtr(codeId));
-    }
</del><ins>+    static MacroAssemblerCodePtr createLLIntCodePtr(OpcodeID codeId);
</ins><span class="cx"> 
</span><span class="cx">     explicit MacroAssemblerCodePtr(ReturnAddressPtr ra)
</span><span class="cx">         : m_value(ra.value())
</span><span class="lines">@@ -299,23 +297,9 @@
</span><span class="cx">         return m_value == other.m_value;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void dumpWithName(const char* name, PrintStream&amp; out) const
-    {
-        if (!m_value) {
-            out.print(name, &quot;(null)&quot;);
-            return;
-        }
-        if (executableAddress() == dataLocation()) {
-            out.print(name, &quot;(&quot;, RawPointer(executableAddress()), &quot;)&quot;);
-            return;
-        }
-        out.print(name, &quot;(executable = &quot;, RawPointer(executableAddress()), &quot;, dataLocation = &quot;, RawPointer(dataLocation()), &quot;)&quot;);
-    }
</del><ins>+    void dumpWithName(const char* name, PrintStream&amp; out) const;
</ins><span class="cx">     
</span><del>-    void dump(PrintStream&amp; out) const
-    {
-        dumpWithName(&quot;CodePtr&quot;, out);
-    }
</del><ins>+    void dump(PrintStream&amp; out) const;
</ins><span class="cx">     
</span><span class="cx">     enum EmptyValueTag { EmptyValue };
</span><span class="cx">     enum DeletedValueTag { DeletedValue };
</span><span class="lines">@@ -389,10 +373,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     // Helper for creating self-managed code refs from LLInt.
</span><del>-    static MacroAssemblerCodeRef createLLIntCodeRef(OpcodeID codeId)
-    {
-        return createSelfManagedCodeRef(MacroAssemblerCodePtr::createFromExecutableAddress(LLInt::getCodePtr(codeId)));
-    }
</del><ins>+    static MacroAssemblerCodeRef createLLIntCodeRef(OpcodeID codeId);
</ins><span class="cx"> 
</span><span class="cx">     ExecutableMemoryHandle* executableMemory() const
</span><span class="cx">     {
</span><span class="lines">@@ -418,10 +399,7 @@
</span><span class="cx">     
</span><span class="cx">     explicit operator bool() const { return !!m_codePtr; }
</span><span class="cx">     
</span><del>-    void dump(PrintStream&amp; out) const
-    {
-        m_codePtr.dumpWithName(&quot;CodeRef&quot;, out);
-    }
</del><ins>+    void dump(PrintStream&amp; out) const;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     MacroAssemblerCodePtr m_codePtr;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3BasicBlockcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -85,6 +85,11 @@
</span><span class="cx">     return appendIntConstant(proc, likeValue-&gt;origin(), likeValue-&gt;type(), value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* BasicBlock::appendBoolConstant(Procedure&amp; proc, Origin origin, bool value)
+{
+    return appendIntConstant(proc, origin, Int32, value ? 1 : 0);
+}
+
</ins><span class="cx"> void BasicBlock::clearSuccessors()
</span><span class="cx"> {
</span><span class="cx">     m_successors.clear();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3BasicBlockh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3BasicBlock.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -82,6 +82,7 @@
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE Value* appendIntConstant(Procedure&amp;, Origin, Type, int64_t value);
</span><span class="cx">     Value* appendIntConstant(Procedure&amp;, Value* likeValue, int64_t value);
</span><ins>+    Value* appendBoolConstant(Procedure&amp;, Origin, bool);
</ins><span class="cx"> 
</span><span class="cx">     void removeLast(Procedure&amp;);
</span><span class="cx">     
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3DuplicateTailscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3DuplicateTails.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3DuplicateTails.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3DuplicateTails.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -71,8 +71,12 @@
</span><span class="cx">         IndexSet&lt;BasicBlock&gt; candidates;
</span><span class="cx"> 
</span><span class="cx">         for (BasicBlock* block : m_proc) {
</span><del>-            if (block-&gt;size() &gt; m_maxSize || block-&gt;numSuccessors() &gt; m_maxSuccessors)
</del><ins>+            if (block-&gt;size() &gt; m_maxSize)
</ins><span class="cx">                 continue;
</span><ins>+            if (block-&gt;numSuccessors() &gt; m_maxSuccessors)
+                continue;
+            if (block-&gt;last()-&gt;type() != Void) // Demoting doesn't handle terminals with values.
+                continue;
</ins><span class="cx"> 
</span><span class="cx">             candidates.add(block);
</span><span class="cx">         }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreb3B3StackmapGenerationParamsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3StackmapGenerationParams.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3StackmapGenerationParams.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/B3StackmapGenerationParams.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx">     // This is computed lazily, so it won't work if you capture StackmapGenerationParams by value.
</span><span class="cx">     // Returns true if the successor at the given index is going to be emitted right after the
</span><span class="cx">     // patchpoint.
</span><del>-    bool fallsThroughToSuccessor(unsigned successorIndex) const;
</del><ins>+    JS_EXPORT_PRIVATE bool fallsThroughToSuccessor(unsigned successorIndex) const;
</ins><span class="cx"> 
</span><span class="cx">     // This is provided for convenience; it means that you don't have to capture it if you don't want to.
</span><span class="cx">     JS_EXPORT_PRIVATE Procedure&amp; proc() const;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreb3testb3cpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/testb3.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/testb3.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/b3/testb3.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -12920,6 +12920,80 @@
</span><span class="cx">     CHECK(terminal.args[2].kind() == Air::Arg::BitImm || terminal.args[2].kind() == Air::Arg::BitImm64);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void testPatchpointTerminalReturnValue(bool successIsRare)
+{
+    // This is a unit test for how FTL's heap allocation fast paths behave.
+    Procedure proc;
+    
+    BasicBlock* root = proc.addBlock();
+    BasicBlock* success = proc.addBlock();
+    BasicBlock* slowPath = proc.addBlock();
+    BasicBlock* continuation = proc.addBlock();
+    
+    Value* arg = root-&gt;appendNew&lt;Value&gt;(
+        proc, Trunc, Origin(),
+        root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR0));
+    
+    PatchpointValue* patchpoint = root-&gt;appendNew&lt;PatchpointValue&gt;(proc, Int32, Origin());
+    patchpoint-&gt;effects.terminal = true;
+    patchpoint-&gt;clobber(RegisterSet::macroScratchRegisters());
+    
+    if (successIsRare) {
+        root-&gt;appendSuccessor(FrequentedBlock(success, FrequencyClass::Rare));
+        root-&gt;appendSuccessor(slowPath);
+    } else {
+        root-&gt;appendSuccessor(success);
+        root-&gt;appendSuccessor(FrequentedBlock(slowPath, FrequencyClass::Rare));
+    }
+    
+    patchpoint-&gt;appendSomeRegister(arg);
+    
+    patchpoint-&gt;setGenerator(
+        [&amp;] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
+            AllowMacroScratchRegisterUsage allowScratch(jit);
+            
+            CCallHelpers::Jump jumpToSlow =
+                jit.branch32(CCallHelpers::Above, params[1].gpr(), CCallHelpers::TrustedImm32(42));
+            
+            jit.add32(CCallHelpers::TrustedImm32(31), params[1].gpr(), params[0].gpr());
+            
+            CCallHelpers::Jump jumpToSuccess;
+            if (!params.fallsThroughToSuccessor(0))
+                jumpToSuccess = jit.jump();
+            
+            Vector&lt;Box&lt;CCallHelpers::Label&gt;&gt; labels = params.successorLabels();
+            
+            params.addLatePath(
+                [=] (CCallHelpers&amp; jit) {
+                    jumpToSlow.linkTo(*labels[1], &amp;jit);
+                    if (jumpToSuccess.isSet())
+                        jumpToSuccess.linkTo(*labels[0], &amp;jit);
+                });
+        });
+    
+    UpsilonValue* successUpsilon = success-&gt;appendNew&lt;UpsilonValue&gt;(proc, Origin(), patchpoint);
+    success-&gt;appendNew&lt;Value&gt;(proc, Jump, Origin());
+    success-&gt;setSuccessors(continuation);
+    
+    UpsilonValue* slowPathUpsilon = slowPath-&gt;appendNew&lt;UpsilonValue&gt;(
+        proc, Origin(), slowPath-&gt;appendNew&lt;Const32Value&gt;(proc, Origin(), 666));
+    slowPath-&gt;appendNew&lt;Value&gt;(proc, Jump, Origin());
+    slowPath-&gt;setSuccessors(continuation);
+    
+    Value* phi = continuation-&gt;appendNew&lt;Value&gt;(proc, Phi, Int32, Origin());
+    successUpsilon-&gt;setPhi(phi);
+    slowPathUpsilon-&gt;setPhi(phi);
+    continuation-&gt;appendNew&lt;Value&gt;(proc, Return, Origin(), phi);
+    
+    auto code = compile(proc);
+    CHECK_EQ(invoke&lt;int&gt;(*code, 0), 31);
+    CHECK_EQ(invoke&lt;int&gt;(*code, 1), 32);
+    CHECK_EQ(invoke&lt;int&gt;(*code, 41), 72);
+    CHECK_EQ(invoke&lt;int&gt;(*code, 42), 73);
+    CHECK_EQ(invoke&lt;int&gt;(*code, 43), 666);
+    CHECK_EQ(invoke&lt;int&gt;(*code, -1), 666);
+}
+
</ins><span class="cx"> // Make sure the compiler does not try to optimize anything out.
</span><span class="cx"> NEVER_INLINE double zero()
</span><span class="cx"> {
</span><span class="lines">@@ -14337,6 +14411,8 @@
</span><span class="cx">     RUN(testEntrySwitchLoop());
</span><span class="cx"> 
</span><span class="cx">     RUN(testSomeEarlyRegister());
</span><ins>+    RUN(testPatchpointTerminalReturnValue(true));
+    RUN(testPatchpointTerminalReturnValue(false));
</ins><span class="cx">     
</span><span class="cx">     if (isX86()) {
</span><span class="cx">         RUN(testBranchBitAndImmFusion(Identity, Int64, 1, Air::BranchTest32, Air::Arg::Tmp));
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebindingsScriptValuecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bindings/ScriptValue.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bindings/ScriptValue.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bindings/ScriptValue.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,9 +32,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;APICast.h&quot;
</span><span class="cx"> #include &quot;InspectorValues.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSLock.h&quot;
</span><del>-#include &quot;JSObjectInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> using namespace Inspector;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeAdaptiveInferredPropertyValueWatchpointBasecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,8 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;AdaptiveInferredPropertyValueWatchpointBase.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCellInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeBytecodeLivenessAnalysiscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeLivenessAnalysis.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;FullBytecodeLiveness.h&quot;
</span><span class="cx"> #include &quot;InterpreterInlines.h&quot;
</span><ins>+#include &quot;PreciseJumpTargets.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeBytecodeRewritercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeRewriter.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeRewriter.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeRewriter.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;BytecodeRewriter.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;HeapInlines.h&quot;
</ins><span class="cx"> #include &quot;PreciseJumpTargetsInlines.h&quot;
</span><span class="cx"> #include &lt;wtf/BubbleSort.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeBytecodeUseDefh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeUseDef.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeUseDef.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/BytecodeUseDef.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #define BytecodeUseDef_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCallLinkInfocpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;DFGOperations.h&quot;
</span><span class="cx"> #include &quot;DFGThunks.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#include &quot;Opcode.h&quot;
</ins><span class="cx"> #include &quot;Repatch.h&quot;
</span><span class="cx"> #include &lt;wtf/ListDump.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -36,6 +37,22 @@
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+CallLinkInfo::CallType CallLinkInfo::callTypeFor(OpcodeID opcodeID)
+{
+    if (opcodeID == op_call || opcodeID == op_call_eval)
+        return Call;
+    if (opcodeID == op_call_varargs)
+        return CallVarargs;
+    if (opcodeID == op_construct)
+        return Construct;
+    if (opcodeID == op_construct_varargs)
+        return ConstructVarargs;
+    if (opcodeID == op_tail_call)
+        return TailCall;
+    ASSERT(opcodeID == op_tail_call_varargs || op_tail_call_forward_arguments);
+    return TailCallVarargs;
+}
+
</ins><span class="cx"> CallLinkInfo::CallLinkInfo()
</span><span class="cx">     : m_hasSeenShouldRepatch(false)
</span><span class="cx">     , m_hasSeenClosure(false)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCallLinkInfoh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkInfo.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> #include &quot;CodeSpecializationKind.h&quot;
</span><span class="cx"> #include &quot;JITWriteBarrier.h&quot;
</span><span class="cx"> #include &quot;JSFunction.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &quot;PolymorphicCallStubRoutine.h&quot;
</span><span class="cx"> #include &quot;WriteBarrier.h&quot;
</span><span class="cx"> #include &lt;wtf/SentinelLinkedList.h&gt;
</span><span class="lines">@@ -40,26 +39,13 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> 
</span><ins>+enum OpcodeID : unsigned;
</ins><span class="cx"> struct CallFrameShuffleData;
</span><span class="cx"> 
</span><span class="cx"> class CallLinkInfo : public BasicRawSentinelNode&lt;CallLinkInfo&gt; {
</span><span class="cx"> public:
</span><span class="cx">     enum CallType { None, Call, CallVarargs, Construct, ConstructVarargs, TailCall, TailCallVarargs };
</span><del>-    static CallType callTypeFor(OpcodeID opcodeID)
-    {
-        if (opcodeID == op_call || opcodeID == op_call_eval)
-            return Call;
-        if (opcodeID == op_call_varargs)
-            return CallVarargs;
-        if (opcodeID == op_construct)
-            return Construct;
-        if (opcodeID == op_construct_varargs)
-            return ConstructVarargs;
-        if (opcodeID == op_tail_call)
-            return TailCall;
-        ASSERT(opcodeID == op_tail_call_varargs || op_tail_call_forward_arguments);
-        return TailCallVarargs;
-    }
</del><ins>+    static CallType callTypeFor(OpcodeID opcodeID);
</ins><span class="cx"> 
</span><span class="cx">     static bool isVarargsCallType(CallType callType)
</span><span class="cx">     {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCallLinkStatuscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CallLinkStatus.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;DFGJITCode.h&quot;
</span><span class="cx"> #include &quot;InlineCallFrame.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;LLIntCallLinkInfo.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &lt;wtf/CommaPrinter.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSLexicalEnvironment.h&quot;
</span><span class="cx"> #include &quot;JSModuleEnvironment.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;LLIntEntrypoint.h&quot;
</span><span class="cx"> #include &quot;LLIntPrototypeLoadAdaptiveStructureWatchpoint.h&quot;
</span><span class="cx"> #include &quot;LowLevelInterpreter.h&quot;
</span><span class="lines">@@ -70,6 +71,7 @@
</span><span class="cx"> #include &quot;VMInlines.h&quot;
</span><span class="cx"> #include &lt;wtf/BagToHashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/CommaPrinter.h&gt;
</span><ins>+#include &lt;wtf/SimpleStats.h&gt;
</ins><span class="cx"> #include &lt;wtf/StringExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/StringPrintStream.h&gt;
</span><span class="cx"> #include &lt;wtf/text/UniquedStringImpl.h&gt;
</span><span class="lines">@@ -1876,7 +1878,7 @@
</span><span class="cx">         m_rareData-&gt;m_stringSwitchJumpTables = other.m_rareData-&gt;m_stringSwitchJumpTables;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    heap()-&gt;m_codeBlocks.add(this);
</del><ins>+    heap()-&gt;m_codeBlocks-&gt;add(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CodeBlock::CodeBlock(VM* vm, Structure* structure, ScriptExecutable* ownerExecutable, UnlinkedCodeBlock* unlinkedCodeBlock,
</span><span class="lines">@@ -2342,7 +2344,7 @@
</span><span class="cx">     if (Options::dumpGeneratedBytecodes())
</span><span class="cx">         dumpBytecode();
</span><span class="cx">     
</span><del>-    heap()-&gt;m_codeBlocks.add(this);
</del><ins>+    heap()-&gt;m_codeBlocks-&gt;add(this);
</ins><span class="cx">     heap()-&gt;reportExtraMemoryAllocated(m_instructions.size() * sizeof(Instruction));
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2379,7 +2381,7 @@
</span><span class="cx"> {
</span><span class="cx">     Base::finishCreation(vm);
</span><span class="cx"> 
</span><del>-    heap()-&gt;m_codeBlocks.add(this);
</del><ins>+    heap()-&gt;m_codeBlocks-&gt;add(this);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -2783,6 +2785,14 @@
</span><span class="cx">     codeBlock-&gt;determineLiveness(visitor);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void CodeBlock::clearLLIntGetByIdCache(Instruction* instruction)
+{
+    instruction[0].u.opcode = LLInt::getOpcode(op_get_by_id);
+    instruction[4].u.pointer = nullptr;
+    instruction[5].u.pointer = nullptr;
+    instruction[6].u.pointer = nullptr;
+}
+
</ins><span class="cx"> void CodeBlock::finalizeLLIntInlineCaches()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(WEBASSEMBLY)
</span><span class="lines">@@ -4184,12 +4194,12 @@
</span><span class="cx">     if (!m_vm)
</span><span class="cx">         return 0;
</span><span class="cx">     
</span><del>-    if (!m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT)
</del><ins>+    if (!*m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT)
</ins><span class="cx">         return 0; // It's as good of a prediction as we'll get.
</span><span class="cx">     
</span><span class="cx">     // Be conservative: return a size that will be an overestimation 84% of the time.
</span><del>-    double multiplier = m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT.mean() +
-        m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT.standardDeviation();
</del><ins>+    double multiplier = m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT-&gt;mean() +
+        m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT-&gt;standardDeviation();
</ins><span class="cx">     
</span><span class="cx">     // Be paranoid: silently reject bogus multipiers. Silently doing the &quot;wrong&quot; thing
</span><span class="cx">     // here is OK, since this whole method is just a heuristic.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeCodeBlockh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/CodeBlock.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -293,6 +293,8 @@
</span><span class="cx">     {
</span><span class="cx">         return m_jitCodeMap.get();
</span><span class="cx">     }
</span><ins>+    
+    static void clearLLIntGetByIdCache(Instruction*);
</ins><span class="cx"> 
</span><span class="cx">     unsigned bytecodeOffset(Instruction* returnAddress)
</span><span class="cx">     {
</span><span class="lines">@@ -1283,14 +1285,6 @@
</span><span class="cx"> };
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-inline void clearLLIntGetByIdCache(Instruction* instruction)
-{
-    instruction[0].u.opcode = LLInt::getOpcode(op_get_by_id);
-    instruction[4].u.pointer = nullptr;
-    instruction[5].u.pointer = nullptr;
-    instruction[6].u.pointer = nullptr;
-}
-
</del><span class="cx"> inline Register&amp; ExecState::r(int index)
</span><span class="cx"> {
</span><span class="cx">     CodeBlock* codeBlock = this-&gt;codeBlock();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeExecutionCounterh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ExecutionCounter.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ExecutionCounter.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ExecutionCounter.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;Options.h&quot;
</span><span class="cx"> #include &lt;wtf/PrintStream.h&gt;
</span><del>-#include &lt;wtf/SimpleStats.h&gt;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeInstructionh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Instruction.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Instruction.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Instruction.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BasicBlockLocation.h&quot;
</span><span class="cx"> #include &quot;MacroAssembler.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &quot;PutByIdFlags.h&quot;
</span><span class="cx"> #include &quot;SymbolTable.h&quot;
</span><span class="cx"> #include &quot;TypeLocation.h&quot;
</span><span class="lines">@@ -52,6 +51,12 @@
</span><span class="cx"> struct LLIntCallLinkInfo;
</span><span class="cx"> struct ValueProfile;
</span><span class="cx"> 
</span><ins>+#if ENABLE(COMPUTED_GOTO_OPCODES)
+typedef void* Opcode;
+#else
+typedef OpcodeID Opcode;
+#endif
+
</ins><span class="cx"> struct Instruction {
</span><span class="cx">     Instruction()
</span><span class="cx">     {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeLLIntPrototypeLoadAdaptiveStructureWatchpointcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;Instruction.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> 
</span><span class="cx">     StringFireDetail stringDetail(out.toCString().data());
</span><span class="cx"> 
</span><del>-    clearLLIntGetByIdCache(m_getByIdInstruction);
</del><ins>+    CodeBlock::clearLLIntGetByIdCache(m_getByIdInstruction);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeObjectAllocationProfileh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ObjectAllocationProfile.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ObjectAllocationProfile.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/ObjectAllocationProfile.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -45,7 +45,7 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool isNull() { return !m_allocator; }
</del><ins>+    bool isNull() { return !m_structure; }
</ins><span class="cx"> 
</span><span class="cx">     void initialize(VM&amp; vm, JSCell* owner, JSObject* prototype, unsigned inferredInlineCapacity)
</span><span class="cx">     {
</span><span class="lines">@@ -80,14 +80,15 @@
</span><span class="cx">         ASSERT(inlineCapacity &lt;= JSFinalObject::maxInlineCapacity());
</span><span class="cx"> 
</span><span class="cx">         size_t allocationSize = JSFinalObject::allocationSize(inlineCapacity);
</span><del>-        MarkedAllocator* allocator = &amp;vm.heap.allocatorForObjectWithoutDestructor(allocationSize);
-        ASSERT(allocator-&gt;cellSize());
-
</del><ins>+        MarkedAllocator* allocator = vm.heap.allocatorForObjectWithoutDestructor(allocationSize);
+        
</ins><span class="cx">         // Take advantage of extra inline capacity available in the size class.
</span><del>-        size_t slop = (allocator-&gt;cellSize() - allocationSize) / sizeof(WriteBarrier&lt;Unknown&gt;);
-        inlineCapacity += slop;
-        if (inlineCapacity &gt; JSFinalObject::maxInlineCapacity())
-            inlineCapacity = JSFinalObject::maxInlineCapacity();
</del><ins>+        if (allocator) {
+            size_t slop = (allocator-&gt;cellSize() - allocationSize) / sizeof(WriteBarrier&lt;Unknown&gt;);
+            inlineCapacity += slop;
+            if (inlineCapacity &gt; JSFinalObject::maxInlineCapacity())
+                inlineCapacity = JSFinalObject::maxInlineCapacity();
+        }
</ins><span class="cx"> 
</span><span class="cx">         Structure* structure = vm.prototypeMap.emptyObjectStructureForPrototype(prototype, inlineCapacity);
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeOpcodeh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Opcode.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Opcode.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/Opcode.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> #define OPCODE_ID_ENUM(opcode, length) opcode,
</span><del>-    typedef enum { FOR_EACH_OPCODE_ID(OPCODE_ID_ENUM) } OpcodeID;
</del><ins>+    enum OpcodeID : unsigned { FOR_EACH_OPCODE_ID(OPCODE_ID_ENUM) };
</ins><span class="cx"> #undef OPCODE_ID_ENUM
</span><span class="cx"> 
</span><span class="cx"> const int maxOpcodeLength = 9;
</span><span class="lines">@@ -75,10 +75,19 @@
</span><span class="cx">     const int opcodeLengths[numOpcodeIDs] = { FOR_EACH_OPCODE_ID(OPCODE_ID_LENGTH_MAP) };
</span><span class="cx"> #undef OPCODE_ID_LENGTH_MAP
</span><span class="cx"> 
</span><ins>+#if COMPILER(GCC)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored &quot;-Wtype-limits&quot;
+#endif
+
</ins><span class="cx"> #define VERIFY_OPCODE_ID(id, size) COMPILE_ASSERT(id &lt;= numOpcodeIDs, ASSERT_THAT_JS_OPCODE_IDS_ARE_VALID);
</span><span class="cx">     FOR_EACH_OPCODE_ID(VERIFY_OPCODE_ID);
</span><span class="cx"> #undef VERIFY_OPCODE_ID
</span><span class="cx"> 
</span><ins>+#if COMPILER(GCC)
+#pragma GCC diagnostic pop
+#endif
+
</ins><span class="cx"> #if ENABLE(COMPUTED_GOTO_OPCODES)
</span><span class="cx"> typedef void* Opcode;
</span><span class="cx"> #else
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodePolymorphicAccesscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1206,19 +1206,18 @@
</span><span class="cx">             size_t newSize = newStructure()-&gt;outOfLineCapacity() * sizeof(JSValue);
</span><span class="cx">             
</span><span class="cx">             if (allocatingInline) {
</span><del>-                CopiedAllocator* copiedAllocator = &amp;vm.heap.storageAllocator();
-
-                if (!reallocating) {
-                    jit.loadPtr(&amp;copiedAllocator-&gt;m_currentRemaining, scratchGPR);
-                    slowPath.append(
-                        jit.branchSubPtr(
-                            CCallHelpers::Signed, CCallHelpers::TrustedImm32(newSize), scratchGPR));
-                    jit.storePtr(scratchGPR, &amp;copiedAllocator-&gt;m_currentRemaining);
-                    jit.negPtr(scratchGPR);
-                    jit.addPtr(
-                        CCallHelpers::AbsoluteAddress(&amp;copiedAllocator-&gt;m_currentPayloadEnd), scratchGPR);
-                    jit.addPtr(CCallHelpers::TrustedImm32(sizeof(JSValue)), scratchGPR);
-                } else {
</del><ins>+                MarkedAllocator* allocator = vm.heap.allocatorForAuxiliaryData(newSize);
+                
+                if (!allocator) {
+                    // Yuck, this case would suck!
+                    slowPath.append(jit.jump());
+                }
+                
+                jit.move(CCallHelpers::TrustedImmPtr(allocator), scratchGPR2);
+                jit.emitAllocate(scratchGPR, allocator, scratchGPR2, scratchGPR3, slowPath);
+                jit.addPtr(CCallHelpers::TrustedImm32(newSize + sizeof(IndexingHeader)), scratchGPR);
+                
+                if (reallocating) {
</ins><span class="cx">                     // Handle the case where we are reallocating (i.e. the old structure/butterfly
</span><span class="cx">                     // already had out-of-line property storage).
</span><span class="cx">                     size_t oldSize = structure()-&gt;outOfLineCapacity() * sizeof(JSValue);
</span><span class="lines">@@ -1225,15 +1224,7 @@
</span><span class="cx">                     ASSERT(newSize &gt; oldSize);
</span><span class="cx">             
</span><span class="cx">                     jit.loadPtr(CCallHelpers::Address(baseGPR, JSObject::butterflyOffset()), scratchGPR3);
</span><del>-                    jit.loadPtr(&amp;copiedAllocator-&gt;m_currentRemaining, scratchGPR);
-                    slowPath.append(
-                        jit.branchSubPtr(
-                            CCallHelpers::Signed, CCallHelpers::TrustedImm32(newSize), scratchGPR));
-                    jit.storePtr(scratchGPR, &amp;copiedAllocator-&gt;m_currentRemaining);
-                    jit.negPtr(scratchGPR);
-                    jit.addPtr(
-                        CCallHelpers::AbsoluteAddress(&amp;copiedAllocator-&gt;m_currentPayloadEnd), scratchGPR);
-                    jit.addPtr(CCallHelpers::TrustedImm32(sizeof(JSValue)), scratchGPR);
</del><ins>+                    
</ins><span class="cx">                     // We have scratchGPR = new storage, scratchGPR3 = old storage,
</span><span class="cx">                     // scratchGPR2 = available
</span><span class="cx">                     for (size_t offset = 0; offset &lt; oldSize; offset += sizeof(void*)) {
</span><span class="lines">@@ -1659,6 +1650,7 @@
</span><span class="cx">         // Cascade through the list, preferring newer entries.
</span><span class="cx">         for (unsigned i = cases.size(); i--;) {
</span><span class="cx">             fallThrough.link(&amp;jit);
</span><ins>+            fallThrough.clear();
</ins><span class="cx">             cases[i]-&gt;generateWithGuard(state, fallThrough);
</span><span class="cx">         }
</span><span class="cx">         state.failAndRepatch.append(fallThrough);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodePolymorphicAccessh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/PolymorphicAccess.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,10 +29,10 @@
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CodeOrigin.h&quot;
</span><ins>+#include &quot;JITStubRoutine.h&quot;
</ins><span class="cx"> #include &quot;JSFunctionInlines.h&quot;
</span><span class="cx"> #include &quot;MacroAssembler.h&quot;
</span><span class="cx"> #include &quot;ObjectPropertyConditionSet.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &quot;ScratchRegisterAllocator.h&quot;
</span><span class="cx"> #include &quot;Structure.h&quot;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeStructureStubInfocpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;StructureStubInfo.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;PolymorphicAccess.h&quot;
</span><span class="cx"> #include &quot;Repatch.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeStructureStubInfoh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/StructureStubInfo.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,7 +31,6 @@
</span><span class="cx"> #include &quot;JITStubRoutine.h&quot;
</span><span class="cx"> #include &quot;MacroAssembler.h&quot;
</span><span class="cx"> #include &quot;ObjectPropertyConditionSet.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &quot;Options.h&quot;
</span><span class="cx"> #include &quot;RegisterSet.h&quot;
</span><span class="cx"> #include &quot;Structure.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeSuperSamplercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #include &quot;Options.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/DataLog.h&gt;
</span><ins>+#include &lt;wtf/Lock.h&gt;
</ins><span class="cx"> #include &lt;wtf/Threading.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -36,6 +37,7 @@
</span><span class="cx"> 
</span><span class="cx"> volatile uint32_t g_superSamplerCount;
</span><span class="cx"> 
</span><ins>+static StaticLock lock;
</ins><span class="cx"> static double in;
</span><span class="cx"> static double out;
</span><span class="cx"> 
</span><span class="lines">@@ -51,10 +53,13 @@
</span><span class="cx">             const int printingPeriod = 1000;
</span><span class="cx">             for (;;) {
</span><span class="cx">                 for (int ms = 0; ms &lt; printingPeriod; ms += sleepQuantum) {
</span><del>-                    if (g_superSamplerCount)
-                        in++;
-                    else
-                        out++;
</del><ins>+                    {
+                        LockHolder locker(lock);
+                        if (g_superSamplerCount)
+                            in++;
+                        else
+                            out++;
+                    }
</ins><span class="cx">                     sleepMS(sleepQuantum);
</span><span class="cx">                 }
</span><span class="cx">                 printSuperSamplerState();
</span><span class="lines">@@ -64,11 +69,19 @@
</span><span class="cx">         });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void resetSuperSamplerState()
+{
+    LockHolder locker(lock);
+    in = 0;
+    out = 0;
+}
+
</ins><span class="cx"> void printSuperSamplerState()
</span><span class="cx"> {
</span><span class="cx">     if (!Options::useSuperSampler())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    LockHolder locker(lock);
</ins><span class="cx">     double percentage = 100.0 * in / (in + out);
</span><span class="cx">     if (percentage != percentage)
</span><span class="cx">         percentage = 0.0;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeSuperSamplerh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/SuperSampler.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx">     bool m_doSample;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+JS_EXPORT_PRIVATE void resetSuperSamplerState();
</ins><span class="cx"> JS_EXPORT_PRIVATE void printSuperSamplerState();
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -90,11 +90,6 @@
</span><span class="cx">     ASSERT(m_constructorKind == static_cast&lt;unsigned&gt;(info.constructorKind()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-VM* UnlinkedCodeBlock::vm() const
-{
-    return MarkedBlock::blockFor(this)-&gt;vm();
-}
-
</del><span class="cx"> void UnlinkedCodeBlock::visitChildren(JSCell* cell, SlotVisitor&amp; visitor)
</span><span class="cx"> {
</span><span class="cx">     UnlinkedCodeBlock* thisObject = jsCast&lt;UnlinkedCodeBlock*&gt;(cell);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedCodeBlockh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedCodeBlock.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -284,8 +284,6 @@
</span><span class="cx">     void addExceptionHandler(const UnlinkedHandlerInfo&amp; handler) { createRareDataIfNecessary(); return m_rareData-&gt;m_exceptionHandlers.append(handler); }
</span><span class="cx">     UnlinkedHandlerInfo&amp; exceptionHandler(int index) { ASSERT(m_rareData); return m_rareData-&gt;m_exceptionHandlers[index]; }
</span><span class="cx"> 
</span><del>-    VM* vm() const;
-
</del><span class="cx">     UnlinkedArrayProfile addArrayProfile() { return m_arrayProfileCount++; }
</span><span class="cx">     unsigned numberOfArrayProfiles() { return m_arrayProfileCount; }
</span><span class="cx">     UnlinkedArrayAllocationProfile addArrayAllocationProfile() { return m_arrayAllocationProfileCount++; }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedInstructionStreamcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;UnlinkedInstructionStream.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;Opcode.h&quot;
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> static void append8(unsigned char*&amp; ptr, unsigned char value)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeUnlinkedInstructionStreamh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/UnlinkedInstructionStream.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #ifndef UnlinkedInstructionStream_h
</span><span class="cx"> #define UnlinkedInstructionStream_h
</span><span class="cx"> 
</span><ins>+#include &quot;Opcode.h&quot;
</ins><span class="cx"> #include &quot;UnlinkedCodeBlock.h&quot;
</span><span class="cx"> #include &lt;wtf/RefCountedArray.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGCallArrayAllocatorSlowPathGeneratorh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGCallArrayAllocatorSlowPathGenerator.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -38,7 +38,7 @@
</span><span class="cx"> class CallArrayAllocatorSlowPathGenerator : public JumpingSlowPathGenerator&lt;MacroAssembler::JumpList&gt; {
</span><span class="cx"> public:
</span><span class="cx">     CallArrayAllocatorSlowPathGenerator(
</span><del>-        MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZ function,
</del><ins>+        MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZB function,
</ins><span class="cx">         GPRReg resultGPR, GPRReg storageGPR, Structure* structure, size_t size)
</span><span class="cx">         : JumpingSlowPathGenerator&lt;MacroAssembler::JumpList&gt;(from, jit)
</span><span class="cx">         , m_function(function)
</span><span class="lines">@@ -57,7 +57,7 @@
</span><span class="cx">         linkFrom(jit);
</span><span class="cx">         for (unsigned i = 0; i &lt; m_plans.size(); ++i)
</span><span class="cx">             jit-&gt;silentSpill(m_plans[i]);
</span><del>-        jit-&gt;callOperation(m_function, m_resultGPR, m_structure, m_size);
</del><ins>+        jit-&gt;callOperation(m_function, m_resultGPR, m_structure, m_size, m_storageGPR);
</ins><span class="cx">         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], canTrample);
</span><span class="lines">@@ -67,7 +67,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx"> private:
</span><del>-    P_JITOperation_EStZ m_function;
</del><ins>+    P_JITOperation_EStZB m_function;
</ins><span class="cx">     GPRReg m_resultGPR;
</span><span class="cx">     GPRReg m_storageGPR;
</span><span class="cx">     Structure* m_structure;
</span><span class="lines">@@ -78,8 +78,8 @@
</span><span class="cx"> class CallArrayAllocatorWithVariableSizeSlowPathGenerator : public JumpingSlowPathGenerator&lt;MacroAssembler::JumpList&gt; {
</span><span class="cx"> public:
</span><span class="cx">     CallArrayAllocatorWithVariableSizeSlowPathGenerator(
</span><del>-        MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZ function,
-        GPRReg resultGPR, Structure* contiguousStructure, Structure* arrayStorageStructure, GPRReg sizeGPR)
</del><ins>+        MacroAssembler::JumpList from, SpeculativeJIT* jit, P_JITOperation_EStZB function,
+        GPRReg resultGPR, Structure* contiguousStructure, Structure* arrayStorageStructure, GPRReg sizeGPR, GPRReg storageGPR)
</ins><span class="cx">         : JumpingSlowPathGenerator&lt;MacroAssembler::JumpList&gt;(from, jit)
</span><span class="cx">         , m_function(function)
</span><span class="cx">         , m_resultGPR(resultGPR)
</span><span class="lines">@@ -86,6 +86,7 @@
</span><span class="cx">         , m_contiguousStructure(contiguousStructure)
</span><span class="cx">         , m_arrayStorageOrContiguousStructure(arrayStorageStructure)
</span><span class="cx">         , m_sizeGPR(sizeGPR)
</span><ins>+        , m_storageGPR(storageGPR)
</ins><span class="cx">     {
</span><span class="cx">         jit-&gt;silentSpillAllRegistersImpl(false, m_plans, resultGPR);
</span><span class="cx">     }
</span><span class="lines">@@ -96,7 +97,7 @@
</span><span class="cx">         linkFrom(jit);
</span><span class="cx">         for (unsigned i = 0; i &lt; m_plans.size(); ++i)
</span><span class="cx">             jit-&gt;silentSpill(m_plans[i]);
</span><del>-        GPRReg scratchGPR = AssemblyHelpers::selectScratchGPR(m_sizeGPR);
</del><ins>+        GPRReg scratchGPR = AssemblyHelpers::selectScratchGPR(m_sizeGPR, m_storageGPR);
</ins><span class="cx">         if (m_contiguousStructure != m_arrayStorageOrContiguousStructure) {
</span><span class="cx">             MacroAssembler::Jump bigLength = jit-&gt;m_jit.branch32(MacroAssembler::AboveOrEqual, m_sizeGPR, MacroAssembler::TrustedImm32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH));
</span><span class="cx">             jit-&gt;m_jit.move(MacroAssembler::TrustedImmPtr(m_contiguousStructure), scratchGPR);
</span><span class="lines">@@ -106,7 +107,7 @@
</span><span class="cx">             done.link(&amp;jit-&gt;m_jit);
</span><span class="cx">         } else
</span><span class="cx">             jit-&gt;m_jit.move(MacroAssembler::TrustedImmPtr(m_contiguousStructure), scratchGPR);
</span><del>-        jit-&gt;callOperation(m_function, m_resultGPR, scratchGPR, m_sizeGPR);
</del><ins>+        jit-&gt;callOperation(m_function, m_resultGPR, scratchGPR, m_sizeGPR, m_storageGPR);
</ins><span class="cx">         GPRReg canTrample = SpeculativeJIT::pickCanTrample(m_resultGPR);
</span><span class="cx">         for (unsigned i = m_plans.size(); i--;)
</span><span class="cx">             jit-&gt;silentFill(m_plans[i], canTrample);
</span><span class="lines">@@ -115,11 +116,12 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx"> private:
</span><del>-    P_JITOperation_EStZ m_function;
</del><ins>+    P_JITOperation_EStZB m_function;
</ins><span class="cx">     GPRReg m_resultGPR;
</span><span class="cx">     Structure* m_contiguousStructure;
</span><span class="cx">     Structure* m_arrayStorageOrContiguousStructure;
</span><span class="cx">     GPRReg m_sizeGPR;
</span><ins>+    GPRReg m_storageGPR;
</ins><span class="cx">     Vector&lt;SilentRegisterSavePlan, 2&gt; m_plans;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGOperationscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -933,17 +933,20 @@
</span><span class="cx">     return bitwise_cast&lt;char*&gt;(JSArray::create(*vm, arrayStructure));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-char* JIT_OPERATION operationNewArrayWithSize(ExecState* exec, Structure* arrayStructure, int32_t size)
</del><ins>+char* JIT_OPERATION operationNewArrayWithSize(ExecState* exec, Structure* arrayStructure, int32_t size, Butterfly* butterfly)
</ins><span class="cx"> {
</span><del>-    VM* vm = &amp;exec-&gt;vm();
-    NativeCallFrameTracer tracer(vm, exec);
-    auto scope = DECLARE_THROW_SCOPE(*vm);
</del><ins>+    VM&amp; vm = exec-&gt;vm();
+    NativeCallFrameTracer tracer(&amp;vm, exec);
+    auto scope = DECLARE_THROW_SCOPE(vm);
</ins><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(size &lt; 0))
</span><span class="cx">         return bitwise_cast&lt;char*&gt;(throwException(exec, scope, createRangeError(exec, ASCIILiteral(&quot;Array size is not a small enough positive integer.&quot;))));
</span><span class="cx"> 
</span><del>-    JSArray* result = JSArray::create(*vm, arrayStructure, size);
-    result-&gt;butterfly(); // Ensure that the backing store is in to-space.
</del><ins>+    JSArray* result;
+    if (butterfly)
+        result = JSArray::createWithButterfly(vm, arrayStructure, butterfly);
+    else
+        result = JSArray::create(vm, arrayStructure, size);
</ins><span class="cx">     return bitwise_cast&lt;char*&gt;(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -1629,13 +1632,13 @@
</span><span class="cx">     return 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-char* JIT_OPERATION operationNewRawObject(ExecState* exec, Structure* structure, int32_t length)
</del><ins>+char* JIT_OPERATION operationNewRawObject(ExecState* exec, Structure* structure, int32_t length, Butterfly* butterfly)
</ins><span class="cx"> {
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="cx"> 
</span><del>-    Butterfly* butterfly;
-    if (structure-&gt;outOfLineCapacity() || hasIndexedProperties(structure-&gt;indexingType())) {
</del><ins>+    if (!butterfly
+        &amp;&amp; (structure-&gt;outOfLineCapacity() || hasIndexedProperties(structure-&gt;indexingType()))) {
</ins><span class="cx">         IndexingHeader header;
</span><span class="cx">         header.setVectorLength(length);
</span><span class="cx">         header.setPublicLength(0);
</span><span class="lines">@@ -1644,8 +1647,7 @@
</span><span class="cx">             vm, nullptr, 0, structure-&gt;outOfLineCapacity(),
</span><span class="cx">             hasIndexedProperties(structure-&gt;indexingType()), header,
</span><span class="cx">             length * sizeof(EncodedJSValue));
</span><del>-    } else
-        butterfly = nullptr;
</del><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     JSObject* result = JSObject::createRawObject(exec, structure, butterfly);
</span><span class="cx">     result-&gt;butterfly(); // Ensure that the butterfly is in to-space.
</span><span class="lines">@@ -1652,13 +1654,15 @@
</span><span class="cx">     return bitwise_cast&lt;char*&gt;(result);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSCell* JIT_OPERATION operationNewObjectWithButterfly(ExecState* exec, Structure* structure)
</del><ins>+JSCell* JIT_OPERATION operationNewObjectWithButterfly(ExecState* exec, Structure* structure, Butterfly* butterfly)
</ins><span class="cx"> {
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="cx">     
</span><del>-    Butterfly* butterfly = Butterfly::create(
-        vm, nullptr, 0, structure-&gt;outOfLineCapacity(), false, IndexingHeader(), 0);
</del><ins>+    if (!butterfly) {
+        butterfly = Butterfly::create(
+            vm, nullptr, 0, structure-&gt;outOfLineCapacity(), false, IndexingHeader(), 0);
+    }
</ins><span class="cx">     
</span><span class="cx">     JSObject* result = JSObject::createRawObject(exec, structure, butterfly);
</span><span class="cx">     result-&gt;butterfly(); // Ensure that the butterfly is in to-space.
</span><span class="lines">@@ -1665,7 +1669,7 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-JSCell* JIT_OPERATION operationNewObjectWithButterflyWithIndexingHeaderAndVectorLength(ExecState* exec, Structure* structure, unsigned length)
</del><ins>+JSCell* JIT_OPERATION operationNewObjectWithButterflyWithIndexingHeaderAndVectorLength(ExecState* exec, Structure* structure, unsigned length, Butterfly* butterfly)
</ins><span class="cx"> {
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="lines">@@ -1673,10 +1677,14 @@
</span><span class="cx">     IndexingHeader header;
</span><span class="cx">     header.setVectorLength(length);
</span><span class="cx">     header.setPublicLength(0);
</span><del>-    Butterfly* butterfly = Butterfly::create(
-        vm, nullptr, 0, structure-&gt;outOfLineCapacity(), true, header,
-        sizeof(EncodedJSValue) * length);
-
</del><ins>+    if (butterfly)
+        *butterfly-&gt;indexingHeader() = header;
+    else {
+        butterfly = Butterfly::create(
+            vm, nullptr, 0, structure-&gt;outOfLineCapacity(), true, header,
+            sizeof(EncodedJSValue) * length);
+    }
+    
</ins><span class="cx">     // Paradoxically this may allocate a JSArray. That's totally cool.
</span><span class="cx">     JSObject* result = JSObject::createRawObject(exec, structure, butterfly);
</span><span class="cx">     result-&gt;butterfly(); // Ensure that the butterfly is in to-space.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGOperationsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGOperations.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -70,7 +70,7 @@
</span><span class="cx"> char* JIT_OPERATION operationNewArray(ExecState*, Structure*, void*, size_t) WTF_INTERNAL;
</span><span class="cx"> char* JIT_OPERATION operationNewArrayBuffer(ExecState*, Structure*, size_t, size_t) WTF_INTERNAL;
</span><span class="cx"> char* JIT_OPERATION operationNewEmptyArray(ExecState*, Structure*) WTF_INTERNAL;
</span><del>-char* JIT_OPERATION operationNewArrayWithSize(ExecState*, Structure*, int32_t) WTF_INTERNAL;
</del><ins>+char* JIT_OPERATION operationNewArrayWithSize(ExecState*, Structure*, int32_t, Butterfly*) WTF_INTERNAL;
</ins><span class="cx"> char* JIT_OPERATION operationNewInt8ArrayWithSize(ExecState*, Structure*, int32_t) WTF_INTERNAL;
</span><span class="cx"> char* JIT_OPERATION operationNewInt8ArrayWithOneArgument(ExecState*, Structure*, EncodedJSValue) WTF_INTERNAL;
</span><span class="cx"> char* JIT_OPERATION operationNewInt16ArrayWithSize(ExecState*, Structure*, int32_t) WTF_INTERNAL;
</span><span class="lines">@@ -176,9 +176,9 @@
</span><span class="cx"> 
</span><span class="cx"> size_t JIT_OPERATION operationDefaultHasInstance(ExecState*, JSCell* value, JSCell* proto);
</span><span class="cx"> 
</span><del>-char* JIT_OPERATION operationNewRawObject(ExecState*, Structure*, int32_t) WTF_INTERNAL;
-JSCell* JIT_OPERATION operationNewObjectWithButterfly(ExecState*, Structure*) WTF_INTERNAL;
-JSCell* JIT_OPERATION operationNewObjectWithButterflyWithIndexingHeaderAndVectorLength(ExecState*, Structure*, unsigned length) WTF_INTERNAL;
</del><ins>+char* JIT_OPERATION operationNewRawObject(ExecState*, Structure*, int32_t, Butterfly*) WTF_INTERNAL;
+JSCell* JIT_OPERATION operationNewObjectWithButterfly(ExecState*, Structure*, Butterfly*) WTF_INTERNAL;
+JSCell* JIT_OPERATION operationNewObjectWithButterflyWithIndexingHeaderAndVectorLength(ExecState*, Structure*, unsigned length, Butterfly*) WTF_INTERNAL;
</ins><span class="cx"> 
</span><span class="cx"> void JIT_OPERATION operationProcessTypeProfilerLogDFG(ExecState*) WTF_INTERNAL;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJITcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">     GPRReg scratch2GPR = scratch2.gpr();
</span><span class="cx"> 
</span><span class="cx">     ASSERT(vectorLength &gt;= numElements);
</span><del>-    vectorLength = std::max(BASE_VECTOR_LEN, vectorLength);
</del><ins>+    vectorLength = Butterfly::optimalContiguousVectorLength(structure, vectorLength);
</ins><span class="cx">     
</span><span class="cx">     JITCompiler::JumpList slowCases;
</span><span class="cx"> 
</span><span class="lines">@@ -103,24 +103,31 @@
</span><span class="cx">         size += vectorLength * sizeof(JSValue) + sizeof(IndexingHeader);
</span><span class="cx">     size += outOfLineCapacity * sizeof(JSValue);
</span><span class="cx"> 
</span><ins>+    m_jit.move(TrustedImmPtr(0), storageGPR);
+    
</ins><span class="cx">     if (size) {
</span><del>-        slowCases.append(
-            emitAllocateBasicStorage(TrustedImm32(size), storageGPR));
-        if (hasIndexingHeader)
-            m_jit.subPtr(TrustedImm32(vectorLength * sizeof(JSValue)), storageGPR);
-        else
-            m_jit.addPtr(TrustedImm32(sizeof(IndexingHeader)), storageGPR);
-    } else
-        m_jit.move(TrustedImmPtr(0), storageGPR);
</del><ins>+        if (MarkedAllocator* allocator = m_jit.vm()-&gt;heap.allocatorForAuxiliaryData(size)) {
+            m_jit.move(TrustedImmPtr(allocator), scratchGPR);
+            m_jit.emitAllocate(storageGPR, allocator, scratchGPR, scratch2GPR, slowCases);
+            
+            m_jit.addPtr(
+                TrustedImm32(outOfLineCapacity * sizeof(JSValue) + sizeof(IndexingHeader)),
+                storageGPR);
+            
+            if (hasIndexingHeader)
+                m_jit.store32(TrustedImm32(vectorLength), MacroAssembler::Address(storageGPR, Butterfly::offsetOfVectorLength()));
+        } else
+            slowCases.append(m_jit.jump());
+    }
</ins><span class="cx"> 
</span><span class="cx">     size_t allocationSize = JSFinalObject::allocationSize(inlineCapacity);
</span><del>-    MarkedAllocator* allocatorPtr = &amp;m_jit.vm()-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
-    m_jit.move(TrustedImmPtr(allocatorPtr), scratchGPR);
-    emitAllocateJSObject(resultGPR, scratchGPR, TrustedImmPtr(structure), storageGPR, scratch2GPR, slowCases);
</del><ins>+    MarkedAllocator* allocatorPtr = m_jit.vm()-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
+    if (allocatorPtr) {
+        m_jit.move(TrustedImmPtr(allocatorPtr), scratchGPR);
+        emitAllocateJSObject(resultGPR, allocatorPtr, scratchGPR, TrustedImmPtr(structure), storageGPR, scratch2GPR, slowCases);
+    } else
+        slowCases.append(m_jit.jump());
</ins><span class="cx"> 
</span><del>-    if (hasIndexingHeader)
-        m_jit.store32(TrustedImm32(vectorLength), MacroAssembler::Address(storageGPR, Butterfly::offsetOfVectorLength()));
-
</del><span class="cx">     // I want a slow path that also loads out the storage pointer, and that's
</span><span class="cx">     // what this custom CallArrayAllocatorSlowPathGenerator gives me. It's a lot
</span><span class="cx">     // of work for a very small piece of functionality. :-/
</span><span class="lines">@@ -128,14 +135,20 @@
</span><span class="cx">         slowCases, this, operationNewRawObject, resultGPR, storageGPR,
</span><span class="cx">         structure, vectorLength));
</span><span class="cx"> 
</span><del>-    if (hasDouble(structure-&gt;indexingType()) &amp;&amp; numElements &lt; vectorLength) {
</del><ins>+    if (numElements &lt; vectorLength) {
</ins><span class="cx"> #if USE(JSVALUE64)
</span><del>-        m_jit.move(TrustedImm64(bitwise_cast&lt;int64_t&gt;(PNaN)), scratchGPR);
</del><ins>+        if (hasDouble(structure-&gt;indexingType()))
+            m_jit.move(TrustedImm64(bitwise_cast&lt;int64_t&gt;(PNaN)), scratchGPR);
+        else
+            m_jit.move(TrustedImm64(JSValue::encode(JSValue())), scratchGPR);
</ins><span class="cx">         for (unsigned i = numElements; i &lt; vectorLength; ++i)
</span><span class="cx">             m_jit.store64(scratchGPR, MacroAssembler::Address(storageGPR, sizeof(double) * i));
</span><span class="cx"> #else
</span><span class="cx">         EncodedValueDescriptor value;
</span><del>-        value.asInt64 = JSValue::encode(JSValue(JSValue::EncodeAsDouble, PNaN));
</del><ins>+        if (hasDouble(structure-&gt;indexingType()))
+            value.asInt64 = JSValue::encode(JSValue(JSValue::EncodeAsDouble, PNaN));
+        else
+            value.asInt64 = JSValue::encode(JSValue());
</ins><span class="cx">         for (unsigned i = numElements; i &lt; vectorLength; ++i) {
</span><span class="cx">             m_jit.store32(TrustedImm32(value.asBits.tag), MacroAssembler::Address(storageGPR, sizeof(double) * i + OBJECT_OFFSETOF(JSValue, u.asBits.tag)));
</span><span class="cx">             m_jit.store32(TrustedImm32(value.asBits.payload), MacroAssembler::Address(storageGPR, sizeof(double) * i + OBJECT_OFFSETOF(JSValue, u.asBits.payload)));
</span><span class="lines">@@ -3823,9 +3836,10 @@
</span><span class="cx">     GPRReg scratchGPR = scratch.gpr();
</span><span class="cx">     
</span><span class="cx">     JITCompiler::JumpList slowPath;
</span><del>-    MarkedAllocator&amp; markedAllocator = m_jit.vm()-&gt;heap.allocatorForObjectWithDestructor(sizeof(JSRopeString));
-    m_jit.move(TrustedImmPtr(&amp;markedAllocator), allocatorGPR);
-    emitAllocateJSCell(resultGPR, allocatorGPR, TrustedImmPtr(m_jit.vm()-&gt;stringStructure.get()), scratchGPR, slowPath);
</del><ins>+    MarkedAllocator* markedAllocator = m_jit.vm()-&gt;heap.allocatorForObjectWithDestructor(sizeof(JSRopeString));
+    RELEASE_ASSERT(markedAllocator);
+    m_jit.move(TrustedImmPtr(markedAllocator), allocatorGPR);
+    emitAllocateJSCell(resultGPR, markedAllocator, allocatorGPR, TrustedImmPtr(m_jit.vm()-&gt;stringStructure.get()), scratchGPR, slowPath);
</ins><span class="cx">         
</span><span class="cx">     m_jit.storePtr(TrustedImmPtr(0), JITCompiler::Address(resultGPR, JSString::offsetOfValue()));
</span><span class="cx">     for (unsigned i = 0; i &lt; numOpGPRs; ++i)
</span><span class="lines">@@ -6908,7 +6922,14 @@
</span><span class="cx"> 
</span><span class="cx"> void SpeculativeJIT::compileAllocatePropertyStorage(Node* node)
</span><span class="cx"> {
</span><del>-    if (node-&gt;transition()-&gt;previous-&gt;couldHaveIndexingHeader()) {
</del><ins>+    ASSERT(!node-&gt;transition()-&gt;previous-&gt;outOfLineCapacity());
+    ASSERT(initialOutOfLineCapacity == node-&gt;transition()-&gt;next-&gt;outOfLineCapacity());
+    
+    size_t size = initialOutOfLineCapacity * sizeof(JSValue);
+
+    MarkedAllocator* allocator = m_jit.vm()-&gt;heap.allocatorForAuxiliaryData(size);
+
+    if (!allocator || node-&gt;transition()-&gt;previous-&gt;couldHaveIndexingHeader()) {
</ins><span class="cx">         SpeculateCellOperand base(this, node-&gt;child1());
</span><span class="cx">         
</span><span class="cx">         GPRReg baseGPR = base.gpr();
</span><span class="lines">@@ -6925,18 +6946,18 @@
</span><span class="cx">     
</span><span class="cx">     SpeculateCellOperand base(this, node-&gt;child1());
</span><span class="cx">     GPRTemporary scratch1(this);
</span><ins>+    GPRTemporary scratch2(this);
+    GPRTemporary scratch3(this);
</ins><span class="cx">         
</span><span class="cx">     GPRReg baseGPR = base.gpr();
</span><span class="cx">     GPRReg scratchGPR1 = scratch1.gpr();
</span><ins>+    GPRReg scratchGPR2 = scratch2.gpr();
+    GPRReg scratchGPR3 = scratch3.gpr();
</ins><span class="cx">         
</span><del>-    ASSERT(!node-&gt;transition()-&gt;previous-&gt;outOfLineCapacity());
-    ASSERT(initialOutOfLineCapacity == node-&gt;transition()-&gt;next-&gt;outOfLineCapacity());
-    
-    JITCompiler::Jump slowPath =
-        emitAllocateBasicStorage(
-            TrustedImm32(initialOutOfLineCapacity * sizeof(JSValue)), scratchGPR1);
-
-    m_jit.addPtr(JITCompiler::TrustedImm32(sizeof(IndexingHeader)), scratchGPR1);
</del><ins>+    m_jit.move(JITCompiler::TrustedImmPtr(allocator), scratchGPR2);
+    JITCompiler::JumpList slowPath;
+    m_jit.emitAllocate(scratchGPR1, allocator, scratchGPR2, scratchGPR3, slowPath);
+    m_jit.addPtr(JITCompiler::TrustedImm32(size + sizeof(IndexingHeader)), scratchGPR1);
</ins><span class="cx">         
</span><span class="cx">     addSlowPathGenerator(
</span><span class="cx">         slowPathCall(slowPath, this, operationAllocatePropertyStorageWithInitialCapacity, scratchGPR1));
</span><span class="lines">@@ -6951,8 +6972,10 @@
</span><span class="cx">     size_t oldSize = node-&gt;transition()-&gt;previous-&gt;outOfLineCapacity() * sizeof(JSValue);
</span><span class="cx">     size_t newSize = oldSize * outOfLineGrowthFactor;
</span><span class="cx">     ASSERT(newSize == node-&gt;transition()-&gt;next-&gt;outOfLineCapacity() * sizeof(JSValue));
</span><ins>+    
+    MarkedAllocator* allocator = m_jit.vm()-&gt;heap.allocatorForAuxiliaryData(newSize);
</ins><span class="cx"> 
</span><del>-    if (node-&gt;transition()-&gt;previous-&gt;couldHaveIndexingHeader()) {
</del><ins>+    if (!allocator || node-&gt;transition()-&gt;previous-&gt;couldHaveIndexingHeader()) {
</ins><span class="cx">         SpeculateCellOperand base(this, node-&gt;child1());
</span><span class="cx">         
</span><span class="cx">         GPRReg baseGPR = base.gpr();
</span><span class="lines">@@ -6971,17 +6994,20 @@
</span><span class="cx">     StorageOperand oldStorage(this, node-&gt;child2());
</span><span class="cx">     GPRTemporary scratch1(this);
</span><span class="cx">     GPRTemporary scratch2(this);
</span><ins>+    GPRTemporary scratch3(this);
</ins><span class="cx">         
</span><span class="cx">     GPRReg baseGPR = base.gpr();
</span><span class="cx">     GPRReg oldStorageGPR = oldStorage.gpr();
</span><span class="cx">     GPRReg scratchGPR1 = scratch1.gpr();
</span><span class="cx">     GPRReg scratchGPR2 = scratch2.gpr();
</span><ins>+    GPRReg scratchGPR3 = scratch3.gpr();
+    
+    JITCompiler::JumpList slowPath;
+    m_jit.move(JITCompiler::TrustedImmPtr(allocator), scratchGPR2);
+    m_jit.emitAllocate(scratchGPR1, allocator, scratchGPR2, scratchGPR3, slowPath);
+    
+    m_jit.addPtr(JITCompiler::TrustedImm32(newSize + sizeof(IndexingHeader)), scratchGPR1);
</ins><span class="cx">         
</span><del>-    JITCompiler::Jump slowPath =
-        emitAllocateBasicStorage(TrustedImm32(newSize), scratchGPR1);
-
-    m_jit.addPtr(JITCompiler::TrustedImm32(sizeof(IndexingHeader)), scratchGPR1);
-        
</del><span class="cx">     addSlowPathGenerator(
</span><span class="cx">         slowPathCall(slowPath, this, operationAllocatePropertyStorage, scratchGPR1, newSize / sizeof(JSValue)));
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1003,6 +1003,26 @@
</span><span class="cx">         m_jit.setupArgumentsWithExecState(arg1, arg2);
</span><span class="cx">         return appendCallSetResult(operation, result);
</span><span class="cx">     }
</span><ins>+    JITCompiler::Call callOperation(P_JITOperation_EStZB operation, GPRReg result, Structure* structure, GPRReg arg2, GPRReg butterfly)
+    {
+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), arg2, butterfly);
+        return appendCallSetResult(operation, result);
+    }
+    JITCompiler::Call callOperation(P_JITOperation_EStZB operation, GPRReg result, Structure* structure, size_t arg2, GPRReg butterfly)
+    {
+        m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImm32(arg2), butterfly);
+        return appendCallSetResult(operation, result);
+    }
+    JITCompiler::Call callOperation(P_JITOperation_EStZB operation, GPRReg result, GPRReg arg1, GPRReg arg2, GPRReg butterfly)
+    {
+        m_jit.setupArgumentsWithExecState(arg1, arg2, butterfly);
+        return appendCallSetResult(operation, result);
+    }
+    JITCompiler::Call callOperation(P_JITOperation_EStZB operation, GPRReg result, GPRReg arg1, GPRReg arg2, Butterfly* butterfly)
+    {
+        m_jit.setupArgumentsWithExecState(arg1, arg2, TrustedImmPtr(butterfly));
+        return appendCallSetResult(operation, result);
+    }
</ins><span class="cx">     JITCompiler::Call callOperation(P_JITOperation_EStPS operation, GPRReg result, Structure* structure, void* pointer, size_t size)
</span><span class="cx">     {
</span><span class="cx">         m_jit.setupArgumentsWithExecState(TrustedImmPtr(structure), TrustedImmPtr(pointer), TrustedImmPtr(size));
</span><span class="lines">@@ -2557,18 +2577,21 @@
</span><span class="cx"> 
</span><span class="cx">     // Allocator for a cell of a specific size.
</span><span class="cx">     template &lt;typename StructureType&gt; // StructureType can be GPR or ImmPtr.
</span><del>-    void emitAllocateJSCell(GPRReg resultGPR, GPRReg allocatorGPR, StructureType structure,
</del><ins>+    void emitAllocateJSCell(
+        GPRReg resultGPR, MarkedAllocator* allocator, GPRReg allocatorGPR, StructureType structure,
</ins><span class="cx">         GPRReg scratchGPR, MacroAssembler::JumpList&amp; slowPath)
</span><span class="cx">     {
</span><del>-        m_jit.emitAllocateJSCell(resultGPR, allocatorGPR, structure, scratchGPR, slowPath);
</del><ins>+        m_jit.emitAllocateJSCell(resultGPR, allocator, allocatorGPR, structure, scratchGPR, slowPath);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Allocator for an object of a specific size.
</span><span class="cx">     template &lt;typename StructureType, typename StorageType&gt; // StructureType and StorageType can be GPR or ImmPtr.
</span><del>-    void emitAllocateJSObject(GPRReg resultGPR, GPRReg allocatorGPR, StructureType structure,
</del><ins>+    void emitAllocateJSObject(
+        GPRReg resultGPR, MarkedAllocator* allocator, GPRReg allocatorGPR, StructureType structure,
</ins><span class="cx">         StorageType storage, GPRReg scratchGPR, MacroAssembler::JumpList&amp; slowPath)
</span><span class="cx">     {
</span><del>-        m_jit.emitAllocateJSObject(resultGPR, allocatorGPR, structure, storage, scratchGPR, slowPath);
</del><ins>+        m_jit.emitAllocateJSObject(
+            resultGPR, allocator, allocatorGPR, structure, storage, scratchGPR, slowPath);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     template &lt;typename ClassType, typename StructureType, typename StorageType&gt; // StructureType and StorageType can be GPR or ImmPtr.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -3866,8 +3866,7 @@
</span><span class="cx">         bigLength.link(&amp;m_jit);
</span><span class="cx">         m_jit.move(TrustedImmPtr(globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage)), structureGPR);
</span><span class="cx">         done.link(&amp;m_jit);
</span><del>-        callOperation(
-            operationNewArrayWithSize, resultGPR, structureGPR, sizeGPR);
</del><ins>+        callOperation(operationNewArrayWithSize, resultGPR, structureGPR, sizeGPR, nullptr);
</ins><span class="cx">         m_jit.exceptionCheck();
</span><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="lines">@@ -4033,7 +4032,7 @@
</span><span class="cx">         m_jit.loadPtr(JITCompiler::Address(rareDataGPR, FunctionRareData::offsetOfObjectAllocationProfile() + ObjectAllocationProfile::offsetOfAllocator()), allocatorGPR);
</span><span class="cx">         m_jit.loadPtr(JITCompiler::Address(rareDataGPR, FunctionRareData::offsetOfObjectAllocationProfile() + ObjectAllocationProfile::offsetOfStructure()), structureGPR);
</span><span class="cx">         slowPath.append(m_jit.branchTestPtr(MacroAssembler::Zero, allocatorGPR));
</span><del>-        emitAllocateJSObject(resultGPR, allocatorGPR, structureGPR, TrustedImmPtr(0), scratchGPR, slowPath);
</del><ins>+        emitAllocateJSObject(resultGPR, nullptr, allocatorGPR, structureGPR, TrustedImmPtr(0), scratchGPR, slowPath);
</ins><span class="cx"> 
</span><span class="cx">         addSlowPathGenerator(slowPathCall(slowPath, this, operationCreateThis, resultGPR, calleeGPR, node-&gt;inlineCapacity()));
</span><span class="cx">         
</span><span class="lines">@@ -4054,10 +4053,10 @@
</span><span class="cx">         
</span><span class="cx">         Structure* structure = node-&gt;structure();
</span><span class="cx">         size_t allocationSize = JSFinalObject::allocationSize(structure-&gt;inlineCapacity());
</span><del>-        MarkedAllocator* allocatorPtr = &amp;m_jit.vm()-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</del><ins>+        MarkedAllocator* allocatorPtr = m_jit.vm()-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</ins><span class="cx"> 
</span><span class="cx">         m_jit.move(TrustedImmPtr(allocatorPtr), allocatorGPR);
</span><del>-        emitAllocateJSObject(resultGPR, allocatorGPR, TrustedImmPtr(structure), TrustedImmPtr(0), scratchGPR, slowPath);
</del><ins>+        emitAllocateJSObject(resultGPR, allocatorPtr, allocatorGPR, TrustedImmPtr(structure), TrustedImmPtr(0), scratchGPR, slowPath);
</ins><span class="cx"> 
</span><span class="cx">         addSlowPathGenerator(slowPathCall(slowPath, this, operationNewObject, resultGPR, structure));
</span><span class="cx">         
</span><span class="lines">@@ -5364,41 +5363,47 @@
</span><span class="cx">     GPRReg scratchGPR = scratch.gpr();
</span><span class="cx">     GPRReg scratch2GPR = scratch2.gpr();
</span><span class="cx">     
</span><ins>+    m_jit.move(TrustedImmPtr(0), storageGPR);
+            
</ins><span class="cx">     MacroAssembler::JumpList slowCases;
</span><span class="cx">     if (shouldConvertLargeSizeToArrayStorage)
</span><span class="cx">         slowCases.append(m_jit.branch32(MacroAssembler::AboveOrEqual, sizeGPR, TrustedImm32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH)));
</span><del>-    
</del><ins>+            
</ins><span class="cx">     ASSERT((1 &lt;&lt; 3) == sizeof(JSValue));
</span><span class="cx">     m_jit.move(sizeGPR, scratchGPR);
</span><span class="cx">     m_jit.lshift32(TrustedImm32(3), scratchGPR);
</span><span class="cx">     m_jit.add32(TrustedImm32(sizeof(IndexingHeader)), scratchGPR, resultGPR);
</span><del>-    slowCases.append(
-        emitAllocateBasicStorage(resultGPR, storageGPR));
-    m_jit.subPtr(scratchGPR, storageGPR);
-    Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType);
-    emitAllocateJSObject&lt;JSArray&gt;(resultGPR, TrustedImmPtr(structure), storageGPR, scratchGPR, scratch2GPR, slowCases);
-    
</del><ins>+    m_jit.emitAllocateVariableSized(
+        storageGPR, m_jit.vm()-&gt;heap.subspaceForAuxiliaryData(), resultGPR, scratchGPR,
+        scratch2GPR, slowCases);
+    m_jit.addPtr(TrustedImm32(sizeof(IndexingHeader)), storageGPR);
+
</ins><span class="cx">     m_jit.store32(sizeGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()));
</span><span class="cx">     m_jit.store32(sizeGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfVectorLength()));
</span><ins>+            
+    JSValue hole;
+    if (hasDouble(indexingType))
+        hole = JSValue(JSValue::EncodeAsDouble, PNaN);
+    else
+        hole = JSValue();
+            
+    m_jit.move(sizeGPR, scratchGPR);
+    MacroAssembler::Jump done = m_jit.branchTest32(MacroAssembler::Zero, scratchGPR);
+    MacroAssembler::Label loop = m_jit.label();
+    m_jit.sub32(TrustedImm32(1), scratchGPR);
+    m_jit.store32(TrustedImm32(hole.u.asBits.tag), MacroAssembler::BaseIndex(storageGPR, scratchGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag)));
+    m_jit.store32(TrustedImm32(hole.u.asBits.payload), MacroAssembler::BaseIndex(storageGPR, scratchGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload)));
+    m_jit.branchTest32(MacroAssembler::NonZero, scratchGPR).linkTo(loop, &amp;m_jit);
+    done.link(&amp;m_jit);
</ins><span class="cx">     
</span><del>-    if (hasDouble(indexingType)) {
-        JSValue nan = JSValue(JSValue::EncodeAsDouble, PNaN);
-        
-        m_jit.move(sizeGPR, scratchGPR);
-        MacroAssembler::Jump done = m_jit.branchTest32(MacroAssembler::Zero, scratchGPR);
-        MacroAssembler::Label loop = m_jit.label();
-        m_jit.sub32(TrustedImm32(1), scratchGPR);
-        m_jit.store32(TrustedImm32(nan.u.asBits.tag), MacroAssembler::BaseIndex(storageGPR, scratchGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.tag)));
-        m_jit.store32(TrustedImm32(nan.u.asBits.payload), MacroAssembler::BaseIndex(storageGPR, scratchGPR, MacroAssembler::TimesEight, OBJECT_OFFSETOF(JSValue, u.asBits.payload)));
-        m_jit.branchTest32(MacroAssembler::NonZero, scratchGPR).linkTo(loop, &amp;m_jit);
-        done.link(&amp;m_jit);
-    }
-    
</del><ins>+    Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType);
+    emitAllocateJSObject&lt;JSArray&gt;(resultGPR, TrustedImmPtr(structure), storageGPR, scratchGPR, scratch2GPR, slowCases);
+            
</ins><span class="cx">     addSlowPathGenerator(std::make_unique&lt;CallArrayAllocatorWithVariableSizeSlowPathGenerator&gt;(
</span><span class="cx">         slowCases, this, operationNewArrayWithSize, resultGPR,
</span><span class="cx">         structure,
</span><span class="cx">         shouldConvertLargeSizeToArrayStorage ? globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage) : structure,
</span><del>-        sizeGPR));
</del><ins>+        sizeGPR, storageGPR));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -3818,7 +3818,7 @@
</span><span class="cx">         bigLength.link(&amp;m_jit);
</span><span class="cx">         m_jit.move(TrustedImmPtr(globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage)), structureGPR);
</span><span class="cx">         done.link(&amp;m_jit);
</span><del>-        callOperation(operationNewArrayWithSize, resultGPR, structureGPR, sizeGPR);
</del><ins>+        callOperation(operationNewArrayWithSize, resultGPR, structureGPR, sizeGPR, nullptr);
</ins><span class="cx">         m_jit.exceptionCheck();
</span><span class="cx">         cellResult(resultGPR, node);
</span><span class="cx">         break;
</span><span class="lines">@@ -3975,7 +3975,7 @@
</span><span class="cx">         m_jit.loadPtr(JITCompiler::Address(rareDataGPR, FunctionRareData::offsetOfObjectAllocationProfile() + ObjectAllocationProfile::offsetOfAllocator()), allocatorGPR);
</span><span class="cx">         m_jit.loadPtr(JITCompiler::Address(rareDataGPR, FunctionRareData::offsetOfObjectAllocationProfile() + ObjectAllocationProfile::offsetOfStructure()), structureGPR);
</span><span class="cx">         slowPath.append(m_jit.branchTestPtr(MacroAssembler::Zero, allocatorGPR));
</span><del>-        emitAllocateJSObject(resultGPR, allocatorGPR, structureGPR, TrustedImmPtr(0), scratchGPR, slowPath);
</del><ins>+        emitAllocateJSObject(resultGPR, nullptr, allocatorGPR, structureGPR, TrustedImmPtr(0), scratchGPR, slowPath);
</ins><span class="cx"> 
</span><span class="cx">         addSlowPathGenerator(slowPathCall(slowPath, this, operationCreateThis, resultGPR, calleeGPR, node-&gt;inlineCapacity()));
</span><span class="cx">         
</span><span class="lines">@@ -3996,10 +3996,10 @@
</span><span class="cx"> 
</span><span class="cx">         Structure* structure = node-&gt;structure();
</span><span class="cx">         size_t allocationSize = JSFinalObject::allocationSize(structure-&gt;inlineCapacity());
</span><del>-        MarkedAllocator* allocatorPtr = &amp;m_jit.vm()-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</del><ins>+        MarkedAllocator* allocatorPtr = m_jit.vm()-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</ins><span class="cx"> 
</span><span class="cx">         m_jit.move(TrustedImmPtr(allocatorPtr), allocatorGPR);
</span><del>-        emitAllocateJSObject(resultGPR, allocatorGPR, TrustedImmPtr(structure), TrustedImmPtr(0), scratchGPR, slowPath);
</del><ins>+        emitAllocateJSObject(resultGPR, allocatorPtr, allocatorGPR, TrustedImmPtr(structure), TrustedImmPtr(0), scratchGPR, slowPath);
</ins><span class="cx"> 
</span><span class="cx">         addSlowPathGenerator(slowPathCall(slowPath, this, operationNewObject, resultGPR, structure));
</span><span class="cx">         
</span><span class="lines">@@ -5236,7 +5236,7 @@
</span><span class="cx"> 
</span><span class="cx">         unsigned bytecodeIndex = node-&gt;origin.semantic.bytecodeIndex;
</span><span class="cx">         auto triggerIterator = m_jit.jitCode()-&gt;tierUpEntryTriggers.find(bytecodeIndex);
</span><del>-        RELEASE_ASSERT(triggerIterator != m_jit.jitCode()-&gt;tierUpEntryTriggers.end());
</del><ins>+        DFG_ASSERT(m_jit.graph(), node, triggerIterator != m_jit.jitCode()-&gt;tierUpEntryTriggers.end());
</ins><span class="cx">         uint8_t* forceEntryTrigger = &amp;(m_jit.jitCode()-&gt;tierUpEntryTriggers.find(bytecodeIndex)-&gt;value);
</span><span class="cx"> 
</span><span class="cx">         MacroAssembler::Jump forceOSREntry = m_jit.branchTest8(MacroAssembler::NonZero, MacroAssembler::AbsoluteAddress(forceEntryTrigger));
</span><span class="lines">@@ -5420,39 +5420,45 @@
</span><span class="cx">     GPRReg scratchGPR = scratch.gpr();
</span><span class="cx">     GPRReg scratch2GPR = scratch2.gpr();
</span><span class="cx">     
</span><ins>+    m_jit.move(TrustedImmPtr(0), storageGPR);
+    
</ins><span class="cx">     MacroAssembler::JumpList slowCases;
</span><span class="cx">     if (shouldConvertLargeSizeToArrayStorage)
</span><span class="cx">         slowCases.append(m_jit.branch32(MacroAssembler::AboveOrEqual, sizeGPR, TrustedImm32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH)));
</span><del>-    
</del><ins>+            
</ins><span class="cx">     ASSERT((1 &lt;&lt; 3) == sizeof(JSValue));
</span><span class="cx">     m_jit.move(sizeGPR, scratchGPR);
</span><span class="cx">     m_jit.lshift32(TrustedImm32(3), scratchGPR);
</span><span class="cx">     m_jit.add32(TrustedImm32(sizeof(IndexingHeader)), scratchGPR, resultGPR);
</span><del>-    slowCases.append(
-        emitAllocateBasicStorage(resultGPR, storageGPR));
-    m_jit.subPtr(scratchGPR, storageGPR);
-    Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType);
-    emitAllocateJSObject&lt;JSArray&gt;(resultGPR, TrustedImmPtr(structure), storageGPR, scratchGPR, scratch2GPR, slowCases);
-    
</del><ins>+    m_jit.emitAllocateVariableSized(
+        storageGPR, m_jit.vm()-&gt;heap.subspaceForAuxiliaryData(), resultGPR, scratchGPR,
+        scratch2GPR, slowCases);
+    m_jit.addPtr(TrustedImm32(sizeof(IndexingHeader)), storageGPR);
+
</ins><span class="cx">     m_jit.store32(sizeGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()));
</span><span class="cx">     m_jit.store32(sizeGPR, MacroAssembler::Address(storageGPR, Butterfly::offsetOfVectorLength()));
</span><del>-    
-    if (hasDouble(indexingType)) {
</del><ins>+            
+    if (hasDouble(indexingType))
</ins><span class="cx">         m_jit.move(TrustedImm64(bitwise_cast&lt;int64_t&gt;(PNaN)), scratchGPR);
</span><del>-        m_jit.move(sizeGPR, scratch2GPR);
-        MacroAssembler::Jump done = m_jit.branchTest32(MacroAssembler::Zero, scratch2GPR);
-        MacroAssembler::Label loop = m_jit.label();
-        m_jit.sub32(TrustedImm32(1), scratch2GPR);
-        m_jit.store64(scratchGPR, MacroAssembler::BaseIndex(storageGPR, scratch2GPR, MacroAssembler::TimesEight));
-        m_jit.branchTest32(MacroAssembler::NonZero, scratch2GPR).linkTo(loop, &amp;m_jit);
-        done.link(&amp;m_jit);
-    }
</del><ins>+    else
+        m_jit.move(TrustedImm64(JSValue::encode(JSValue())), scratchGPR);
+    m_jit.move(sizeGPR, scratch2GPR);
+    MacroAssembler::Jump done = m_jit.branchTest32(MacroAssembler::Zero, scratch2GPR);
+    MacroAssembler::Label loop = m_jit.label();
+    m_jit.sub32(TrustedImm32(1), scratch2GPR);
+    m_jit.store64(scratchGPR, MacroAssembler::BaseIndex(storageGPR, scratch2GPR, MacroAssembler::TimesEight));
+    m_jit.branchTest32(MacroAssembler::NonZero, scratch2GPR).linkTo(loop, &amp;m_jit);
+    done.link(&amp;m_jit);
+            
+    Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType);
+            
+    emitAllocateJSObject&lt;JSArray&gt;(resultGPR, TrustedImmPtr(structure), storageGPR, scratchGPR, scratch2GPR, slowCases);
</ins><span class="cx">     
</span><span class="cx">     addSlowPathGenerator(std::make_unique&lt;CallArrayAllocatorWithVariableSizeSlowPathGenerator&gt;(
</span><span class="cx">         slowCases, this, operationNewArrayWithSize, resultGPR,
</span><span class="cx">         structure,
</span><span class="cx">         shouldConvertLargeSizeToArrayStorage ? globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage) : structure,
</span><del>-        sizeGPR));
</del><ins>+        sizeGPR, storageGPR));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoredfgDFGStrengthReductionPhasecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/dfg/DFGStrengthReductionPhase.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include &quot;RegExpConstructor.h&quot;
</span><span class="cx"> #include &quot;StringPrototype.h&quot;
</span><span class="cx"> #include &lt;cstdlib&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace DFG {
</span><span class="cx"> 
</span><span class="lines">@@ -420,7 +421,7 @@
</span><span class="cx">                     dataLog(&quot;Giving up because of pattern limit.\n&quot;);
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><del>-
</del><ins>+            
</ins><span class="cx">             unsigned lastIndex;
</span><span class="cx">             if (regExp-&gt;globalOrSticky()) {
</span><span class="cx">                 // This will only work if we can prove what the value of lastIndex is. To do this
</span><span class="lines">@@ -468,7 +469,7 @@
</span><span class="cx">             FrozenValue* constructorFrozenValue = m_graph.freeze(constructor);
</span><span class="cx"> 
</span><span class="cx">             MatchResult result;
</span><del>-            Vector&lt;int, 32&gt; ovector;
</del><ins>+            Vector&lt;int&gt; ovector;
</ins><span class="cx">             // We have to call the kind of match function that the main thread would have called.
</span><span class="cx">             // Otherwise, we might not have the desired Yarr code compiled, and the match will fail.
</span><span class="cx">             if (m_node-&gt;op() == RegExpExec) {
</span><span class="lines">@@ -514,7 +515,8 @@
</span><span class="cx">                     }
</span><span class="cx"> 
</span><span class="cx">                     unsigned publicLength = resultArray.size();
</span><del>-                    unsigned vectorLength = std::max(BASE_VECTOR_LEN, publicLength);
</del><ins>+                    unsigned vectorLength =
+                        Butterfly::optimalContiguousVectorLength(structure, publicLength);
</ins><span class="cx"> 
</span><span class="cx">                     UniquedStringImpl* indexUID = vm().propertyNames-&gt;index.impl();
</span><span class="cx">                     UniquedStringImpl* inputUID = vm().propertyNames-&gt;input.impl();
</span><span class="lines">@@ -649,7 +651,7 @@
</span><span class="cx">             bool ok = true;
</span><span class="cx">             do {
</span><span class="cx">                 MatchResult result;
</span><del>-                Vector&lt;int, 32&gt; ovector;
</del><ins>+                Vector&lt;int&gt; ovector;
</ins><span class="cx">                 // Model which version of match() is called by the main thread.
</span><span class="cx">                 if (replace.isEmpty() &amp;&amp; regExp-&gt;global()) {
</span><span class="cx">                     if (!regExp-&gt;matchConcurrently(vm(), string, startPosition, result)) {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLAbstractHeapRepositoryh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLAbstractHeapRepository.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -76,7 +76,6 @@
</span><span class="cx">     macro(JSString_value, JSString::offsetOfValue()) \
</span><span class="cx">     macro(JSSymbolTableObject_symbolTable, JSSymbolTableObject::offsetOfSymbolTable()) \
</span><span class="cx">     macro(JSWrapperObject_internalValue, JSWrapperObject::internalValueOffset()) \
</span><del>-    macro(MarkedAllocator_freeListHead, MarkedAllocator::offsetOfFreeListHead()) \
</del><span class="cx">     macro(RegExpConstructor_cachedResult_lastRegExp, RegExpConstructor::offsetOfCachedResult() + RegExpCachedResult::offsetOfLastRegExp()) \
</span><span class="cx">     macro(RegExpConstructor_cachedResult_lastInput, RegExpConstructor::offsetOfCachedResult() + RegExpCachedResult::offsetOfLastInput()) \
</span><span class="cx">     macro(RegExpConstructor_cachedResult_result_start, RegExpConstructor::offsetOfCachedResult() + RegExpCachedResult::offsetOfResult() + OBJECT_OFFSETOF(MatchResult, start)) \
</span><span class="lines">@@ -109,8 +108,7 @@
</span><span class="cx">     macro(JSEnvironmentRecord_variables, JSEnvironmentRecord::offsetOfVariables(), sizeof(EncodedJSValue)) \
</span><span class="cx">     macro(JSPropertyNameEnumerator_cachedPropertyNamesVectorContents, 0, sizeof(WriteBarrier&lt;JSString&gt;)) \
</span><span class="cx">     macro(JSRopeString_fibers, JSRopeString::offsetOfFibers(), sizeof(WriteBarrier&lt;JSString&gt;)) \
</span><del>-    macro(MarkedSpace_Subspace_impreciseAllocators, OBJECT_OFFSETOF(MarkedSpace::Subspace, impreciseAllocators), sizeof(MarkedAllocator)) \
-    macro(MarkedSpace_Subspace_preciseAllocators, OBJECT_OFFSETOF(MarkedSpace::Subspace, preciseAllocators), sizeof(MarkedAllocator)) \
</del><ins>+    macro(MarkedSpace_Subspace_allocatorForSizeStep, OBJECT_OFFSETOF(MarkedSpace::Subspace, allocatorForSizeStep), sizeof(MarkedAllocator*)) \
</ins><span class="cx">     macro(ScopedArguments_overflowStorage, ScopedArguments::overflowStorageOffset(), sizeof(EncodedJSValue)) \
</span><span class="cx">     macro(WriteBarrierBuffer_bufferContents, 0, sizeof(JSCell*)) \
</span><span class="cx">     macro(characters8, 0, sizeof(LChar)) \
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLCompilecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLCompile.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLCompile.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLCompile.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> #include &quot;FTLJITCode.h&quot;
</span><span class="cx"> #include &quot;FTLThunks.h&quot;
</span><span class="cx"> #include &quot;JITSubGenerator.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;LinkBuffer.h&quot;
</span><span class="cx"> #include &quot;PCToCodeOriginMap.h&quot;
</span><span class="cx"> #include &quot;ScratchRegisterAllocator.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLJITFinalizercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;DFGPlan.h&quot;
</span><span class="cx"> #include &quot;FTLState.h&quot;
</span><span class="cx"> #include &quot;FTLThunks.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;ProfilerDatabase.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace FTL {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLLowerDFGToB3cpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -3815,7 +3815,7 @@
</span><span class="cx">                 size, m_out.constInt32(DirectArguments::allocationSize(minCapacity)));
</span><span class="cx">             
</span><span class="cx">             fastObject = allocateVariableSizedObject&lt;DirectArguments&gt;(
</span><del>-                size, structure, m_out.intPtrZero, slowPath);
</del><ins>+                m_out.zeroExtPtr(size), structure, m_out.intPtrZero, slowPath);
</ins><span class="cx">         }
</span><span class="cx">         
</span><span class="cx">         m_out.store32(length.value, fastObject, m_heaps.DirectArguments_length);
</span><span class="lines">@@ -3915,10 +3915,11 @@
</span><span class="cx">             LBasicBlock continuation = m_out.newBlock();
</span><span class="cx">             LValue arrayLength = lowInt32(m_node-&gt;child1());
</span><span class="cx">             LBasicBlock loopStart = m_out.newBlock();
</span><del>-            bool shouldLargeArraySizeCreateArrayStorage = false;
-            LValue array = compileAllocateArrayWithSize(arrayLength, ArrayWithContiguous, shouldLargeArraySizeCreateArrayStorage);
-
-            LValue butterfly = m_out.loadPtr(array, m_heaps.JSObject_butterfly);
</del><ins>+            JSGlobalObject* globalObject = m_graph.globalObjectFor(m_node-&gt;origin.semantic);
+            Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithContiguous);
+            ArrayValues arrayValues = allocateUninitializedContiguousJSArray(arrayLength, structure);
+            LValue array = arrayValues.array;
+            LValue butterfly = arrayValues.butterfly;
</ins><span class="cx">             ValueFromBlock startLength = m_out.anchor(arrayLength);
</span><span class="cx">             LValue argumentRegion = m_out.add(getArgumentsStart(), m_out.constInt64(sizeof(Register) * m_node-&gt;numberOfArgumentsToSkip()));
</span><span class="cx">             m_out.branch(m_out.equal(arrayLength, m_out.constInt32(0)),
</span><span class="lines">@@ -3930,7 +3931,7 @@
</span><span class="cx">             m_out.addIncomingToPhi(phiOffset, m_out.anchor(currentOffset));
</span><span class="cx">             LValue loadedValue = m_out.load64(m_out.baseIndex(m_heaps.variables, argumentRegion, m_out.zeroExtPtr(currentOffset)));
</span><span class="cx">             IndexedAbstractHeap&amp; heap = m_heaps.indexedContiguousProperties;
</span><del>-            m_out.store(loadedValue, m_out.baseIndex(heap, butterfly, m_out.zeroExtPtr(currentOffset)), Output::Store64);
</del><ins>+            m_out.store64(loadedValue, m_out.baseIndex(heap, butterfly, m_out.zeroExtPtr(currentOffset)));
</ins><span class="cx">             m_out.branch(m_out.equal(currentOffset, m_out.constInt32(0)), unsure(continuation), unsure(loopStart));
</span><span class="cx"> 
</span><span class="cx">             m_out.appendTo(continuation, lastNext);
</span><span class="lines">@@ -3987,7 +3988,8 @@
</span><span class="cx">         if (!globalObject-&gt;isHavingABadTime() &amp;&amp; !hasAnyArrayStorage(m_node-&gt;indexingType())) {
</span><span class="cx">             unsigned numElements = m_node-&gt;numChildren();
</span><span class="cx">             
</span><del>-            ArrayValues arrayValues = allocateJSArray(structure, numElements);
</del><ins>+            ArrayValues arrayValues =
+                allocateUninitializedContiguousJSArray(m_out.constInt32(numElements), structure);
</ins><span class="cx">             
</span><span class="cx">             for (unsigned operandIndex = 0; operandIndex &lt; m_node-&gt;numChildren(); ++operandIndex) {
</span><span class="cx">                 Edge edge = m_graph.varArgChild(m_node, operandIndex);
</span><span class="lines">@@ -4063,7 +4065,8 @@
</span><span class="cx">         if (!globalObject-&gt;isHavingABadTime() &amp;&amp; !hasAnyArrayStorage(m_node-&gt;indexingType())) {
</span><span class="cx">             unsigned numElements = m_node-&gt;numConstants();
</span><span class="cx">             
</span><del>-            ArrayValues arrayValues = allocateJSArray(structure, numElements);
</del><ins>+            ArrayValues arrayValues =
+                allocateUninitializedContiguousJSArray(m_out.constInt32(numElements), structure);
</ins><span class="cx">             
</span><span class="cx">             JSValue* data = codeBlock()-&gt;constantBuffer(m_node-&gt;startConstant());
</span><span class="cx">             for (unsigned index = 0; index &lt; m_node-&gt;numConstants(); ++index) {
</span><span class="lines">@@ -4089,88 +4092,6 @@
</span><span class="cx">             m_out.constIntPtr(m_node-&gt;numConstants())));
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LValue compileAllocateArrayWithSize(LValue publicLength, IndexingType indexingType, bool shouldLargeArraySizeCreateArrayStorage = true)
-    {
-        JSGlobalObject* globalObject = m_graph.globalObjectFor(m_node-&gt;origin.semantic);
-        Structure* structure = globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(indexingType);
-        ASSERT(
-            hasUndecided(structure-&gt;indexingType())
-            || hasInt32(structure-&gt;indexingType())
-            || hasDouble(structure-&gt;indexingType())
-            || hasContiguous(structure-&gt;indexingType()));
-
-        LBasicBlock fastCase = m_out.newBlock();
-        LBasicBlock largeCase = shouldLargeArraySizeCreateArrayStorage ? m_out.newBlock() : nullptr;
-        LBasicBlock failCase = m_out.newBlock();
-        LBasicBlock continuation = m_out.newBlock();
-        LBasicBlock lastNext = nullptr;
-        if (shouldLargeArraySizeCreateArrayStorage) {
-            m_out.branch(
-                m_out.aboveOrEqual(publicLength, m_out.constInt32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH)),
-                rarely(largeCase), usually(fastCase));
-            lastNext = m_out.appendTo(fastCase, largeCase);
-        }
-
-        
-        // We don't round up to BASE_VECTOR_LEN for new Array(blah).
-        LValue vectorLength = publicLength;
-        
-        LValue payloadSize =
-            m_out.shl(m_out.zeroExt(vectorLength, pointerType()), m_out.constIntPtr(3));
-        
-        LValue butterflySize = m_out.add(
-            payloadSize, m_out.constIntPtr(sizeof(IndexingHeader)));
-        
-        LValue endOfStorage = allocateBasicStorageAndGetEnd(butterflySize, failCase);
-        
-        LValue butterfly = m_out.sub(endOfStorage, payloadSize);
-        
-        LValue object = allocateObject&lt;JSArray&gt;(structure, butterfly, failCase);
-        
-        m_out.store32(publicLength, butterfly, m_heaps.Butterfly_publicLength);
-        m_out.store32(vectorLength, butterfly, m_heaps.Butterfly_vectorLength);
-
-        initializeArrayElements(indexingType, vectorLength, butterfly);
-        
-        ValueFromBlock fastResult = m_out.anchor(object);
-        m_out.jump(continuation);
-        
-        LValue structureValue;
-        if (shouldLargeArraySizeCreateArrayStorage) {
-            LBasicBlock slowCase = m_out.newBlock();
-
-            m_out.appendTo(largeCase, failCase);
-            ValueFromBlock largeStructure = m_out.anchor(m_out.constIntPtr(
-                globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage)));
-            m_out.jump(slowCase);
-
-            m_out.appendTo(failCase, slowCase);
-            ValueFromBlock failStructure = m_out.anchor(m_out.constIntPtr(structure));
-            m_out.jump(slowCase);
-
-            m_out.appendTo(slowCase, continuation);
-            structureValue = m_out.phi(
-                pointerType(), largeStructure, failStructure);
-        } else {
-            ASSERT(!lastNext);
-            lastNext = m_out.appendTo(failCase, continuation);
-            structureValue = m_out.constIntPtr(structure);
-        }
-
-        LValue slowResultValue = lazySlowPath(
-            [=] (const Vector&lt;Location&gt;&amp; locations) -&gt; RefPtr&lt;LazySlowPath::Generator&gt; {
-                return createLazyCallGenerator(
-                    operationNewArrayWithSize, locations[0].directGPR(),
-                    locations[1].directGPR(), locations[2].directGPR());
-            },
-            structureValue, publicLength);
-        ValueFromBlock slowResult = m_out.anchor(slowResultValue);
-        m_out.jump(continuation);
-        
-        m_out.appendTo(continuation, lastNext);
-        return m_out.phi(pointerType(), fastResult, slowResult);
-    }
-    
</del><span class="cx">     void compileNewArrayWithSize()
</span><span class="cx">     {
</span><span class="cx">         LValue publicLength = lowInt32(m_node-&gt;child1());
</span><span class="lines">@@ -4180,7 +4101,11 @@
</span><span class="cx">             m_node-&gt;indexingType());
</span><span class="cx">         
</span><span class="cx">         if (!globalObject-&gt;isHavingABadTime() &amp;&amp; !hasAnyArrayStorage(m_node-&gt;indexingType())) {
</span><del>-            setJSValue(compileAllocateArrayWithSize(publicLength, m_node-&gt;indexingType()));
</del><ins>+            setJSValue(
+                allocateJSArray(
+                    publicLength,
+                    globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(
+                        m_node-&gt;indexingType())).array);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="lines">@@ -4189,7 +4114,7 @@
</span><span class="cx">             m_out.constIntPtr(
</span><span class="cx">                 globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage)),
</span><span class="cx">             m_out.constIntPtr(structure));
</span><del>-        setJSValue(vmCall(Int64, m_out.operation(operationNewArrayWithSize), m_callFrame, structureValue, publicLength));
</del><ins>+        setJSValue(vmCall(Int64, m_out.operation(operationNewArrayWithSize), m_callFrame, structureValue, publicLength, m_out.intPtrZero));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void compileNewTypedArray()
</span><span class="lines">@@ -4449,13 +4374,12 @@
</span><span class="cx">         
</span><span class="cx">         LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
</span><span class="cx">         
</span><del>-        MarkedAllocator&amp; allocator =
</del><ins>+        MarkedAllocator* allocator =
</ins><span class="cx">             vm().heap.allocatorForObjectWithDestructor(sizeof(JSRopeString));
</span><ins>+        DFG_ASSERT(m_graph, m_node, allocator);
</ins><span class="cx">         
</span><span class="cx">         LValue result = allocateCell(
</span><del>-            m_out.constIntPtr(&amp;allocator),
-            vm().stringStructure.get(),
-            slowPath);
</del><ins>+            m_out.constIntPtr(allocator), vm().stringStructure.get(), slowPath);
</ins><span class="cx">         
</span><span class="cx">         m_out.storePtr(m_out.intPtrZero, result, m_heaps.JSString_value);
</span><span class="cx">         for (unsigned i = 0; i &lt; numKids; ++i)
</span><span class="lines">@@ -7004,7 +6928,8 @@
</span><span class="cx">             
</span><span class="cx">             if (structure-&gt;outOfLineCapacity() || hasIndexedProperties(structure-&gt;indexingType())) {
</span><span class="cx">                 size_t allocationSize = JSFinalObject::allocationSize(structure-&gt;inlineCapacity());
</span><del>-                MarkedAllocator* allocator = &amp;vm().heap.allocatorForObjectWithoutDestructor(allocationSize);
</del><ins>+                MarkedAllocator* cellAllocator = vm().heap.allocatorForObjectWithoutDestructor(allocationSize);
+                DFG_ASSERT(m_graph, m_node, cellAllocator);
</ins><span class="cx"> 
</span><span class="cx">                 bool hasIndexingHeader = hasIndexedProperties(structure-&gt;indexingType());
</span><span class="cx">                 unsigned indexingHeaderSize = 0;
</span><span class="lines">@@ -7029,7 +6954,7 @@
</span><span class="cx">                     indexingPayloadSizeInBytes =
</span><span class="cx">                         m_out.mul(m_out.zeroExtPtr(vectorLength), m_out.intPtrEight);
</span><span class="cx">                 }
</span><del>-
</del><ins>+                
</ins><span class="cx">                 LValue butterflySize = m_out.add(
</span><span class="cx">                     m_out.constIntPtr(
</span><span class="cx">                         structure-&gt;outOfLineCapacity() * sizeof(JSValue) + indexingHeaderSize),
</span><span class="lines">@@ -7040,16 +6965,23 @@
</span><span class="cx">                 
</span><span class="cx">                 LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
</span><span class="cx">                 
</span><del>-                LValue endOfStorage = allocateBasicStorageAndGetEnd(butterflySize, slowPath);
</del><ins>+                ValueFromBlock noButterfly = m_out.anchor(m_out.intPtrZero);
+                
+                LValue startOfStorage = allocateHeapCell(
+                    allocatorForSize(vm().heap.subspaceForAuxiliaryData(), butterflySize, slowPath),
+                    slowPath);
</ins><span class="cx"> 
</span><span class="cx">                 LValue fastButterflyValue = m_out.add(
</span><del>-                    m_out.sub(endOfStorage, indexingPayloadSizeInBytes),
-                    m_out.constIntPtr(sizeof(IndexingHeader) - indexingHeaderSize));
</del><ins>+                    startOfStorage,
+                    m_out.constIntPtr(
+                        structure-&gt;outOfLineCapacity() * sizeof(JSValue) + sizeof(IndexingHeader)));
+                
+                ValueFromBlock haveButterfly = m_out.anchor(fastButterflyValue);
</ins><span class="cx"> 
</span><span class="cx">                 m_out.store32(vectorLength, fastButterflyValue, m_heaps.Butterfly_vectorLength);
</span><span class="cx">                 
</span><span class="cx">                 LValue fastObjectValue = allocateObject(
</span><del>-                    m_out.constIntPtr(allocator), structure, fastButterflyValue, slowPath);
</del><ins>+                    m_out.constIntPtr(cellAllocator), structure, fastButterflyValue, slowPath);
</ins><span class="cx"> 
</span><span class="cx">                 ValueFromBlock fastObject = m_out.anchor(fastObjectValue);
</span><span class="cx">                 ValueFromBlock fastButterfly = m_out.anchor(fastButterflyValue);
</span><span class="lines">@@ -7056,6 +6988,8 @@
</span><span class="cx">                 m_out.jump(continuation);
</span><span class="cx">                 
</span><span class="cx">                 m_out.appendTo(slowPath, continuation);
</span><ins>+                
+                LValue butterflyValue = m_out.phi(pointerType(), noButterfly, haveButterfly);
</ins><span class="cx"> 
</span><span class="cx">                 LValue slowObjectValue;
</span><span class="cx">                 if (hasIndexingHeader) {
</span><span class="lines">@@ -7064,16 +6998,17 @@
</span><span class="cx">                             return createLazyCallGenerator(
</span><span class="cx">                                 operationNewObjectWithButterflyWithIndexingHeaderAndVectorLength,
</span><span class="cx">                                 locations[0].directGPR(), CCallHelpers::TrustedImmPtr(structure),
</span><del>-                                locations[1].directGPR());
</del><ins>+                                locations[1].directGPR(), locations[2].directGPR());
</ins><span class="cx">                         },
</span><del>-                        vectorLength);
</del><ins>+                        vectorLength, butterflyValue);
</ins><span class="cx">                 } else {
</span><span class="cx">                     slowObjectValue = lazySlowPath(
</span><span class="cx">                         [=] (const Vector&lt;Location&gt;&amp; locations) -&gt; RefPtr&lt;LazySlowPath::Generator&gt; {
</span><span class="cx">                             return createLazyCallGenerator(
</span><span class="cx">                                 operationNewObjectWithButterfly, locations[0].directGPR(),
</span><del>-                                CCallHelpers::TrustedImmPtr(structure));
-                        });
</del><ins>+                                CCallHelpers::TrustedImmPtr(structure), locations[1].directGPR());
+                        },
+                        butterflyValue);
</ins><span class="cx">                 }
</span><span class="cx">                 ValueFromBlock slowObject = m_out.anchor(slowObjectValue);
</span><span class="cx">                 ValueFromBlock slowButterfly = m_out.anchor(
</span><span class="lines">@@ -7088,7 +7023,7 @@
</span><span class="cx"> 
</span><span class="cx">                 m_out.store32(publicLength, butterfly, m_heaps.Butterfly_publicLength);
</span><span class="cx"> 
</span><del>-                initializeArrayElements(structure-&gt;indexingType(), vectorLength, butterfly);
</del><ins>+                initializeArrayElements(structure-&gt;indexingType(), m_out.int32Zero, vectorLength, butterfly);
</ins><span class="cx"> 
</span><span class="cx">                 HashMap&lt;int32_t, LValue, DefaultHash&lt;int32_t&gt;::Hash, WTF::UnsignedWithZeroKeyHashTraits&lt;int32_t&gt;&gt; indexMap;
</span><span class="cx">                 Vector&lt;int32_t&gt; indices;
</span><span class="lines">@@ -7833,11 +7768,33 @@
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void initializeArrayElements(IndexingType indexingType, LValue vectorLength, LValue butterfly)
</del><ins>+    void initializeArrayElements(IndexingType indexingType, LValue begin, LValue end, LValue butterfly)
</ins><span class="cx">     {
</span><del>-        if (!hasDouble(indexingType)) {
-            // The GC already initialized everything to JSValue() for us.
</del><ins>+        if (hasUndecided(indexingType))
</ins><span class="cx">             return;
</span><ins>+        
+        if (begin == end)
+            return;
+        
+        IndexedAbstractHeap* heap = m_heaps.forIndexingType(indexingType);
+        DFG_ASSERT(m_graph, m_node, heap);
+        
+        LValue hole;
+        if (hasDouble(indexingType))
+            hole = m_out.constInt64(bitwise_cast&lt;int64_t&gt;(PNaN));
+        else
+            hole = m_out.constInt64(JSValue::encode(JSValue()));
+        
+        const uint64_t unrollingLimit = 10;
+        if (begin-&gt;hasInt() &amp;&amp; end-&gt;hasInt()) {
+            uint64_t beginConst = static_cast&lt;uint64_t&gt;(begin-&gt;asInt());
+            uint64_t endConst = static_cast&lt;uint64_t&gt;(end-&gt;asInt());
+            
+            if (endConst - beginConst &lt;= unrollingLimit) {
+                for (uint64_t i = beginConst; i &lt; endConst; ++i)
+                    m_out.store64(hole, butterfly, heap-&gt;at(i));
+                return;
+            }
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Doubles must be initialized to PNaN.
</span><span class="lines">@@ -7844,24 +7801,21 @@
</span><span class="cx">         LBasicBlock initLoop = m_out.newBlock();
</span><span class="cx">         LBasicBlock initDone = m_out.newBlock();
</span><span class="cx">         
</span><del>-        ValueFromBlock originalIndex = m_out.anchor(vectorLength);
</del><ins>+        ValueFromBlock originalIndex = m_out.anchor(end);
</ins><span class="cx">         ValueFromBlock originalPointer = m_out.anchor(butterfly);
</span><del>-        m_out.branch(
-            m_out.notZero32(vectorLength), unsure(initLoop), unsure(initDone));
</del><ins>+        m_out.branch(m_out.notEqual(end, begin), unsure(initLoop), unsure(initDone));
</ins><span class="cx">         
</span><span class="cx">         LBasicBlock initLastNext = m_out.appendTo(initLoop, initDone);
</span><span class="cx">         LValue index = m_out.phi(Int32, originalIndex);
</span><span class="cx">         LValue pointer = m_out.phi(pointerType(), originalPointer);
</span><span class="cx">         
</span><del>-        m_out.store64(
-            m_out.constInt64(bitwise_cast&lt;int64_t&gt;(PNaN)),
-            TypedPointer(m_heaps.indexedDoubleProperties.atAnyIndex(), pointer));
</del><ins>+        m_out.store64(hole, TypedPointer(heap-&gt;atAnyIndex(), pointer));
</ins><span class="cx">         
</span><span class="cx">         LValue nextIndex = m_out.sub(index, m_out.int32One);
</span><span class="cx">         m_out.addIncomingToPhi(index, m_out.anchor(nextIndex));
</span><span class="cx">         m_out.addIncomingToPhi(pointer, m_out.anchor(m_out.add(pointer, m_out.intPtrEight)));
</span><span class="cx">         m_out.branch(
</span><del>-            m_out.notZero32(nextIndex), unsure(initLoop), unsure(initDone));
</del><ins>+            m_out.notEqual(nextIndex, begin), unsure(initLoop), unsure(initDone));
</ins><span class="cx">         
</span><span class="cx">         m_out.appendTo(initDone, initLastNext);
</span><span class="cx">     }
</span><span class="lines">@@ -7916,13 +7870,12 @@
</span><span class="cx">         LBasicBlock continuation = m_out.newBlock();
</span><span class="cx">         
</span><span class="cx">         LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
</span><del>-        
-        LValue endOfStorage = allocateBasicStorageAndGetEnd(
-            m_out.constIntPtr(sizeInValues * sizeof(JSValue)), slowPath);
-        
</del><ins>+
+        size_t sizeInBytes = sizeInValues * sizeof(JSValue);
+        MarkedAllocator* allocator = vm().heap.allocatorForAuxiliaryData(sizeInBytes);
+        LValue startOfStorage = allocateHeapCell(m_out.constIntPtr(allocator), slowPath);
</ins><span class="cx">         ValueFromBlock fastButterfly = m_out.anchor(
</span><del>-            m_out.add(m_out.constIntPtr(sizeof(IndexingHeader)), endOfStorage));
-        
</del><ins>+            m_out.add(m_out.constIntPtr(sizeInBytes + sizeof(IndexingHeader)), startOfStorage));
</ins><span class="cx">         m_out.jump(continuation);
</span><span class="cx">         
</span><span class="cx">         m_out.appendTo(slowPath, continuation);
</span><span class="lines">@@ -8487,29 +8440,64 @@
</span><span class="cx">         setJSValue(patchpoint);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    LValue allocateCell(LValue allocator, LBasicBlock slowPath)
</del><ins>+    LValue allocateHeapCell(LValue allocator, LBasicBlock slowPath)
</ins><span class="cx">     {
</span><del>-        LBasicBlock success = m_out.newBlock();
-    
-        LValue result;
-        LValue condition;
-        if (Options::forceGCSlowPaths()) {
-            result = m_out.intPtrZero;
-            condition = m_out.booleanFalse;
-        } else {
-            result = m_out.loadPtr(
-                allocator, m_heaps.MarkedAllocator_freeListHead);
-            condition = m_out.notNull(result);
</del><ins>+        MarkedAllocator* actualAllocator = nullptr;
+        if (allocator-&gt;hasIntPtr())
+            actualAllocator = bitwise_cast&lt;MarkedAllocator*&gt;(allocator-&gt;asIntPtr());
+        
+        if (!actualAllocator) {
+            // This means that either we know that the allocator is null or we don't know what the
+            // allocator is. In either case, we need the null check.
+            LBasicBlock haveAllocator = m_out.newBlock();
+            LBasicBlock lastNext = m_out.insertNewBlocksBefore(haveAllocator);
+            m_out.branch(allocator, usually(haveAllocator), rarely(slowPath));
+            m_out.appendTo(haveAllocator, lastNext);
</ins><span class="cx">         }
</span><del>-        m_out.branch(condition, usually(success), rarely(slowPath));
</del><span class="cx">         
</span><del>-        m_out.appendTo(success);
</del><ins>+        LBasicBlock continuation = m_out.newBlock();
</ins><span class="cx">         
</span><del>-        m_out.storePtr(
-            m_out.loadPtr(result, m_heaps.JSCell_freeListNext),
-            allocator, m_heaps.MarkedAllocator_freeListHead);
-
-        return result;
</del><ins>+        LBasicBlock lastNext = m_out.insertNewBlocksBefore(continuation);
+        
+        PatchpointValue* patchpoint = m_out.patchpoint(pointerType());
+        patchpoint-&gt;effects.terminal = true;
+        patchpoint-&gt;appendSomeRegister(allocator);
+        patchpoint-&gt;numGPScratchRegisters++;
+        patchpoint-&gt;resultConstraint = ValueRep::SomeEarlyRegister;
+        
+        m_out.appendSuccessor(usually(continuation));
+        m_out.appendSuccessor(rarely(slowPath));
+        
+        patchpoint-&gt;setGenerator(
+            [=] (CCallHelpers&amp; jit, const StackmapGenerationParams&amp; params) {
+                CCallHelpers::JumpList jumpToSlowPath;
+                
+                // We use a patchpoint to emit the allocation path because whenever we mess with
+                // allocation paths, we already reason about them at the machine code level. We know
+                // exactly what instruction sequence we want. We're confident that no compiler
+                // optimization could make this code better. So, it's best to have the code in
+                // AssemblyHelpers::emitAllocate(). That way, the same optimized path is shared by
+                // all of the compiler tiers.
+                jit.emitAllocateWithNonNullAllocator(
+                    params[0].gpr(), actualAllocator, params[1].gpr(), params.gpScratch(0),
+                    jumpToSlowPath);
+                
+                CCallHelpers::Jump jumpToSuccess;
+                if (!params.fallsThroughToSuccessor(0))
+                    jumpToSuccess = jit.jump();
+                
+                Vector&lt;Box&lt;CCallHelpers::Label&gt;&gt; labels = params.successorLabels();
+                
+                params.addLatePath(
+                    [=] (CCallHelpers&amp; jit) {
+                        jumpToSlowPath.linkTo(*labels[1], &amp;jit);
+                        if (jumpToSuccess.isSet())
+                            jumpToSuccess.linkTo(*labels[0], &amp;jit);
+                    });
+            });
+        
+        m_out.appendTo(continuation, lastNext);
+        return patchpoint;
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     void storeStructure(LValue object, Structure* structure)
</span><span class="lines">@@ -8522,7 +8510,7 @@
</span><span class="cx"> 
</span><span class="cx">     LValue allocateCell(LValue allocator, Structure* structure, LBasicBlock slowPath)
</span><span class="cx">     {
</span><del>-        LValue result = allocateCell(allocator, slowPath);
</del><ins>+        LValue result = allocateHeapCell(allocator, slowPath);
</ins><span class="cx">         storeStructure(result, structure);
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><span class="lines">@@ -8539,7 +8527,7 @@
</span><span class="cx">     LValue allocateObject(
</span><span class="cx">         size_t size, Structure* structure, LValue butterfly, LBasicBlock slowPath)
</span><span class="cx">     {
</span><del>-        MarkedAllocator* allocator = &amp;vm().heap.allocatorForObjectOfType&lt;ClassType&gt;(size);
</del><ins>+        MarkedAllocator* allocator = vm().heap.allocatorForObjectOfType&lt;ClassType&gt;(size);
</ins><span class="cx">         return allocateObject(m_out.constIntPtr(allocator), structure, butterfly, slowPath);
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -8550,46 +8538,60 @@
</span><span class="cx">             ClassType::allocationSize(0), structure, butterfly, slowPath);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    template&lt;typename ClassType&gt;
-    LValue allocateVariableSizedObject(
-        LValue size, Structure* structure, LValue butterfly, LBasicBlock slowPath)
</del><ins>+    LValue allocatorForSize(LValue subspace, LValue size, LBasicBlock slowPath)
</ins><span class="cx">     {
</span><del>-        static_assert(!(MarkedSpace::preciseStep &amp; (MarkedSpace::preciseStep - 1)), &quot;MarkedSpace::preciseStep must be a power of two.&quot;);
-        static_assert(!(MarkedSpace::impreciseStep &amp; (MarkedSpace::impreciseStep - 1)), &quot;MarkedSpace::impreciseStep must be a power of two.&quot;);
-
-        LValue subspace = m_out.constIntPtr(&amp;vm().heap.subspaceForObjectOfType&lt;ClassType&gt;());
</del><ins>+        static_assert(!(MarkedSpace::sizeStep &amp; (MarkedSpace::sizeStep - 1)), &quot;MarkedSpace::sizeStep must be a power of two.&quot;);
</ins><span class="cx">         
</span><del>-        LBasicBlock smallCaseBlock = m_out.newBlock();
-        LBasicBlock largeOrOversizeCaseBlock = m_out.newBlock();
-        LBasicBlock largeCaseBlock = m_out.newBlock();
</del><ins>+        // Try to do some constant-folding here.
+        if (subspace-&gt;hasIntPtr() &amp;&amp; size-&gt;hasIntPtr()) {
+            MarkedSpace::Subspace* actualSubspace = bitwise_cast&lt;MarkedSpace::Subspace*&gt;(subspace-&gt;asIntPtr());
+            size_t actualSize = size-&gt;asIntPtr();
+            
+            MarkedAllocator* actualAllocator = MarkedSpace::allocatorFor(*actualSubspace, actualSize);
+            if (!actualAllocator) {
+                LBasicBlock continuation = m_out.newBlock();
+                LBasicBlock lastNext = m_out.insertNewBlocksBefore(continuation);
+                m_out.jump(slowPath);
+                m_out.appendTo(continuation, lastNext);
+                return m_out.intPtrZero;
+            }
+            
+            return m_out.constIntPtr(actualAllocator);
+        }
+        
+        unsigned stepShift = getLSBSet(MarkedSpace::sizeStep);
+        
</ins><span class="cx">         LBasicBlock continuation = m_out.newBlock();
</span><span class="cx">         
</span><del>-        LValue uproundedSize = m_out.add(size, m_out.constInt32(MarkedSpace::preciseStep - 1));
-        LValue isSmall = m_out.below(uproundedSize, m_out.constInt32(MarkedSpace::preciseCutoff));
-        m_out.branch(isSmall, unsure(smallCaseBlock), unsure(largeOrOversizeCaseBlock));
</del><ins>+        LBasicBlock lastNext = m_out.insertNewBlocksBefore(continuation);
</ins><span class="cx">         
</span><del>-        LBasicBlock lastNext = m_out.appendTo(smallCaseBlock, largeOrOversizeCaseBlock);
-        TypedPointer address = m_out.baseIndex(
-            m_heaps.MarkedSpace_Subspace_preciseAllocators, subspace,
-            m_out.zeroExtPtr(m_out.lShr(uproundedSize, m_out.constInt32(getLSBSet(MarkedSpace::preciseStep)))));
-        ValueFromBlock smallAllocator = m_out.anchor(address.value());
-        m_out.jump(continuation);
</del><ins>+        LValue sizeClassIndex = m_out.lShr(
+            m_out.add(size, m_out.constIntPtr(MarkedSpace::sizeStep - 1)),
+            m_out.constInt32(stepShift));
</ins><span class="cx">         
</span><del>-        m_out.appendTo(largeOrOversizeCaseBlock, largeCaseBlock);
</del><span class="cx">         m_out.branch(
</span><del>-            m_out.below(uproundedSize, m_out.constInt32(MarkedSpace::impreciseCutoff)),
-            usually(largeCaseBlock), rarely(slowPath));
</del><ins>+            m_out.above(sizeClassIndex, m_out.constIntPtr(MarkedSpace::largeCutoff &gt;&gt; stepShift)),
+            rarely(slowPath), usually(continuation));
</ins><span class="cx">         
</span><del>-        m_out.appendTo(largeCaseBlock, continuation);
-        address = m_out.baseIndex(
-            m_heaps.MarkedSpace_Subspace_impreciseAllocators, subspace,
-            m_out.zeroExtPtr(m_out.lShr(uproundedSize, m_out.constInt32(getLSBSet(MarkedSpace::impreciseStep)))));
-        ValueFromBlock largeAllocator = m_out.anchor(address.value());
-        m_out.jump(continuation);
-        
</del><span class="cx">         m_out.appendTo(continuation, lastNext);
</span><del>-        LValue allocator = m_out.phi(pointerType(), smallAllocator, largeAllocator);
</del><span class="cx">         
</span><ins>+        return m_out.loadPtr(
+            m_out.baseIndex(
+                m_heaps.MarkedSpace_Subspace_allocatorForSizeStep,
+                subspace, m_out.sub(sizeClassIndex, m_out.intPtrOne)));
+    }
+    
+    LValue allocatorForSize(MarkedSpace::Subspace&amp; subspace, LValue size, LBasicBlock slowPath)
+    {
+        return allocatorForSize(m_out.constIntPtr(&amp;subspace), size, slowPath);
+    }
+    
+    template&lt;typename ClassType&gt;
+    LValue allocateVariableSizedObject(
+        LValue size, Structure* structure, LValue butterfly, LBasicBlock slowPath)
+    {
+        LValue allocator = allocatorForSize(
+            vm().heap.subspaceForObjectOfType&lt;ClassType&gt;(), size, slowPath);
</ins><span class="cx">         return allocateObject(allocator, structure, butterfly, slowPath);
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -8622,8 +8624,12 @@
</span><span class="cx">     LValue allocateObject(Structure* structure)
</span><span class="cx">     {
</span><span class="cx">         size_t allocationSize = JSFinalObject::allocationSize(structure-&gt;inlineCapacity());
</span><del>-        MarkedAllocator* allocator = &amp;vm().heap.allocatorForObjectWithoutDestructor(allocationSize);
</del><ins>+        MarkedAllocator* allocator = vm().heap.allocatorForObjectWithoutDestructor(allocationSize);
</ins><span class="cx">         
</span><ins>+        // FIXME: If the allocator is null, we could simply emit a normal C call to the allocator
+        // instead of putting it on the slow path.
+        // https://bugs.webkit.org/show_bug.cgi?id=161062
+        
</ins><span class="cx">         LBasicBlock slowPath = m_out.newBlock();
</span><span class="cx">         LBasicBlock continuation = m_out.newBlock();
</span><span class="cx">         
</span><span class="lines">@@ -8665,75 +8671,122 @@
</span><span class="cx">         LValue array;
</span><span class="cx">         LValue butterfly;
</span><span class="cx">     };
</span><del>-    ArrayValues allocateJSArray(
-        Structure* structure, unsigned numElements, LBasicBlock slowPath)
</del><ins>+
+    ArrayValues allocateJSArray(LValue publicLength, Structure* structure, bool shouldInitializeElements = true, bool shouldLargeArraySizeCreateArrayStorage = true)
</ins><span class="cx">     {
</span><ins>+        JSGlobalObject* globalObject = m_graph.globalObjectFor(m_node-&gt;origin.semantic);
+        IndexingType indexingType = structure-&gt;indexingType();
</ins><span class="cx">         ASSERT(
</span><del>-            hasUndecided(structure-&gt;indexingType())
-            || hasInt32(structure-&gt;indexingType())
-            || hasDouble(structure-&gt;indexingType())
-            || hasContiguous(structure-&gt;indexingType()));
</del><ins>+            hasUndecided(indexingType)
+            || hasInt32(indexingType)
+            || hasDouble(indexingType)
+            || hasContiguous(indexingType));
+
+        LBasicBlock fastCase = m_out.newBlock();
+        LBasicBlock largeCase = m_out.newBlock();
+        LBasicBlock failCase = m_out.newBlock();
+        LBasicBlock continuation = m_out.newBlock();
+        LBasicBlock slowCase = m_out.newBlock();
</ins><span class="cx">         
</span><del>-        unsigned vectorLength = std::max(BASE_VECTOR_LEN, numElements);
</del><ins>+        LBasicBlock lastNext = m_out.insertNewBlocksBefore(fastCase);
</ins><span class="cx">         
</span><del>-        LValue endOfStorage = allocateBasicStorageAndGetEnd(
-            m_out.constIntPtr(sizeof(JSValue) * vectorLength + sizeof(IndexingHeader)),
-            slowPath);
</del><ins>+        ValueFromBlock noButterfly = m_out.anchor(m_out.intPtrZero);
</ins><span class="cx">         
</span><del>-        LValue butterfly = m_out.sub(
-            endOfStorage, m_out.constIntPtr(sizeof(JSValue) * vectorLength));
</del><ins>+        LValue predicate;
+        if (shouldLargeArraySizeCreateArrayStorage)
+            predicate = m_out.aboveOrEqual(publicLength, m_out.constInt32(MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH));
+        else
+            predicate = m_out.booleanFalse;
</ins><span class="cx">         
</span><del>-        LValue object = allocateObject&lt;JSArray&gt;(
-            structure, butterfly, slowPath);
</del><ins>+        m_out.branch(predicate, rarely(largeCase), usually(fastCase));
</ins><span class="cx">         
</span><del>-        m_out.store32(m_out.constInt32(numElements), butterfly, m_heaps.Butterfly_publicLength);
-        m_out.store32(m_out.constInt32(vectorLength), butterfly, m_heaps.Butterfly_vectorLength);
-        
-        if (hasDouble(structure-&gt;indexingType())) {
-            for (unsigned i = numElements; i &lt; vectorLength; ++i) {
-                m_out.store64(
-                    m_out.constInt64(bitwise_cast&lt;int64_t&gt;(PNaN)),
-                    butterfly, m_heaps.indexedDoubleProperties[i]);
</del><ins>+        m_out.appendTo(fastCase, largeCase);
+
+        LValue vectorLength = nullptr;
+        if (publicLength-&gt;hasInt32()) {
+            unsigned publicLengthConst = static_cast&lt;unsigned&gt;(publicLength-&gt;asInt32());
+            if (publicLengthConst &lt;= MAX_STORAGE_VECTOR_LENGTH) {
+                vectorLength = m_out.constInt32(
+                    Butterfly::optimalContiguousVectorLength(
+                        structure-&gt;outOfLineCapacity(), publicLengthConst));
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">         
</span><del>-        return ArrayValues(object, butterfly);
-    }
</del><ins>+        if (!vectorLength) {
+            // We don't compute the optimal vector length for new Array(blah) where blah is not
+            // statically known, since the compute effort of doing it here is probably not worth it.
+            vectorLength = publicLength;
+        }
+            
+        LValue payloadSize =
+            m_out.shl(m_out.zeroExt(vectorLength, pointerType()), m_out.constIntPtr(3));
+            
+        LValue butterflySize = m_out.add(
+            payloadSize, m_out.constIntPtr(sizeof(IndexingHeader)));
+            
+        LValue allocator = allocatorForSize(
+            vm().heap.subspaceForAuxiliaryData(), butterflySize, failCase);
+        LValue startOfStorage = allocateHeapCell(allocator, failCase);
+            
+        LValue butterfly = m_out.add(startOfStorage, m_out.constIntPtr(sizeof(IndexingHeader)));
+        
+        m_out.store32(publicLength, butterfly, m_heaps.Butterfly_publicLength);
+        m_out.store32(vectorLength, butterfly, m_heaps.Butterfly_vectorLength);
</ins><span class="cx">     
</span><del>-    ArrayValues allocateJSArray(Structure* structure, unsigned numElements)
-    {
-        LBasicBlock slowPath = m_out.newBlock();
-        LBasicBlock continuation = m_out.newBlock();
</del><ins>+        initializeArrayElements(
+            indexingType,
+            shouldInitializeElements ? m_out.int32Zero : publicLength, vectorLength,
+            butterfly);
</ins><span class="cx">         
</span><del>-        LBasicBlock lastNext = m_out.insertNewBlocksBefore(slowPath);
</del><ins>+        ValueFromBlock haveButterfly = m_out.anchor(butterfly);
</ins><span class="cx">         
</span><del>-        ArrayValues fastValues = allocateJSArray(structure, numElements, slowPath);
-        ValueFromBlock fastArray = m_out.anchor(fastValues.array);
-        ValueFromBlock fastButterfly = m_out.anchor(fastValues.butterfly);
-        
</del><ins>+        LValue object = allocateObject&lt;JSArray&gt;(structure, butterfly, failCase);
+            
+        ValueFromBlock fastResult = m_out.anchor(object);
+        ValueFromBlock fastButterfly = m_out.anchor(butterfly);
</ins><span class="cx">         m_out.jump(continuation);
</span><span class="cx">         
</span><del>-        m_out.appendTo(slowPath, continuation);
</del><ins>+        m_out.appendTo(largeCase, failCase);
+        ValueFromBlock largeStructure = m_out.anchor(
+            m_out.constIntPtr(
+                globalObject-&gt;arrayStructureForIndexingTypeDuringAllocation(ArrayWithArrayStorage)));
+        m_out.jump(slowCase);
+        
+        m_out.appendTo(failCase, slowCase);
+        ValueFromBlock failStructure = m_out.anchor(m_out.constIntPtr(structure));
+        m_out.jump(slowCase);
+        
+        m_out.appendTo(slowCase, continuation);
+        LValue structureValue = m_out.phi(pointerType(), largeStructure, failStructure);
+        LValue butterflyValue = m_out.phi(pointerType(), noButterfly, haveButterfly);
</ins><span class="cx"> 
</span><del>-        LValue slowArrayValue = lazySlowPath(
</del><ins>+        LValue slowResultValue = lazySlowPath(
</ins><span class="cx">             [=] (const Vector&lt;Location&gt;&amp; locations) -&gt; RefPtr&lt;LazySlowPath::Generator&gt; {
</span><span class="cx">                 return createLazyCallGenerator(
</span><span class="cx">                     operationNewArrayWithSize, locations[0].directGPR(),
</span><del>-                    CCallHelpers::TrustedImmPtr(structure), CCallHelpers::TrustedImm32(numElements));
-            });
-        ValueFromBlock slowArray = m_out.anchor(slowArrayValue);
</del><ins>+                    locations[1].directGPR(), locations[2].directGPR(), locations[3].directGPR());
+            },
+            structureValue, publicLength, butterflyValue);
+        ValueFromBlock slowResult = m_out.anchor(slowResultValue);
</ins><span class="cx">         ValueFromBlock slowButterfly = m_out.anchor(
</span><del>-            m_out.loadPtr(slowArrayValue, m_heaps.JSObject_butterfly));
-
</del><ins>+            m_out.loadPtr(slowResultValue, m_heaps.JSObject_butterfly));
</ins><span class="cx">         m_out.jump(continuation);
</span><span class="cx">         
</span><span class="cx">         m_out.appendTo(continuation, lastNext);
</span><del>-        
</del><span class="cx">         return ArrayValues(
</span><del>-            m_out.phi(pointerType(), fastArray, slowArray),
</del><ins>+            m_out.phi(pointerType(), fastResult, slowResult),
</ins><span class="cx">             m_out.phi(pointerType(), fastButterfly, slowButterfly));
</span><span class="cx">     }
</span><span class="cx">     
</span><ins>+    ArrayValues allocateUninitializedContiguousJSArray(LValue publicLength, Structure* structure)
+    {
+        bool shouldInitializeElements = false;
+        bool shouldLargeArraySizeCreateArrayStorage = false;
+        return allocateJSArray(
+            publicLength, structure, shouldInitializeElements,
+            shouldLargeArraySizeCreateArrayStorage);
+    }
+    
</ins><span class="cx">     LValue ensureShadowChickenPacket()
</span><span class="cx">     {
</span><span class="cx">         LBasicBlock slowCase = m_out.newBlock();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLOutputcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -100,7 +100,9 @@
</span><span class="cx"> 
</span><span class="cx"> LValue Output::constBool(bool value)
</span><span class="cx"> {
</span><del>-    return m_block-&gt;appendNew&lt;B3::Const32Value&gt;(m_proc, origin(), value);
</del><ins>+    if (value)
+        return booleanTrue;
+    return booleanFalse;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::constInt32(int32_t value)
</span><span class="lines">@@ -125,6 +127,10 @@
</span><span class="cx"> 
</span><span class="cx"> LValue Output::add(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    if (Value* result = left-&gt;addConstant(m_proc, right)) {
+        m_block-&gt;append(result);
+        return result;
+    }
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Add, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -205,17 +211,32 @@
</span><span class="cx"> 
</span><span class="cx"> LValue Output::shl(LValue left, LValue right)
</span><span class="cx"> {
</span><del>-    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Shl, origin(), left, castToInt32(right));
</del><ins>+    right = castToInt32(right);
+    if (Value* result = left-&gt;shlConstant(m_proc, right)) {
+        m_block-&gt;append(result);
+        return result;
+    }
+    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Shl, origin(), left, right);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::aShr(LValue left, LValue right)
</span><span class="cx"> {
</span><del>-    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::SShr, origin(), left, castToInt32(right));
</del><ins>+    right = castToInt32(right);
+    if (Value* result = left-&gt;sShrConstant(m_proc, right)) {
+        m_block-&gt;append(result);
+        return result;
+    }
+    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::SShr, origin(), left, right);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::lShr(LValue left, LValue right)
</span><span class="cx"> {
</span><del>-    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::ZShr, origin(), left, castToInt32(right));
</del><ins>+    right = castToInt32(right);
+    if (Value* result = left-&gt;zShrConstant(m_proc, right)) {
+        m_block-&gt;append(result);
+        return result;
+    }
+    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::ZShr, origin(), left, right);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::bitNot(LValue value)
</span><span class="lines">@@ -343,6 +364,8 @@
</span><span class="cx"> {
</span><span class="cx">     if (value-&gt;type() == type)
</span><span class="cx">         return value;
</span><ins>+    if (value-&gt;hasInt32())
+        return m_block-&gt;appendIntConstant(m_proc, origin(), Int64, static_cast&lt;uint64_t&gt;(static_cast&lt;uint32_t&gt;(value-&gt;asInt32())));
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::ZExt32, origin(), value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -358,8 +381,11 @@
</span><span class="cx"> 
</span><span class="cx"> LValue Output::castToInt32(LValue value)
</span><span class="cx"> {
</span><del>-    return value-&gt;type() == B3::Int32 ? value :
-        m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Trunc, origin(), value);
</del><ins>+    if (value-&gt;type() == Int32)
+        return value;
+    if (value-&gt;hasInt64())
+        return constInt32(static_cast&lt;int32_t&gt;(value-&gt;asInt64()));
+    return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Trunc, origin(), value);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::doubleToFloat(LValue value)
</span><span class="lines">@@ -453,51 +479,81 @@
</span><span class="cx"> 
</span><span class="cx"> LValue Output::equal(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;equalConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Equal, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::notEqual(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;notEqualConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::NotEqual, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::above(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;aboveConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Above, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::aboveOrEqual(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;aboveEqualConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::AboveEqual, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::below(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;belowConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Below, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::belowOrEqual(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;belowEqualConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::BelowEqual, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::greaterThan(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;greaterThanConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::GreaterThan, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::greaterThanOrEqual(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;greaterEqualConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::GreaterEqual, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::lessThan(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;lessThanConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::LessThan, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> LValue Output::lessThanOrEqual(LValue left, LValue right)
</span><span class="cx"> {
</span><ins>+    TriState result = left-&gt;lessEqualConstant(right);
+    if (result != MixedTriState)
+        return constBool(result == TrueTriState);
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::LessEqual, origin(), left, right);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -583,6 +639,12 @@
</span><span class="cx"> 
</span><span class="cx"> LValue Output::select(LValue value, LValue taken, LValue notTaken)
</span><span class="cx"> {
</span><ins>+    if (value-&gt;hasInt32()) {
+        if (value-&gt;asInt32())
+            return taken;
+        else
+            return notTaken;
+    }
</ins><span class="cx">     return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::Select, origin(), value, taken, notTaken);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -621,6 +683,11 @@
</span><span class="cx">     m_block-&gt;appendNewControlValue(m_proc, B3::Oops, origin());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Output::appendSuccessor(WeightedTarget target)
+{
+    m_block-&gt;appendSuccessor(target.frequentedBlock());
+}
+
</ins><span class="cx"> CheckValue* Output::speculate(LValue value)
</span><span class="cx"> {
</span><span class="cx">     return m_block-&gt;appendNew&lt;B3::CheckValue&gt;(m_proc, B3::Check, origin(), value);
</span><span class="lines">@@ -741,7 +808,8 @@
</span><span class="cx"> 
</span><span class="cx"> void Output::addIncomingToPhi(LValue phi, ValueFromBlock value)
</span><span class="cx"> {
</span><del>-    value.value()-&gt;as&lt;B3::UpsilonValue&gt;()-&gt;setPhi(phi);
</del><ins>+    if (value)
+        value.value()-&gt;as&lt;B3::UpsilonValue&gt;()-&gt;setPhi(phi);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::FTL
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLOutputh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLOutput.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -398,6 +398,8 @@
</span><span class="cx">     void ret(LValue);
</span><span class="cx"> 
</span><span class="cx">     void unreachable();
</span><ins>+    
+    void appendSuccessor(WeightedTarget);
</ins><span class="cx"> 
</span><span class="cx">     B3::CheckValue* speculate(LValue);
</span><span class="cx">     B3::CheckValue* speculateAdd(LValue, LValue);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLValueFromBlockh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLValueFromBlock.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLValueFromBlock.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLValueFromBlock.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -45,6 +45,8 @@
</span><span class="cx">         , m_block(block)
</span><span class="cx">     {
</span><span class="cx">     }
</span><ins>+    
+    explicit operator bool() const { return m_value || m_block; }
</ins><span class="cx"> 
</span><span class="cx">     LValue value() const { return m_value; }
</span><span class="cx">     LBasicBlock block() const { return m_block; }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreftlFTLWeightedTargeth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLWeightedTarget.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLWeightedTarget.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/ftl/FTLWeightedTarget.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -55,6 +55,11 @@
</span><span class="cx">     LBasicBlock target() const { return m_target; }
</span><span class="cx">     Weight weight() const { return m_weight; }
</span><span class="cx">     
</span><ins>+    B3::FrequentedBlock frequentedBlock() const
+    {
+        return B3::FrequentedBlock(target(), weight().frequencyClass());
+    }
+    
</ins><span class="cx"> private:
</span><span class="cx">     LBasicBlock m_target;
</span><span class="cx">     Weight m_weight;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapCellContainerh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainer.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainer.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainer.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,93 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#include &lt;wtf/StdLibExtras.h&gt;
+
+namespace JSC {
+
+class HeapCell;
+class LargeAllocation;
+class MarkedBlock;
+class WeakSet;
+
+// This is how we abstract over either MarkedBlock&amp; or LargeAllocation&amp;. Put things in here as you
+// find need for them.
+
+class CellContainer {
+public:
+    CellContainer()
+        : m_encodedPointer(0)
+    {
+    }
+    
+    CellContainer(MarkedBlock&amp; markedBlock)
+        : m_encodedPointer(bitwise_cast&lt;uintptr_t&gt;(&amp;markedBlock))
+    {
+    }
+    
+    CellContainer(LargeAllocation&amp; largeAllocation)
+        : m_encodedPointer(bitwise_cast&lt;uintptr_t&gt;(&amp;largeAllocation) | isLargeAllocationBit)
+    {
+    }
+    
+    explicit operator bool() const { return !!m_encodedPointer; }
+    
+    bool isMarkedBlock() const { return m_encodedPointer &amp;&amp; !(m_encodedPointer &amp; isLargeAllocationBit); }
+    bool isLargeAllocation() const { return m_encodedPointer &amp; isLargeAllocationBit; }
+    
+    MarkedBlock&amp; markedBlock() const
+    {
+        ASSERT(isMarkedBlock());
+        return *bitwise_cast&lt;MarkedBlock*&gt;(m_encodedPointer);
+    }
+    
+    LargeAllocation&amp; largeAllocation() const
+    {
+        ASSERT(isLargeAllocation());
+        return *bitwise_cast&lt;LargeAllocation*&gt;(m_encodedPointer - isLargeAllocationBit);
+    }
+    
+    void flipIfNecessary(uint64_t heapVersion);
+    void flipIfNecessary();
+    
+    bool isMarked() const;
+    bool isMarked(HeapCell*) const;
+    bool isMarkedOrNewlyAllocated(HeapCell*) const;
+    
+    void noteMarked();
+    
+    size_t cellSize() const;
+    
+    WeakSet&amp; weakSet() const;
+    
+private:
+    static const uintptr_t isLargeAllocationBit = 1;
+    uintptr_t m_encodedPointer;
+};
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapCellContainerInlineshfromrev205702releasesWebKitGTKwebkit214SourceJavaScriptCorebytecodeLLIntPrototypeLoadAdaptiveStructureWatchpointcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainerInlines.h (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainerInlines.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CellContainerInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,89 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#include &quot;CellContainer.h&quot;
+#include &quot;JSCell.h&quot;
+#include &quot;LargeAllocation.h&quot;
+#include &quot;MarkedBlock.h&quot;
+
+namespace JSC {
+
+inline bool CellContainer::isMarked() const
+{
+    if (isLargeAllocation())
+        return true;
+    return markedBlock().handle().isMarked();
+}
+
+inline bool CellContainer::isMarked(HeapCell* cell) const
+{
+    if (isLargeAllocation())
+        return largeAllocation().isMarked();
+    return markedBlock().isMarked(cell);
+}
+
+inline bool CellContainer::isMarkedOrNewlyAllocated(HeapCell* cell) const
+{
+    if (isLargeAllocation())
+        return largeAllocation().isMarkedOrNewlyAllocated();
+    return markedBlock().isMarkedOrNewlyAllocated(cell);
+}
+
+inline void CellContainer::noteMarked()
+{
+    if (!isLargeAllocation())
+        markedBlock().noteMarked();
+}
+
+inline size_t CellContainer::cellSize() const
+{
+    if (isLargeAllocation())
+        return largeAllocation().cellSize();
+    return markedBlock().cellSize();
+}
+
+inline WeakSet&amp; CellContainer::weakSet() const
+{
+    if (isLargeAllocation())
+        return largeAllocation().weakSet();
+    return markedBlock().weakSet();
+}
+
+inline void CellContainer::flipIfNecessary(uint64_t heapVersion)
+{
+    if (!isLargeAllocation())
+        markedBlock().flipIfNecessary(heapVersion);
+}
+
+inline void CellContainer::flipIfNecessary()
+{
+    if (!isLargeAllocation())
+        markedBlock().flipIfNecessary();
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapConservativeRootscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2011 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2011, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> #include &quot;CopiedSpace.h&quot;
</span><span class="cx"> #include &quot;CopiedSpaceInlines.h&quot;
</span><span class="cx"> #include &quot;HeapInlines.h&quot;
</span><ins>+#include &quot;HeapUtil.h&quot;
+#include &quot;JITStubRoutineSet.h&quot;
</ins><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="lines">@@ -39,12 +41,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-ConservativeRoots::ConservativeRoots(MarkedBlockSet* blocks, CopiedSpace* copiedSpace)
</del><ins>+ConservativeRoots::ConservativeRoots(Heap&amp; heap)
</ins><span class="cx">     : m_roots(m_inlineRoots)
</span><span class="cx">     , m_size(0)
</span><span class="cx">     , m_capacity(inlineCapacity)
</span><del>-    , m_blocks(blocks)
-    , m_copiedSpace(copiedSpace)
</del><ins>+    , m_heap(heap)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -51,34 +52,35 @@
</span><span class="cx"> ConservativeRoots::~ConservativeRoots()
</span><span class="cx"> {
</span><span class="cx">     if (m_roots != m_inlineRoots)
</span><del>-        OSAllocator::decommitAndRelease(m_roots, m_capacity * sizeof(JSCell*));
</del><ins>+        OSAllocator::decommitAndRelease(m_roots, m_capacity * sizeof(HeapCell*));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ConservativeRoots::grow()
</span><span class="cx"> {
</span><span class="cx">     size_t newCapacity = m_capacity == inlineCapacity ? nonInlineCapacity : m_capacity * 2;
</span><del>-    JSCell** newRoots = static_cast&lt;JSCell**&gt;(OSAllocator::reserveAndCommit(newCapacity * sizeof(JSCell*)));
-    memcpy(newRoots, m_roots, m_size * sizeof(JSCell*));
</del><ins>+    HeapCell** newRoots = static_cast&lt;HeapCell**&gt;(OSAllocator::reserveAndCommit(newCapacity * sizeof(HeapCell*)));
+    memcpy(newRoots, m_roots, m_size * sizeof(HeapCell*));
</ins><span class="cx">     if (m_roots != m_inlineRoots)
</span><del>-        OSAllocator::decommitAndRelease(m_roots, m_capacity * sizeof(JSCell*));
</del><ins>+        OSAllocator::decommitAndRelease(m_roots, m_capacity * sizeof(HeapCell*));
</ins><span class="cx">     m_capacity = newCapacity;
</span><span class="cx">     m_roots = newRoots;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename MarkHook&gt;
</span><del>-inline void ConservativeRoots::genericAddPointer(void* p, TinyBloomFilter filter, MarkHook&amp; markHook)
</del><ins>+inline void ConservativeRoots::genericAddPointer(void* p, int64_t version, TinyBloomFilter filter, MarkHook&amp; markHook)
</ins><span class="cx"> {
</span><span class="cx">     markHook.mark(p);
</span><span class="cx"> 
</span><del>-    m_copiedSpace-&gt;pinIfNecessary(p);
</del><ins>+    m_heap.storageSpace().pinIfNecessary(p);
</ins><span class="cx"> 
</span><del>-    if (!Heap::isPointerGCObject(filter, *m_blocks, p))
-        return;
-
-    if (m_size == m_capacity)
-        grow();
-
-    m_roots[m_size++] = static_cast&lt;JSCell*&gt;(p);
</del><ins>+    HeapUtil::findGCObjectPointersForMarking(
+        m_heap, version, filter, p,
+        [&amp;] (void* p) {
+            if (m_size == m_capacity)
+                grow();
+            
+            m_roots[m_size++] = bitwise_cast&lt;HeapCell*&gt;(p);
+        });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename MarkHook&gt;
</span><span class="lines">@@ -94,9 +96,10 @@
</span><span class="cx">     RELEASE_ASSERT(isPointerAligned(begin));
</span><span class="cx">     RELEASE_ASSERT(isPointerAligned(end));
</span><span class="cx"> 
</span><del>-    TinyBloomFilter filter = m_blocks-&gt;filter(); // Make a local copy of filter to show the compiler it won't alias, and can be register-allocated.
</del><ins>+    TinyBloomFilter filter = m_heap.objectSpace().blocks().filter(); // Make a local copy of filter to show the compiler it won't alias, and can be register-allocated.
+    int64_t version = m_heap.objectSpace().version();
</ins><span class="cx">     for (char** it = static_cast&lt;char**&gt;(begin); it != static_cast&lt;char**&gt;(end); ++it)
</span><del>-        genericAddPointer(*it, filter, markHook);
</del><ins>+        genericAddPointer(*it, version, filter, markHook);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class DummyMarkHook {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapConservativeRootsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/ConservativeRoots.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2009 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2009, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -31,12 +31,12 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class CodeBlockSet;
</span><ins>+class HeapCell;
</ins><span class="cx"> class JITStubRoutineSet;
</span><del>-class JSCell;
</del><span class="cx"> 
</span><span class="cx"> class ConservativeRoots {
</span><span class="cx"> public:
</span><del>-    ConservativeRoots(MarkedBlockSet*, CopiedSpace*);
</del><ins>+    ConservativeRoots(Heap&amp;);
</ins><span class="cx">     ~ConservativeRoots();
</span><span class="cx"> 
</span><span class="cx">     void add(void* begin, void* end);
</span><span class="lines">@@ -44,14 +44,14 @@
</span><span class="cx">     void add(void* begin, void* end, JITStubRoutineSet&amp;, CodeBlockSet&amp;);
</span><span class="cx">     
</span><span class="cx">     size_t size();
</span><del>-    JSCell** roots();
</del><ins>+    HeapCell** roots();
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     static const size_t inlineCapacity = 128;
</span><del>-    static const size_t nonInlineCapacity = 8192 / sizeof(JSCell*);
</del><ins>+    static const size_t nonInlineCapacity = 8192 / sizeof(HeapCell*);
</ins><span class="cx">     
</span><span class="cx">     template&lt;typename MarkHook&gt;
</span><del>-    void genericAddPointer(void*, TinyBloomFilter, MarkHook&amp;);
</del><ins>+    void genericAddPointer(void*, int64_t heapVersion, TinyBloomFilter, MarkHook&amp;);
</ins><span class="cx"> 
</span><span class="cx">     template&lt;typename MarkHook&gt;
</span><span class="cx">     void genericAddSpan(void*, void* end, MarkHook&amp;);
</span><span class="lines">@@ -58,12 +58,11 @@
</span><span class="cx">     
</span><span class="cx">     void grow();
</span><span class="cx"> 
</span><del>-    JSCell** m_roots;
</del><ins>+    HeapCell** m_roots;
</ins><span class="cx">     size_t m_size;
</span><span class="cx">     size_t m_capacity;
</span><del>-    MarkedBlockSet* m_blocks;
-    CopiedSpace* m_copiedSpace;
-    JSCell* m_inlineRoots[inlineCapacity];
</del><ins>+    Heap&amp; m_heap;
+    HeapCell* m_inlineRoots[inlineCapacity];
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> inline size_t ConservativeRoots::size()
</span><span class="lines">@@ -71,7 +70,7 @@
</span><span class="cx">     return m_size;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline JSCell** ConservativeRoots::roots()
</del><ins>+inline HeapCell** ConservativeRoots::roots()
</ins><span class="cx"> {
</span><span class="cx">     return m_roots;
</span><span class="cx"> }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapCopyTokenh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CopyToken.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CopyToken.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/CopyToken.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> enum CopyToken {
</span><del>-    ButterflyCopyToken,
</del><span class="cx">     TypedArrayVectorCopyToken,
</span><span class="cx">     MapBackingStoreCopyToken,
</span><span class="cx">     DirectArgumentsOverridesCopyToken
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapFreeListcppfromrev205702releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSErrorEventCustomcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.cpp (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSErrorEventCustom.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;FreeList.h&quot;
+
+namespace JSC {
+
+void FreeList::dump(PrintStream&amp; out) const
+{
+    out.print(&quot;{head = &quot;, RawPointer(head), &quot;, payloadEnd = &quot;, RawPointer(payloadEnd), &quot;, remaining = &quot;, remaining, &quot;, originalSize = &quot;, originalSize, &quot;}&quot;);
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapFreeListh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/FreeList.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,91 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#include &lt;wtf/PrintStream.h&gt;
+
+namespace JSC {
+
+struct FreeCell {
+    FreeCell* next;
+};
+        
+// This representation of a FreeList is convenient for the MarkedAllocator.
+
+struct FreeList {
+    FreeCell* head { nullptr };
+    char* payloadEnd { nullptr };
+    unsigned remaining { 0 };
+    unsigned originalSize { 0 };
+    
+    FreeList()
+    {
+    }
+    
+    static FreeList list(FreeCell* head, unsigned bytes)
+    {
+        FreeList result;
+        result.head = head;
+        result.remaining = 0;
+        result.originalSize = bytes;
+        return result;
+    }
+    
+    static FreeList bump(char* payloadEnd, unsigned remaining)
+    {
+        FreeList result;
+        result.payloadEnd = payloadEnd;
+        result.remaining = remaining;
+        result.originalSize = remaining;
+        return result;
+    }
+    
+    bool operator==(const FreeList&amp; other) const
+    {
+        return head == other.head
+            &amp;&amp; payloadEnd == other.payloadEnd
+            &amp;&amp; remaining == other.remaining
+            &amp;&amp; originalSize == other.originalSize;
+    }
+    
+    bool operator!=(const FreeList&amp; other) const
+    {
+        return !(*this == other);
+    }
+    
+    explicit operator bool() const
+    {
+        return *this != FreeList();
+    }
+    
+    bool allocationWillFail() const { return !head &amp;&amp; !remaining; }
+    bool allocationWillSucceed() const { return !allocationWillFail(); }
+    
+    void dump(PrintStream&amp;) const;
+};
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapGCTypeMaphfromrev205702releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingContactSelectedEventCustomcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/GCTypeMap.h (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/GCTypeMap.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/GCTypeMap.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,56 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;HeapOperation.h&quot;
+#include &lt;wtf/Assertions.h&gt;
+
+namespace JSC {
+
+template&lt;typename T&gt;
+struct GCTypeMap {
+    T eden;
+    T full;
+    
+    T&amp; operator[](HeapOperation operation)
+    {
+        if (operation == FullCollection)
+            return full;
+        ASSERT(operation == EdenCollection);
+        return eden;
+    }
+    
+    const T&amp; operator[](HeapOperation operation) const
+    {
+        if (operation == FullCollection)
+            return full;
+        ASSERT(operation == EdenCollection);
+        return eden;
+    }
+};
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;FullGCActivityCallback.h&quot;
</span><span class="cx"> #include &quot;GCActivityCallback.h&quot;
</span><span class="cx"> #include &quot;GCIncomingRefCountedSetInlines.h&quot;
</span><ins>+#include &quot;GCTypeMap.h&quot;
</ins><span class="cx"> #include &quot;HeapHelperPool.h&quot;
</span><span class="cx"> #include &quot;HeapIterationScope.h&quot;
</span><span class="cx"> #include &quot;HeapProfiler.h&quot;
</span><span class="lines">@@ -40,6 +41,7 @@
</span><span class="cx"> #include &quot;HeapVerifier.h&quot;
</span><span class="cx"> #include &quot;IncrementalSweeper.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><ins>+#include &quot;JITStubRoutineSet.h&quot;
</ins><span class="cx"> #include &quot;JITWorklist.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="lines">@@ -47,6 +49,7 @@
</span><span class="cx"> #include &quot;JSVirtualMachineInternal.h&quot;
</span><span class="cx"> #include &quot;SamplingProfiler.h&quot;
</span><span class="cx"> #include &quot;ShadowChicken.h&quot;
</span><ins>+#include &quot;SuperSampler.h&quot;
</ins><span class="cx"> #include &quot;TypeProfilerLog.h&quot;
</span><span class="cx"> #include &quot;UnlinkedCodeBlock.h&quot;
</span><span class="cx"> #include &quot;VM.h&quot;
</span><span class="lines">@@ -57,6 +60,7 @@
</span><span class="cx"> #include &lt;wtf/ParallelVectorIterator.h&gt;
</span><span class="cx"> #include &lt;wtf/ProcessID.h&gt;
</span><span class="cx"> #include &lt;wtf/RAMSize.h&gt;
</span><ins>+#include &lt;wtf/SimpleStats.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if USE(FOUNDATION)
</span><span class="cx"> #if __has_include(&lt;objc/objc-internal.h&gt;)
</span><span class="lines">@@ -74,152 +78,9 @@
</span><span class="cx"> namespace {
</span><span class="cx"> 
</span><span class="cx"> static const size_t largeHeapSize = 32 * MB; // About 1.5X the average webpage.
</span><del>-static const size_t smallHeapSize = 1 * MB; // Matches the FastMalloc per-thread cache.
</del><ins>+const size_t smallHeapSize = 1 * MB; // Matches the FastMalloc per-thread cache.
</ins><span class="cx"> 
</span><del>-#define ENABLE_GC_LOGGING 0
-
-#if ENABLE(GC_LOGGING)
-#if COMPILER(CLANG)
-#define DEFINE_GC_LOGGING_GLOBAL(type, name, arguments) \
-_Pragma(&quot;clang diagnostic push&quot;) \
-_Pragma(&quot;clang diagnostic ignored \&quot;-Wglobal-constructors\&quot;&quot;) \
-_Pragma(&quot;clang diagnostic ignored \&quot;-Wexit-time-destructors\&quot;&quot;) \
-static type name arguments; \
-_Pragma(&quot;clang diagnostic pop&quot;)
-#else
-#define DEFINE_GC_LOGGING_GLOBAL(type, name, arguments) \
-static type name arguments;
-#endif // COMPILER(CLANG)
-
-struct GCTimer {
-    GCTimer(const char* name)
-        : name(name)
-    {
-    }
-    ~GCTimer()
-    {
-        logData(allCollectionData, &quot;(All)&quot;);
-        logData(edenCollectionData, &quot;(Eden)&quot;);
-        logData(fullCollectionData, &quot;(Full)&quot;);
-    }
-
-    struct TimeRecord {
-        TimeRecord()
-            : time(0)
-            , min(std::numeric_limits&lt;double&gt;::infinity())
-            , max(0)
-            , count(0)
-        {
-        }
-
-        double time;
-        double min;
-        double max;
-        size_t count;
-    };
-
-    void logData(const TimeRecord&amp; data, const char* extra)
-    {
-        dataLogF(&quot;[%d] %s (Parent: %s) %s: %.2lfms (avg. %.2lf, min. %.2lf, max. %.2lf, count %lu)\n&quot;, 
-            getCurrentProcessID(),
-            name,
-            parent ? parent-&gt;name : &quot;nullptr&quot;,
-            extra, 
-            data.time * 1000, 
-            data.time * 1000 / data.count, 
-            data.min * 1000, 
-            data.max * 1000,
-            data.count);
-    }
-
-    void updateData(TimeRecord&amp; data, double duration)
-    {
-        if (duration &lt; data.min)
-            data.min = duration;
-        if (duration &gt; data.max)
-            data.max = duration;
-        data.count++;
-        data.time += duration;
-    }
-
-    void didFinishPhase(HeapOperation collectionType, double duration)
-    {
-        TimeRecord&amp; data = collectionType == EdenCollection ? edenCollectionData : fullCollectionData;
-        updateData(data, duration);
-        updateData(allCollectionData, duration);
-    }
-
-    static GCTimer* s_currentGlobalTimer;
-
-    TimeRecord allCollectionData;
-    TimeRecord fullCollectionData;
-    TimeRecord edenCollectionData;
-    const char* name;
-    GCTimer* parent { nullptr };
-};
-
-GCTimer* GCTimer::s_currentGlobalTimer = nullptr;
-
-struct GCTimerScope {
-    GCTimerScope(GCTimer&amp; timer, HeapOperation collectionType)
-        : timer(timer)
-        , start(WTF::monotonicallyIncreasingTime())
-        , collectionType(collectionType)
-    {
-        timer.parent = GCTimer::s_currentGlobalTimer;
-        GCTimer::s_currentGlobalTimer = &amp;timer;
-    }
-    ~GCTimerScope()
-    {
-        double delta = WTF::monotonicallyIncreasingTime() - start;
-        timer.didFinishPhase(collectionType, delta);
-        GCTimer::s_currentGlobalTimer = timer.parent;
-    }
-    GCTimer&amp; timer;
-    double start;
-    HeapOperation collectionType;
-};
-
-struct GCCounter {
-    GCCounter(const char* name)
-        : name(name)
-        , count(0)
-        , total(0)
-        , min(10000000)
-        , max(0)
-    {
-    }
-    
-    void add(size_t amount)
-    {
-        count++;
-        total += amount;
-        if (amount &lt; min)
-            min = amount;
-        if (amount &gt; max)
-            max = amount;
-    }
-    ~GCCounter()
-    {
-        dataLogF(&quot;[%d] %s: %zu values (avg. %zu, min. %zu, max. %zu)\n&quot;, getCurrentProcessID(), name, total, total / count, min, max);
-    }
-    const char* name;
-    size_t count;
-    size_t total;
-    size_t min;
-    size_t max;
-};
-
-#define GCPHASE(name) DEFINE_GC_LOGGING_GLOBAL(GCTimer, name##Timer, (#name)); GCTimerScope name##TimerScope(name##Timer, m_operationInProgress)
-#define GCCOUNTER(name, value) do { DEFINE_GC_LOGGING_GLOBAL(GCCounter, name##Counter, (#name)); name##Counter.add(value); } while (false)
-    
-#else
-
-#define GCPHASE(name) do { } while (false)
-#define GCCOUNTER(name, value) do { } while (false)
-#endif
-
-static inline size_t minHeapSize(HeapType heapType, size_t ramSize)
</del><ins>+size_t minHeapSize(HeapType heapType, size_t ramSize)
</ins><span class="cx"> {
</span><span class="cx">     if (heapType == LargeHeap)
</span><span class="cx">         return min(largeHeapSize, ramSize / 4);
</span><span class="lines">@@ -226,7 +87,7 @@
</span><span class="cx">     return smallHeapSize;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline size_t proportionalHeapSize(size_t heapSize, size_t ramSize)
</del><ins>+size_t proportionalHeapSize(size_t heapSize, size_t ramSize)
</ins><span class="cx"> {
</span><span class="cx">     // Try to stay under 1/2 RAM size to leave room for the DOM, rendering, networking, etc.
</span><span class="cx">     if (heapSize &lt; ramSize / 4)
</span><span class="lines">@@ -236,12 +97,12 @@
</span><span class="cx">     return 1.25 * heapSize;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline bool isValidSharedInstanceThreadState(VM* vm)
</del><ins>+bool isValidSharedInstanceThreadState(VM* vm)
</ins><span class="cx"> {
</span><span class="cx">     return vm-&gt;currentThreadIsHoldingAPILock();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline bool isValidThreadState(VM* vm)
</del><ins>+bool isValidThreadState(VM* vm)
</ins><span class="cx"> {
</span><span class="cx">     if (vm-&gt;atomicStringTable() != wtfThreadData().atomicStringTable())
</span><span class="cx">         return false;
</span><span class="lines">@@ -252,7 +113,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline void recordType(TypeCountSet&amp; set, JSCell* cell)
</del><ins>+void recordType(TypeCountSet&amp; set, JSCell* cell)
</ins><span class="cx"> {
</span><span class="cx">     const char* typeName = &quot;[unknown]&quot;;
</span><span class="cx">     const ClassInfo* info = cell-&gt;classInfo();
</span><span class="lines">@@ -261,6 +122,69 @@
</span><span class="cx">     set.add(typeName);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool measurePhaseTiming()
+{
+    return false;
+}
+
+HashMap&lt;const char*, GCTypeMap&lt;SimpleStats&gt;&gt;&amp; timingStats()
+{
+    static HashMap&lt;const char*, GCTypeMap&lt;SimpleStats&gt;&gt;* result;
+    static std::once_flag once;
+    std::call_once(
+        once,
+        [] {
+            result = new HashMap&lt;const char*, GCTypeMap&lt;SimpleStats&gt;&gt;();
+        });
+    return *result;
+}
+
+SimpleStats&amp; timingStats(const char* name, HeapOperation operation)
+{
+    return timingStats().add(name, GCTypeMap&lt;SimpleStats&gt;()).iterator-&gt;value[operation];
+}
+
+class TimingScope {
+public:
+    TimingScope(HeapOperation operation, const char* name)
+        : m_operation(operation)
+        , m_name(name)
+    {
+        if (measurePhaseTiming())
+            m_before = monotonicallyIncreasingTimeMS();
+    }
+    
+    TimingScope(Heap&amp; heap, const char* name)
+        : TimingScope(heap.operationInProgress(), name)
+    {
+    }
+    
+    void setOperation(HeapOperation operation)
+    {
+        m_operation = operation;
+    }
+    
+    void setOperation(Heap&amp; heap)
+    {
+        setOperation(heap.operationInProgress());
+    }
+    
+    ~TimingScope()
+    {
+        if (measurePhaseTiming()) {
+            double after = monotonicallyIncreasingTimeMS();
+            double timing = after - m_before;
+            SimpleStats&amp; stats = timingStats(m_name, m_operation);
+            stats.add(timing);
+            dataLog(&quot;[GC:&quot;, m_operation, &quot;] &quot;, m_name, &quot; took: &quot;, timing, &quot; ms (average &quot;, stats.mean(), &quot; ms).\n&quot;);
+        }
+    }
+private:
+    HeapOperation m_operation;
+    double m_before;
+    const char* m_name;
+};
+
</ins><span class="cx"> } // anonymous namespace
</span><span class="cx"> 
</span><span class="cx"> Heap::Heap(VM* vm, HeapType heapType)
</span><span class="lines">@@ -287,6 +211,8 @@
</span><span class="cx">     , m_machineThreads(this)
</span><span class="cx">     , m_slotVisitor(*this)
</span><span class="cx">     , m_handleSet(vm)
</span><ins>+    , m_codeBlocks(std::make_unique&lt;CodeBlockSet&gt;())
+    , m_jitStubRoutines(std::make_unique&lt;JITStubRoutineSet&gt;())
</ins><span class="cx">     , m_isSafeToCollect(false)
</span><span class="cx">     , m_writeBarrierBuffer(256)
</span><span class="cx">     , m_vm(vm)
</span><span class="lines">@@ -331,7 +257,7 @@
</span><span class="cx">     RELEASE_ASSERT(m_operationInProgress == NoOperation);
</span><span class="cx"> 
</span><span class="cx">     m_arrayBuffers.lastChanceToFinalize();
</span><del>-    m_codeBlocks.lastChanceToFinalize();
</del><ins>+    m_codeBlocks-&gt;lastChanceToFinalize();
</ins><span class="cx">     m_objectSpace.lastChanceToFinalize();
</span><span class="cx">     releaseDelayedReleasedObjects();
</span><span class="cx"> 
</span><span class="lines">@@ -434,7 +360,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::finalizeUnconditionalFinalizers()
</span><span class="cx"> {
</span><del>-    GCPHASE(FinalizeUnconditionalFinalizers);
</del><span class="cx">     m_slotVisitor.finalizeUnconditionalFinalizers();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -460,76 +385,86 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::markRoots(double gcStartTime, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&amp; calleeSavedRegisters)
</span><span class="cx"> {
</span><del>-    GCPHASE(MarkRoots);
</del><ins>+    TimingScope markRootsTimingScope(*this, &quot;Heap::markRoots&quot;);
+    
</ins><span class="cx">     ASSERT(isValidThreadState(m_vm));
</span><span class="cx"> 
</span><del>-    // We gather conservative roots before clearing mark bits because conservative
-    // gathering uses the mark bits to determine whether a reference is valid.
-    ConservativeRoots conservativeRoots(&amp;m_objectSpace.blocks(), &amp;m_storageSpace);
-    gatherStackRoots(conservativeRoots, stackOrigin, stackTop, calleeSavedRegisters);
-    gatherJSStackRoots(conservativeRoots);
-    gatherScratchBufferRoots(conservativeRoots);
</del><ins>+    HeapRootVisitor heapRootVisitor(m_slotVisitor);
+    
+    ConservativeRoots conservativeRoots(*this);
+    {
+        TimingScope preConvergenceTimingScope(*this, &quot;Heap::markRoots before convergence&quot;);
+        // We gather conservative roots before clearing mark bits because conservative
+        // gathering uses the mark bits to determine whether a reference is valid.
+        {
+            TimingScope preConvergenceTimingScope(*this, &quot;Heap::markRoots conservative scan&quot;);
+            SuperSamplerScope superSamplerScope(false);
+            gatherStackRoots(conservativeRoots, stackOrigin, stackTop, calleeSavedRegisters);
+            gatherJSStackRoots(conservativeRoots);
+            gatherScratchBufferRoots(conservativeRoots);
+        }
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    DFG::rememberCodeBlocks(*m_vm);
</del><ins>+        DFG::rememberCodeBlocks(*m_vm);
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(SAMPLING_PROFILER)
</span><del>-    if (SamplingProfiler* samplingProfiler = m_vm-&gt;samplingProfiler()) {
-        // Note that we need to own the lock from now until we're done
-        // marking the SamplingProfiler's data because once we verify the
-        // SamplingProfiler's stack traces, we don't want it to accumulate
-        // more stack traces before we get the chance to mark it.
-        // This lock is released inside visitSamplingProfiler().
-        samplingProfiler-&gt;getLock().lock();
-        samplingProfiler-&gt;processUnverifiedStackTraces();
-    }
</del><ins>+        if (SamplingProfiler* samplingProfiler = m_vm-&gt;samplingProfiler()) {
+            // Note that we need to own the lock from now until we're done
+            // marking the SamplingProfiler's data because once we verify the
+            // SamplingProfiler's stack traces, we don't want it to accumulate
+            // more stack traces before we get the chance to mark it.
+            // This lock is released inside visitSamplingProfiler().
+            samplingProfiler-&gt;getLock().lock();
+            samplingProfiler-&gt;processUnverifiedStackTraces();
+        }
</ins><span class="cx"> #endif // ENABLE(SAMPLING_PROFILER)
</span><span class="cx"> 
</span><del>-    if (m_operationInProgress == FullCollection) {
-        m_opaqueRoots.clear();
-        m_slotVisitor.clearMarkStack();
-    }
</del><ins>+        if (m_operationInProgress == FullCollection) {
+            m_opaqueRoots.clear();
+            m_slotVisitor.clearMarkStack();
+        }
</ins><span class="cx"> 
</span><del>-    clearLivenessData();
</del><ins>+        clearLivenessData();
</ins><span class="cx"> 
</span><del>-    m_parallelMarkersShouldExit = false;
</del><ins>+        m_parallelMarkersShouldExit = false;
</ins><span class="cx"> 
</span><del>-    m_helperClient.setFunction(
-        [this] () {
-            SlotVisitor* slotVisitor;
-            {
-                LockHolder locker(m_parallelSlotVisitorLock);
-                if (m_availableParallelSlotVisitors.isEmpty()) {
-                    std::unique_ptr&lt;SlotVisitor&gt; newVisitor =
-                        std::make_unique&lt;SlotVisitor&gt;(*this);
-                    slotVisitor = newVisitor.get();
-                    m_parallelSlotVisitors.append(WTFMove(newVisitor));
-                } else
-                    slotVisitor = m_availableParallelSlotVisitors.takeLast();
-            }
</del><ins>+        m_helperClient.setFunction(
+            [this] () {
+                SlotVisitor* slotVisitor;
+                {
+                    LockHolder locker(m_parallelSlotVisitorLock);
+                    if (m_availableParallelSlotVisitors.isEmpty()) {
+                        std::unique_ptr&lt;SlotVisitor&gt; newVisitor =
+                            std::make_unique&lt;SlotVisitor&gt;(*this);
+                        slotVisitor = newVisitor.get();
+                        m_parallelSlotVisitors.append(WTFMove(newVisitor));
+                    } else
+                        slotVisitor = m_availableParallelSlotVisitors.takeLast();
+                }
</ins><span class="cx"> 
</span><del>-            WTF::registerGCThread();
</del><ins>+                WTF::registerGCThread();
</ins><span class="cx"> 
</span><del>-            {
-                ParallelModeEnabler parallelModeEnabler(*slotVisitor);
-                slotVisitor-&gt;didStartMarking();
-                slotVisitor-&gt;drainFromShared(SlotVisitor::SlaveDrain);
-            }
</del><ins>+                {
+                    ParallelModeEnabler parallelModeEnabler(*slotVisitor);
+                    slotVisitor-&gt;didStartMarking();
+                    slotVisitor-&gt;drainFromShared(SlotVisitor::SlaveDrain);
+                }
</ins><span class="cx"> 
</span><del>-            {
-                LockHolder locker(m_parallelSlotVisitorLock);
-                m_availableParallelSlotVisitors.append(slotVisitor);
-            }
-        });
</del><ins>+                {
+                    LockHolder locker(m_parallelSlotVisitorLock);
+                    m_availableParallelSlotVisitors.append(slotVisitor);
+                }
+            });
</ins><span class="cx"> 
</span><del>-    m_slotVisitor.didStartMarking();
</del><ins>+        m_slotVisitor.didStartMarking();
+    }
</ins><span class="cx">     
</span><del>-    HeapRootVisitor heapRootVisitor(m_slotVisitor);
-
</del><span class="cx">     {
</span><ins>+        SuperSamplerScope superSamplerScope(false);
+        TimingScope convergenceTimingScope(*this, &quot;Heap::markRoots convergence&quot;);
</ins><span class="cx">         ParallelModeEnabler enabler(m_slotVisitor);
</span><del>-
</del><ins>+        
</ins><span class="cx">         m_slotVisitor.donateAndDrain();
</span><span class="cx">         visitExternalRememberedSet();
</span><span class="cx">         visitSmallStrings();
</span><span class="lines">@@ -544,6 +479,8 @@
</span><span class="cx">         traceCodeBlocksAndJITStubRoutines();
</span><span class="cx">         converge();
</span><span class="cx">     }
</span><ins>+    
+    TimingScope postConvergenceTimingScope(*this, &quot;Heap::markRoots after convergence&quot;);
</ins><span class="cx"> 
</span><span class="cx">     // Weak references must be marked last because their liveness depends on
</span><span class="cx">     // the liveness of the rest of the object graph.
</span><span class="lines">@@ -561,7 +498,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::copyBackingStores()
</span><span class="cx"> {
</span><del>-    GCPHASE(CopyBackingStores);
</del><ins>+    SuperSamplerScope superSamplerScope(false);
</ins><span class="cx">     if (m_operationInProgress == EdenCollection)
</span><span class="cx">         m_storageSpace.startedCopying&lt;EdenCollection&gt;();
</span><span class="cx">     else {
</span><span class="lines">@@ -598,12 +535,6 @@
</span><span class="cx">                         
</span><span class="cx">                         CopyWorkList&amp; workList = block-&gt;workList();
</span><span class="cx">                         for (CopyWorklistItem item : workList) {
</span><del>-                            if (item.token() == ButterflyCopyToken) {
-                                JSObject::copyBackingStore(
-                                    item.cell(), copyVisitor, ButterflyCopyToken);
-                                continue;
-                            }
-                            
</del><span class="cx">                             item.cell()-&gt;methodTable()-&gt;copyBackingStore(
</span><span class="cx">                                 item.cell(), copyVisitor, item.token());
</span><span class="cx">                         }
</span><span class="lines">@@ -619,16 +550,14 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::gatherStackRoots(ConservativeRoots&amp; roots, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&amp; calleeSavedRegisters)
</span><span class="cx"> {
</span><del>-    GCPHASE(GatherStackRoots);
-    m_jitStubRoutines.clearMarks();
-    m_machineThreads.gatherConservativeRoots(roots, m_jitStubRoutines, m_codeBlocks, stackOrigin, stackTop, calleeSavedRegisters);
</del><ins>+    m_jitStubRoutines-&gt;clearMarks();
+    m_machineThreads.gatherConservativeRoots(roots, *m_jitStubRoutines, *m_codeBlocks, stackOrigin, stackTop, calleeSavedRegisters);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::gatherJSStackRoots(ConservativeRoots&amp; roots)
</span><span class="cx"> {
</span><span class="cx"> #if !ENABLE(JIT)
</span><del>-    GCPHASE(GatherJSStackRoots);
-    m_vm-&gt;interpreter-&gt;cloopStack().gatherConservativeRoots(roots, m_jitStubRoutines, m_codeBlocks);
</del><ins>+    m_vm-&gt;interpreter-&gt;cloopStack().gatherConservativeRoots(roots, *m_jitStubRoutines, *m_codeBlocks);
</ins><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(roots);
</span><span class="cx"> #endif
</span><span class="lines">@@ -637,7 +566,6 @@
</span><span class="cx"> void Heap::gatherScratchBufferRoots(ConservativeRoots&amp; roots)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    GCPHASE(GatherScratchBufferRoots);
</del><span class="cx">     m_vm-&gt;gatherConservativeRoots(roots);
</span><span class="cx"> #else
</span><span class="cx">     UNUSED_PARAM(roots);
</span><span class="lines">@@ -646,12 +574,19 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::clearLivenessData()
</span><span class="cx"> {
</span><del>-    GCPHASE(ClearLivenessData);
</del><ins>+    TimingScope timingScope(*this, &quot;Heap::clearLivenessData&quot;);
</ins><span class="cx">     if (m_operationInProgress == FullCollection)
</span><del>-        m_codeBlocks.clearMarksForFullCollection();
-
-    m_objectSpace.clearNewlyAllocated();
-    m_objectSpace.clearMarks();
</del><ins>+        m_codeBlocks-&gt;clearMarksForFullCollection();
+    
+    {
+        TimingScope clearNewlyAllocatedTimingScope(*this, &quot;m_objectSpace.clearNewlyAllocated&quot;);
+        m_objectSpace.clearNewlyAllocated();
+    }
+    
+    {
+        TimingScope clearMarksTimingScope(*this, &quot;m_objectSpace.clearMarks&quot;);
+        m_objectSpace.flip();
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitExternalRememberedSet()
</span><span class="lines">@@ -663,7 +598,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitSmallStrings()
</span><span class="cx"> {
</span><del>-    GCPHASE(VisitSmallStrings);
</del><span class="cx">     if (!m_vm-&gt;smallStrings.needsToBeVisited(m_operationInProgress))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -675,7 +609,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitConservativeRoots(ConservativeRoots&amp; roots)
</span><span class="cx"> {
</span><del>-    GCPHASE(VisitConservativeRoots);
</del><span class="cx">     m_slotVisitor.append(roots);
</span><span class="cx"> 
</span><span class="cx">     if (Options::logGC() == GCLogging::Verbose)
</span><span class="lines">@@ -698,7 +631,6 @@
</span><span class="cx"> void Heap::removeDeadCompilerWorklistEntries()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    GCPHASE(FinalizeDFGWorklists);
</del><span class="cx">     for (auto worklist : m_suspendedCompilerWorklists)
</span><span class="cx">         worklist-&gt;removeDeadPlans(*m_vm);
</span><span class="cx"> #endif
</span><span class="lines">@@ -732,7 +664,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::gatherExtraHeapSnapshotData(HeapProfiler&amp; heapProfiler)
</span><span class="cx"> {
</span><del>-    GCPHASE(GatherExtraHeapSnapshotData);
</del><span class="cx">     if (HeapSnapshotBuilder* builder = heapProfiler.activeSnapshotBuilder()) {
</span><span class="cx">         HeapIterationScope heapIterationScope(*this);
</span><span class="cx">         GatherHeapSnapshotData functor(*builder);
</span><span class="lines">@@ -758,7 +689,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::removeDeadHeapSnapshotNodes(HeapProfiler&amp; heapProfiler)
</span><span class="cx"> {
</span><del>-    GCPHASE(RemoveDeadHeapSnapshotNodes);
</del><span class="cx">     if (HeapSnapshot* snapshot = heapProfiler.mostRecentSnapshot()) {
</span><span class="cx">         HeapIterationScope heapIterationScope(*this);
</span><span class="cx">         RemoveDeadHeapSnapshotNodes functor(*snapshot);
</span><span class="lines">@@ -769,8 +699,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitProtectedObjects(HeapRootVisitor&amp; heapRootVisitor)
</span><span class="cx"> {
</span><del>-    GCPHASE(VisitProtectedObjects);
-
</del><span class="cx">     for (auto&amp; pair : m_protectedValues)
</span><span class="cx">         heapRootVisitor.visit(&amp;pair.key);
</span><span class="cx"> 
</span><span class="lines">@@ -782,7 +710,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitArgumentBuffers(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    GCPHASE(MarkingArgumentBuffers);
</del><span class="cx">     if (!m_markListSet || !m_markListSet-&gt;size())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -796,7 +723,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitException(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    GCPHASE(MarkingException);
</del><span class="cx">     if (!m_vm-&gt;exception() &amp;&amp; !m_vm-&gt;lastException())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -811,7 +737,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitStrongHandles(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    GCPHASE(VisitStrongHandles);
</del><span class="cx">     m_handleSet.visitStrongHandles(visitor);
</span><span class="cx"> 
</span><span class="cx">     if (Options::logGC() == GCLogging::Verbose)
</span><span class="lines">@@ -822,7 +747,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitHandleStack(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    GCPHASE(VisitHandleStack);
</del><span class="cx">     m_handleStack.visit(visitor);
</span><span class="cx"> 
</span><span class="cx">     if (Options::logGC() == GCLogging::Verbose)
</span><span class="lines">@@ -836,7 +760,6 @@
</span><span class="cx"> #if ENABLE(SAMPLING_PROFILER)
</span><span class="cx">     if (SamplingProfiler* samplingProfiler = m_vm-&gt;samplingProfiler()) {
</span><span class="cx">         ASSERT(samplingProfiler-&gt;getLock().isLocked());
</span><del>-        GCPHASE(VisitSamplingProfiler);
</del><span class="cx">         samplingProfiler-&gt;visit(m_slotVisitor);
</span><span class="cx">         if (Options::logGC() == GCLogging::Verbose)
</span><span class="cx">             dataLog(&quot;Sampling Profiler data:\n&quot;, m_slotVisitor);
</span><span class="lines">@@ -854,8 +777,7 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::traceCodeBlocksAndJITStubRoutines()
</span><span class="cx"> {
</span><del>-    GCPHASE(TraceCodeBlocksAndJITStubRoutines);
-    m_jitStubRoutines.traceMarkedStubRoutines(m_slotVisitor);
</del><ins>+    m_jitStubRoutines-&gt;traceMarkedStubRoutines(m_slotVisitor);
</ins><span class="cx"> 
</span><span class="cx">     if (Options::logGC() == GCLogging::Verbose)
</span><span class="cx">         dataLog(&quot;Code Blocks and JIT Stub Routines:\n&quot;, m_slotVisitor);
</span><span class="lines">@@ -865,15 +787,17 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::converge()
</span><span class="cx"> {
</span><del>-    GCPHASE(Convergence);
</del><span class="cx">     m_slotVisitor.drainFromShared(SlotVisitor::MasterDrain);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::visitWeakHandles(HeapRootVisitor&amp; visitor)
</span><span class="cx"> {
</span><del>-    GCPHASE(VisitingLiveWeakHandles);
</del><ins>+    TimingScope timingScope(*this, &quot;Heap::visitWeakHandles&quot;);
</ins><span class="cx">     while (true) {
</span><del>-        m_objectSpace.visitWeakSets(visitor);
</del><ins>+        {
+            TimingScope timingScope(*this, &quot;m_objectSpace.visitWeakSets&quot;);
+            m_objectSpace.visitWeakSets(visitor);
+        }
</ins><span class="cx">         harvestWeakReferences();
</span><span class="cx">         visitCompilerWorklistWeakReferences();
</span><span class="cx">         if (m_slotVisitor.isEmpty())
</span><span class="lines">@@ -892,8 +816,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::updateObjectCounts(double gcStartTime)
</span><span class="cx"> {
</span><del>-    GCCOUNTER(VisitedValueCount, m_slotVisitor.visitCount() + threadVisitCount());
-
</del><span class="cx">     if (Options::logGC() == GCLogging::Verbose) {
</span><span class="cx">         size_t visitCount = m_slotVisitor.visitCount();
</span><span class="cx">         visitCount += threadVisitCount();
</span><span class="lines">@@ -1033,7 +955,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::clearUnmarkedExecutables()
</span><span class="cx"> {
</span><del>-    GCPHASE(ClearUnmarkedExecutables);
</del><span class="cx">     for (unsigned i = m_executables.size(); i--;) {
</span><span class="cx">         ExecutableBase* current = m_executables[i];
</span><span class="cx">         if (isMarked(current))
</span><span class="lines">@@ -1051,10 +972,9 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::deleteUnmarkedCompiledCode()
</span><span class="cx"> {
</span><del>-    GCPHASE(DeleteCodeBlocks);
</del><span class="cx">     clearUnmarkedExecutables();
</span><del>-    m_codeBlocks.deleteUnmarkedAndUnreferenced(m_operationInProgress);
-    m_jitStubRoutines.deleteUnmarkedJettisonedStubRoutines();
</del><ins>+    m_codeBlocks-&gt;deleteUnmarkedAndUnreferenced(m_operationInProgress);
+    m_jitStubRoutines-&gt;deleteUnmarkedJettisonedStubRoutines();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::addToRememberedSet(const JSCell* cell)
</span><span class="lines">@@ -1073,10 +993,11 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::collectAllGarbage()
</span><span class="cx"> {
</span><ins>+    SuperSamplerScope superSamplerScope(false);
</ins><span class="cx">     if (!m_isSafeToCollect)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    collect(FullCollection);
</del><ins>+    collectWithoutAnySweep(FullCollection);
</ins><span class="cx"> 
</span><span class="cx">     DeferGCForAWhile deferGC(*this);
</span><span class="cx">     if (UNLIKELY(Options::useImmortalObjects()))
</span><span class="lines">@@ -1090,8 +1011,17 @@
</span><span class="cx">     sweepAllLogicallyEmptyWeakBlocks();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-NEVER_INLINE void Heap::collect(HeapOperation collectionType)
</del><ins>+void Heap::collect(HeapOperation collectionType)
</ins><span class="cx"> {
</span><ins>+    SuperSamplerScope superSamplerScope(false);
+    if (!m_isSafeToCollect)
+        return;
+
+    collectWithoutAnySweep(collectionType);
+}
+
+NEVER_INLINE void Heap::collectWithoutAnySweep(HeapOperation collectionType)
+{
</ins><span class="cx">     void* stackTop;
</span><span class="cx">     ALLOCATE_AND_GET_REGISTER_STATE(registers);
</span><span class="cx"> 
</span><span class="lines">@@ -1102,6 +1032,9 @@
</span><span class="cx"> 
</span><span class="cx"> NEVER_INLINE void Heap::collectImpl(HeapOperation collectionType, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&amp; calleeSavedRegisters)
</span><span class="cx"> {
</span><ins>+    SuperSamplerScope superSamplerScope(false);
+    TimingScope collectImplTimingScope(collectionType, &quot;Heap::collectImpl&quot;);
+    
</ins><span class="cx"> #if ENABLE(ALLOCATION_LOGGING)
</span><span class="cx">     dataLogF(&quot;JSC GC starting collection.\n&quot;);
</span><span class="cx"> #endif
</span><span class="lines">@@ -1112,45 +1045,55 @@
</span><span class="cx">         before = currentTimeMS();
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    if (vm()-&gt;typeProfiler()) {
-        DeferGCForAWhile awhile(*this);
-        vm()-&gt;typeProfilerLog()-&gt;processLogEntries(ASCIILiteral(&quot;GC&quot;));
-    }
</del><ins>+    double gcStartTime;
+    {
+        TimingScope earlyTimingScope(collectionType, &quot;Heap::collectImpl before markRoots&quot;);
</ins><span class="cx"> 
</span><ins>+        if (vm()-&gt;typeProfiler()) {
+            DeferGCForAWhile awhile(*this);
+            vm()-&gt;typeProfilerLog()-&gt;processLogEntries(ASCIILiteral(&quot;GC&quot;));
+        }
+
</ins><span class="cx"> #if ENABLE(JIT)
</span><del>-    {
-        DeferGCForAWhile awhile(*this);
-        JITWorklist::instance()-&gt;completeAllForVM(*m_vm);
-    }
</del><ins>+        {
+            DeferGCForAWhile awhile(*this);
+            JITWorklist::instance()-&gt;completeAllForVM(*m_vm);
+        }
</ins><span class="cx"> #endif // ENABLE(JIT)
</span><span class="cx"> 
</span><del>-    vm()-&gt;shadowChicken().update(*vm(), vm()-&gt;topCallFrame);
</del><ins>+        vm()-&gt;shadowChicken().update(*vm(), vm()-&gt;topCallFrame);
</ins><span class="cx"> 
</span><del>-    RELEASE_ASSERT(!m_deferralDepth);
-    ASSERT(vm()-&gt;currentThreadIsHoldingAPILock());
-    RELEASE_ASSERT(vm()-&gt;atomicStringTable() == wtfThreadData().atomicStringTable());
-    ASSERT(m_isSafeToCollect);
-    RELEASE_ASSERT(m_operationInProgress == NoOperation);
</del><ins>+        RELEASE_ASSERT(!m_deferralDepth);
+        ASSERT(vm()-&gt;currentThreadIsHoldingAPILock());
+        RELEASE_ASSERT(vm()-&gt;atomicStringTable() == wtfThreadData().atomicStringTable());
+        ASSERT(m_isSafeToCollect);
+        RELEASE_ASSERT(m_operationInProgress == NoOperation);
</ins><span class="cx"> 
</span><del>-    suspendCompilerThreads();
-    willStartCollection(collectionType);
-    GCPHASE(Collect);
</del><ins>+        suspendCompilerThreads();
+        willStartCollection(collectionType);
+        
+        collectImplTimingScope.setOperation(*this);
+        earlyTimingScope.setOperation(*this);
</ins><span class="cx"> 
</span><del>-    double gcStartTime = WTF::monotonicallyIncreasingTime();
-    if (m_verifier) {
-        // Verify that live objects from the last GC cycle haven't been corrupted by
-        // mutators before we begin this new GC cycle.
-        m_verifier-&gt;verify(HeapVerifier::Phase::BeforeGC);
</del><ins>+        gcStartTime = WTF::monotonicallyIncreasingTime();
+        if (m_verifier) {
+            // Verify that live objects from the last GC cycle haven't been corrupted by
+            // mutators before we begin this new GC cycle.
+            m_verifier-&gt;verify(HeapVerifier::Phase::BeforeGC);
</ins><span class="cx"> 
</span><del>-        m_verifier-&gt;initializeGCCycle();
-        m_verifier-&gt;gatherLiveObjects(HeapVerifier::Phase::BeforeMarking);
</del><ins>+            m_verifier-&gt;initializeGCCycle();
+            m_verifier-&gt;gatherLiveObjects(HeapVerifier::Phase::BeforeMarking);
+        }
+
+        flushOldStructureIDTables();
+        stopAllocation();
+        prepareForMarking();
+        flushWriteBarrierBuffer();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    flushOldStructureIDTables();
-    stopAllocation();
-    flushWriteBarrierBuffer();
-
</del><span class="cx">     markRoots(gcStartTime, stackOrigin, stackTop, calleeSavedRegisters);
</span><ins>+    
+    TimingScope lateTimingScope(*this, &quot;Heap::collectImpl after markRoots&quot;);
</ins><span class="cx"> 
</span><span class="cx">     if (m_verifier) {
</span><span class="cx">         m_verifier-&gt;gatherLiveObjects(HeapVerifier::Phase::AfterMarking);
</span><span class="lines">@@ -1164,9 +1107,7 @@
</span><span class="cx">     pruneStaleEntriesFromWeakGCMaps();
</span><span class="cx">     sweepArrayBuffers();
</span><span class="cx">     snapshotMarkedSpace();
</span><del>-
</del><span class="cx">     copyBackingStores();
</span><del>-
</del><span class="cx">     finalizeUnconditionalFinalizers();
</span><span class="cx">     removeDeadCompilerWorklistEntries();
</span><span class="cx">     deleteUnmarkedCompiledCode();
</span><span class="lines">@@ -1179,7 +1120,8 @@
</span><span class="cx">     updateAllocationLimits();
</span><span class="cx">     didFinishCollection(gcStartTime);
</span><span class="cx">     resumeCompilerThreads();
</span><del>-
</del><ins>+    sweepLargeAllocations();
+    
</ins><span class="cx">     if (m_verifier) {
</span><span class="cx">         m_verifier-&gt;trimDeadObjects();
</span><span class="cx">         m_verifier-&gt;verify(HeapVerifier::Phase::AfterGC);
</span><span class="lines">@@ -1191,10 +1133,14 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Heap::sweepLargeAllocations()
+{
+    m_objectSpace.sweepLargeAllocations();
+}
+
</ins><span class="cx"> void Heap::suspendCompilerThreads()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    GCPHASE(SuspendCompilerThreads);
</del><span class="cx">     ASSERT(m_suspendedCompilerWorklists.isEmpty());
</span><span class="cx">     for (unsigned i = DFG::numberOfWorklists(); i--;) {
</span><span class="cx">         if (DFG::Worklist* worklist = DFG::worklistForIndexOrNull(i)) {
</span><span class="lines">@@ -1207,8 +1153,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::willStartCollection(HeapOperation collectionType)
</span><span class="cx"> {
</span><del>-    GCPHASE(StartingCollection);
-    
</del><span class="cx">     if (Options::logGC())
</span><span class="cx">         dataLog(&quot;=&gt; &quot;);
</span><span class="cx">     
</span><span class="lines">@@ -1246,13 +1190,11 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::flushOldStructureIDTables()
</span><span class="cx"> {
</span><del>-    GCPHASE(FlushOldStructureIDTables);
</del><span class="cx">     m_structureIDTable.flushOldTables();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::flushWriteBarrierBuffer()
</span><span class="cx"> {
</span><del>-    GCPHASE(FlushWriteBarrierBuffer);
</del><span class="cx">     if (m_operationInProgress == EdenCollection) {
</span><span class="cx">         m_writeBarrierBuffer.flush(*this);
</span><span class="cx">         return;
</span><span class="lines">@@ -1262,21 +1204,23 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::stopAllocation()
</span><span class="cx"> {
</span><del>-    GCPHASE(StopAllocation);
</del><span class="cx">     m_objectSpace.stopAllocating();
</span><span class="cx">     if (m_operationInProgress == FullCollection)
</span><span class="cx">         m_storageSpace.didStartFullCollection();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Heap::prepareForMarking()
+{
+    m_objectSpace.prepareForMarking();
+}
+
</ins><span class="cx"> void Heap::reapWeakHandles()
</span><span class="cx"> {
</span><del>-    GCPHASE(ReapingWeakHandles);
</del><span class="cx">     m_objectSpace.reapWeakSets();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::pruneStaleEntriesFromWeakGCMaps()
</span><span class="cx"> {
</span><del>-    GCPHASE(PruningStaleEntriesFromWeakGCMaps);
</del><span class="cx">     if (m_operationInProgress != FullCollection)
</span><span class="cx">         return;
</span><span class="cx">     for (auto&amp; pruneCallback : m_weakGCMaps.values())
</span><span class="lines">@@ -1285,34 +1229,42 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::sweepArrayBuffers()
</span><span class="cx"> {
</span><del>-    GCPHASE(SweepingArrayBuffers);
</del><span class="cx">     m_arrayBuffers.sweep();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> struct MarkedBlockSnapshotFunctor : public MarkedBlock::VoidFunctor {
</span><del>-    MarkedBlockSnapshotFunctor(Vector&lt;MarkedBlock*&gt;&amp; blocks) 
</del><ins>+    MarkedBlockSnapshotFunctor(Vector&lt;MarkedBlock::Handle*&gt;&amp; blocks) 
</ins><span class="cx">         : m_index(0) 
</span><span class="cx">         , m_blocks(blocks)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void operator()(MarkedBlock* block) const { m_blocks[m_index++] = block; }
</del><ins>+    void operator()(MarkedBlock::Handle* block) const
+    {
+        block-&gt;setIsOnBlocksToSweep(true);
+        m_blocks[m_index++] = block;
+    }
</ins><span class="cx"> 
</span><span class="cx">     // FIXME: This is a mutable field becaue this isn't a C++ lambda.
</span><span class="cx">     // https://bugs.webkit.org/show_bug.cgi?id=159644
</span><span class="cx">     mutable size_t m_index;
</span><del>-    Vector&lt;MarkedBlock*&gt;&amp; m_blocks;
</del><ins>+    Vector&lt;MarkedBlock::Handle*&gt;&amp; m_blocks;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> void Heap::snapshotMarkedSpace()
</span><span class="cx"> {
</span><del>-    GCPHASE(SnapshotMarkedSpace);
-
</del><ins>+    TimingScope timingScope(*this, &quot;Heap::snapshotMarkedSpace&quot;);
+    // FIXME: This should probably be renamed. It's not actually snapshotting all of MarkedSpace.
+    // This is used by IncrementalSweeper, so it only needs to snapshot blocks. However, if we ever
+    // wanted to add other snapshotting login, we'd probably put it here.
+    
</ins><span class="cx">     if (m_operationInProgress == EdenCollection) {
</span><del>-        m_blockSnapshot.appendVector(m_objectSpace.blocksWithNewObjects());
-        // Sort and deduplicate the block snapshot since we might be appending to an unfinished work list.
-        std::sort(m_blockSnapshot.begin(), m_blockSnapshot.end());
-        m_blockSnapshot.shrink(std::unique(m_blockSnapshot.begin(), m_blockSnapshot.end()) - m_blockSnapshot.begin());
</del><ins>+        for (MarkedBlock::Handle* handle : m_objectSpace.blocksWithNewObjects()) {
+            if (handle-&gt;isOnBlocksToSweep())
+                continue;
+            m_blockSnapshot.append(handle);
+            handle-&gt;setIsOnBlocksToSweep(true);
+        }
</ins><span class="cx">     } else {
</span><span class="cx">         m_blockSnapshot.resizeToFit(m_objectSpace.blocks().set().size());
</span><span class="cx">         MarkedBlockSnapshotFunctor functor(m_blockSnapshot);
</span><span class="lines">@@ -1322,14 +1274,11 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::deleteSourceProviderCaches()
</span><span class="cx"> {
</span><del>-    GCPHASE(DeleteSourceProviderCaches);
</del><span class="cx">     m_vm-&gt;clearSourceProviderCaches();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::notifyIncrementalSweeper()
</span><span class="cx"> {
</span><del>-    GCPHASE(NotifyIncrementalSweeper);
-
</del><span class="cx">     if (m_operationInProgress == FullCollection) {
</span><span class="cx">         if (!m_logicallyEmptyWeakBlocks.isEmpty())
</span><span class="cx">             m_indexOfNextLogicallyEmptyWeakBlockToSweep = 0;
</span><span class="lines">@@ -1340,20 +1289,23 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::writeBarrierCurrentlyExecutingCodeBlocks()
</span><span class="cx"> {
</span><del>-    GCPHASE(WriteBarrierCurrentlyExecutingCodeBlocks);
-    m_codeBlocks.writeBarrierCurrentlyExecutingCodeBlocks(this);
</del><ins>+    m_codeBlocks-&gt;writeBarrierCurrentlyExecutingCodeBlocks(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::resetAllocators()
</span><span class="cx"> {
</span><del>-    GCPHASE(ResetAllocators);
</del><span class="cx">     m_objectSpace.resetAllocators();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::updateAllocationLimits()
</span><span class="cx"> {
</span><del>-    GCPHASE(UpdateAllocationLimits);
</del><ins>+    static const bool verbose = false;
</ins><span class="cx">     
</span><ins>+    if (verbose) {
+        dataLog(&quot;\n&quot;);
+        dataLog(&quot;bytesAllocatedThisCycle = &quot;, m_bytesAllocatedThisCycle, &quot;\n&quot;);
+    }
+    
</ins><span class="cx">     // Calculate our current heap size threshold for the purpose of figuring out when we should
</span><span class="cx">     // run another collection. This isn't the same as either size() or capacity(), though it should
</span><span class="cx">     // be somewhere between the two. The key is to match the size calculations involved calls to
</span><span class="lines">@@ -1369,6 +1321,8 @@
</span><span class="cx">     // of fragmentation, this may be substantial. Fortunately, marked space rarely fragments because
</span><span class="cx">     // cells usually have a narrow range of sizes. So, the underestimation is probably OK.
</span><span class="cx">     currentHeapSize += m_totalBytesVisited;
</span><ins>+    if (verbose)
+        dataLog(&quot;totalBytesVisited = &quot;, m_totalBytesVisited, &quot;, currentHeapSize = &quot;, currentHeapSize, &quot;\n&quot;);
</ins><span class="cx"> 
</span><span class="cx">     // For copied space, we use the capacity of storage space. This is because copied space may get
</span><span class="cx">     // badly fragmented between full collections. This arises when each eden collection evacuates
</span><span class="lines">@@ -1384,10 +1338,15 @@
</span><span class="cx">     // https://bugs.webkit.org/show_bug.cgi?id=150268
</span><span class="cx">     ASSERT(m_totalBytesCopied &lt;= m_storageSpace.size());
</span><span class="cx">     currentHeapSize += m_storageSpace.capacity();
</span><ins>+    if (verbose)
+        dataLog(&quot;storageSpace.capacity() = &quot;, m_storageSpace.capacity(), &quot;, currentHeapSize = &quot;, currentHeapSize, &quot;\n&quot;);
</ins><span class="cx"> 
</span><span class="cx">     // It's up to the user to ensure that extraMemorySize() ends up corresponding to allocation-time
</span><span class="cx">     // extra memory reporting.
</span><span class="cx">     currentHeapSize += extraMemorySize();
</span><ins>+
+    if (verbose)
+        dataLog(&quot;extraMemorySize() = &quot;, extraMemorySize(), &quot;, currentHeapSize = &quot;, currentHeapSize, &quot;\n&quot;);
</ins><span class="cx">     
</span><span class="cx">     if (Options::gcMaxHeapSize() &amp;&amp; currentHeapSize &gt; Options::gcMaxHeapSize())
</span><span class="cx">         HeapStatistics::exitWithFailure();
</span><span class="lines">@@ -1397,29 +1356,38 @@
</span><span class="cx">         // the new allocation limit based on the current size of the heap, with a
</span><span class="cx">         // fixed minimum.
</span><span class="cx">         m_maxHeapSize = max(minHeapSize(m_heapType, m_ramSize), proportionalHeapSize(currentHeapSize, m_ramSize));
</span><ins>+        if (verbose)
+            dataLog(&quot;Full: maxHeapSize = &quot;, m_maxHeapSize, &quot;\n&quot;);
</ins><span class="cx">         m_maxEdenSize = m_maxHeapSize - currentHeapSize;
</span><ins>+        if (verbose)
+            dataLog(&quot;Full: maxEdenSize = &quot;, m_maxEdenSize, &quot;\n&quot;);
</ins><span class="cx">         m_sizeAfterLastFullCollect = currentHeapSize;
</span><ins>+        if (verbose)
+            dataLog(&quot;Full: sizeAfterLastFullCollect = &quot;, currentHeapSize, &quot;\n&quot;);
</ins><span class="cx">         m_bytesAbandonedSinceLastFullCollect = 0;
</span><ins>+        if (verbose)
+            dataLog(&quot;Full: bytesAbandonedSinceLastFullCollect = &quot;, 0, &quot;\n&quot;);
</ins><span class="cx">     } else {
</span><del>-        static const bool verbose = false;
-        
</del><span class="cx">         ASSERT(currentHeapSize &gt;= m_sizeAfterLastCollect);
</span><del>-        m_maxEdenSize = m_maxHeapSize - currentHeapSize;
</del><ins>+        // Theoretically, we shouldn't ever scan more memory than the heap size we planned to have.
+        // But we are sloppy, so we have to defend against the overflow.
+        m_maxEdenSize = currentHeapSize &gt; m_maxHeapSize ? 0 : m_maxHeapSize - currentHeapSize;
+        if (verbose)
+            dataLog(&quot;Eden: maxEdenSize = &quot;, m_maxEdenSize, &quot;\n&quot;);
</ins><span class="cx">         m_sizeAfterLastEdenCollect = currentHeapSize;
</span><del>-        if (verbose) {
-            dataLog(&quot;Max heap size: &quot;, m_maxHeapSize, &quot;\n&quot;);
-            dataLog(&quot;Current heap size: &quot;, currentHeapSize, &quot;\n&quot;);
-            dataLog(&quot;Size after last eden collection: &quot;, m_sizeAfterLastEdenCollect, &quot;\n&quot;);
-        }
</del><ins>+        if (verbose)
+            dataLog(&quot;Eden: sizeAfterLastEdenCollect = &quot;, currentHeapSize, &quot;\n&quot;);
</ins><span class="cx">         double edenToOldGenerationRatio = (double)m_maxEdenSize / (double)m_maxHeapSize;
</span><del>-        if (verbose)
-            dataLog(&quot;Eden to old generation ratio: &quot;, edenToOldGenerationRatio, &quot;\n&quot;);
</del><span class="cx">         double minEdenToOldGenerationRatio = 1.0 / 3.0;
</span><span class="cx">         if (edenToOldGenerationRatio &lt; minEdenToOldGenerationRatio)
</span><span class="cx">             m_shouldDoFullCollection = true;
</span><span class="cx">         // This seems suspect at first, but what it does is ensure that the nursery size is fixed.
</span><span class="cx">         m_maxHeapSize += currentHeapSize - m_sizeAfterLastCollect;
</span><ins>+        if (verbose)
+            dataLog(&quot;Eden: maxHeapSize = &quot;, m_maxHeapSize, &quot;\n&quot;);
</ins><span class="cx">         m_maxEdenSize = m_maxHeapSize - currentHeapSize;
</span><ins>+        if (verbose)
+            dataLog(&quot;Eden: maxEdenSize = &quot;, m_maxEdenSize, &quot;\n&quot;);
</ins><span class="cx">         if (m_fullActivityCallback) {
</span><span class="cx">             ASSERT(currentHeapSize &gt;= m_sizeAfterLastFullCollect);
</span><span class="cx">             m_fullActivityCallback-&gt;didAllocate(currentHeapSize - m_sizeAfterLastFullCollect);
</span><span class="lines">@@ -1427,6 +1395,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_sizeAfterLastCollect = currentHeapSize;
</span><ins>+    if (verbose)
+        dataLog(&quot;sizeAfterLastCollect = &quot;, m_sizeAfterLastCollect, &quot;\n&quot;);
</ins><span class="cx">     m_bytesAllocatedThisCycle = 0;
</span><span class="cx"> 
</span><span class="cx">     if (Options::logGC())
</span><span class="lines">@@ -1435,7 +1405,6 @@
</span><span class="cx"> 
</span><span class="cx"> void Heap::didFinishCollection(double gcStartTime)
</span><span class="cx"> {
</span><del>-    GCPHASE(FinishingCollection);
</del><span class="cx">     double gcEndTime = WTF::monotonicallyIncreasingTime();
</span><span class="cx">     HeapOperation operation = m_operationInProgress;
</span><span class="cx">     if (m_operationInProgress == FullCollection)
</span><span class="lines">@@ -1471,7 +1440,6 @@
</span><span class="cx"> void Heap::resumeCompilerThreads()
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><del>-    GCPHASE(ResumeCompilerThreads);
</del><span class="cx">     for (auto worklist : m_suspendedCompilerWorklists)
</span><span class="cx">         worklist-&gt;resumeAllThreads();
</span><span class="cx">     m_suspendedCompilerWorklists.clear();
</span><span class="lines">@@ -1580,7 +1548,7 @@
</span><span class="cx">         if (cell-&gt;isZapped())
</span><span class="cx">             current++;
</span><span class="cx"> 
</span><del>-        void* limit = static_cast&lt;void*&gt;(reinterpret_cast&lt;char*&gt;(cell) + MarkedBlock::blockFor(cell)-&gt;cellSize());
</del><ins>+        void* limit = static_cast&lt;void*&gt;(reinterpret_cast&lt;char*&gt;(cell) + cell-&gt;cellSize());
</ins><span class="cx">         for (; current &lt; limit; current++)
</span><span class="cx">             *current = zombifiedBits;
</span><span class="cx">     }
</span><span class="lines">@@ -1686,4 +1654,12 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void Heap::forEachCodeBlockImpl(const ScopedLambda&lt;bool(CodeBlock*)&gt;&amp; func)
+{
+    // We don't know the full set of CodeBlocks until compilation has terminated.
+    completeAllJITPlans();
+
+    return m_codeBlocks-&gt;iterate(func);
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeaph"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/Heap.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> #define Heap_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ArrayBuffer.h&quot;
</span><del>-#include &quot;CodeBlockSet.h&quot;
</del><span class="cx"> #include &quot;CopyVisitor.h&quot;
</span><span class="cx"> #include &quot;GCIncomingRefCountedSet.h&quot;
</span><span class="cx"> #include &quot;HandleSet.h&quot;
</span><span class="lines">@@ -30,7 +29,6 @@
</span><span class="cx"> #include &quot;HandleStack.h&quot;
</span><span class="cx"> #include &quot;HeapObserver.h&quot;
</span><span class="cx"> #include &quot;HeapOperation.h&quot;
</span><del>-#include &quot;JITStubRoutineSet.h&quot;
</del><span class="cx"> #include &quot;ListableHandler.h&quot;
</span><span class="cx"> #include &quot;MachineStackMarker.h&quot;
</span><span class="cx"> #include &quot;MarkedAllocator.h&quot;
</span><span class="lines">@@ -53,6 +51,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class CodeBlock;
</span><ins>+class CodeBlockSet;
</ins><span class="cx"> class CopiedSpace;
</span><span class="cx"> class EdenGCActivityCallback;
</span><span class="cx"> class ExecutableBase;
</span><span class="lines">@@ -65,6 +64,7 @@
</span><span class="cx"> class HeapVerifier;
</span><span class="cx"> class IncrementalSweeper;
</span><span class="cx"> class JITStubRoutine;
</span><ins>+class JITStubRoutineSet;
</ins><span class="cx"> class JSCell;
</span><span class="cx"> class JSValue;
</span><span class="cx"> class LLIntOffsetsExtractor;
</span><span class="lines">@@ -83,6 +83,8 @@
</span><span class="cx"> 
</span><span class="cx"> enum HeapType { SmallHeap, LargeHeap };
</span><span class="cx"> 
</span><ins>+class HeapUtil;
+
</ins><span class="cx"> class Heap {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(Heap);
</span><span class="cx"> public:
</span><span class="lines">@@ -89,7 +91,7 @@
</span><span class="cx">     friend class JIT;
</span><span class="cx">     friend class DFG::SpeculativeJIT;
</span><span class="cx">     static Heap* heap(const JSValue); // 0 for immediate values
</span><del>-    static Heap* heap(const JSCell*);
</del><ins>+    static Heap* heap(const HeapCell*);
</ins><span class="cx"> 
</span><span class="cx">     // This constant determines how many blocks we iterate between checks of our 
</span><span class="cx">     // deadline when calling Heap::isPagedOut. Decreasing it will cause us to detect 
</span><span class="lines">@@ -99,14 +101,11 @@
</span><span class="cx"> 
</span><span class="cx">     static bool isLive(const void*);
</span><span class="cx">     static bool isMarked(const void*);
</span><del>-    static bool testAndSetMarked(const void*);
</del><ins>+    static bool testAndSetMarked(int64_t, const void*);
</ins><span class="cx">     static void setMarked(const void*);
</span><ins>+    
+    static size_t cellSize(const void*);
</ins><span class="cx"> 
</span><del>-    // This function must be run after stopAllocation() is called and 
-    // before liveness data is cleared to be accurate.
-    static bool isPointerGCObject(TinyBloomFilter, MarkedBlockSet&amp;, void* pointer);
-    static bool isValueGCObject(TinyBloomFilter, MarkedBlockSet&amp;, JSValue);
-
</del><span class="cx">     void writeBarrier(const JSCell*);
</span><span class="cx">     void writeBarrier(const JSCell*, JSValue);
</span><span class="cx">     void writeBarrier(const JSCell*, JSCell*);
</span><span class="lines">@@ -147,10 +146,14 @@
</span><span class="cx">     MarkedSpace::Subspace&amp; subspaceForObjectDestructor() { return m_objectSpace.subspaceForObjectsWithDestructor(); }
</span><span class="cx">     MarkedSpace::Subspace&amp; subspaceForAuxiliaryData() { return m_objectSpace.subspaceForAuxiliaryData(); }
</span><span class="cx">     template&lt;typename ClassType&gt; MarkedSpace::Subspace&amp; subspaceForObjectOfType();
</span><del>-    MarkedAllocator&amp; allocatorForObjectWithoutDestructor(size_t bytes) { return m_objectSpace.allocatorFor(bytes); }
-    MarkedAllocator&amp; allocatorForObjectWithDestructor(size_t bytes) { return m_objectSpace.destructorAllocatorFor(bytes); }
-    template&lt;typename ClassType&gt; MarkedAllocator&amp; allocatorForObjectOfType(size_t bytes);
</del><ins>+    MarkedAllocator* allocatorForObjectWithoutDestructor(size_t bytes) { return m_objectSpace.allocatorFor(bytes); }
+    MarkedAllocator* allocatorForObjectWithDestructor(size_t bytes) { return m_objectSpace.destructorAllocatorFor(bytes); }
+    template&lt;typename ClassType&gt; MarkedAllocator* allocatorForObjectOfType(size_t bytes);
+    MarkedAllocator* allocatorForAuxiliaryData(size_t bytes) { return m_objectSpace.auxiliaryAllocatorFor(bytes); }
</ins><span class="cx">     CopiedAllocator&amp; storageAllocator() { return m_storageSpace.allocator(); }
</span><ins>+    void* allocateAuxiliary(JSCell* intendedOwner, size_t);
+    void* tryAllocateAuxiliary(JSCell* intendedOwner, size_t);
+    void* tryReallocateAuxiliary(JSCell* intendedOwner, void* oldBase, size_t oldSize, size_t newSize);
</ins><span class="cx">     CheckedBoolean tryAllocateStorage(JSCell* intendedOwner, size_t, void**);
</span><span class="cx">     CheckedBoolean tryReallocateStorage(JSCell* intendedOwner, void**, size_t, size_t);
</span><span class="cx">     void ascribeOwner(JSCell* intendedOwner, void*);
</span><span class="lines">@@ -230,7 +233,7 @@
</span><span class="cx">     void didAllocate(size_t);
</span><span class="cx">     bool isPagedOut(double deadline);
</span><span class="cx">     
</span><del>-    const JITStubRoutineSet&amp; jitStubRoutines() { return m_jitStubRoutines; }
</del><ins>+    const JITStubRoutineSet&amp; jitStubRoutines() { return *m_jitStubRoutines; }
</ins><span class="cx">     
</span><span class="cx">     void addReference(JSCell*, ArrayBuffer*);
</span><span class="cx">     
</span><span class="lines">@@ -238,7 +241,7 @@
</span><span class="cx"> 
</span><span class="cx">     StructureIDTable&amp; structureIDTable() { return m_structureIDTable; }
</span><span class="cx"> 
</span><del>-    CodeBlockSet&amp; codeBlockSet() { return m_codeBlocks; }
</del><ins>+    CodeBlockSet&amp; codeBlockSet() { return *m_codeBlocks; }
</ins><span class="cx"> 
</span><span class="cx"> #if USE(FOUNDATION)
</span><span class="cx">     template&lt;typename T&gt; void releaseSoon(RetainPtr&lt;T&gt;&amp;&amp;);
</span><span class="lines">@@ -267,6 +270,7 @@
</span><span class="cx">     friend class GCLogging;
</span><span class="cx">     friend class GCThread;
</span><span class="cx">     friend class HandleSet;
</span><ins>+    friend class HeapUtil;
</ins><span class="cx">     friend class HeapVerifier;
</span><span class="cx">     friend class JITStubRoutine;
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="lines">@@ -283,6 +287,8 @@
</span><span class="cx">     template&lt;typename T&gt; friend void* allocateCell(Heap&amp;);
</span><span class="cx">     template&lt;typename T&gt; friend void* allocateCell(Heap&amp;, size_t);
</span><span class="cx"> 
</span><ins>+    void collectWithoutAnySweep(HeapOperation collectionType = AnyCollection);
+
</ins><span class="cx">     void* allocateWithDestructor(size_t); // For use with objects with destructors.
</span><span class="cx">     void* allocateWithoutDestructor(size_t); // For use with objects without destructors.
</span><span class="cx">     template&lt;typename ClassType&gt; void* allocateObjectOfType(size_t); // Chooses one of the methods above based on type.
</span><span class="lines">@@ -304,6 +310,7 @@
</span><span class="cx">     void flushOldStructureIDTables();
</span><span class="cx">     void flushWriteBarrierBuffer();
</span><span class="cx">     void stopAllocation();
</span><ins>+    void prepareForMarking();
</ins><span class="cx">     
</span><span class="cx">     void markRoots(double gcStartTime, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&amp;);
</span><span class="cx">     void gatherStackRoots(ConservativeRoots&amp;, void* stackOrigin, void* stackTop, MachineThreads::RegisterState&amp;);
</span><span class="lines">@@ -348,7 +355,8 @@
</span><span class="cx">     void zombifyDeadObjects();
</span><span class="cx">     void gatherExtraHeapSnapshotData(HeapProfiler&amp;);
</span><span class="cx">     void removeDeadHeapSnapshotNodes(HeapProfiler&amp;);
</span><del>-
</del><ins>+    void sweepLargeAllocations();
+    
</ins><span class="cx">     void sweepAllLogicallyEmptyWeakBlocks();
</span><span class="cx">     bool sweepNextLogicallyEmptyWeakBlock();
</span><span class="cx"> 
</span><span class="lines">@@ -361,6 +369,8 @@
</span><span class="cx">     size_t threadVisitCount();
</span><span class="cx">     size_t threadBytesVisited();
</span><span class="cx">     size_t threadBytesCopied();
</span><ins>+    
+    void forEachCodeBlockImpl(const ScopedLambda&lt;bool(CodeBlock*)&gt;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     const HeapType m_heapType;
</span><span class="cx">     const size_t m_ramSize;
</span><span class="lines">@@ -408,8 +418,8 @@
</span><span class="cx"> 
</span><span class="cx">     HandleSet m_handleSet;
</span><span class="cx">     HandleStack m_handleStack;
</span><del>-    CodeBlockSet m_codeBlocks;
-    JITStubRoutineSet m_jitStubRoutines;
</del><ins>+    std::unique_ptr&lt;CodeBlockSet&gt; m_codeBlocks;
+    std::unique_ptr&lt;JITStubRoutineSet&gt; m_jitStubRoutines;
</ins><span class="cx">     FinalizerOwner m_finalizerOwner;
</span><span class="cx">     
</span><span class="cx">     bool m_isSafeToCollect;
</span><span class="lines">@@ -428,7 +438,7 @@
</span><span class="cx">     RefPtr&lt;FullGCActivityCallback&gt; m_fullActivityCallback;
</span><span class="cx">     RefPtr&lt;GCActivityCallback&gt; m_edenActivityCallback;
</span><span class="cx">     std::unique_ptr&lt;IncrementalSweeper&gt; m_sweeper;
</span><del>-    Vector&lt;MarkedBlock*&gt; m_blockSnapshot;
</del><ins>+    Vector&lt;MarkedBlock::Handle*&gt; m_blockSnapshot;
</ins><span class="cx"> 
</span><span class="cx">     Vector&lt;HeapObserver*&gt; m_observers;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapCellh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCell.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCell.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCell.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -25,8 +25,17 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include &quot;DestructionMode.h&quot;
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+class CellContainer;
+class Heap;
+class LargeAllocation;
+class MarkedBlock;
+class VM;
+struct AllocatorAttributes;
+
</ins><span class="cx"> class HeapCell {
</span><span class="cx"> public:
</span><span class="cx">     enum Kind : int8_t {
</span><span class="lines">@@ -38,6 +47,25 @@
</span><span class="cx">     
</span><span class="cx">     void zap() { *reinterpret_cast&lt;uintptr_t**&gt;(this) = 0; }
</span><span class="cx">     bool isZapped() const { return !*reinterpret_cast&lt;uintptr_t* const*&gt;(this); }
</span><ins>+    
+    bool isLargeAllocation() const;
+    CellContainer cellContainer() const;
+    MarkedBlock&amp; markedBlock() const;
+    LargeAllocation&amp; largeAllocation() const;
+
+    // If you want performance and you know that your cell is small, you can do this instead:
+    // ASSERT(!cell-&gt;isLargeAllocation());
+    // cell-&gt;markedBlock().vm()
+    // We currently only use this hack for callees to make ExecState::vm() fast. It's not
+    // recommended to use it for too many other things, since the large allocation cutoff is
+    // a runtime option and its default value is small (400 bytes).
+    Heap* heap() const;
+    VM* vm() const;
+    
+    size_t cellSize() const;
+    AllocatorAttributes allocatorAttributes() const;
+    DestructionMode destructionMode() const;
+    Kind cellKind() const;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapCellInlinesh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCellInlines.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCellInlines.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCellInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,94 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#include &quot;CellContainer.h&quot;
+#include &quot;HeapCell.h&quot;
+#include &quot;LargeAllocation.h&quot;
+#include &quot;MarkedBlock.h&quot;
+
+namespace JSC {
+
+ALWAYS_INLINE bool HeapCell::isLargeAllocation() const
+{
+    return LargeAllocation::isLargeAllocation(const_cast&lt;HeapCell*&gt;(this));
+}
+
+ALWAYS_INLINE CellContainer HeapCell::cellContainer() const
+{
+    if (isLargeAllocation())
+        return largeAllocation();
+    return markedBlock();
+}
+
+ALWAYS_INLINE MarkedBlock&amp; HeapCell::markedBlock() const
+{
+    return *MarkedBlock::blockFor(this);
+}
+
+ALWAYS_INLINE LargeAllocation&amp; HeapCell::largeAllocation() const
+{
+    return *LargeAllocation::fromCell(const_cast&lt;HeapCell*&gt;(this));
+}
+
+ALWAYS_INLINE Heap* HeapCell::heap() const
+{
+    return &amp;vm()-&gt;heap;
+}
+
+ALWAYS_INLINE VM* HeapCell::vm() const
+{
+    if (isLargeAllocation())
+        return largeAllocation().vm();
+    return markedBlock().vm();
+}
+    
+ALWAYS_INLINE size_t HeapCell::cellSize() const
+{
+    if (isLargeAllocation())
+        return largeAllocation().cellSize();
+    return markedBlock().cellSize();
+}
+
+ALWAYS_INLINE AllocatorAttributes HeapCell::allocatorAttributes() const
+{
+    if (isLargeAllocation())
+        return largeAllocation().attributes();
+    return markedBlock().attributes();
+}
+
+ALWAYS_INLINE DestructionMode HeapCell::destructionMode() const
+{
+    return allocatorAttributes().destruction;
+}
+
+ALWAYS_INLINE HeapCell::Kind HeapCell::cellKind() const
+{
+    return allocatorAttributes().cellKind;
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CopyBarrier.h&quot;
</span><span class="cx"> #include &quot;Heap.h&quot;
</span><ins>+#include &quot;HeapCellInlines.h&quot;
+#include &quot;IndexingHeader.h&quot;
+#include &quot;JSCallee.h&quot;
</ins><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="cx"> #include &quot;Structure.h&quot;
</span><span class="cx"> #include &lt;type_traits&gt;
</span><span class="lines">@@ -59,9 +62,9 @@
</span><span class="cx">     return m_operationInProgress == FullCollection || m_operationInProgress == EdenCollection;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline Heap* Heap::heap(const JSCell* cell)
</del><ins>+ALWAYS_INLINE Heap* Heap::heap(const HeapCell* cell)
</ins><span class="cx"> {
</span><del>-    return MarkedBlock::blockFor(cell)-&gt;heap();
</del><ins>+    return cell-&gt;heap();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline Heap* Heap::heap(const JSValue v)
</span><span class="lines">@@ -71,26 +74,53 @@
</span><span class="cx">     return heap(v.asCell());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool Heap::isLive(const void* cell)
</del><ins>+inline bool Heap::isLive(const void* rawCell)
</ins><span class="cx"> {
</span><del>-    return MarkedBlock::blockFor(cell)-&gt;isLiveCell(cell);
</del><ins>+    HeapCell* cell = bitwise_cast&lt;HeapCell*&gt;(rawCell);
+    if (cell-&gt;isLargeAllocation())
+        return cell-&gt;largeAllocation().isLive();
+    MarkedBlock&amp; block = cell-&gt;markedBlock();
+    block.flipIfNecessary(block.vm()-&gt;heap.objectSpace().version());
+    return block.handle().isLiveCell(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool Heap::isMarked(const void* cell)
</del><ins>+ALWAYS_INLINE bool Heap::isMarked(const void* rawCell)
</ins><span class="cx"> {
</span><del>-    return MarkedBlock::blockFor(cell)-&gt;isMarked(cell);
</del><ins>+    HeapCell* cell = bitwise_cast&lt;HeapCell*&gt;(rawCell);
+    if (cell-&gt;isLargeAllocation())
+        return cell-&gt;largeAllocation().isMarked();
+    MarkedBlock&amp; block = cell-&gt;markedBlock();
+    block.flipIfNecessary(block.vm()-&gt;heap.objectSpace().version());
+    return block.isMarked(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool Heap::testAndSetMarked(const void* cell)
</del><ins>+ALWAYS_INLINE bool Heap::testAndSetMarked(int64_t version, const void* rawCell)
</ins><span class="cx"> {
</span><del>-    return MarkedBlock::blockFor(cell)-&gt;testAndSetMarked(cell);
</del><ins>+    HeapCell* cell = bitwise_cast&lt;HeapCell*&gt;(rawCell);
+    if (cell-&gt;isLargeAllocation())
+        return cell-&gt;largeAllocation().testAndSetMarked();
+    MarkedBlock&amp; block = cell-&gt;markedBlock();
+    block.flipIfNecessaryConcurrently(version);
+    return block.testAndSetMarked(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void Heap::setMarked(const void* cell)
</del><ins>+inline void Heap::setMarked(const void* rawCell)
</ins><span class="cx"> {
</span><del>-    MarkedBlock::blockFor(cell)-&gt;setMarked(cell);
</del><ins>+    HeapCell* cell = bitwise_cast&lt;HeapCell*&gt;(rawCell);
+    if (cell-&gt;isLargeAllocation()) {
+        cell-&gt;largeAllocation().setMarked();
+        return;
+    }
+    MarkedBlock&amp; block = cell-&gt;markedBlock();
+    block.flipIfNecessary(block.vm()-&gt;heap.objectSpace().version());
+    block.setMarked(cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ALWAYS_INLINE size_t Heap::cellSize(const void* rawCell)
+{
+    return bitwise_cast&lt;HeapCell*&gt;(rawCell)-&gt;cellSize();
+}
+
</ins><span class="cx"> inline void Heap::writeBarrier(const JSCell* from, JSValue to)
</span><span class="cx"> {
</span><span class="cx"> #if ENABLE(WRITE_BARRIER_PROFILING)
</span><span class="lines">@@ -165,12 +195,9 @@
</span><span class="cx">         deprecatedReportExtraMemorySlowCase(size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;typename Functor&gt; inline void Heap::forEachCodeBlock(const Functor&amp; functor)
</del><ins>+template&lt;typename Functor&gt; inline void Heap::forEachCodeBlock(const Functor&amp; func)
</ins><span class="cx"> {
</span><del>-    // We don't know the full set of CodeBlocks until compilation has terminated.
-    completeAllJITPlans();
-
-    return m_codeBlocks.iterate&lt;Functor&gt;(functor);
</del><ins>+    forEachCodeBlockImpl(scopedLambdaRef&lt;bool(CodeBlock*)&gt;(func));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename Functor&gt; inline void Heap::forEachProtectedCell(const Functor&amp; functor)
</span><span class="lines">@@ -199,7 +226,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ClassType&gt;
</span><del>-void* Heap::allocateObjectOfType(size_t bytes)
</del><ins>+inline void* Heap::allocateObjectOfType(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx">     // JSCell::classInfo() expects objects allocated with normal destructor to derive from JSDestructibleObject.
</span><span class="cx">     ASSERT((!ClassType::needsDestruction || (ClassType::StructureFlags &amp; StructureIsImmortal) || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</span><span class="lines">@@ -210,7 +237,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ClassType&gt;
</span><del>-MarkedSpace::Subspace&amp; Heap::subspaceForObjectOfType()
</del><ins>+inline MarkedSpace::Subspace&amp; Heap::subspaceForObjectOfType()
</ins><span class="cx"> {
</span><span class="cx">     // JSCell::classInfo() expects objects allocated with normal destructor to derive from JSDestructibleObject.
</span><span class="cx">     ASSERT((!ClassType::needsDestruction || (ClassType::StructureFlags &amp; StructureIsImmortal) || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</span><span class="lines">@@ -221,16 +248,52 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename ClassType&gt;
</span><del>-MarkedAllocator&amp; Heap::allocatorForObjectOfType(size_t bytes)
</del><ins>+inline MarkedAllocator* Heap::allocatorForObjectOfType(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx">     // JSCell::classInfo() expects objects allocated with normal destructor to derive from JSDestructibleObject.
</span><span class="cx">     ASSERT((!ClassType::needsDestruction || (ClassType::StructureFlags &amp; StructureIsImmortal) || std::is_convertible&lt;ClassType, JSDestructibleObject&gt;::value));
</span><ins>+
+    MarkedAllocator* result;
+    if (ClassType::needsDestruction)
+        result = allocatorForObjectWithDestructor(bytes);
+    else
+        result = allocatorForObjectWithoutDestructor(bytes);
</ins><span class="cx">     
</span><del>-    if (ClassType::needsDestruction)
-        return allocatorForObjectWithDestructor(bytes);
-    return allocatorForObjectWithoutDestructor(bytes);
</del><ins>+    ASSERT(result || !ClassType::info()-&gt;isSubClassOf(JSCallee::info()));
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void* Heap::allocateAuxiliary(JSCell* intendedOwner, size_t bytes)
+{
+    void* result = m_objectSpace.allocateAuxiliary(bytes);
+#if ENABLE(ALLOCATION_LOGGING)
+    dataLogF(&quot;JSC GC allocating %lu bytes of auxiliary for %p: %p.\n&quot;, bytes, intendedOwner, result);
+#else
+    UNUSED_PARAM(intendedOwner);
+#endif
+    return result;
+}
+
+inline void* Heap::tryAllocateAuxiliary(JSCell* intendedOwner, size_t bytes)
+{
+    void* result = m_objectSpace.tryAllocateAuxiliary(bytes);
+#if ENABLE(ALLOCATION_LOGGING)
+    dataLogF(&quot;JSC GC allocating %lu bytes of auxiliary for %p: %p.\n&quot;, bytes, intendedOwner, result);
+#else
+    UNUSED_PARAM(intendedOwner);
+#endif
+    return result;
+}
+
+inline void* Heap::tryReallocateAuxiliary(JSCell* intendedOwner, void* oldBase, size_t oldSize, size_t newSize)
+{
+    void* newBase = tryAllocateAuxiliary(intendedOwner, newSize);
+    if (!newBase)
+        return nullptr;
+    memcpy(newBase, oldBase, oldSize);
+    return newBase;
+}
+
</ins><span class="cx"> inline CheckedBoolean Heap::tryAllocateStorage(JSCell* intendedOwner, size_t bytes, void** outPtr)
</span><span class="cx"> {
</span><span class="cx">     CheckedBoolean result = m_storageSpace.tryAllocate(bytes, outPtr);
</span><span class="lines">@@ -354,33 +417,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool Heap::isPointerGCObject(TinyBloomFilter filter, MarkedBlockSet&amp; markedBlockSet, void* pointer)
-{
-    MarkedBlock* candidate = MarkedBlock::blockFor(pointer);
-    if (filter.ruleOut(bitwise_cast&lt;Bits&gt;(candidate))) {
-        ASSERT(!candidate || !markedBlockSet.set().contains(candidate));
-        return false;
-    }
-
-    if (!MarkedBlock::isAtomAligned(pointer))
-        return false;
-
-    if (!markedBlockSet.set().contains(candidate))
-        return false;
-
-    if (!candidate-&gt;isLiveCell(pointer))
-        return false;
-
-    return true;
-}
-
-inline bool Heap::isValueGCObject(TinyBloomFilter filter, MarkedBlockSet&amp; markedBlockSet, JSValue value)
-{
-    if (!value.isCell())
-        return false;
-    return isPointerGCObject(filter, markedBlockSet, static_cast&lt;void*&gt;(value.asCell()));
-}
-
</del><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // HeapInlines_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapOperationcppfromrev205702releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingContactSelectedEventCustomcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.cpp (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,60 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;HeapOperation.h&quot;
+
+#include &lt;wtf/PrintStream.h&gt;
+
+namespace WTF {
+
+using namespace JSC;
+
+void printInternal(PrintStream&amp; out, HeapOperation operation)
+{
+    switch (operation) {
+    case NoOperation:
+        out.print(&quot;None&quot;);
+        return;
+    case Allocation:
+        out.print(&quot;Alloc&quot;);
+        return;
+    case FullCollection:
+        out.print(&quot;Full&quot;);
+        return;
+    case EdenCollection:
+        out.print(&quot;Eden&quot;);
+        return;
+    case AnyCollection:
+        out.print(&quot;Any&quot;);
+        return;
+    }
+    RELEASE_ASSERT_NOT_REACHED();
+}
+
+} // namespace WTF
+
+
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapOperationh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapOperation.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,4 +32,12 @@
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><ins>+namespace WTF {
+
+class PrintStream;
+
+void printInternal(PrintStream&amp; out, JSC::HeapOperation);
+
+} // namespace WTF
+
</ins><span class="cx"> #endif // HeapOperation_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapUtilh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapUtil.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapUtil.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapUtil.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,190 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace JSC {
+
+// Are you tired of waiting for all of WebKit to build because you changed the implementation of a
+// function in HeapInlines.h?  Does it bother you that you're waiting on rebuilding the JS DOM
+// bindings even though your change is in a function called from only 2 .cpp files?  Then HeapUtil.h
+// is for you!  Everything in this class should be a static method that takes a Heap&amp; if needed.
+// This is a friend of Heap, so you can access all of Heap's privates.
+//
+// This ends up being an issue because Heap exposes a lot of methods that ought to be inline for
+// performance or that must be inline because they are templates.  This class ought to contain
+// methods that are used for the implementation of the collector, or for unusual clients that need
+// to reach deep into the collector for some reason.  Don't put things in here that would cause you
+// to have to include it from more than a handful of places, since that would defeat the purpose.
+// This class isn't here to look pretty.  It's to let us hack the GC more easily!
+
+class HeapUtil {
+public:
+    // This function must be run after stopAllocation() is called and 
+    // before liveness data is cleared to be accurate.
+    template&lt;typename Func&gt;
+    static void findGCObjectPointersForMarking(
+        Heap&amp; heap, int64_t heapVersion, TinyBloomFilter filter, void* passedPointer,
+        const Func&amp; func)
+    {
+        const HashSet&lt;MarkedBlock*&gt;&amp; set = heap.objectSpace().blocks().set();
+        
+        char* pointer = static_cast&lt;char*&gt;(passedPointer);
+        
+        // It could point to a large allocation.
+        if (heap.objectSpace().largeAllocationsForThisCollectionSize()) {
+            if (heap.objectSpace().largeAllocationsForThisCollectionBegin()[0]-&gt;aboveLowerBound(pointer)
+                &amp;&amp; heap.objectSpace().largeAllocationsForThisCollectionEnd()[-1]-&gt;belowUpperBound(pointer)) {
+                LargeAllocation** result = approximateBinarySearch&lt;LargeAllocation*&gt;(
+                    heap.objectSpace().largeAllocationsForThisCollectionBegin(),
+                    heap.objectSpace().largeAllocationsForThisCollectionSize(),
+                    LargeAllocation::fromCell(pointer),
+                    [] (LargeAllocation** ptr) -&gt; LargeAllocation* { return *ptr; });
+                if (result) {
+                    if (result &gt; heap.objectSpace().largeAllocationsForThisCollectionBegin()
+                        &amp;&amp; result[-1]-&gt;contains(pointer))
+                        func(result[-1]-&gt;cell());
+                    if (result[0]-&gt;contains(pointer))
+                        func(result[0]-&gt;cell());
+                    if (result + 1 &lt; heap.objectSpace().largeAllocationsForThisCollectionEnd()
+                        &amp;&amp; result[1]-&gt;contains(pointer))
+                        func(result[1]-&gt;cell());
+                }
+            }
+        }
+    
+        MarkedBlock* candidate = MarkedBlock::blockFor(pointer);
+        // It's possible for a butterfly pointer to point past the end of a butterfly. Check this now.
+        if (pointer &lt;= bitwise_cast&lt;char*&gt;(candidate) + sizeof(IndexingHeader)) {
+            // We may be interested in the last cell of the previous MarkedBlock.
+            char* previousPointer = pointer - sizeof(IndexingHeader) - 1;
+            MarkedBlock* previousCandidate = MarkedBlock::blockFor(previousPointer);
+            if (!filter.ruleOut(bitwise_cast&lt;Bits&gt;(previousCandidate))
+                &amp;&amp; set.contains(previousCandidate)
+                &amp;&amp; previousCandidate-&gt;handle().cellKind() == HeapCell::Auxiliary) {
+                previousCandidate-&gt;flipIfNecessary(heapVersion);
+                previousPointer = static_cast&lt;char*&gt;(previousCandidate-&gt;handle().cellAlign(previousPointer));
+                if (previousCandidate-&gt;handle().isLiveCell(previousPointer))
+                    func(previousPointer);
+            }
+        }
+    
+        if (filter.ruleOut(bitwise_cast&lt;Bits&gt;(candidate))) {
+            ASSERT(!candidate || !set.contains(candidate));
+            return;
+        }
+    
+        if (!set.contains(candidate))
+            return;
+        
+        candidate-&gt;flipIfNecessary(heapVersion);
+
+        auto tryPointer = [&amp;] (void* pointer) {
+            if (candidate-&gt;handle().isLiveCell(pointer))
+                func(pointer);
+        };
+    
+        if (candidate-&gt;handle().cellKind() == HeapCell::JSCell) {
+            if (!MarkedBlock::isAtomAligned(pointer))
+                return;
+        
+            tryPointer(pointer);
+            return;
+        }
+    
+        // A butterfly could point into the middle of an object.
+        char* alignedPointer = static_cast&lt;char*&gt;(candidate-&gt;handle().cellAlign(pointer));
+        tryPointer(alignedPointer);
+    
+        // Also, a butterfly could point at the end of an object plus sizeof(IndexingHeader). In that
+        // case, this is pointing to the object to the right of the one we should be marking.
+        if (candidate-&gt;atomNumber(alignedPointer) &gt; MarkedBlock::firstAtom()
+            &amp;&amp; pointer &lt;= alignedPointer + sizeof(IndexingHeader))
+            tryPointer(alignedPointer - candidate-&gt;cellSize());
+    }
+    
+    static bool isPointerGCObjectJSCell(
+        Heap&amp; heap, TinyBloomFilter filter, const void* pointer)
+    {
+        // It could point to a large allocation.
+        const Vector&lt;LargeAllocation*&gt;&amp; largeAllocations = heap.objectSpace().largeAllocations();
+        if (!largeAllocations.isEmpty()) {
+            if (largeAllocations[0]-&gt;aboveLowerBound(pointer)
+                &amp;&amp; largeAllocations.last()-&gt;belowUpperBound(pointer)) {
+                LargeAllocation*const* result = approximateBinarySearch&lt;LargeAllocation*const&gt;(
+                    largeAllocations.begin(), largeAllocations.size(),
+                    LargeAllocation::fromCell(pointer),
+                    [] (LargeAllocation*const* ptr) -&gt; LargeAllocation* { return *ptr; });
+                if (result) {
+                    if (result &gt; largeAllocations.begin()
+                        &amp;&amp; result[-1]-&gt;cell() == pointer
+                        &amp;&amp; result[-1]-&gt;attributes().cellKind == HeapCell::JSCell)
+                        return true;
+                    if (result[0]-&gt;cell() == pointer
+                        &amp;&amp; result[0]-&gt;attributes().cellKind == HeapCell::JSCell)
+                        return true;
+                    if (result + 1 &lt; largeAllocations.end()
+                        &amp;&amp; result[1]-&gt;cell() == pointer
+                        &amp;&amp; result[1]-&gt;attributes().cellKind == HeapCell::JSCell)
+                        return true;
+                }
+            }
+        }
+    
+        const HashSet&lt;MarkedBlock*&gt;&amp; set = heap.objectSpace().blocks().set();
+        
+        MarkedBlock* candidate = MarkedBlock::blockFor(pointer);
+        if (filter.ruleOut(bitwise_cast&lt;Bits&gt;(candidate))) {
+            ASSERT(!candidate || !set.contains(candidate));
+            return false;
+        }
+        
+        if (!MarkedBlock::isAtomAligned(pointer))
+            return false;
+        
+        if (!set.contains(candidate))
+            return false;
+        
+        if (candidate-&gt;handle().cellKind() != HeapCell::JSCell)
+            return false;
+        
+        candidate-&gt;flipIfNecessary();
+        if (!candidate-&gt;handle().isLiveCell(pointer))
+            return false;
+        
+        return true;
+    }
+    
+    static bool isValueGCObject(
+        Heap&amp; heap, TinyBloomFilter filter, JSValue value)
+    {
+        if (!value.isCell())
+            return false;
+        return isPointerGCObjectJSCell(heap, filter, static_cast&lt;void*&gt;(value.asCell()));
+    }
+};
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapIncrementalSweepercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -128,7 +128,8 @@
</span><span class="cx"> bool IncrementalSweeper::sweepNextBlock()
</span><span class="cx"> {
</span><span class="cx">     while (!m_blocksToSweep.isEmpty()) {
</span><del>-        MarkedBlock* block = m_blocksToSweep.takeLast();
</del><ins>+        MarkedBlock::Handle* block = m_blocksToSweep.takeLast();
+        block-&gt;setIsOnBlocksToSweep(false);
</ins><span class="cx"> 
</span><span class="cx">         if (!block-&gt;needsSweeping())
</span><span class="cx">             continue;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapIncrementalSweeperh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/IncrementalSweeper.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #define IncrementalSweeper_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;HeapTimer.h&quot;
</span><ins>+#include &quot;MarkedBlock.h&quot;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -55,7 +56,7 @@
</span><span class="cx">     void scheduleTimer();
</span><span class="cx">     void cancelTimer();
</span><span class="cx">     
</span><del>-    Vector&lt;MarkedBlock*&gt;&amp; m_blocksToSweep;
</del><ins>+    Vector&lt;MarkedBlock::Handle*&gt;&amp; m_blocksToSweep;
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapLargeAllocationcpp"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.cpp (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,112 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;LargeAllocation.h&quot;
+
+#include &quot;Heap.h&quot;
+#include &quot;JSCInlines.h&quot;
+#include &quot;Operations.h&quot;
+
+namespace JSC {
+
+LargeAllocation* LargeAllocation::tryCreate(Heap&amp; heap, size_t size, const AllocatorAttributes&amp; attributes)
+{
+    void* space = tryFastAlignedMalloc(alignment, headerSize() + size);
+    if (!space)
+        return nullptr;
+    if (scribbleFreeCells())
+        scribble(space, size);
+    return new (NotNull, space) LargeAllocation(heap, size, attributes);
+}
+
+LargeAllocation::LargeAllocation(Heap&amp; heap, size_t size, const AllocatorAttributes&amp; attributes)
+    : m_cellSize(size)
+    , m_isNewlyAllocated(true)
+    , m_hasValidCell(true)
+    , m_attributes(attributes)
+    , m_weakSet(heap.vm(), *this)
+{
+    m_isMarked.store(0);
+}
+
+void LargeAllocation::lastChanceToFinalize()
+{
+    m_weakSet.lastChanceToFinalize();
+    clearMarked();
+    clearNewlyAllocated();
+    sweep();
+}
+
+void LargeAllocation::shrink()
+{
+    m_weakSet.shrink();
+}
+
+void LargeAllocation::visitWeakSet(HeapRootVisitor&amp; visitor)
+{
+    m_weakSet.visit(visitor);
+}
+
+void LargeAllocation::reapWeakSet()
+{
+    return m_weakSet.reap();
+}
+
+void LargeAllocation::flip()
+{
+    ASSERT(heap()-&gt;operationInProgress() == FullCollection);
+    clearMarked();
+}
+
+bool LargeAllocation::isEmpty()
+{
+    return !isMarked() &amp;&amp; m_weakSet.isEmpty() &amp;&amp; !isNewlyAllocated();
+}
+
+void LargeAllocation::sweep()
+{
+    m_weakSet.sweep();
+    
+    if (m_hasValidCell &amp;&amp; !isLive()) {
+        if (m_attributes.destruction == NeedsDestruction)
+            static_cast&lt;JSCell*&gt;(cell())-&gt;callDestructor(*vm());
+        m_hasValidCell = false;
+    }
+}
+
+void LargeAllocation::destroy()
+{
+    this-&gt;~LargeAllocation();
+    fastAlignedFree(this);
+}
+
+void LargeAllocation::dump(PrintStream&amp; out) const
+{
+    out.print(RawPointer(this), &quot;:(cell at &quot;, RawPointer(cell()), &quot; with size &quot;, m_cellSize, &quot; and attributes &quot;, m_attributes, &quot;)&quot;);
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapLargeAllocationh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/LargeAllocation.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,153 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#pragma once
+
+#include &quot;MarkedBlock.h&quot;
+#include &quot;WeakSet.h&quot;
+
+namespace JSC {
+
+// WebKit has a good malloc that already knows what to do for large allocations. The GC shouldn't
+// have to think about such things. That's where LargeAllocation comes in. We will allocate large
+// objects directly using malloc, and put the LargeAllocation header just before them. We can detect
+// when a HeapCell* is a LargeAllocation because it will have the MarkedBlock::atomSize / 2 bit set.
+
+class LargeAllocation {
+public:
+    static LargeAllocation* tryCreate(Heap&amp;, size_t, const AllocatorAttributes&amp;);
+    
+    static LargeAllocation* fromCell(const void* cell)
+    {
+        return bitwise_cast&lt;LargeAllocation*&gt;(bitwise_cast&lt;char*&gt;(cell) - headerSize());
+    }
+    
+    HeapCell* cell() const
+    {
+        return bitwise_cast&lt;HeapCell*&gt;(bitwise_cast&lt;char*&gt;(this) + headerSize());
+    }
+    
+    static bool isLargeAllocation(HeapCell* cell)
+    {
+        return bitwise_cast&lt;uintptr_t&gt;(cell) &amp; halfAlignment;
+    }
+    
+    void lastChanceToFinalize();
+    
+    Heap* heap() const { return m_weakSet.heap(); }
+    VM* vm() const { return m_weakSet.vm(); }
+    WeakSet&amp; weakSet() { return m_weakSet; }
+    
+    void shrink();
+    
+    void visitWeakSet(HeapRootVisitor&amp;);
+    void reapWeakSet();
+    
+    void clearNewlyAllocated() { m_isNewlyAllocated = false; }
+    void flip();
+    
+    bool isNewlyAllocated() const { return m_isNewlyAllocated; }
+    ALWAYS_INLINE bool isMarked() { return m_isMarked.load(std::memory_order_relaxed); }
+    bool isMarkedOrNewlyAllocated() { return isMarked() || isNewlyAllocated(); }
+    bool isLive() { return isMarkedOrNewlyAllocated(); }
+    
+    bool hasValidCell() const { return m_hasValidCell; }
+    
+    bool isEmpty();
+    
+    size_t cellSize() const { return m_cellSize; }
+    
+    bool aboveLowerBound(const void* rawPtr)
+    {
+        char* ptr = bitwise_cast&lt;char*&gt;(rawPtr);
+        char* begin = bitwise_cast&lt;char*&gt;(cell());
+        return ptr &gt;= begin;
+    }
+    
+    bool belowUpperBound(const void* rawPtr)
+    {
+        char* ptr = bitwise_cast&lt;char*&gt;(rawPtr);
+        char* begin = bitwise_cast&lt;char*&gt;(cell());
+        char* end = begin + cellSize();
+        // We cannot #include IndexingHeader.h because reasons. The fact that IndexingHeader is 8
+        // bytes is wired deep into our engine, so this isn't so bad.
+        size_t sizeOfIndexingHeader = 8;
+        return ptr &lt;= end + sizeOfIndexingHeader;
+    }
+    
+    bool contains(const void* rawPtr)
+    {
+        return aboveLowerBound(rawPtr) &amp;&amp; belowUpperBound(rawPtr);
+    }
+    
+    const AllocatorAttributes&amp; attributes() const { return m_attributes; }
+    
+    void flipIfNecessary(uint64_t) { }
+    void flipIfNecessaryConcurrently(uint64_t) { }
+    
+    ALWAYS_INLINE bool testAndSetMarked()
+    {
+        // This method is usually called when the object is already marked. This avoids us
+        // having to CAS in that case. It's profitable to reduce the total amount of CAS
+        // traffic.
+        if (isMarked())
+            return true;
+        return !m_isMarked.compareExchangeStrong(false, true);
+    }
+    ALWAYS_INLINE bool testAndSetMarked(HeapCell*) { return testAndSetMarked(); }
+    void setMarked() { m_isMarked.store(true); }
+    void clearMarked() { m_isMarked.store(false); }
+    
+    void noteMarked() { }
+    
+    void sweep();
+    
+    void destroy();
+    
+    void dump(PrintStream&amp;) const;
+    
+private:
+    LargeAllocation(Heap&amp;, size_t, const AllocatorAttributes&amp;);
+    
+    static const unsigned alignment = MarkedBlock::atomSize;
+    static const unsigned halfAlignment = alignment / 2;
+
+    static unsigned headerSize();
+    
+    size_t m_cellSize;
+    bool m_isNewlyAllocated;
+    bool m_hasValidCell;
+    Atomic&lt;bool&gt; m_isMarked;
+    AllocatorAttributes m_attributes;
+    WeakSet m_weakSet;
+};
+
+inline unsigned LargeAllocation::headerSize()
+{
+    return ((sizeof(LargeAllocation) + halfAlignment - 1) &amp; ~(halfAlignment - 1)) | halfAlignment;
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedAllocatorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,17 +30,31 @@
</span><span class="cx"> #include &quot;Heap.h&quot;
</span><span class="cx"> #include &quot;IncrementalSweeper.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#include &quot;SuperSampler.h&quot;
</ins><span class="cx"> #include &quot;VM.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-static bool isListPagedOut(double deadline, DoublyLinkedList&lt;MarkedBlock&gt;&amp; list)
</del><ins>+MarkedAllocator::MarkedAllocator(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, const AllocatorAttributes&amp; attributes)
+    : m_currentBlock(0)
+    , m_lastActiveBlock(0)
+    , m_nextBlockToSweep(nullptr)
+    , m_cellSize(static_cast&lt;unsigned&gt;(cellSize))
+    , m_attributes(attributes)
+    , m_heap(heap)
+    , m_markedSpace(markedSpace)
</ins><span class="cx"> {
</span><ins>+}
+
+bool MarkedAllocator::isPagedOut(double deadline)
+{
</ins><span class="cx">     unsigned itersSinceLastTimeCheck = 0;
</span><del>-    MarkedBlock* block = list.head();
</del><ins>+    MarkedBlock::Handle* block = m_blockList.begin();
</ins><span class="cx">     while (block) {
</span><del>-        block = block-&gt;next();
</del><ins>+        block = filterNextBlock(block-&gt;next());
+        if (block)
+            block-&gt;flipIfNecessary(); // Forces us to touch the memory of the block, but has no semantic effect.
</ins><span class="cx">         ++itersSinceLastTimeCheck;
</span><span class="cx">         if (itersSinceLastTimeCheck &gt;= Heap::s_timeCheckResolution) {
</span><span class="cx">             double currentTime = WTF::monotonicallyIncreasingTime();
</span><span class="lines">@@ -52,79 +66,104 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool MarkedAllocator::isPagedOut(double deadline)
</del><ins>+void MarkedAllocator::retire(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><del>-    if (isListPagedOut(deadline, m_blockList))
-        return true;
-    return false;
</del><ins>+    LockHolder locker(m_lock); // This will be called in parallel during GC.
+    if (block == m_currentBlock) {
+        // This happens when the mutator is running. We finished a full GC and marked too few things
+        // to retire. Then we started allocating in this block. Then a barrier ran, which marked an
+        // object in this block, which put it over the retirement threshold. It's OK to simply do
+        // nothing in that case.
+        return;
+    }
+    if (block == m_lastActiveBlock) {
+        // This can easily happen during marking. It would be easy to handle this case, but it's
+        // just as easy to ignore it.
+        return;
+    }
+    RELEASE_ASSERT(block-&gt;isOnList());
+    if (block == m_nextBlockToSweep)
+        m_nextBlockToSweep = filterNextBlock(block-&gt;next());
+    block-&gt;remove();
+    m_retiredBlocks.push(block);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedAllocator::retire(MarkedBlock* block, MarkedBlock::FreeList&amp; freeList)
</del><ins>+MarkedBlock::Handle* MarkedAllocator::filterNextBlock(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><del>-    m_blockList.remove(block);
-    m_retiredBlocks.push(block);
-    block-&gt;didRetireBlock(freeList);
</del><ins>+    if (block == m_blockList.end())
+        return nullptr;
+    return block;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void* MarkedAllocator::tryAllocateHelper(size_t bytes)
</del><ins>+void MarkedAllocator::setNextBlockToSweep(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><ins>+    m_nextBlockToSweep = filterNextBlock(block);
+}
+
+void* MarkedAllocator::tryAllocateWithoutCollectingImpl()
+{
+    SuperSamplerScope superSamplerScope(false);
+    
</ins><span class="cx">     if (m_currentBlock) {
</span><span class="cx">         ASSERT(m_currentBlock == m_nextBlockToSweep);
</span><span class="cx">         m_currentBlock-&gt;didConsumeFreeList();
</span><del>-        m_nextBlockToSweep = m_currentBlock-&gt;next();
</del><ins>+        setNextBlockToSweep(m_currentBlock-&gt;next());
</ins><span class="cx">     }
</span><ins>+    
+    setFreeList(FreeList());
</ins><span class="cx"> 
</span><del>-    MarkedBlock* next;
-    for (MarkedBlock*&amp; block = m_nextBlockToSweep; block; block = next) {
-        next = block-&gt;next();
</del><ins>+    RELEASE_ASSERT(m_nextBlockToSweep != m_blockList.end());
</ins><span class="cx"> 
</span><del>-        MarkedBlock::FreeList freeList = block-&gt;sweep(MarkedBlock::SweepToFreeList);
</del><ins>+    MarkedBlock::Handle* next;
+    for (MarkedBlock::Handle*&amp; block = m_nextBlockToSweep; block; block = next) {
+        next = filterNextBlock(block-&gt;next());
+
+        // It would be super weird if the blocks we are sweeping have anything allocated during this
+        // cycle.
+        ASSERT(!block-&gt;hasAnyNewlyAllocated());
</ins><span class="cx">         
</span><del>-        double utilization = ((double)MarkedBlock::blockSize - (double)freeList.bytes) / (double)MarkedBlock::blockSize;
-        if (utilization &gt;= Options::minMarkedBlockUtilization()) {
-            ASSERT(freeList.bytes || !freeList.head);
-            retire(block, freeList);
</del><ins>+        FreeList freeList = block-&gt;sweep(MarkedBlock::Handle::SweepToFreeList);
+        
+        // It's possible to stumble on a complete-full block. Marking tries to retire these, but
+        // that algorithm is racy and may forget to do it sometimes.
+        if (freeList.allocationWillFail()) {
+            ASSERT(block-&gt;isFreeListed());
+            block-&gt;unsweepWithNoNewlyAllocated();
+            ASSERT(block-&gt;isMarked());
+            retire(block);
</ins><span class="cx">             continue;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (bytes &gt; block-&gt;cellSize()) {
-            block-&gt;stopAllocating(freeList);
-            continue;
-        }
-
</del><span class="cx">         m_currentBlock = block;
</span><del>-        m_freeList = freeList;
</del><ins>+        setFreeList(freeList);
</ins><span class="cx">         break;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    if (!m_freeList.head) {
</del><ins>+    if (!m_freeList) {
</ins><span class="cx">         m_currentBlock = 0;
</span><span class="cx">         return 0;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ASSERT(m_freeList.head);
-    void* head = tryPopFreeList(bytes);
-    ASSERT(head);
</del><ins>+    void* result;
+    if (m_freeList.remaining) {
+        unsigned cellSize = m_cellSize;
+        m_freeList.remaining -= cellSize;
+        result = m_freeList.payloadEnd - m_freeList.remaining - cellSize;
+    } else {
+        FreeCell* head = m_freeList.head;
+        m_freeList.head = head-&gt;next;
+        result = head;
+    }
+    RELEASE_ASSERT(result);
</ins><span class="cx">     m_markedSpace-&gt;didAllocateInBlock(m_currentBlock);
</span><del>-    return head;
</del><ins>+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void* MarkedAllocator::tryPopFreeList(size_t bytes)
</del><ins>+inline void* MarkedAllocator::tryAllocateWithoutCollecting()
</ins><span class="cx"> {
</span><del>-    ASSERT(m_currentBlock);
-    if (bytes &gt; m_currentBlock-&gt;cellSize())
-        return 0;
-
-    MarkedBlock::FreeCell* head = m_freeList.head;
-    m_freeList.head = head-&gt;next;
-    return head;
-}
-
-inline void* MarkedAllocator::tryAllocate(size_t bytes)
-{
</del><span class="cx">     ASSERT(!m_heap-&gt;isBusy());
</span><span class="cx">     m_heap-&gt;m_operationInProgress = Allocation;
</span><del>-    void* result = tryAllocateHelper(bytes);
</del><ins>+    void* result = tryAllocateWithoutCollectingImpl();
</ins><span class="cx"> 
</span><span class="cx">     m_heap-&gt;m_operationInProgress = NoOperation;
</span><span class="cx">     ASSERT(result || !m_currentBlock);
</span><span class="lines">@@ -146,22 +185,34 @@
</span><span class="cx">         allocationCount = 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void* MarkedAllocator::allocateSlowCase(size_t bytes)
</del><ins>+void* MarkedAllocator::allocateSlowCase()
</ins><span class="cx"> {
</span><ins>+    bool crashOnFailure = true;
+    return allocateSlowCaseImpl(crashOnFailure);
+}
+
+void* MarkedAllocator::tryAllocateSlowCase()
+{
+    bool crashOnFailure = false;
+    return allocateSlowCaseImpl(crashOnFailure);
+}
+
+void* MarkedAllocator::allocateSlowCaseImpl(bool crashOnFailure)
+{
+    SuperSamplerScope superSamplerScope(false);
</ins><span class="cx">     ASSERT(m_heap-&gt;vm()-&gt;currentThreadIsHoldingAPILock());
</span><span class="cx">     doTestCollectionsIfNeeded();
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!m_markedSpace-&gt;isIterating());
</span><del>-    ASSERT(!m_freeList.head);
-    m_heap-&gt;didAllocate(m_freeList.bytes);
</del><ins>+    m_heap-&gt;didAllocate(m_freeList.originalSize);
</ins><span class="cx">     
</span><del>-    void* result = tryAllocate(bytes);
</del><ins>+    void* result = tryAllocateWithoutCollecting();
</ins><span class="cx">     
</span><span class="cx">     if (LIKELY(result != 0))
</span><span class="cx">         return result;
</span><span class="cx">     
</span><span class="cx">     if (m_heap-&gt;collectIfNecessaryOrDefer()) {
</span><del>-        result = tryAllocate(bytes);
</del><ins>+        result = tryAllocateWithoutCollecting();
</ins><span class="cx">         if (result)
</span><span class="cx">             return result;
</span><span class="cx">     }
</span><span class="lines">@@ -168,67 +219,95 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!m_heap-&gt;shouldCollect());
</span><span class="cx">     
</span><del>-    MarkedBlock* block = allocateBlock(bytes);
-    ASSERT(block);
</del><ins>+    MarkedBlock::Handle* block = tryAllocateBlock();
+    if (!block) {
+        if (crashOnFailure)
+            RELEASE_ASSERT_NOT_REACHED();
+        else
+            return nullptr;
+    }
</ins><span class="cx">     addBlock(block);
</span><span class="cx">         
</span><del>-    result = tryAllocate(bytes);
</del><ins>+    result = tryAllocateWithoutCollecting();
</ins><span class="cx">     ASSERT(result);
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-MarkedBlock* MarkedAllocator::allocateBlock(size_t bytes)
</del><ins>+static size_t blockHeaderSize()
</ins><span class="cx"> {
</span><ins>+    return WTF::roundUpToMultipleOf&lt;MarkedBlock::atomSize&gt;(sizeof(MarkedBlock));
+}
+
+size_t MarkedAllocator::blockSizeForBytes(size_t bytes)
+{
</ins><span class="cx">     size_t minBlockSize = MarkedBlock::blockSize;
</span><del>-    size_t minAllocationSize = WTF::roundUpToMultipleOf&lt;MarkedBlock::atomSize&gt;(sizeof(MarkedBlock)) + WTF::roundUpToMultipleOf&lt;MarkedBlock::atomSize&gt;(bytes);
</del><ins>+    size_t minAllocationSize = blockHeaderSize() + WTF::roundUpToMultipleOf&lt;MarkedBlock::atomSize&gt;(bytes);
</ins><span class="cx">     minAllocationSize = WTF::roundUpToMultipleOf(WTF::pageSize(), minAllocationSize);
</span><del>-    size_t blockSize = std::max(minBlockSize, minAllocationSize);
</del><ins>+    return std::max(minBlockSize, minAllocationSize);
+}
</ins><span class="cx"> 
</span><del>-    size_t cellSize = m_cellSize ? m_cellSize : WTF::roundUpToMultipleOf&lt;MarkedBlock::atomSize&gt;(bytes);
-
-    return MarkedBlock::create(*m_heap, this, blockSize, cellSize, m_attributes);
</del><ins>+MarkedBlock::Handle* MarkedAllocator::tryAllocateBlock()
+{
+    SuperSamplerScope superSamplerScope(false);
+    return MarkedBlock::tryCreate(*m_heap, this, m_cellSize, m_attributes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedAllocator::addBlock(MarkedBlock* block)
</del><ins>+void MarkedAllocator::addBlock(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!m_currentBlock);
</span><del>-    ASSERT(!m_freeList.head);
</del><ins>+    ASSERT(!m_freeList);
</ins><span class="cx">     
</span><span class="cx">     m_blockList.append(block);
</span><del>-    m_nextBlockToSweep = block;
</del><ins>+    setNextBlockToSweep(block);
</ins><span class="cx">     m_markedSpace-&gt;didAddBlock(block);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedAllocator::removeBlock(MarkedBlock* block)
</del><ins>+void MarkedAllocator::removeBlock(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><span class="cx">     if (m_currentBlock == block) {
</span><del>-        m_currentBlock = m_currentBlock-&gt;next();
-        m_freeList = MarkedBlock::FreeList();
</del><ins>+        m_currentBlock = filterNextBlock(m_currentBlock-&gt;next());
+        setFreeList(FreeList());
</ins><span class="cx">     }
</span><span class="cx">     if (m_nextBlockToSweep == block)
</span><del>-        m_nextBlockToSweep = m_nextBlockToSweep-&gt;next();
</del><ins>+        setNextBlockToSweep(m_nextBlockToSweep-&gt;next());
</ins><span class="cx"> 
</span><span class="cx">     block-&gt;willRemoveBlock();
</span><span class="cx">     m_blockList.remove(block);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MarkedAllocator::stopAllocating()
+{
+    if (m_heap-&gt;operationInProgress() == FullCollection)
+        m_blockList.takeFrom(m_retiredBlocks);
+
+    ASSERT(!m_lastActiveBlock);
+    if (!m_currentBlock) {
+        ASSERT(!m_freeList);
+        return;
+    }
+    
+    m_currentBlock-&gt;stopAllocating(m_freeList);
+    m_lastActiveBlock = m_currentBlock;
+    m_currentBlock = 0;
+    m_freeList = FreeList();
+}
+
</ins><span class="cx"> void MarkedAllocator::reset()
</span><span class="cx"> {
</span><span class="cx">     m_lastActiveBlock = 0;
</span><span class="cx">     m_currentBlock = 0;
</span><del>-    m_freeList = MarkedBlock::FreeList();
-    if (m_heap-&gt;operationInProgress() == FullCollection)
-        m_blockList.append(m_retiredBlocks);
</del><ins>+    setFreeList(FreeList());
</ins><span class="cx"> 
</span><del>-    m_nextBlockToSweep = m_blockList.head();
</del><ins>+    setNextBlockToSweep(m_blockList.begin());
</ins><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(Options::useImmortalObjects())) {
</span><del>-        MarkedBlock* next;
-        for (MarkedBlock*&amp; block = m_nextBlockToSweep; block; block = next) {
-            next = block-&gt;next();
</del><ins>+        MarkedBlock::Handle* next;
+        for (MarkedBlock::Handle*&amp; block = m_nextBlockToSweep; block; block = next) {
+            next = filterNextBlock(block-&gt;next());
</ins><span class="cx"> 
</span><del>-            MarkedBlock::FreeList freeList = block-&gt;sweep(MarkedBlock::SweepToFreeList);
-            retire(block, freeList);
</del><ins>+            FreeList freeList = block-&gt;sweep(MarkedBlock::Handle::SweepToFreeList);
+            block-&gt;zap(freeList);
+            retire(block);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -235,11 +314,16 @@
</span><span class="cx"> 
</span><span class="cx"> void MarkedAllocator::lastChanceToFinalize()
</span><span class="cx"> {
</span><del>-    m_blockList.append(m_retiredBlocks);
</del><ins>+    m_blockList.takeFrom(m_retiredBlocks);
</ins><span class="cx">     forEachBlock(
</span><del>-        [&amp;] (MarkedBlock* block) {
</del><ins>+        [&amp;] (MarkedBlock::Handle* block) {
</ins><span class="cx">             block-&gt;lastChanceToFinalize();
</span><span class="cx">         });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MarkedAllocator::setFreeList(const FreeList&amp; freeList)
+{
+    m_freeList = freeList;
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedAllocatorh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedAllocator.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,8 +27,9 @@
</span><span class="cx"> #define MarkedAllocator_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AllocatorAttributes.h&quot;
</span><ins>+#include &quot;FreeList.h&quot;
</ins><span class="cx"> #include &quot;MarkedBlock.h&quot;
</span><del>-#include &lt;wtf/DoublyLinkedList.h&gt;
</del><ins>+#include &lt;wtf/SentinelLinkedList.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -40,9 +41,10 @@
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> 
</span><span class="cx"> public:
</span><del>-    static ptrdiff_t offsetOfFreeListHead();
</del><ins>+    static ptrdiff_t offsetOfFreeList();
+    static ptrdiff_t offsetOfCellSize();
</ins><span class="cx"> 
</span><del>-    MarkedAllocator();
</del><ins>+    MarkedAllocator(Heap*, MarkedSpace*, size_t cellSize, const AllocatorAttributes&amp;);
</ins><span class="cx">     void lastChanceToFinalize();
</span><span class="cx">     void reset();
</span><span class="cx">     void stopAllocating();
</span><span class="lines">@@ -52,11 +54,12 @@
</span><span class="cx">     bool needsDestruction() const { return m_attributes.destruction == NeedsDestruction; }
</span><span class="cx">     DestructionMode destruction() const { return m_attributes.destruction; }
</span><span class="cx">     HeapCell::Kind cellKind() const { return m_attributes.cellKind; }
</span><del>-    void* allocate(size_t);
</del><ins>+    void* allocate();
+    void* tryAllocate();
</ins><span class="cx">     Heap* heap() { return m_heap; }
</span><del>-    MarkedBlock* takeLastActiveBlock()
</del><ins>+    MarkedBlock::Handle* takeLastActiveBlock()
</ins><span class="cx">     {
</span><del>-        MarkedBlock* block = m_lastActiveBlock;
</del><ins>+        MarkedBlock::Handle* block = m_lastActiveBlock;
</ins><span class="cx">         m_lastActiveBlock = 0;
</span><span class="cx">         return block;
</span><span class="cx">     }
</span><span class="lines">@@ -63,86 +66,87 @@
</span><span class="cx">     
</span><span class="cx">     template&lt;typename Functor&gt; void forEachBlock(const Functor&amp;);
</span><span class="cx">     
</span><del>-    void addBlock(MarkedBlock*);
-    void removeBlock(MarkedBlock*);
-    void init(Heap*, MarkedSpace*, size_t cellSize, const AllocatorAttributes&amp;);
</del><ins>+    void addBlock(MarkedBlock::Handle*);
+    void removeBlock(MarkedBlock::Handle*);
</ins><span class="cx"> 
</span><span class="cx">     bool isPagedOut(double deadline);
</span><ins>+    
+    static size_t blockSizeForBytes(size_t);
</ins><span class="cx">    
</span><span class="cx"> private:
</span><del>-    JS_EXPORT_PRIVATE void* allocateSlowCase(size_t);
-    void* tryAllocate(size_t);
-    void* tryAllocateHelper(size_t);
-    void* tryPopFreeList(size_t);
-    MarkedBlock* allocateBlock(size_t);
</del><ins>+    friend class MarkedBlock;
+    
+    JS_EXPORT_PRIVATE void* allocateSlowCase();
+    JS_EXPORT_PRIVATE void* tryAllocateSlowCase();
+    void* allocateSlowCaseImpl(bool crashOnFailure);
+    void* tryAllocateWithoutCollecting();
+    void* tryAllocateWithoutCollectingImpl();
+    MarkedBlock::Handle* tryAllocateBlock();
</ins><span class="cx">     ALWAYS_INLINE void doTestCollectionsIfNeeded();
</span><del>-    void retire(MarkedBlock*, MarkedBlock::FreeList&amp;);
</del><ins>+    void retire(MarkedBlock::Handle*);
</ins><span class="cx">     
</span><del>-    MarkedBlock::FreeList m_freeList;
-    MarkedBlock* m_currentBlock;
-    MarkedBlock* m_lastActiveBlock;
-    MarkedBlock* m_nextBlockToSweep;
-    DoublyLinkedList&lt;MarkedBlock&gt; m_blockList;
-    DoublyLinkedList&lt;MarkedBlock&gt; m_retiredBlocks;
-    size_t m_cellSize;
</del><ins>+    void setFreeList(const FreeList&amp;);
+    
+    MarkedBlock::Handle* filterNextBlock(MarkedBlock::Handle*);
+    void setNextBlockToSweep(MarkedBlock::Handle*);
+    
+    FreeList m_freeList;
+    MarkedBlock::Handle* m_currentBlock;
+    MarkedBlock::Handle* m_lastActiveBlock;
+    MarkedBlock::Handle* m_nextBlockToSweep;
+    SentinelLinkedList&lt;MarkedBlock::Handle, BasicRawSentinelNode&lt;MarkedBlock::Handle&gt;&gt; m_blockList;
+    SentinelLinkedList&lt;MarkedBlock::Handle, BasicRawSentinelNode&lt;MarkedBlock::Handle&gt;&gt; m_retiredBlocks;
+    Lock m_lock;
+    unsigned m_cellSize;
</ins><span class="cx">     AllocatorAttributes m_attributes;
</span><span class="cx">     Heap* m_heap;
</span><span class="cx">     MarkedSpace* m_markedSpace;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-inline ptrdiff_t MarkedAllocator::offsetOfFreeListHead()
</del><ins>+inline ptrdiff_t MarkedAllocator::offsetOfFreeList()
</ins><span class="cx"> {
</span><del>-    return OBJECT_OFFSETOF(MarkedAllocator, m_freeList) + OBJECT_OFFSETOF(MarkedBlock::FreeList, head);
</del><ins>+    return OBJECT_OFFSETOF(MarkedAllocator, m_freeList);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator::MarkedAllocator()
-    : m_currentBlock(0)
-    , m_lastActiveBlock(0)
-    , m_nextBlockToSweep(0)
-    , m_cellSize(0)
-    , m_heap(0)
-    , m_markedSpace(0)
</del><ins>+inline ptrdiff_t MarkedAllocator::offsetOfCellSize()
</ins><span class="cx"> {
</span><ins>+    return OBJECT_OFFSETOF(MarkedAllocator, m_cellSize);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void MarkedAllocator::init(Heap* heap, MarkedSpace* markedSpace, size_t cellSize, const AllocatorAttributes&amp; attributes)
</del><ins>+ALWAYS_INLINE void* MarkedAllocator::tryAllocate()
</ins><span class="cx"> {
</span><del>-    m_heap = heap;
-    m_markedSpace = markedSpace;
-    m_cellSize = cellSize;
-    m_attributes = attributes;
-}
-
-inline void* MarkedAllocator::allocate(size_t bytes)
-{
-    MarkedBlock::FreeCell* head = m_freeList.head;
-    if (UNLIKELY(!head)) {
-        void* result = allocateSlowCase(bytes);
-#ifndef NDEBUG
-        memset(result, 0xCD, bytes);
-#endif
-        return result;
</del><ins>+    unsigned remaining = m_freeList.remaining;
+    if (remaining) {
+        unsigned cellSize = m_cellSize;
+        remaining -= cellSize;
+        m_freeList.remaining = remaining;
+        return m_freeList.payloadEnd - remaining - cellSize;
</ins><span class="cx">     }
</span><span class="cx">     
</span><ins>+    FreeCell* head = m_freeList.head;
+    if (UNLIKELY(!head))
+        return tryAllocateSlowCase();
+    
</ins><span class="cx">     m_freeList.head = head-&gt;next;
</span><del>-#ifndef NDEBUG
-    memset(head, 0xCD, bytes);
-#endif
</del><span class="cx">     return head;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void MarkedAllocator::stopAllocating()
</del><ins>+ALWAYS_INLINE void* MarkedAllocator::allocate()
</ins><span class="cx"> {
</span><del>-    ASSERT(!m_lastActiveBlock);
-    if (!m_currentBlock) {
-        ASSERT(!m_freeList.head);
-        return;
</del><ins>+    unsigned remaining = m_freeList.remaining;
+    if (remaining) {
+        unsigned cellSize = m_cellSize;
+        remaining -= cellSize;
+        m_freeList.remaining = remaining;
+        return m_freeList.payloadEnd - remaining - cellSize;
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    m_currentBlock-&gt;stopAllocating(m_freeList);
-    m_lastActiveBlock = m_currentBlock;
-    m_currentBlock = 0;
-    m_freeList = MarkedBlock::FreeList();
</del><ins>+    FreeCell* head = m_freeList.head;
+    if (UNLIKELY(!head))
+        return allocateSlowCase();
+    
+    m_freeList.head = head-&gt;next;
+    return head;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void MarkedAllocator::resumeAllocating()
</span><span class="lines">@@ -157,16 +161,8 @@
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename Functor&gt; inline void MarkedAllocator::forEachBlock(const Functor&amp; functor)
</span><span class="cx"> {
</span><del>-    MarkedBlock* next;
-    for (MarkedBlock* block = m_blockList.head(); block; block = next) {
-        next = block-&gt;next();
-        functor(block);
-    }
-
-    for (MarkedBlock* block = m_retiredBlocks.head(); block; block = next) {
-        next = block-&gt;next();
-        functor(block);
-    }
</del><ins>+    m_blockList.forEach(functor);
+    m_retiredBlocks.forEach(functor);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedBlockcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="cx"> #include &quot;JSDestructibleObject.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#include &quot;SuperSampler.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -35,7 +36,7 @@
</span><span class="cx"> static const bool computeBalance = false;
</span><span class="cx"> static size_t balance;
</span><span class="cx"> 
</span><del>-MarkedBlock* MarkedBlock::create(Heap&amp; heap, MarkedAllocator* allocator, size_t capacity, size_t cellSize, const AllocatorAttributes&amp; attributes)
</del><ins>+MarkedBlock::Handle* MarkedBlock::tryCreate(Heap&amp; heap, MarkedAllocator* allocator, size_t cellSize, const AllocatorAttributes&amp; attributes)
</ins><span class="cx"> {
</span><span class="cx">     if (computeBalance) {
</span><span class="cx">         balance++;
</span><span class="lines">@@ -42,62 +43,94 @@
</span><span class="cx">         if (!(balance % 10))
</span><span class="cx">             dataLog(&quot;MarkedBlock Balance: &quot;, balance, &quot;\n&quot;);
</span><span class="cx">     }
</span><del>-    MarkedBlock* block = new (NotNull, fastAlignedMalloc(blockSize, capacity)) MarkedBlock(allocator, capacity, cellSize, attributes);
-    heap.didAllocateBlock(capacity);
-    return block;
</del><ins>+    void* blockSpace = tryFastAlignedMalloc(blockSize, blockSize);
+    if (!blockSpace)
+        return nullptr;
+    if (scribbleFreeCells())
+        scribble(blockSpace, blockSize);
+    return new Handle(heap, allocator, cellSize, attributes, blockSpace);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedBlock::destroy(Heap&amp; heap, MarkedBlock* block)
</del><ins>+MarkedBlock::Handle::Handle(Heap&amp; heap, MarkedAllocator* allocator, size_t cellSize, const AllocatorAttributes&amp; attributes, void* blockSpace)
+    : m_atomsPerCell((cellSize + atomSize - 1) / atomSize)
+    , m_endAtom(atomsPerBlock - m_atomsPerCell + 1)
+    , m_attributes(attributes)
+    , m_state(New) // All cells start out unmarked.
+    , m_allocator(allocator)
+    , m_weakSet(allocator-&gt;heap()-&gt;vm(), CellContainer())
</ins><span class="cx"> {
</span><ins>+    m_block = new (NotNull, blockSpace) MarkedBlock(*heap.vm(), *this);
+    
+    m_weakSet.setContainer(*m_block);
+    
+    heap.didAllocateBlock(blockSize);
+    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
+    ASSERT(allocator);
+    if (m_attributes.cellKind != HeapCell::JSCell)
+        RELEASE_ASSERT(m_attributes.destruction == DoesNotNeedDestruction);
+}
+
+MarkedBlock::Handle::~Handle()
+{
+    Heap&amp; heap = *this-&gt;heap();
</ins><span class="cx">     if (computeBalance) {
</span><span class="cx">         balance--;
</span><span class="cx">         if (!(balance % 10))
</span><span class="cx">             dataLog(&quot;MarkedBlock Balance: &quot;, balance, &quot;\n&quot;);
</span><span class="cx">     }
</span><del>-    size_t capacity = block-&gt;capacity();
-    block-&gt;~MarkedBlock();
-    fastAlignedFree(block);
-    heap.didFreeBlock(capacity);
</del><ins>+    m_block-&gt;~MarkedBlock();
+    fastAlignedFree(m_block);
+    heap.didFreeBlock(blockSize);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-MarkedBlock::MarkedBlock(MarkedAllocator* allocator, size_t capacity, size_t cellSize, const AllocatorAttributes&amp; attributes)
-    : DoublyLinkedListNode&lt;MarkedBlock&gt;()
-    , m_atomsPerCell((cellSize + atomSize - 1) / atomSize)
-    , m_endAtom((allocator-&gt;cellSize() ? atomsPerBlock - m_atomsPerCell : firstAtom()) + 1)
-    , m_capacity(capacity)
-    , m_attributes(attributes)
-    , m_allocator(allocator)
-    , m_state(New) // All cells start out unmarked.
-    , m_weakSet(allocator-&gt;heap()-&gt;vm(), *this)
</del><ins>+MarkedBlock::MarkedBlock(VM&amp; vm, Handle&amp; handle)
+    : m_needsDestruction(handle.needsDestruction())
+    , m_handle(handle)
+    , m_vm(&amp;vm)
+    , m_version(vm.heap.objectSpace().version())
</ins><span class="cx"> {
</span><del>-    ASSERT(allocator);
-    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
-    if (m_attributes.cellKind != HeapCell::JSCell)
-        RELEASE_ASSERT(m_attributes.destruction == DoesNotNeedDestruction);
</del><ins>+    unsigned cellsPerBlock = MarkedSpace::blockPayload / handle.cellSize();
+    double markCountBias = -(Options::minMarkedBlockUtilization() * cellsPerBlock);
+    
+    // The mark count bias should be comfortably within this range.
+    RELEASE_ASSERT(markCountBias &gt; static_cast&lt;double&gt;(std::numeric_limits&lt;int16_t&gt;::min()));
+    RELEASE_ASSERT(markCountBias &lt; 0);
+    
+    m_markCountBias = static_cast&lt;int16_t&gt;(markCountBias);
+    
+    m_biasedMarkCount = m_markCountBias; // This means we haven't marked anything yet.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void MarkedBlock::callDestructor(HeapCell* cell)
</del><ins>+template&lt;MarkedBlock::BlockState blockState, MarkedBlock::Handle::SweepMode sweepMode, DestructionMode destructionMode, MarkedBlock::Handle::ScribbleMode scribbleMode, MarkedBlock::Handle::NewlyAllocatedMode newlyAllocatedMode&gt;
+FreeList MarkedBlock::Handle::specializedSweep()
</ins><span class="cx"> {
</span><del>-    // A previous eager sweep may already have run cell's destructor.
-    if (cell-&gt;isZapped())
-        return;
</del><ins>+    SuperSamplerScope superSamplerScope(false);
+    ASSERT(blockState == New || blockState == Marked);
+    ASSERT(!(destructionMode == DoesNotNeedDestruction &amp;&amp; sweepMode == SweepOnly));
</ins><span class="cx">     
</span><del>-    JSCell* jsCell = static_cast&lt;JSCell*&gt;(cell);
</del><ins>+    assertFlipped();
+    MarkedBlock&amp; block = this-&gt;block();
+    
+    bool isNewBlock = blockState == New;
+    bool isEmptyBlock = !block.hasAnyMarked()
+        &amp;&amp; newlyAllocatedMode == DoesNotHaveNewlyAllocated
+        &amp;&amp; destructionMode == DoesNotNeedDestruction;
+    if (Options::useBumpAllocator() &amp;&amp; (isNewBlock || isEmptyBlock)) {
+        ASSERT(block.m_marks.isEmpty());
+        
+        char* startOfLastCell = static_cast&lt;char*&gt;(cellAlign(block.atoms() + m_endAtom - 1));
+        char* payloadEnd = startOfLastCell + cellSize();
+        RELEASE_ASSERT(payloadEnd - MarkedBlock::blockSize &lt;= bitwise_cast&lt;char*&gt;(&amp;block));
+        char* payloadBegin = bitwise_cast&lt;char*&gt;(block.atoms() + firstAtom());
+        if (scribbleMode == Scribble)
+            scribble(payloadBegin, payloadEnd - payloadBegin);
+        m_state = ((sweepMode == SweepToFreeList) ? FreeListed : Marked);
+        FreeList result = FreeList::bump(payloadEnd, payloadEnd - payloadBegin);
+        if (false)
+            dataLog(&quot;Quickly swept block &quot;, RawPointer(this), &quot; with cell size &quot;, cellSize(), &quot; and attributes &quot;, m_attributes, &quot;: &quot;, result, &quot;\n&quot;);
+        return result;
+    }
</ins><span class="cx"> 
</span><del>-    ASSERT(jsCell-&gt;structureID());
-    if (jsCell-&gt;inlineTypeFlags() &amp; StructureIsImmortal)
-        jsCell-&gt;structure(*vm())-&gt;classInfo()-&gt;methodTable.destroy(jsCell);
-    else
-        jsCast&lt;JSDestructibleObject*&gt;(jsCell)-&gt;classInfo()-&gt;methodTable.destroy(jsCell);
-    cell-&gt;zap();
-}
-
-template&lt;MarkedBlock::BlockState blockState, MarkedBlock::SweepMode sweepMode, bool callDestructors&gt;
-MarkedBlock::FreeList MarkedBlock::specializedSweep()
-{
-    ASSERT(blockState != Allocated &amp;&amp; blockState != FreeListed);
-    ASSERT(!(!callDestructors &amp;&amp; sweepMode == SweepOnly));
-
</del><span class="cx">     // This produces a free list that is ordered in reverse through the block.
</span><span class="cx">     // This is fine, since the allocation code makes no assumptions about the
</span><span class="cx">     // order of the free list.
</span><span class="lines">@@ -104,16 +137,20 @@
</span><span class="cx">     FreeCell* head = 0;
</span><span class="cx">     size_t count = 0;
</span><span class="cx">     for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
</span><del>-        if (blockState == Marked &amp;&amp; (m_marks.get(i) || (m_newlyAllocated &amp;&amp; m_newlyAllocated-&gt;get(i))))
</del><ins>+        if (blockState == Marked
+            &amp;&amp; (block.m_marks.get(i)
+                || (newlyAllocatedMode == HasNewlyAllocated &amp;&amp; m_newlyAllocated-&gt;get(i))))
</ins><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;atoms()[i]);
</del><ins>+        HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;block.atoms()[i]);
</ins><span class="cx"> 
</span><del>-        if (callDestructors &amp;&amp; blockState != New)
-            callDestructor(cell);
</del><ins>+        if (destructionMode == NeedsDestruction &amp;&amp; blockState != New)
+            static_cast&lt;JSCell*&gt;(cell)-&gt;callDestructor(*vm());
</ins><span class="cx"> 
</span><span class="cx">         if (sweepMode == SweepToFreeList) {
</span><span class="cx">             FreeCell* freeCell = reinterpret_cast&lt;FreeCell*&gt;(cell);
</span><ins>+            if (scribbleMode == Scribble)
+                scribble(freeCell, cellSize());
</ins><span class="cx">             freeCell-&gt;next = head;
</span><span class="cx">             head = freeCell;
</span><span class="cx">             ++count;
</span><span class="lines">@@ -122,15 +159,20 @@
</span><span class="cx"> 
</span><span class="cx">     // We only want to discard the newlyAllocated bits if we're creating a FreeList,
</span><span class="cx">     // otherwise we would lose information on what's currently alive.
</span><del>-    if (sweepMode == SweepToFreeList &amp;&amp; m_newlyAllocated)
</del><ins>+    if (sweepMode == SweepToFreeList &amp;&amp; newlyAllocatedMode == HasNewlyAllocated)
</ins><span class="cx">         m_newlyAllocated = nullptr;
</span><span class="cx"> 
</span><del>-    m_state = ((sweepMode == SweepToFreeList) ? FreeListed : Marked);
-    return FreeList(head, count * cellSize());
</del><ins>+    FreeList result = FreeList::list(head, count * cellSize());
+    m_state = (sweepMode == SweepToFreeList ? FreeListed : Marked);
+    if (false)
+        dataLog(&quot;Slowly swept block &quot;, RawPointer(&amp;block), &quot; with cell size &quot;, cellSize(), &quot; and attributes &quot;, m_attributes, &quot;: &quot;, result, &quot;\n&quot;);
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-MarkedBlock::FreeList MarkedBlock::sweep(SweepMode sweepMode)
</del><ins>+FreeList MarkedBlock::Handle::sweep(SweepMode sweepMode)
</ins><span class="cx"> {
</span><ins>+    flipIfNecessary();
+    
</ins><span class="cx">     HEAP_LOG_BLOCK_STATE_TRANSITION(this);
</span><span class="cx"> 
</span><span class="cx">     m_weakSet.sweep();
</span><span class="lines">@@ -139,37 +181,60 @@
</span><span class="cx">         return FreeList();
</span><span class="cx"> 
</span><span class="cx">     if (m_attributes.destruction == NeedsDestruction)
</span><del>-        return sweepHelper&lt;true&gt;(sweepMode);
-    return sweepHelper&lt;false&gt;(sweepMode);
</del><ins>+        return sweepHelperSelectScribbleMode&lt;NeedsDestruction&gt;(sweepMode);
+    return sweepHelperSelectScribbleMode&lt;DoesNotNeedDestruction&gt;(sweepMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template&lt;bool callDestructors&gt;
-MarkedBlock::FreeList MarkedBlock::sweepHelper(SweepMode sweepMode)
</del><ins>+template&lt;DestructionMode destructionMode&gt;
+FreeList MarkedBlock::Handle::sweepHelperSelectScribbleMode(SweepMode sweepMode)
</ins><span class="cx"> {
</span><ins>+    if (scribbleFreeCells())
+        return sweepHelperSelectStateAndSweepMode&lt;destructionMode, Scribble&gt;(sweepMode);
+    return sweepHelperSelectStateAndSweepMode&lt;destructionMode, DontScribble&gt;(sweepMode);
+}
+
+template&lt;DestructionMode destructionMode, MarkedBlock::Handle::ScribbleMode scribbleMode&gt;
+FreeList MarkedBlock::Handle::sweepHelperSelectStateAndSweepMode(SweepMode sweepMode)
+{
</ins><span class="cx">     switch (m_state) {
</span><span class="cx">     case New:
</span><span class="cx">         ASSERT(sweepMode == SweepToFreeList);
</span><del>-        return specializedSweep&lt;New, SweepToFreeList, callDestructors&gt;();
</del><ins>+        return specializedSweep&lt;New, SweepToFreeList, destructionMode, scribbleMode, DoesNotHaveNewlyAllocated&gt;();
</ins><span class="cx">     case FreeListed:
</span><span class="cx">         // Happens when a block transitions to fully allocated.
</span><span class="cx">         ASSERT(sweepMode == SweepToFreeList);
</span><span class="cx">         return FreeList();
</span><del>-    case Retired:
</del><span class="cx">     case Allocated:
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">         return FreeList();
</span><span class="cx">     case Marked:
</span><del>-        return sweepMode == SweepToFreeList
-            ? specializedSweep&lt;Marked, SweepToFreeList, callDestructors&gt;()
-            : specializedSweep&lt;Marked, SweepOnly, callDestructors&gt;();
</del><ins>+        if (m_newlyAllocated) {
+            return sweepMode == SweepToFreeList
+                ? specializedSweep&lt;Marked, SweepToFreeList, destructionMode, scribbleMode, HasNewlyAllocated&gt;()
+                : specializedSweep&lt;Marked, SweepOnly, destructionMode, scribbleMode, HasNewlyAllocated&gt;();
+        } else {
+            return sweepMode == SweepToFreeList
+                ? specializedSweep&lt;Marked, SweepToFreeList, destructionMode, scribbleMode, DoesNotHaveNewlyAllocated&gt;()
+                : specializedSweep&lt;Marked, SweepOnly, destructionMode, scribbleMode, DoesNotHaveNewlyAllocated&gt;();
+        }
</ins><span class="cx">     }
</span><span class="cx">     RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">     return FreeList();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MarkedBlock::Handle::unsweepWithNoNewlyAllocated()
+{
+    flipIfNecessary();
+    
+    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
+    
+    RELEASE_ASSERT(m_state == FreeListed);
+    m_state = Marked;
+}
+
</ins><span class="cx"> class SetNewlyAllocatedFunctor : public MarkedBlock::VoidFunctor {
</span><span class="cx"> public:
</span><del>-    SetNewlyAllocatedFunctor(MarkedBlock* block)
</del><ins>+    SetNewlyAllocatedFunctor(MarkedBlock::Handle* block)
</ins><span class="cx">         : m_block(block)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="lines">@@ -176,31 +241,35 @@
</span><span class="cx"> 
</span><span class="cx">     IterationStatus operator()(HeapCell* cell, HeapCell::Kind) const
</span><span class="cx">     {
</span><del>-        ASSERT(MarkedBlock::blockFor(cell) == m_block);
</del><ins>+        ASSERT(MarkedBlock::blockFor(cell) == &amp;m_block-&gt;block());
</ins><span class="cx">         m_block-&gt;setNewlyAllocated(cell);
</span><span class="cx">         return IterationStatus::Continue;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    MarkedBlock* m_block;
</del><ins>+    MarkedBlock::Handle* m_block;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-void MarkedBlock::stopAllocating(const FreeList&amp; freeList)
</del><ins>+void MarkedBlock::Handle::stopAllocating(const FreeList&amp; freeList)
</ins><span class="cx"> {
</span><ins>+    flipIfNecessary();
</ins><span class="cx">     HEAP_LOG_BLOCK_STATE_TRANSITION(this);
</span><del>-    FreeCell* head = freeList.head;
</del><span class="cx"> 
</span><span class="cx">     if (m_state == Marked) {
</span><del>-        // If the block is in the Marked state then we know that:
-        // 1) It was not used for allocation during the previous allocation cycle.
-        // 2) It may have dead objects, and we only know them to be dead by the
-        //    fact that their mark bits are unset.
</del><ins>+        // If the block is in the Marked state then we know that one of these
+        // conditions holds:
+        //
+        // - It was not used for allocation during the previous allocation cycle.
+        //   It may have dead objects, and we only know them to be dead by the
+        //   fact that their mark bits are unset.
+        //
+        // - Someone had already done stopAllocating(), for example because of
+        //   heap iteration, and they had already 
</ins><span class="cx">         // Hence if the block is Marked we need to leave it Marked.
</span><del>-        
-        ASSERT(!head);
</del><ins>+        ASSERT(freeList.allocationWillFail());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><del>-   
</del><ins>+    
</ins><span class="cx">     ASSERT(m_state == FreeListed);
</span><span class="cx">     
</span><span class="cx">     // Roll back to a coherent state for Heap introspection. Cells newly
</span><span class="lines">@@ -213,57 +282,29 @@
</span><span class="cx">     SetNewlyAllocatedFunctor functor(this);
</span><span class="cx">     forEachCell(functor);
</span><span class="cx"> 
</span><del>-    FreeCell* next;
-    for (FreeCell* current = head; current; current = next) {
-        next = current-&gt;next;
-        if (m_attributes.destruction == NeedsDestruction)
-            reinterpret_cast&lt;HeapCell*&gt;(current)-&gt;zap();
-        clearNewlyAllocated(current);
-    }
</del><ins>+    forEachFreeCell(
+        freeList,
+        [&amp;] (HeapCell* cell) {
+            if (m_attributes.destruction == NeedsDestruction)
+                cell-&gt;zap();
+            clearNewlyAllocated(cell);
+        });
</ins><span class="cx">     
</span><span class="cx">     m_state = Marked;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedBlock::clearMarks()
</del><ins>+void MarkedBlock::Handle::lastChanceToFinalize()
</ins><span class="cx"> {
</span><del>-    if (heap()-&gt;operationInProgress() == JSC::EdenCollection)
-        this-&gt;clearMarksWithCollectionType&lt;EdenCollection&gt;();
-    else
-        this-&gt;clearMarksWithCollectionType&lt;FullCollection&gt;();
-}
-
-template &lt;HeapOperation collectionType&gt;
-void MarkedBlock::clearMarksWithCollectionType()
-{
-    ASSERT(collectionType == FullCollection || collectionType == EdenCollection);
-    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
-
-    ASSERT(m_state != New &amp;&amp; m_state != FreeListed);
-    if (collectionType == FullCollection) {
-        m_marks.clearAll();
-        // This will become true at the end of the mark phase. We set it now to
-        // avoid an extra pass to do so later.
-        m_state = Marked;
-        return;
-    }
-
-    ASSERT(collectionType == EdenCollection);
-    // If a block was retired then there's no way an EdenCollection can un-retire it.
-    if (m_state != Retired)
-        m_state = Marked;
-}
-
-void MarkedBlock::lastChanceToFinalize()
-{
</del><ins>+    m_block-&gt;clearMarks();
</ins><span class="cx">     m_weakSet.lastChanceToFinalize();
</span><span class="cx"> 
</span><span class="cx">     clearNewlyAllocated();
</span><del>-    clearMarksWithCollectionType&lt;FullCollection&gt;();
</del><span class="cx">     sweep();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-MarkedBlock::FreeList MarkedBlock::resumeAllocating()
</del><ins>+FreeList MarkedBlock::Handle::resumeAllocating()
</ins><span class="cx"> {
</span><ins>+    flipIfNecessary();
</ins><span class="cx">     HEAP_LOG_BLOCK_STATE_TRANSITION(this);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(m_state == Marked);
</span><span class="lines">@@ -274,32 +315,148 @@
</span><span class="cx">         return FreeList();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Re-create our free list from before stopping allocation. 
</del><ins>+    // Re-create our free list from before stopping allocation. Note that this may return an empty
+    // freelist, in which case the block will still be Marked!
</ins><span class="cx">     return sweep(SweepToFreeList);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedBlock::didRetireBlock(const FreeList&amp; freeList)
</del><ins>+void MarkedBlock::Handle::zap(const FreeList&amp; freeList)
</ins><span class="cx"> {
</span><del>-    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
-    FreeCell* head = freeList.head;
</del><ins>+    forEachFreeCell(
+        freeList,
+        [&amp;] (HeapCell* cell) {
+            if (m_attributes.destruction == NeedsDestruction)
+                cell-&gt;zap();
+        });
+}
</ins><span class="cx"> 
</span><del>-    // Currently we don't notify the Heap that we're giving up on this block. 
-    // The Heap might be able to make a better decision about how many bytes should 
-    // be allocated before the next collection if it knew about this retired block.
-    // On the other hand we'll waste at most 10% of our Heap space between FullCollections 
-    // and only under heavy fragmentation.
-
-    // We need to zap the free list when retiring a block so that we don't try to destroy 
-    // previously destroyed objects when we re-sweep the block in the future.
-    FreeCell* next;
-    for (FreeCell* current = head; current; current = next) {
-        next = current-&gt;next;
-        if (m_attributes.destruction == NeedsDestruction)
-            reinterpret_cast&lt;HeapCell*&gt;(current)-&gt;zap();
</del><ins>+template&lt;typename Func&gt;
+void MarkedBlock::Handle::forEachFreeCell(const FreeList&amp; freeList, const Func&amp; func)
+{
+    if (freeList.remaining) {
+        for (unsigned remaining = freeList.remaining; remaining; remaining -= cellSize())
+            func(bitwise_cast&lt;HeapCell*&gt;(freeList.payloadEnd - remaining));
+    } else {
+        for (FreeCell* current = freeList.head; current;) {
+            FreeCell* next = current-&gt;next;
+            func(bitwise_cast&lt;HeapCell*&gt;(current));
+            current = next;
+        }
</ins><span class="cx">     }
</span><ins>+}
</ins><span class="cx"> 
</span><ins>+void MarkedBlock::flipIfNecessary()
+{
+    flipIfNecessary(vm()-&gt;heap.objectSpace().version());
+}
+
+void MarkedBlock::Handle::flipIfNecessary()
+{
+    block().flipIfNecessary();
+}
+
+void MarkedBlock::flipIfNecessarySlow()
+{
+    ASSERT(m_version != vm()-&gt;heap.objectSpace().version());
+    clearMarks();
+}
+
+void MarkedBlock::flipIfNecessaryConcurrentlySlow()
+{
+    LockHolder locker(m_lock);
+    if (m_version != vm()-&gt;heap.objectSpace().version())
+        clearMarks();
+}
+
+void MarkedBlock::clearMarks()
+{
+    m_marks.clearAll();
+    clearHasAnyMarked();
+    // This will become true at the end of the mark phase. We set it now to
+    // avoid an extra pass to do so later.
+    handle().m_state = Marked;
+    WTF::storeStoreFence();
+    m_version = vm()-&gt;heap.objectSpace().version();
+}
+
+#if !ASSERT_DISABLED
+void MarkedBlock::assertFlipped()
+{
+    ASSERT(m_version == vm()-&gt;heap.objectSpace().version());
+}
+#endif // !ASSERT_DISABLED
+
+bool MarkedBlock::needsFlip()
+{
+    return vm()-&gt;heap.objectSpace().version() != m_version;
+}
+
+bool MarkedBlock::Handle::needsFlip()
+{
+    return m_block-&gt;needsFlip();
+}
+
+void MarkedBlock::Handle::willRemoveBlock()
+{
+    flipIfNecessary();
+}
+
+void MarkedBlock::Handle::didConsumeFreeList()
+{
+    flipIfNecessary();
+    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
+    
</ins><span class="cx">     ASSERT(m_state == FreeListed);
</span><del>-    m_state = Retired;
</del><ins>+
+    m_state = Allocated;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+size_t MarkedBlock::markCount()
+{
+    flipIfNecessary();
+    return m_marks.count();
+}
+
+bool MarkedBlock::Handle::isEmpty()
+{
+    flipIfNecessary();
+    return m_state == Marked &amp;&amp; !block().hasAnyMarked() &amp;&amp; m_weakSet.isEmpty() &amp;&amp; (!m_newlyAllocated || m_newlyAllocated-&gt;isEmpty());
+}
+
+void MarkedBlock::clearHasAnyMarked()
+{
+    m_biasedMarkCount = m_markCountBias;
+}
+
+void MarkedBlock::noteMarkedSlow()
+{
+    handle().m_allocator-&gt;retire(&amp;handle());
+}
+
</ins><span class="cx"> } // namespace JSC
</span><ins>+
+namespace WTF {
+
+using namespace JSC;
+
+void printInternal(PrintStream&amp; out, MarkedBlock::BlockState blockState)
+{
+    switch (blockState) {
+    case MarkedBlock::New:
+        out.print(&quot;New&quot;);
+        return;
+    case MarkedBlock::FreeListed:
+        out.print(&quot;FreeListed&quot;);
+        return;
+    case MarkedBlock::Allocated:
+        out.print(&quot;Allocated&quot;);
+        return;
+    case MarkedBlock::Marked:
+        out.print(&quot;Marked&quot;);
+        return;
+    }
+    RELEASE_ASSERT_NOT_REACHED();
+}
+
+} // namespace WTF
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedBlockh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedBlock.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AllocatorAttributes.h&quot;
</span><span class="cx"> #include &quot;DestructionMode.h&quot;
</span><ins>+#include &quot;FreeList.h&quot;
</ins><span class="cx"> #include &quot;HeapCell.h&quot;
</span><span class="cx"> #include &quot;HeapOperation.h&quot;
</span><span class="cx"> #include &quot;IterationStatus.h&quot;
</span><span class="lines">@@ -34,88 +35,93 @@
</span><span class="cx"> #include &lt;wtf/HashFunctions.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="cx"> 
</span><ins>+namespace JSC {
+    
+class Heap;
+class JSCell;
+class MarkedAllocator;
+
+typedef uintptr_t Bits;
+
</ins><span class="cx"> // Set to log state transitions of blocks.
</span><span class="cx"> #define HEAP_LOG_BLOCK_STATE_TRANSITIONS 0
</span><span class="cx"> 
</span><span class="cx"> #if HEAP_LOG_BLOCK_STATE_TRANSITIONS
</span><del>-#define HEAP_LOG_BLOCK_STATE_TRANSITION(block) do {                     \
-        dataLogF(                                                    \
-            &quot;%s:%d %s: block %s = %p, %d\n&quot;,                            \
-            __FILE__, __LINE__, __FUNCTION__,                           \
-            #block, (block), (block)-&gt;m_state);                         \
</del><ins>+#define HEAP_LOG_BLOCK_STATE_TRANSITION(handle) do {            \
+        dataLogF(                                               \
+            &quot;%s:%d %s: block %s = %p, %d\n&quot;,                    \
+            __FILE__, __LINE__, __FUNCTION__,                   \
+            #handle, &amp;(handle)-&gt;block(), (handle)-&gt;m_state);    \
</ins><span class="cx">     } while (false)
</span><span class="cx"> #else
</span><del>-#define HEAP_LOG_BLOCK_STATE_TRANSITION(block) ((void)0)
</del><ins>+#define HEAP_LOG_BLOCK_STATE_TRANSITION(handle) ((void)0)
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-namespace JSC {
-    
-    class Heap;
-    class JSCell;
-    class MarkedAllocator;
</del><ins>+// A marked block is a page-aligned container for heap-allocated objects.
+// Objects are allocated within cells of the marked block. For a given
+// marked block, all cells have the same size. Objects smaller than the
+// cell size may be allocated in the marked block, in which case the
+// allocation suffers from internal fragmentation: wasted space whose
+// size is equal to the difference between the cell size and the object
+// size.
</ins><span class="cx"> 
</span><del>-    typedef uintptr_t Bits;
</del><ins>+class MarkedBlock {
+    WTF_MAKE_NONCOPYABLE(MarkedBlock);
+    friend class LLIntOffsetsExtractor;
+    friend struct VerifyMarked;
</ins><span class="cx"> 
</span><del>-    // A marked block is a page-aligned container for heap-allocated objects.
-    // Objects are allocated within cells of the marked block. For a given
-    // marked block, all cells have the same size. Objects smaller than the
-    // cell size may be allocated in the marked block, in which case the
-    // allocation suffers from internal fragmentation: wasted space whose
-    // size is equal to the difference between the cell size and the object
-    // size.
-
-    class MarkedBlock : public DoublyLinkedListNode&lt;MarkedBlock&gt; {
-        friend class WTF::DoublyLinkedListNode&lt;MarkedBlock&gt;;
-        friend class LLIntOffsetsExtractor;
-        friend struct VerifyMarkedOrRetired;
-    public:
-        static const size_t atomSize = 16; // bytes
-        static const size_t blockSize = 16 * KB;
-        static const size_t blockMask = ~(blockSize - 1); // blockSize must be a power of two.
-
-        static const size_t atomsPerBlock = blockSize / atomSize;
-
-        static_assert(!(MarkedBlock::atomSize &amp; (MarkedBlock::atomSize - 1)), &quot;MarkedBlock::atomSize must be a power of two.&quot;);
-        static_assert(!(MarkedBlock::blockSize &amp; (MarkedBlock::blockSize - 1)), &quot;MarkedBlock::blockSize must be a power of two.&quot;);
-
-        struct FreeCell {
-            FreeCell* next;
-        };
</del><ins>+public:
+    class Handle;
+private:
+    friend class Handle;
+public:
+    enum BlockState : uint8_t { New, FreeListed, Allocated, Marked };
</ins><span class="cx">         
</span><del>-        struct FreeList {
-            FreeCell* head;
-            size_t bytes;
</del><ins>+    static const size_t atomSize = 16; // bytes
+    static const size_t blockSize = 16 * KB;
+    static const size_t blockMask = ~(blockSize - 1); // blockSize must be a power of two.
</ins><span class="cx"> 
</span><del>-            FreeList();
-            FreeList(FreeCell*, size_t);
-        };
</del><ins>+    static const size_t atomsPerBlock = blockSize / atomSize;
</ins><span class="cx"> 
</span><del>-        struct VoidFunctor {
-            typedef void ReturnType;
-            void returnValue() { }
-        };
</del><ins>+    static_assert(!(MarkedBlock::atomSize &amp; (MarkedBlock::atomSize - 1)), &quot;MarkedBlock::atomSize must be a power of two.&quot;);
+    static_assert(!(MarkedBlock::blockSize &amp; (MarkedBlock::blockSize - 1)), &quot;MarkedBlock::blockSize must be a power of two.&quot;);
</ins><span class="cx"> 
</span><del>-        class CountFunctor {
-        public:
-            typedef size_t ReturnType;
</del><ins>+    struct VoidFunctor {
+        typedef void ReturnType;
+        void returnValue() { }
+    };
</ins><span class="cx"> 
</span><del>-            CountFunctor() : m_count(0) { }
-            void count(size_t count) const { m_count += count; }
-            ReturnType returnValue() const { return m_count; }
</del><ins>+    class CountFunctor {
+    public:
+        typedef size_t ReturnType;
</ins><span class="cx"> 
</span><del>-        private:
-            // FIXME: This is mutable because we're using a functor rather than C++ lambdas.
-            // https://bugs.webkit.org/show_bug.cgi?id=159644
-            mutable ReturnType m_count;
-        };
</del><ins>+        CountFunctor() : m_count(0) { }
+        void count(size_t count) const { m_count += count; }
+        ReturnType returnValue() const { return m_count; }
</ins><span class="cx"> 
</span><del>-        static MarkedBlock* create(Heap&amp;, MarkedAllocator*, size_t capacity, size_t cellSize, const AllocatorAttributes&amp;);
-        static void destroy(Heap&amp;, MarkedBlock*);
</del><ins>+    private:
+        // FIXME: This is mutable because we're using a functor rather than C++ lambdas.
+        // https://bugs.webkit.org/show_bug.cgi?id=159644
+        mutable ReturnType m_count;
+    };
+        
+    class Handle : public BasicRawSentinelNode&lt;Handle&gt; {
+        WTF_MAKE_NONCOPYABLE(Handle);
+        WTF_MAKE_FAST_ALLOCATED;
+        friend class DoublyLinkedListNode&lt;Handle&gt;;
+        friend class LLIntOffsetsExtractor;
+        friend class MarkedBlock;
+        friend struct VerifyMarked;
+    public:
+            
+        ~Handle();
+            
+        MarkedBlock&amp; block();
+            
+        void* cellAlign(void*);
+            
+        bool isEmpty();
</ins><span class="cx"> 
</span><del>-        static bool isAtomAligned(const void*);
-        static MarkedBlock* blockFor(const void*);
-        static size_t firstAtom();
-        
</del><span class="cx">         void lastChanceToFinalize();
</span><span class="cx"> 
</span><span class="cx">         MarkedAllocator* allocator() const;
</span><span class="lines">@@ -122,15 +128,19 @@
</span><span class="cx">         Heap* heap() const;
</span><span class="cx">         VM* vm() const;
</span><span class="cx">         WeakSet&amp; weakSet();
</span><del>-        
</del><ins>+            
</ins><span class="cx">         enum SweepMode { SweepOnly, SweepToFreeList };
</span><span class="cx">         FreeList sweep(SweepMode = SweepOnly);
</span><del>-
</del><ins>+        
+        void unsweepWithNoNewlyAllocated();
+        
+        void zap(const FreeList&amp;);
+        
</ins><span class="cx">         void shrink();
</span><del>-
-        void visitWeakSet(HeapRootVisitor&amp;);
</del><ins>+            
+        unsigned visitWeakSet(HeapRootVisitor&amp;);
</ins><span class="cx">         void reapWeakSet();
</span><del>-
</del><ins>+            
</ins><span class="cx">         // While allocating from a free list, MarkedBlock temporarily has bogus
</span><span class="cx">         // cell liveness data. To restore accurate cell liveness data, call one
</span><span class="cx">         // of these functions:
</span><span class="lines">@@ -137,382 +147,557 @@
</span><span class="cx">         void didConsumeFreeList(); // Call this once you've allocated all the items in the free list.
</span><span class="cx">         void stopAllocating(const FreeList&amp;);
</span><span class="cx">         FreeList resumeAllocating(); // Call this if you canonicalized a block for some non-collection related purpose.
</span><del>-
</del><ins>+            
</ins><span class="cx">         // Returns true if the &quot;newly allocated&quot; bitmap was non-null 
</span><span class="cx">         // and was successfully cleared and false otherwise.
</span><span class="cx">         bool clearNewlyAllocated();
</span><del>-        void clearMarks();
-        template &lt;HeapOperation collectionType&gt;
-        void clearMarksWithCollectionType();
-
-        size_t markCount();
-        bool isEmpty();
-
</del><ins>+            
+        void flipForEdenCollection();
+            
</ins><span class="cx">         size_t cellSize();
</span><span class="cx">         const AllocatorAttributes&amp; attributes() const;
</span><span class="cx">         DestructionMode destruction() const;
</span><span class="cx">         bool needsDestruction() const;
</span><span class="cx">         HeapCell::Kind cellKind() const;
</span><del>-
</del><ins>+            
+        size_t markCount();
</ins><span class="cx">         size_t size();
</span><del>-        size_t capacity();
-
-        bool isMarked(const void*);
-        bool testAndSetMarked(const void*);
</del><ins>+            
</ins><span class="cx">         bool isLive(const HeapCell*);
</span><span class="cx">         bool isLiveCell(const void*);
</span><del>-        bool isAtom(const void*);
</del><span class="cx">         bool isMarkedOrNewlyAllocated(const HeapCell*);
</span><del>-        void setMarked(const void*);
-        void clearMarked(const void*);
-
</del><ins>+            
</ins><span class="cx">         bool isNewlyAllocated(const void*);
</span><span class="cx">         void setNewlyAllocated(const void*);
</span><span class="cx">         void clearNewlyAllocated(const void*);
</span><del>-
</del><ins>+        
+        bool hasAnyNewlyAllocated() const { return !!m_newlyAllocated; }
+            
</ins><span class="cx">         bool isAllocated() const;
</span><del>-        bool isMarkedOrRetired() const;
</del><ins>+        bool isMarked() const;
+        bool isFreeListed() const;
</ins><span class="cx">         bool needsSweeping() const;
</span><del>-        void didRetireBlock(const FreeList&amp;);
</del><span class="cx">         void willRemoveBlock();
</span><span class="cx"> 
</span><span class="cx">         template &lt;typename Functor&gt; IterationStatus forEachCell(const Functor&amp;);
</span><span class="cx">         template &lt;typename Functor&gt; IterationStatus forEachLiveCell(const Functor&amp;);
</span><span class="cx">         template &lt;typename Functor&gt; IterationStatus forEachDeadCell(const Functor&amp;);
</span><del>-
</del><ins>+            
+        bool needsFlip();
+            
+        void flipIfNecessaryConcurrently(uint64_t heapVersion);
+        void flipIfNecessary(uint64_t heapVersion);
+        void flipIfNecessary();
+            
+        void assertFlipped();
+            
+        bool isOnBlocksToSweep() const { return m_isOnBlocksToSweep; }
+        void setIsOnBlocksToSweep(bool value) { m_isOnBlocksToSweep = value; }
+        
+        BlockState state() const { return m_state; }
+            
</ins><span class="cx">     private:
</span><del>-        static const size_t atomAlignmentMask = atomSize - 1;
-
-        // During allocation, we look for available space in free lists in blocks.
-        // If a block's utilization is sufficiently high (i.e. it's almost full),
-        // we want to remove that block as a candidate for allocating to reduce
-        // the likelihood of allocation having to take a slow path. When the
-        // block is in this state, we say that it is &quot;Retired&quot;.
-        //
-        // A full GC can take a Retired blocks out of retirement. An eden GC
-        // will simply ignore Retired blocks (i.e. they will not be swept even
-        // if they no longer have live objects).
-
-        enum BlockState { New, FreeListed, Allocated, Marked, Retired };
-        template&lt;bool callDestructors&gt; FreeList sweepHelper(SweepMode = SweepOnly);
-
-        typedef char Atom[atomSize];
-
-        MarkedBlock(MarkedAllocator*, size_t capacity, size_t cellSize, const AllocatorAttributes&amp;);
-        Atom* atoms();
-        size_t atomNumber(const void*);
-        void callDestructor(HeapCell*);
-        template&lt;BlockState, SweepMode, bool callDestructors&gt; FreeList specializedSweep();
-        
-        MarkedBlock* m_prev;
-        MarkedBlock* m_next;
-
</del><ins>+        Handle(Heap&amp;, MarkedAllocator*, size_t cellSize, const AllocatorAttributes&amp;, void*);
+            
+        template&lt;DestructionMode&gt;
+        FreeList sweepHelperSelectScribbleMode(SweepMode = SweepOnly);
+            
+        enum ScribbleMode { DontScribble, Scribble };
+            
+        template&lt;DestructionMode, ScribbleMode&gt;
+        FreeList sweepHelperSelectStateAndSweepMode(SweepMode = SweepOnly);
+            
+        enum NewlyAllocatedMode { HasNewlyAllocated, DoesNotHaveNewlyAllocated };
+            
+        template&lt;BlockState, SweepMode, DestructionMode, ScribbleMode, NewlyAllocatedMode&gt;
+        FreeList specializedSweep();
+            
+        template&lt;typename Func&gt;
+        void forEachFreeCell(const FreeList&amp;, const Func&amp;);
+            
+        MarkedBlock::Handle* m_prev;
+        MarkedBlock::Handle* m_next;
+            
</ins><span class="cx">         size_t m_atomsPerCell;
</span><span class="cx">         size_t m_endAtom; // This is a fuzzy end. Always test for &lt; m_endAtom.
</span><del>-        WTF::Bitmap&lt;atomsPerBlock, WTF::BitmapAtomic, uint8_t&gt; m_marks;
</del><ins>+            
</ins><span class="cx">         std::unique_ptr&lt;WTF::Bitmap&lt;atomsPerBlock&gt;&gt; m_newlyAllocated;
</span><del>-
-        size_t m_capacity;
</del><ins>+            
</ins><span class="cx">         AllocatorAttributes m_attributes;
</span><ins>+        BlockState m_state;
+        bool m_isOnBlocksToSweep { false };
+            
</ins><span class="cx">         MarkedAllocator* m_allocator;
</span><del>-        BlockState m_state;
</del><span class="cx">         WeakSet m_weakSet;
</span><ins>+            
+        MarkedBlock* m_block;
</ins><span class="cx">     };
</span><ins>+        
+    static MarkedBlock::Handle* tryCreate(Heap&amp;, MarkedAllocator*, size_t cellSize, const AllocatorAttributes&amp;);
+        
+    Handle&amp; handle();
+        
+    VM* vm() const;
</ins><span class="cx"> 
</span><del>-    inline MarkedBlock::FreeList::FreeList()
-        : head(0)
-        , bytes(0)
-    {
-    }
</del><ins>+    static bool isAtomAligned(const void*);
+    static MarkedBlock* blockFor(const void*);
+    static size_t firstAtom();
+    size_t atomNumber(const void*);
+        
+    size_t markCount();
</ins><span class="cx"> 
</span><del>-    inline MarkedBlock::FreeList::FreeList(FreeCell* head, size_t bytes)
-        : head(head)
-        , bytes(bytes)
-    {
-    }
</del><ins>+    bool isMarked(const void*);
+    bool testAndSetMarked(const void*);
+        
+    bool isMarkedOrNewlyAllocated(const HeapCell*);
</ins><span class="cx"> 
</span><del>-    inline size_t MarkedBlock::firstAtom()
-    {
-        return WTF::roundUpToMultipleOf&lt;atomSize&gt;(sizeof(MarkedBlock)) / atomSize;
-    }
</del><ins>+    bool isAtom(const void*);
+    void setMarked(const void*);
+    void clearMarked(const void*);
+        
+    size_t cellSize();
+    const AllocatorAttributes&amp; attributes() const;
</ins><span class="cx"> 
</span><del>-    inline MarkedBlock::Atom* MarkedBlock::atoms()
-    {
-        return reinterpret_cast&lt;Atom*&gt;(this);
-    }
</del><ins>+    bool hasAnyMarked() const;
+    void noteMarked();
+        
+    WeakSet&amp; weakSet();
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isAtomAligned(const void* p)
-    {
-        return !(reinterpret_cast&lt;Bits&gt;(p) &amp; atomAlignmentMask);
-    }
</del><ins>+    bool needsFlip();
+        
+    void flipIfNecessaryConcurrently(uint64_t heapVersion);
+    void flipIfNecessary(uint64_t heapVersion);
+    void flipIfNecessary();
+        
+    void assertFlipped();
+        
+    bool needsDestruction() const { return m_needsDestruction; }
+        
+private:
+    static const size_t atomAlignmentMask = atomSize - 1;
</ins><span class="cx"> 
</span><del>-    inline MarkedBlock* MarkedBlock::blockFor(const void* p)
-    {
-        return reinterpret_cast&lt;MarkedBlock*&gt;(reinterpret_cast&lt;Bits&gt;(p) &amp; blockMask);
-    }
</del><ins>+    typedef char Atom[atomSize];
</ins><span class="cx"> 
</span><del>-    inline MarkedAllocator* MarkedBlock::allocator() const
-    {
-        return m_allocator;
-    }
</del><ins>+    MarkedBlock(VM&amp;, Handle&amp;);
+    Atom* atoms();
+        
+    void flipIfNecessaryConcurrentlySlow();
+    void flipIfNecessarySlow();
+    void clearMarks();
+    void clearHasAnyMarked();
+    
+    void noteMarkedSlow();
+        
+    WTF::Bitmap&lt;atomsPerBlock, WTF::BitmapAtomic, uint8_t&gt; m_marks;
</ins><span class="cx"> 
</span><del>-    inline Heap* MarkedBlock::heap() const
-    {
-        return m_weakSet.heap();
-    }
</del><ins>+    bool m_needsDestruction;
+    Lock m_lock;
+    
+    // The actual mark count can be computed by doing: m_biasedMarkCount - m_markCountBias. Note
+    // that this count is racy. It will accurately detect whether or not exactly zero things were
+    // marked, but if N things got marked, then this may report anything in the range [1, N] (or
+    // before unbiased, it would be [1 + m_markCountBias, N + m_markCountBias].)
+    int16_t m_biasedMarkCount;
+    
+    // We bias the mark count so that if m_biasedMarkCount &gt;= 0 then the block should be retired.
+    // We go to all this trouble to make marking a bit faster: this way, marking knows when to
+    // retire a block using a js/jns on m_biasedMarkCount.
+    //
+    // For example, if a block has room for 100 objects and retirement happens whenever 90% are
+    // live, then m_markCountBias will be -90. This way, when marking begins, this will cause us to
+    // set m_biasedMarkCount to -90 as well, since:
+    //
+    //     m_biasedMarkCount = actualMarkCount + m_markCountBias.
+    //
+    // Marking an object will increment m_biasedMarkCount. Once 90 objects get marked, we will have
+    // m_biasedMarkCount = 0, which will trigger retirement. In other words, we want to set
+    // m_markCountBias like so:
+    //
+    //     m_markCountBias = -(minMarkedBlockUtilization * cellsPerBlock)
+    //
+    // All of this also means that you can detect if any objects are marked by doing:
+    //
+    //     m_biasedMarkCount != m_markCountBias
+    int16_t m_markCountBias;
+    
+    Handle&amp; m_handle;
+    VM* m_vm;
+        
+    uint64_t m_version;
+};
</ins><span class="cx"> 
</span><del>-    inline VM* MarkedBlock::vm() const
-    {
-        return m_weakSet.vm();
-    }
</del><ins>+inline MarkedBlock::Handle&amp; MarkedBlock::handle()
+{
+    return m_handle;
+}
</ins><span class="cx"> 
</span><del>-    inline WeakSet&amp; MarkedBlock::weakSet()
-    {
-        return m_weakSet;
-    }
</del><ins>+inline MarkedBlock&amp; MarkedBlock::Handle::block()
+{
+    return *m_block;
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::shrink()
-    {
-        m_weakSet.shrink();
-    }
</del><ins>+inline size_t MarkedBlock::firstAtom()
+{
+    return WTF::roundUpToMultipleOf&lt;atomSize&gt;(sizeof(MarkedBlock)) / atomSize;
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::visitWeakSet(HeapRootVisitor&amp; heapRootVisitor)
-    {
-        m_weakSet.visit(heapRootVisitor);
-    }
</del><ins>+inline MarkedBlock::Atom* MarkedBlock::atoms()
+{
+    return reinterpret_cast&lt;Atom*&gt;(this);
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::reapWeakSet()
-    {
-        m_weakSet.reap();
-    }
</del><ins>+inline bool MarkedBlock::isAtomAligned(const void* p)
+{
+    return !(reinterpret_cast&lt;Bits&gt;(p) &amp; atomAlignmentMask);
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::willRemoveBlock()
-    {
-        ASSERT(m_state != Retired);
-    }
</del><ins>+inline void* MarkedBlock::Handle::cellAlign(void* p)
+{
+    Bits base = reinterpret_cast&lt;Bits&gt;(block().atoms() + firstAtom());
+    Bits bits = reinterpret_cast&lt;Bits&gt;(p);
+    bits -= base;
+    bits -= bits % cellSize();
+    bits += base;
+    return reinterpret_cast&lt;void*&gt;(bits);
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::didConsumeFreeList()
-    {
-        HEAP_LOG_BLOCK_STATE_TRANSITION(this);
</del><ins>+inline MarkedBlock* MarkedBlock::blockFor(const void* p)
+{
+    return reinterpret_cast&lt;MarkedBlock*&gt;(reinterpret_cast&lt;Bits&gt;(p) &amp; blockMask);
+}
</ins><span class="cx"> 
</span><del>-        ASSERT(m_state == FreeListed);
-        m_state = Allocated;
-    }
</del><ins>+inline MarkedAllocator* MarkedBlock::Handle::allocator() const
+{
+    return m_allocator;
+}
</ins><span class="cx"> 
</span><del>-    inline size_t MarkedBlock::markCount()
-    {
-        return m_marks.count();
-    }
</del><ins>+inline Heap* MarkedBlock::Handle::heap() const
+{
+    return m_weakSet.heap();
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isEmpty()
-    {
-        return m_marks.isEmpty() &amp;&amp; m_weakSet.isEmpty() &amp;&amp; (!m_newlyAllocated || m_newlyAllocated-&gt;isEmpty());
-    }
</del><ins>+inline VM* MarkedBlock::Handle::vm() const
+{
+    return m_weakSet.vm();
+}
</ins><span class="cx"> 
</span><del>-    inline size_t MarkedBlock::cellSize()
-    {
-        return m_atomsPerCell * atomSize;
-    }
</del><ins>+inline VM* MarkedBlock::vm() const
+{
+    return m_vm;
+}
</ins><span class="cx"> 
</span><del>-    inline const AllocatorAttributes&amp; MarkedBlock::attributes() const
-    {
-        return m_attributes;
-    }
</del><ins>+inline WeakSet&amp; MarkedBlock::Handle::weakSet()
+{
+    return m_weakSet;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::needsDestruction() const
-    {
-        return m_attributes.destruction == NeedsDestruction;
-    }
</del><ins>+inline WeakSet&amp; MarkedBlock::weakSet()
+{
+    return m_handle.weakSet();
+}
</ins><span class="cx"> 
</span><del>-    inline DestructionMode MarkedBlock::destruction() const
-    {
-        return m_attributes.destruction;
-    }
</del><ins>+inline void MarkedBlock::Handle::shrink()
+{
+    m_weakSet.shrink();
+}
</ins><span class="cx"> 
</span><del>-    inline HeapCell::Kind MarkedBlock::cellKind() const
-    {
-        return m_attributes.cellKind;
-    }
</del><ins>+inline unsigned MarkedBlock::Handle::visitWeakSet(HeapRootVisitor&amp; heapRootVisitor)
+{
+    return m_weakSet.visit(heapRootVisitor);
+}
</ins><span class="cx"> 
</span><del>-    inline size_t MarkedBlock::size()
-    {
-        return markCount() * cellSize();
-    }
</del><ins>+inline void MarkedBlock::Handle::reapWeakSet()
+{
+    m_weakSet.reap();
+}
</ins><span class="cx"> 
</span><del>-    inline size_t MarkedBlock::capacity()
-    {
-        return m_capacity;
-    }
</del><ins>+inline size_t MarkedBlock::Handle::cellSize()
+{
+    return m_atomsPerCell * atomSize;
+}
</ins><span class="cx"> 
</span><del>-    inline size_t MarkedBlock::atomNumber(const void* p)
-    {
-        return (reinterpret_cast&lt;Bits&gt;(p) - reinterpret_cast&lt;Bits&gt;(this)) / atomSize;
-    }
</del><ins>+inline size_t MarkedBlock::cellSize()
+{
+    return m_handle.cellSize();
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isMarked(const void* p)
-    {
-        return m_marks.get(atomNumber(p));
-    }
</del><ins>+inline const AllocatorAttributes&amp; MarkedBlock::Handle::attributes() const
+{
+    return m_attributes;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::testAndSetMarked(const void* p)
-    {
-        return m_marks.concurrentTestAndSet(atomNumber(p));
-    }
</del><ins>+inline const AllocatorAttributes&amp; MarkedBlock::attributes() const
+{
+    return m_handle.attributes();
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::setMarked(const void* p)
-    {
-        m_marks.set(atomNumber(p));
-    }
</del><ins>+inline bool MarkedBlock::Handle::needsDestruction() const
+{
+    return m_attributes.destruction == NeedsDestruction;
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::clearMarked(const void* p)
-    {
-        ASSERT(m_marks.get(atomNumber(p)));
-        m_marks.clear(atomNumber(p));
-    }
</del><ins>+inline DestructionMode MarkedBlock::Handle::destruction() const
+{
+    return m_attributes.destruction;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isNewlyAllocated(const void* p)
-    {
-        return m_newlyAllocated-&gt;get(atomNumber(p));
-    }
</del><ins>+inline HeapCell::Kind MarkedBlock::Handle::cellKind() const
+{
+    return m_attributes.cellKind;
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::setNewlyAllocated(const void* p)
-    {
-        m_newlyAllocated-&gt;set(atomNumber(p));
-    }
</del><ins>+inline size_t MarkedBlock::Handle::markCount()
+{
+    return m_block-&gt;markCount();
+}
</ins><span class="cx"> 
</span><del>-    inline void MarkedBlock::clearNewlyAllocated(const void* p)
-    {
-        m_newlyAllocated-&gt;clear(atomNumber(p));
-    }
</del><ins>+inline size_t MarkedBlock::Handle::size()
+{
+    return markCount() * cellSize();
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::clearNewlyAllocated()
-    {
-        if (m_newlyAllocated) {
-            m_newlyAllocated = nullptr;
-            return true;
-        }
-        return false;
-    }
</del><ins>+inline size_t MarkedBlock::atomNumber(const void* p)
+{
+    return (reinterpret_cast&lt;Bits&gt;(p) - reinterpret_cast&lt;Bits&gt;(this)) / atomSize;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isMarkedOrNewlyAllocated(const HeapCell* cell)
-    {
-        ASSERT(m_state == Retired || m_state == Marked);
-        return m_marks.get(atomNumber(cell)) || (m_newlyAllocated &amp;&amp; isNewlyAllocated(cell));
</del><ins>+inline void MarkedBlock::flipIfNecessary(uint64_t heapVersion)
+{
+    if (UNLIKELY(heapVersion != m_version))
+        flipIfNecessarySlow();
+}
+
+inline void MarkedBlock::flipIfNecessaryConcurrently(uint64_t heapVersion)
+{
+    if (UNLIKELY(heapVersion != m_version))
+        flipIfNecessaryConcurrentlySlow();
+    WTF::loadLoadFence();
+}
+
+inline void MarkedBlock::Handle::flipIfNecessary(uint64_t heapVersion)
+{
+    block().flipIfNecessary(heapVersion);
+}
+
+inline void MarkedBlock::Handle::flipIfNecessaryConcurrently(uint64_t heapVersion)
+{
+    block().flipIfNecessaryConcurrently(heapVersion);
+}
+
+inline void MarkedBlock::Handle::flipForEdenCollection()
+{
+    assertFlipped();
+        
+    HEAP_LOG_BLOCK_STATE_TRANSITION(this);
+    
+    ASSERT(m_state != New &amp;&amp; m_state != FreeListed);
+    
+    m_state = Marked;
+}
+
+#if ASSERT_DISABLED
+inline void MarkedBlock::assertFlipped()
+{
+}
+#endif // ASSERT_DISABLED
+
+inline void MarkedBlock::Handle::assertFlipped()
+{
+    block().assertFlipped();
+}
+
+inline bool MarkedBlock::isMarked(const void* p)
+{
+    assertFlipped();
+    return m_marks.get(atomNumber(p));
+}
+
+inline bool MarkedBlock::testAndSetMarked(const void* p)
+{
+    assertFlipped();
+    return m_marks.concurrentTestAndSet(atomNumber(p));
+}
+
+inline bool MarkedBlock::Handle::isNewlyAllocated(const void* p)
+{
+    return m_newlyAllocated-&gt;get(m_block-&gt;atomNumber(p));
+}
+
+inline void MarkedBlock::Handle::setNewlyAllocated(const void* p)
+{
+    m_newlyAllocated-&gt;set(m_block-&gt;atomNumber(p));
+}
+
+inline void MarkedBlock::Handle::clearNewlyAllocated(const void* p)
+{
+    m_newlyAllocated-&gt;clear(m_block-&gt;atomNumber(p));
+}
+
+inline bool MarkedBlock::Handle::clearNewlyAllocated()
+{
+    if (m_newlyAllocated) {
+        m_newlyAllocated = nullptr;
+        return true;
</ins><span class="cx">     }
</span><ins>+    return false;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isLive(const HeapCell* cell)
-    {
-        switch (m_state) {
-        case Allocated:
-            return true;
</del><ins>+inline bool MarkedBlock::Handle::isMarkedOrNewlyAllocated(const HeapCell* cell)
+{
+    ASSERT(m_state == Marked);
+    return m_block-&gt;isMarked(cell) || (m_newlyAllocated &amp;&amp; isNewlyAllocated(cell));
+}
</ins><span class="cx"> 
</span><del>-        case Retired:
-        case Marked:
-            return isMarkedOrNewlyAllocated(cell);
</del><ins>+inline bool MarkedBlock::isMarkedOrNewlyAllocated(const HeapCell* cell)
+{
+    ASSERT(m_handle.m_state == Marked);
+    return isMarked(cell) || (m_handle.m_newlyAllocated &amp;&amp; m_handle.isNewlyAllocated(cell));
+}
</ins><span class="cx"> 
</span><del>-        case New:
-        case FreeListed:
-            RELEASE_ASSERT_NOT_REACHED();
-            return false;
-        }
</del><ins>+inline bool MarkedBlock::Handle::isLive(const HeapCell* cell)
+{
+    assertFlipped();
+    switch (m_state) {
+    case Allocated:
+        return true;
</ins><span class="cx"> 
</span><ins>+    case Marked:
+        return isMarkedOrNewlyAllocated(cell);
+
+    case New:
+    case FreeListed:
</ins><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isAtom(const void* p)
-    {
-        ASSERT(MarkedBlock::isAtomAligned(p));
-        size_t atomNumber = this-&gt;atomNumber(p);
-        size_t firstAtom = this-&gt;firstAtom();
-        if (atomNumber &lt; firstAtom) // Filters pointers into MarkedBlock metadata.
-            return false;
-        if ((atomNumber - firstAtom) % m_atomsPerCell) // Filters pointers into cell middles.
-            return false;
-        if (atomNumber &gt;= m_endAtom) // Filters pointers into invalid cells out of the range.
-            return false;
-        return true;
-    }
</del><ins>+    RELEASE_ASSERT_NOT_REACHED();
+    return false;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isLiveCell(const void* p)
-    {
-        if (!isAtom(p))
-            return false;
-        return isLive(static_cast&lt;const HeapCell*&gt;(p));
-    }
</del><ins>+inline bool MarkedBlock::isAtom(const void* p)
+{
+    ASSERT(MarkedBlock::isAtomAligned(p));
+    size_t atomNumber = this-&gt;atomNumber(p);
+    size_t firstAtom = MarkedBlock::firstAtom();
+    if (atomNumber &lt; firstAtom) // Filters pointers into MarkedBlock metadata.
+        return false;
+    if ((atomNumber - firstAtom) % m_handle.m_atomsPerCell) // Filters pointers into cell middles.
+        return false;
+    if (atomNumber &gt;= m_handle.m_endAtom) // Filters pointers into invalid cells out of the range.
+        return false;
+    return true;
+}
</ins><span class="cx"> 
</span><del>-    template &lt;typename Functor&gt; inline IterationStatus MarkedBlock::forEachCell(const Functor&amp; functor)
-    {
-        HeapCell::Kind kind = m_attributes.cellKind;
-        for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
-            HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;atoms()[i]);
-            if (functor(cell, kind) == IterationStatus::Done)
-                return IterationStatus::Done;
-        }
-        return IterationStatus::Continue;
</del><ins>+inline bool MarkedBlock::Handle::isLiveCell(const void* p)
+{
+    if (!m_block-&gt;isAtom(p))
+        return false;
+    return isLive(static_cast&lt;const HeapCell*&gt;(p));
+}
+
+template &lt;typename Functor&gt;
+inline IterationStatus MarkedBlock::Handle::forEachCell(const Functor&amp; functor)
+{
+    HeapCell::Kind kind = m_attributes.cellKind;
+    for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
+        HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;m_block-&gt;atoms()[i]);
+        if (functor(cell, kind) == IterationStatus::Done)
+            return IterationStatus::Done;
</ins><span class="cx">     }
</span><ins>+    return IterationStatus::Continue;
+}
</ins><span class="cx"> 
</span><del>-    template &lt;typename Functor&gt; inline IterationStatus MarkedBlock::forEachLiveCell(const Functor&amp; functor)
-    {
-        HeapCell::Kind kind = m_attributes.cellKind;
-        for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
-            HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;atoms()[i]);
-            if (!isLive(cell))
-                continue;
</del><ins>+template &lt;typename Functor&gt;
+inline IterationStatus MarkedBlock::Handle::forEachLiveCell(const Functor&amp; functor)
+{
+    flipIfNecessary();
+    HeapCell::Kind kind = m_attributes.cellKind;
+    for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
+        HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;m_block-&gt;atoms()[i]);
+        if (!isLive(cell))
+            continue;
</ins><span class="cx"> 
</span><del>-            if (functor(cell, kind) == IterationStatus::Done)
-                return IterationStatus::Done;
-        }
-        return IterationStatus::Continue;
</del><ins>+        if (functor(cell, kind) == IterationStatus::Done)
+            return IterationStatus::Done;
</ins><span class="cx">     }
</span><ins>+    return IterationStatus::Continue;
+}
</ins><span class="cx"> 
</span><del>-    template &lt;typename Functor&gt; inline IterationStatus MarkedBlock::forEachDeadCell(const Functor&amp; functor)
-    {
-        HeapCell::Kind kind = m_attributes.cellKind;
-        for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
-            HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;atoms()[i]);
-            if (isLive(cell))
-                continue;
</del><ins>+template &lt;typename Functor&gt;
+inline IterationStatus MarkedBlock::Handle::forEachDeadCell(const Functor&amp; functor)
+{
+    flipIfNecessary();
+    HeapCell::Kind kind = m_attributes.cellKind;
+    for (size_t i = firstAtom(); i &lt; m_endAtom; i += m_atomsPerCell) {
+        HeapCell* cell = reinterpret_cast_ptr&lt;HeapCell*&gt;(&amp;m_block-&gt;atoms()[i]);
+        if (isLive(cell))
+            continue;
</ins><span class="cx"> 
</span><del>-            if (functor(cell, kind) == IterationStatus::Done)
-                return IterationStatus::Done;
-        }
-        return IterationStatus::Continue;
</del><ins>+        if (functor(cell, kind) == IterationStatus::Done)
+            return IterationStatus::Done;
</ins><span class="cx">     }
</span><ins>+    return IterationStatus::Continue;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::needsSweeping() const
-    {
-        return m_state == Marked;
-    }
</del><ins>+inline bool MarkedBlock::Handle::needsSweeping() const
+{
+    const_cast&lt;MarkedBlock::Handle*&gt;(this)-&gt;flipIfNecessary();
+    return m_state == Marked;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isAllocated() const
-    {
-        return m_state == Allocated;
-    }
</del><ins>+inline bool MarkedBlock::Handle::isAllocated() const
+{
+    const_cast&lt;MarkedBlock::Handle*&gt;(this)-&gt;flipIfNecessary();
+    return m_state == Allocated;
+}
</ins><span class="cx"> 
</span><del>-    inline bool MarkedBlock::isMarkedOrRetired() const
-    {
-        return m_state == Marked || m_state == Retired;
-    }
</del><ins>+inline bool MarkedBlock::Handle::isMarked() const
+{
+    const_cast&lt;MarkedBlock::Handle*&gt;(this)-&gt;flipIfNecessary();
+    return m_state == Marked;
+}
</ins><span class="cx"> 
</span><ins>+inline bool MarkedBlock::Handle::isFreeListed() const
+{
+    const_cast&lt;MarkedBlock::Handle*&gt;(this)-&gt;flipIfNecessary();
+    return m_state == FreeListed;
+}
+
+inline bool MarkedBlock::hasAnyMarked() const
+{
+    return m_biasedMarkCount != m_markCountBias;
+}
+
+inline void MarkedBlock::noteMarked()
+{
+    // This is racy by design. We don't want to pay the price of an atomic increment!
+    int16_t biasedMarkCount = m_biasedMarkCount;
+    ++biasedMarkCount;
+    m_biasedMarkCount = biasedMarkCount;
+    if (UNLIKELY(!biasedMarkCount))
+        noteMarkedSlow();
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> namespace WTF {
</span><span class="cx"> 
</span><del>-    struct MarkedBlockHash : PtrHash&lt;JSC::MarkedBlock*&gt; {
-        static unsigned hash(JSC::MarkedBlock* const&amp; key)
-        {
-            // Aligned VM regions tend to be monotonically increasing integers,
-            // which is a great hash function, but we have to remove the low bits,
-            // since they're always zero, which is a terrible hash function!
-            return reinterpret_cast&lt;JSC::Bits&gt;(key) / JSC::MarkedBlock::blockSize;
-        }
-    };
</del><ins>+struct MarkedBlockHash : PtrHash&lt;JSC::MarkedBlock*&gt; {
+    static unsigned hash(JSC::MarkedBlock* const&amp; key)
+    {
+        // Aligned VM regions tend to be monotonically increasing integers,
+        // which is a great hash function, but we have to remove the low bits,
+        // since they're always zero, which is a terrible hash function!
+        return reinterpret_cast&lt;JSC::Bits&gt;(key) / JSC::MarkedBlock::blockSize;
+    }
+};
</ins><span class="cx"> 
</span><del>-    template&lt;&gt; struct DefaultHash&lt;JSC::MarkedBlock*&gt; {
-        typedef MarkedBlockHash Hash;
-    };
</del><ins>+template&lt;&gt; struct DefaultHash&lt;JSC::MarkedBlock*&gt; {
+    typedef MarkedBlockHash Hash;
+};
</ins><span class="cx"> 
</span><ins>+void printInternal(PrintStream&amp; out, JSC::MarkedBlock::BlockState);
+
</ins><span class="cx"> } // namespace WTF
</span><span class="cx"> 
</span><span class="cx"> #endif // MarkedBlock_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedSpacecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -24,17 +24,175 @@
</span><span class="cx"> #include &quot;IncrementalSweeper.h&quot;
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#include &quot;SuperSampler.h&quot;
+#include &lt;wtf/ListDump.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+std::array&lt;size_t, MarkedSpace::numSizeClasses&gt; MarkedSpace::s_sizeClassForSizeStep;
+
+namespace {
+
+const Vector&lt;size_t&gt;&amp; sizeClasses()
+{
+    static Vector&lt;size_t&gt;* result;
+    static std::once_flag once;
+    std::call_once(
+        once,
+        [] {
+            result = new Vector&lt;size_t&gt;();
+            
+            auto add = [&amp;] (size_t sizeClass) {
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;Adding JSC MarkedSpace size class: &quot;, sizeClass, &quot;\n&quot;);
+                // Perform some validation as we go.
+                RELEASE_ASSERT(!(sizeClass % MarkedSpace::sizeStep));
+                if (result-&gt;isEmpty())
+                    RELEASE_ASSERT(sizeClass == MarkedSpace::sizeStep);
+                else
+                    RELEASE_ASSERT(sizeClass &gt; result-&gt;last());
+                result-&gt;append(sizeClass);
+            };
+            
+            // This is a definition of the size classes in our GC. It must define all of the
+            // size classes from sizeStep up to largeCutoff.
+    
+            // Have very precise size classes for the small stuff. This is a loop to make it easy to reduce
+            // atomSize.
+            for (size_t size = MarkedSpace::sizeStep; size &lt; MarkedSpace::preciseCutoff; size += MarkedSpace::sizeStep)
+                add(size);
+            
+            // We want to make sure that the remaining size classes minimize internal fragmentation (i.e.
+            // the wasted space at the tail end of a MarkedBlock) while proceeding roughly in an exponential
+            // way starting at just above the precise size classes to four cells per block.
+            
+            if (Options::dumpSizeClasses())
+                dataLog(&quot;    Marked block payload size: &quot;, static_cast&lt;size_t&gt;(MarkedSpace::blockPayload), &quot;\n&quot;);
+            
+            for (unsigned i = 0; ; ++i) {
+                double approximateSize = MarkedSpace::preciseCutoff * pow(Options::sizeClassProgression(), i);
+                
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;    Next size class as a double: &quot;, approximateSize, &quot;\n&quot;);
+        
+                size_t approximateSizeInBytes = static_cast&lt;size_t&gt;(approximateSize);
+        
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;    Next size class as bytes: &quot;, approximateSizeInBytes, &quot;\n&quot;);
+        
+                // Make sure that the computer did the math correctly.
+                RELEASE_ASSERT(approximateSizeInBytes &gt;= MarkedSpace::preciseCutoff);
+                
+                if (approximateSizeInBytes &gt; MarkedSpace::largeCutoff)
+                    break;
+                
+                size_t sizeClass =
+                    WTF::roundUpToMultipleOf&lt;MarkedSpace::sizeStep&gt;(approximateSizeInBytes);
+                
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;    Size class: &quot;, sizeClass, &quot;\n&quot;);
+                
+                // Optimize the size class so that there isn't any slop at the end of the block's
+                // payload.
+                unsigned cellsPerBlock = MarkedSpace::blockPayload / sizeClass;
+                size_t possiblyBetterSizeClass = (MarkedSpace::blockPayload / cellsPerBlock) &amp; ~(MarkedSpace::sizeStep - 1);
+                
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;    Possibly better size class: &quot;, possiblyBetterSizeClass, &quot;\n&quot;);
+
+                // The size class we just came up with is better than the other one if it reduces
+                // total wastage assuming we only allocate cells of that size.
+                size_t originalWastage = MarkedSpace::blockPayload - cellsPerBlock * sizeClass;
+                size_t newWastage = (possiblyBetterSizeClass - sizeClass) * cellsPerBlock;
+                
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;    Original wastage: &quot;, originalWastage, &quot;, new wastage: &quot;, newWastage, &quot;\n&quot;);
+                
+                size_t betterSizeClass;
+                if (newWastage &gt; originalWastage)
+                    betterSizeClass = sizeClass;
+                else
+                    betterSizeClass = possiblyBetterSizeClass;
+                
+                if (Options::dumpSizeClasses())
+                    dataLog(&quot;    Choosing size class: &quot;, betterSizeClass, &quot;\n&quot;);
+                
+                if (betterSizeClass == result-&gt;last()) {
+                    // Defense for when expStep is small.
+                    continue;
+                }
+                
+                // This is usually how we get out of the loop.
+                if (betterSizeClass &gt; MarkedSpace::largeCutoff
+                    || betterSizeClass &gt; Options::largeAllocationCutoff())
+                    break;
+                
+                add(betterSizeClass);
+            }
+            
+            if (Options::dumpSizeClasses())
+                dataLog(&quot;JSC Heap MarkedSpace size class dump: &quot;, listDump(*result), &quot;\n&quot;);
+
+            // We have an optimiation in MarkedSpace::optimalSizeFor() that assumes things about
+            // the size class table. This checks our results against that function's assumptions.
+            for (size_t size = MarkedSpace::sizeStep, i = 0; size &lt;= MarkedSpace::preciseCutoff; size += MarkedSpace::sizeStep, i++)
+                RELEASE_ASSERT(result-&gt;at(i) == size);
+        });
+    return *result;
+}
+
+template&lt;typename TableType, typename SizeClassCons, typename DefaultCons&gt;
+void buildSizeClassTable(TableType&amp; table, const SizeClassCons&amp; cons, const DefaultCons&amp; defaultCons)
+{
+    size_t nextIndex = 0;
+    for (size_t sizeClass : sizeClasses()) {
+        auto entry = cons(sizeClass);
+        size_t index = MarkedSpace::sizeClassToIndex(sizeClass);
+        for (size_t i = nextIndex; i &lt;= index; ++i)
+            table[i] = entry;
+        nextIndex = index + 1;
+    }
+    for (size_t i = nextIndex; i &lt; MarkedSpace::numSizeClasses; ++i)
+        table[i] = defaultCons(MarkedSpace::indexToSizeClass(i));
+}
+
+} // anonymous namespace
+
+void MarkedSpace::initializeSizeClassForStepSize()
+{
+    // We call this multiple times and we may call it simultaneously from multiple threads. That's
+    // OK, since it always stores the same values into the table.
+    
+    buildSizeClassTable(
+        s_sizeClassForSizeStep,
+        [&amp;] (size_t sizeClass) -&gt; size_t {
+            return sizeClass;
+        },
+        [&amp;] (size_t sizeClass) -&gt; size_t {
+            return sizeClass;
+        });
+}
+
</ins><span class="cx"> MarkedSpace::MarkedSpace(Heap* heap)
</span><span class="cx">     : m_heap(heap)
</span><span class="cx">     , m_capacity(0)
</span><span class="cx">     , m_isIterating(false)
</span><span class="cx"> {
</span><del>-    forEachAllocator(
-        [&amp;] (MarkedAllocator&amp; allocator, size_t cellSize, AllocatorAttributes attributes) -&gt; IterationStatus {
-            allocator.init(heap, this, cellSize, attributes);
</del><ins>+    initializeSizeClassForStepSize();
+    
+    forEachSubspace(
+        [&amp;] (Subspace&amp; subspace, AllocatorAttributes attributes) -&gt; IterationStatus {
+            subspace.attributes = attributes;
+            
+            buildSizeClassTable(
+                subspace.allocatorForSizeStep,
+                [&amp;] (size_t sizeClass) -&gt; MarkedAllocator* {
+                    return subspace.bagOfAllocators.add(heap, this, sizeClass, attributes);
+                },
+                [&amp;] (size_t) -&gt; MarkedAllocator* {
+                    return nullptr;
+                });
+            
</ins><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><span class="cx"> }
</span><span class="lines">@@ -42,7 +200,7 @@
</span><span class="cx"> MarkedSpace::~MarkedSpace()
</span><span class="cx"> {
</span><span class="cx">     forEachBlock(
</span><del>-        [&amp;] (MarkedBlock* block) {
</del><ins>+        [&amp;] (MarkedBlock::Handle* block) {
</ins><span class="cx">             freeBlock(block);
</span><span class="cx">         });
</span><span class="cx">     ASSERT(!m_blocks.set().size());
</span><span class="lines">@@ -52,21 +210,78 @@
</span><span class="cx"> {
</span><span class="cx">     stopAllocating();
</span><span class="cx">     forEachAllocator(
</span><del>-        [&amp;] (MarkedAllocator&amp; allocator, size_t, AllocatorAttributes) -&gt; IterationStatus {
</del><ins>+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
</ins><span class="cx">             allocator.lastChanceToFinalize();
</span><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><ins>+    for (LargeAllocation* allocation : m_largeAllocations)
+        allocation-&gt;lastChanceToFinalize();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void* MarkedSpace::allocate(Subspace&amp; subspace, size_t bytes)
+{
+    if (MarkedAllocator* allocator = allocatorFor(subspace, bytes))
+        return allocator-&gt;allocate();
+    return allocateLarge(subspace, bytes);
+}
+
+void* MarkedSpace::tryAllocate(Subspace&amp; subspace, size_t bytes)
+{
+    if (MarkedAllocator* allocator = allocatorFor(subspace, bytes))
+        return allocator-&gt;tryAllocate();
+    return tryAllocateLarge(subspace, bytes);
+}
+
+void* MarkedSpace::allocateLarge(Subspace&amp; subspace, size_t size)
+{
+    void* result = tryAllocateLarge(subspace, size);
+    RELEASE_ASSERT(result);
+    return result;
+}
+
+void* MarkedSpace::tryAllocateLarge(Subspace&amp; subspace, size_t size)
+{
+    m_heap-&gt;collectIfNecessaryOrDefer();
+    
+    size = WTF::roundUpToMultipleOf&lt;sizeStep&gt;(size);
+    LargeAllocation* allocation = LargeAllocation::tryCreate(*m_heap, size, subspace.attributes);
+    if (!allocation)
+        return nullptr;
+    
+    m_largeAllocations.append(allocation);
+    m_heap-&gt;didAllocate(size);
+    m_capacity += size;
+    return allocation-&gt;cell();
+}
+
</ins><span class="cx"> void MarkedSpace::sweep()
</span><span class="cx"> {
</span><span class="cx">     m_heap-&gt;sweeper()-&gt;willFinishSweeping();
</span><span class="cx">     forEachBlock(
</span><del>-        [&amp;] (MarkedBlock* block) {
</del><ins>+        [&amp;] (MarkedBlock::Handle* block) {
</ins><span class="cx">             block-&gt;sweep();
</span><span class="cx">         });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MarkedSpace::sweepLargeAllocations()
+{
+    RELEASE_ASSERT(m_largeAllocationsNurseryOffset == m_largeAllocations.size());
+    unsigned srcIndex = m_largeAllocationsNurseryOffsetForSweep;
+    unsigned dstIndex = srcIndex;
+    while (srcIndex &lt; m_largeAllocations.size()) {
+        LargeAllocation* allocation = m_largeAllocations[srcIndex++];
+        allocation-&gt;sweep();
+        if (allocation-&gt;isEmpty()) {
+            m_capacity -= allocation-&gt;cellSize();
+            allocation-&gt;destroy();
+            continue;
+        }
+        m_largeAllocations[dstIndex++] = allocation;
+    }
+    m_largeAllocations.resize(dstIndex);
+    m_largeAllocationsNurseryOffset = m_largeAllocations.size();
+}
+
</ins><span class="cx"> void MarkedSpace::zombifySweep()
</span><span class="cx"> {
</span><span class="cx">     if (Options::logGC())
</span><span class="lines">@@ -73,7 +288,7 @@
</span><span class="cx">         dataLog(&quot;Zombifying sweep...&quot;);
</span><span class="cx">     m_heap-&gt;sweeper()-&gt;willFinishSweeping();
</span><span class="cx">     forEachBlock(
</span><del>-        [&amp;] (MarkedBlock* block) {
</del><ins>+        [&amp;] (MarkedBlock::Handle* block) {
</ins><span class="cx">             if (block-&gt;needsSweeping())
</span><span class="cx">                 block-&gt;sweep();
</span><span class="cx">         });
</span><span class="lines">@@ -82,78 +297,80 @@
</span><span class="cx"> void MarkedSpace::resetAllocators()
</span><span class="cx"> {
</span><span class="cx">     forEachAllocator(
</span><del>-        [&amp;] (MarkedAllocator&amp; allocator, size_t, AllocatorAttributes) -&gt; IterationStatus {
</del><ins>+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
</ins><span class="cx">             allocator.reset();
</span><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><span class="cx"> 
</span><span class="cx">     m_blocksWithNewObjects.clear();
</span><ins>+    m_activeWeakSets.takeFrom(m_newActiveWeakSets);
+    if (m_heap-&gt;operationInProgress() == EdenCollection)
+        m_largeAllocationsNurseryOffsetForSweep = m_largeAllocationsNurseryOffset;
+    else
+        m_largeAllocationsNurseryOffsetForSweep = 0;
+    m_largeAllocationsNurseryOffset = m_largeAllocations.size();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MarkedSpace::visitWeakSets(HeapRootVisitor&amp; heapRootVisitor)
</span><span class="cx"> {
</span><del>-    if (m_heap-&gt;operationInProgress() == EdenCollection) {
-        for (unsigned i = 0; i &lt; m_blocksWithNewObjects.size(); ++i)
-            m_blocksWithNewObjects[i]-&gt;visitWeakSet(heapRootVisitor);
-    } else {
-        forEachBlock(
-            [&amp;] (MarkedBlock* block) {
-                block-&gt;visitWeakSet(heapRootVisitor);
-            });
-    }
</del><ins>+    auto visit = [&amp;] (WeakSet* weakSet) {
+        weakSet-&gt;visit(heapRootVisitor);
+    };
+    
+    m_newActiveWeakSets.forEach(visit);
+    
+    if (m_heap-&gt;operationInProgress() == FullCollection)
+        m_activeWeakSets.forEach(visit);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MarkedSpace::reapWeakSets()
</span><span class="cx"> {
</span><del>-    if (m_heap-&gt;operationInProgress() == EdenCollection) {
-        for (unsigned i = 0; i &lt; m_blocksWithNewObjects.size(); ++i)
-            m_blocksWithNewObjects[i]-&gt;reapWeakSet();
-    } else {
-        forEachBlock(
-            [&amp;] (MarkedBlock* block) {
-                block-&gt;reapWeakSet();
-            });
-    }
</del><ins>+    auto visit = [&amp;] (WeakSet* weakSet) {
+        weakSet-&gt;reap();
+    };
+    
+    m_newActiveWeakSets.forEach(visit);
+    
+    if (m_heap-&gt;operationInProgress() == FullCollection)
+        m_activeWeakSets.forEach(visit);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename Functor&gt;
-void MarkedSpace::forEachAllocator(const Functor&amp; functor)
-{
-    forEachSubspace(
-        [&amp;] (Subspace&amp; subspace, AllocatorAttributes attributes) -&gt; IterationStatus {
-            for (size_t cellSize = preciseStep; cellSize &lt;= preciseCutoff; cellSize += preciseStep) {
-                if (functor(allocatorFor(subspace, cellSize), cellSize, attributes) == IterationStatus::Done)
-                    return IterationStatus::Done;
-            }
-            for (size_t cellSize = impreciseStart; cellSize &lt;= impreciseCutoff; cellSize += impreciseStep) {
-                if (functor(allocatorFor(subspace, cellSize), cellSize, attributes) == IterationStatus::Done)
-                    return IterationStatus::Done;
-            }
-            if (functor(subspace.largeAllocator, 0, attributes) == IterationStatus::Done)
-                return IterationStatus::Done;
-            
-            return IterationStatus::Continue;
-        });
-}
-
</del><span class="cx"> void MarkedSpace::stopAllocating()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!isIterating());
</span><span class="cx">     forEachAllocator(
</span><del>-        [&amp;] (MarkedAllocator&amp; allocator, size_t, AllocatorAttributes) -&gt; IterationStatus {
</del><ins>+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
</ins><span class="cx">             allocator.stopAllocating();
</span><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MarkedSpace::prepareForMarking()
+{
+    if (m_heap-&gt;operationInProgress() == EdenCollection)
+        m_largeAllocationsOffsetForThisCollection = m_largeAllocationsNurseryOffset;
+    else
+        m_largeAllocationsOffsetForThisCollection = 0;
+    m_largeAllocationsForThisCollectionBegin = m_largeAllocations.begin() + m_largeAllocationsOffsetForThisCollection;
+    m_largeAllocationsForThisCollectionSize = m_largeAllocations.size() - m_largeAllocationsOffsetForThisCollection;
+    m_largeAllocationsForThisCollectionEnd = m_largeAllocations.end();
+    RELEASE_ASSERT(m_largeAllocationsForThisCollectionEnd == m_largeAllocationsForThisCollectionBegin + m_largeAllocationsForThisCollectionSize);
+    std::sort(
+        m_largeAllocationsForThisCollectionBegin, m_largeAllocationsForThisCollectionEnd,
+        [&amp;] (LargeAllocation* a, LargeAllocation* b) {
+            return a &lt; b;
+        });
+}
+
</ins><span class="cx"> void MarkedSpace::resumeAllocating()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isIterating());
</span><span class="cx">     forEachAllocator(
</span><del>-        [&amp;] (MarkedAllocator&amp; allocator, size_t, AllocatorAttributes) -&gt; IterationStatus {
</del><ins>+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
</ins><span class="cx">             allocator.resumeAllocating();
</span><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><ins>+    // Nothing to do for LargeAllocations.
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool MarkedSpace::isPagedOut(double deadline)
</span><span class="lines">@@ -160,7 +377,7 @@
</span><span class="cx"> {
</span><span class="cx">     bool result = false;
</span><span class="cx">     forEachAllocator(
</span><del>-        [&amp;] (MarkedAllocator&amp; allocator, size_t, AllocatorAttributes) -&gt; IterationStatus {
</del><ins>+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
</ins><span class="cx">             if (allocator.isPagedOut(deadline)) {
</span><span class="cx">                 result = true;
</span><span class="cx">                 return IterationStatus::Done;
</span><span class="lines">@@ -167,18 +384,19 @@
</span><span class="cx">             }
</span><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><ins>+    // FIXME: Consider taking LargeAllocations into account here.
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedSpace::freeBlock(MarkedBlock* block)
</del><ins>+void MarkedSpace::freeBlock(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><span class="cx">     block-&gt;allocator()-&gt;removeBlock(block);
</span><del>-    m_capacity -= block-&gt;capacity();
-    m_blocks.remove(block);
-    MarkedBlock::destroy(*m_heap, block);
</del><ins>+    m_capacity -= MarkedBlock::blockSize;
+    m_blocks.remove(&amp;block-&gt;block());
+    delete block;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MarkedSpace::freeOrShrinkBlock(MarkedBlock* block)
</del><ins>+void MarkedSpace::freeOrShrinkBlock(MarkedBlock::Handle* block)
</ins><span class="cx"> {
</span><span class="cx">     if (!block-&gt;isEmpty()) {
</span><span class="cx">         block-&gt;shrink();
</span><span class="lines">@@ -191,44 +409,43 @@
</span><span class="cx"> void MarkedSpace::shrink()
</span><span class="cx"> {
</span><span class="cx">     forEachBlock(
</span><del>-        [&amp;] (MarkedBlock* block) {
</del><ins>+        [&amp;] (MarkedBlock::Handle* block) {
</ins><span class="cx">             freeOrShrinkBlock(block);
</span><span class="cx">         });
</span><ins>+    // For LargeAllocations, we do the moral equivalent in sweepLargeAllocations().
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MarkedSpace::clearNewlyAllocated()
</span><span class="cx"> {
</span><span class="cx">     forEachAllocator(
</span><del>-        [&amp;] (MarkedAllocator&amp; allocator, size_t size, AllocatorAttributes) -&gt; IterationStatus {
-            if (!size) {
-                // This means it's a largeAllocator.
-                allocator.forEachBlock(
-                    [&amp;] (MarkedBlock* block) {
-                        block-&gt;clearNewlyAllocated();
-                    });
-                return IterationStatus::Continue;
-            }
-            
-            if (MarkedBlock* block = allocator.takeLastActiveBlock())
</del><ins>+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
+            if (MarkedBlock::Handle* block = allocator.takeLastActiveBlock())
</ins><span class="cx">                 block-&gt;clearNewlyAllocated();
</span><span class="cx">             return IterationStatus::Continue;
</span><span class="cx">         });
</span><ins>+    
+    for (unsigned i = m_largeAllocationsOffsetForThisCollection; i &lt; m_largeAllocations.size(); ++i)
+        m_largeAllocations[i]-&gt;clearNewlyAllocated();
</ins><span class="cx"> 
</span><span class="cx"> #if !ASSERT_DISABLED
</span><span class="cx">     forEachBlock(
</span><del>-        [&amp;] (MarkedBlock* block) {
</del><ins>+        [&amp;] (MarkedBlock::Handle* block) {
</ins><span class="cx">             ASSERT(!block-&gt;clearNewlyAllocated());
</span><span class="cx">         });
</span><ins>+
+    for (LargeAllocation* allocation : m_largeAllocations)
+        ASSERT(!allocation-&gt;isNewlyAllocated());
</ins><span class="cx"> #endif // !ASSERT_DISABLED
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG 
</span><del>-struct VerifyMarkedOrRetired : MarkedBlock::VoidFunctor { 
-    void operator()(MarkedBlock* block) const
</del><ins>+struct VerifyMarked : MarkedBlock::VoidFunctor { 
+    void operator()(MarkedBlock::Handle* block) const
</ins><span class="cx">     {
</span><ins>+        if (block-&gt;needsFlip())
+            return;
</ins><span class="cx">         switch (block-&gt;m_state) {
</span><span class="cx">         case MarkedBlock::Marked:
</span><del>-        case MarkedBlock::Retired:
</del><span class="cx">             return;
</span><span class="cx">         default:
</span><span class="cx">             RELEASE_ASSERT_NOT_REACHED();
</span><span class="lines">@@ -237,20 +454,19 @@
</span><span class="cx"> }; 
</span><span class="cx"> #endif 
</span><span class="cx"> 
</span><del>-void MarkedSpace::clearMarks()
</del><ins>+void MarkedSpace::flip()
</ins><span class="cx"> {
</span><span class="cx">     if (m_heap-&gt;operationInProgress() == EdenCollection) {
</span><span class="cx">         for (unsigned i = 0; i &lt; m_blocksWithNewObjects.size(); ++i)
</span><del>-            m_blocksWithNewObjects[i]-&gt;clearMarks();
</del><ins>+            m_blocksWithNewObjects[i]-&gt;flipForEdenCollection();
</ins><span class="cx">     } else {
</span><del>-        forEachBlock(
-            [&amp;] (MarkedBlock* block) {
-                block-&gt;clearMarks();
-            });
</del><ins>+        m_version++; // Henceforth, flipIfNecessary() will trigger on all blocks.
+        for (LargeAllocation* allocation : m_largeAllocations)
+            allocation-&gt;flip();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><del>-    VerifyMarkedOrRetired verifyFunctor;
</del><ins>+    VerifyMarked verifyFunctor;
</ins><span class="cx">     forEachBlock(verifyFunctor);
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="lines">@@ -269,4 +485,63 @@
</span><span class="cx">     m_isIterating = false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+size_t MarkedSpace::objectCount()
+{
+    size_t result = 0;
+    forEachBlock(
+        [&amp;] (MarkedBlock::Handle* block) {
+            result += block-&gt;markCount();
+        });
+    for (LargeAllocation* allocation : m_largeAllocations) {
+        if (allocation-&gt;isMarked())
+            result++;
+    }
+    return result;
+}
+
+size_t MarkedSpace::size()
+{
+    size_t result = 0;
+    forEachBlock(
+        [&amp;] (MarkedBlock::Handle* block) {
+            result += block-&gt;markCount() * block-&gt;cellSize();
+        });
+    for (LargeAllocation* allocation : m_largeAllocations) {
+        if (allocation-&gt;isMarked())
+            result += allocation-&gt;cellSize();
+    }
+    return result;
+}
+
+size_t MarkedSpace::capacity()
+{
+    return m_capacity;
+}
+
+void MarkedSpace::addActiveWeakSet(WeakSet* weakSet)
+{
+    // We conservatively assume that the WeakSet should belong in the new set. In fact, some weak
+    // sets might contain new weak handles even though they are tied to old objects. This slightly
+    // increases the amount of scanning that an eden collection would have to do, but the effect
+    // ought to be small.
+    m_newActiveWeakSets.append(weakSet);
+}
+
+void MarkedSpace::didAddBlock(MarkedBlock::Handle* block)
+{
+    m_capacity += MarkedBlock::blockSize;
+    m_blocks.add(&amp;block-&gt;block());
+}
+
+void MarkedSpace::didAllocateInBlock(MarkedBlock::Handle* block)
+{
+    block-&gt;assertFlipped();
+    m_blocksWithNewObjects.append(block);
+    
+    if (block-&gt;weakSet().isOnList()) {
+        block-&gt;weakSet().remove();
+        m_newActiveWeakSets.append(&amp;block-&gt;weakSet());
+    }
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapMarkedSpaceh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/MarkedSpace.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -23,13 +23,16 @@
</span><span class="cx"> #define MarkedSpace_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IterationStatus.h&quot;
</span><ins>+#include &quot;LargeAllocation.h&quot;
</ins><span class="cx"> #include &quot;MarkedAllocator.h&quot;
</span><span class="cx"> #include &quot;MarkedBlock.h&quot;
</span><span class="cx"> #include &quot;MarkedBlockSet.h&quot;
</span><span class="cx"> #include &lt;array&gt;
</span><ins>+#include &lt;wtf/Bag.h&gt;
</ins><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><ins>+#include &lt;wtf/SentinelLinkedList.h&gt;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -37,42 +40,76 @@
</span><span class="cx"> class Heap;
</span><span class="cx"> class HeapIterationScope;
</span><span class="cx"> class LLIntOffsetsExtractor;
</span><ins>+class WeakSet;
</ins><span class="cx"> 
</span><span class="cx"> class MarkedSpace {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(MarkedSpace);
</span><span class="cx"> public:
</span><del>-    // [ 16 ... 768 ]
-    static const size_t preciseStep = MarkedBlock::atomSize;
-    static const size_t preciseCutoff = 768;
-    static const size_t preciseCount = preciseCutoff / preciseStep;
</del><ins>+    // sizeStep is really a synonym for atomSize; it's no accident that they are the same.
+    static const size_t sizeStep = MarkedBlock::atomSize;
+    
+    // Sizes up to this amount get a size class for each size step.
+    static const size_t preciseCutoff = 80;
+    
+    // The amount of available payload in a block is the block's size minus the header. But the
+    // header size might not be atom size aligned, so we round down the result accordingly.
+    static const size_t blockPayload = (MarkedBlock::blockSize - sizeof(MarkedBlock)) &amp; ~(MarkedBlock::atomSize - 1);
+    
+    // The largest cell we're willing to allocate in a MarkedBlock the &quot;normal way&quot; (i.e. using size
+    // classes, rather than a large allocation) is half the size of the payload, rounded down. This
+    // ensures that we only use the size class approach if it means being able to pack two things
+    // into one block.
+    static const size_t largeCutoff = (blockPayload / 2) &amp; ~(sizeStep - 1);
</ins><span class="cx"> 
</span><del>-    // [ 1024 ... blockSize/2 ]
-    static const size_t impreciseStart = 1024;
-    static const size_t impreciseStep = 256;
-    static const size_t impreciseCutoff = MarkedBlock::blockSize / 2;
-    static const size_t impreciseCount = impreciseCutoff / impreciseStep;
-
</del><ins>+    static const size_t numSizeClasses = largeCutoff / sizeStep;
+    
+    static size_t sizeClassToIndex(size_t size)
+    {
+        ASSERT(size);
+        return (size + sizeStep - 1) / sizeStep - 1;
+    }
+    
+    static size_t indexToSizeClass(size_t index)
+    {
+        return (index + 1) * sizeStep;
+    }
+    
+    // Each Subspace corresponds to all of the blocks for all of the sizes for some &quot;class&quot; of
+    // objects. There are three classes: non-destructor JSCells, destructor JSCells, and auxiliary.
+    // MarkedSpace is set up to make it relatively easy to add new Subspaces.
</ins><span class="cx">     struct Subspace {
</span><del>-        std::array&lt;MarkedAllocator, preciseCount&gt; preciseAllocators;
-        std::array&lt;MarkedAllocator, impreciseCount&gt; impreciseAllocators;
-        MarkedAllocator largeAllocator;
</del><ins>+        std::array&lt;MarkedAllocator*, numSizeClasses&gt; allocatorForSizeStep;
+        
+        // Each MarkedAllocator is a size class.
+        Bag&lt;MarkedAllocator&gt; bagOfAllocators;
+        
+        AllocatorAttributes attributes;
</ins><span class="cx">     };
</span><del>-
</del><ins>+    
</ins><span class="cx">     MarkedSpace(Heap*);
</span><span class="cx">     ~MarkedSpace();
</span><span class="cx">     void lastChanceToFinalize();
</span><span class="cx"> 
</span><del>-    MarkedAllocator&amp; allocatorFor(size_t);
-    MarkedAllocator&amp; destructorAllocatorFor(size_t);
-    MarkedAllocator&amp; auxiliaryAllocatorFor(size_t);
</del><ins>+    static size_t optimalSizeFor(size_t);
+    
+    static MarkedAllocator* allocatorFor(Subspace&amp;, size_t);
+
+    MarkedAllocator* allocatorFor(size_t);
+    MarkedAllocator* destructorAllocatorFor(size_t);
+    MarkedAllocator* auxiliaryAllocatorFor(size_t);
+
+    JS_EXPORT_PRIVATE void* allocate(Subspace&amp;, size_t);
+    JS_EXPORT_PRIVATE void* tryAllocate(Subspace&amp;, size_t);
+    
</ins><span class="cx">     void* allocateWithDestructor(size_t);
</span><span class="cx">     void* allocateWithoutDestructor(size_t);
</span><span class="cx">     void* allocateAuxiliary(size_t);
</span><del>-
</del><ins>+    void* tryAllocateAuxiliary(size_t);
+    
</ins><span class="cx">     Subspace&amp; subspaceForObjectsWithDestructor() { return m_destructorSpace; }
</span><span class="cx">     Subspace&amp; subspaceForObjectsWithoutDestructor() { return m_normalSpace; }
</span><span class="cx">     Subspace&amp; subspaceForAuxiliaryData() { return m_auxiliarySpace; }
</span><del>-
</del><ins>+    
</ins><span class="cx">     void resetAllocators();
</span><span class="cx"> 
</span><span class="cx">     void visitWeakSets(HeapRootVisitor&amp;);
</span><span class="lines">@@ -86,6 +123,8 @@
</span><span class="cx"> 
</span><span class="cx">     void stopAllocating();
</span><span class="cx">     void resumeAllocating(); // If we just stopped allocation but we didn't do a collection, we need to resume allocation.
</span><ins>+    
+    void prepareForMarking();
</ins><span class="cx"> 
</span><span class="cx">     typedef HashSet&lt;MarkedBlock*&gt;::iterator BlockIterator;
</span><span class="cx"> 
</span><span class="lines">@@ -94,16 +133,17 @@
</span><span class="cx">     template&lt;typename Functor&gt; void forEachBlock(const Functor&amp;);
</span><span class="cx"> 
</span><span class="cx">     void shrink();
</span><del>-    void freeBlock(MarkedBlock*);
-    void freeOrShrinkBlock(MarkedBlock*);
</del><ins>+    void freeBlock(MarkedBlock::Handle*);
+    void freeOrShrinkBlock(MarkedBlock::Handle*);
</ins><span class="cx"> 
</span><del>-    void didAddBlock(MarkedBlock*);
-    void didConsumeFreeList(MarkedBlock*);
-    void didAllocateInBlock(MarkedBlock*);
</del><ins>+    void didAddBlock(MarkedBlock::Handle*);
+    void didConsumeFreeList(MarkedBlock::Handle*);
+    void didAllocateInBlock(MarkedBlock::Handle*);
</ins><span class="cx"> 
</span><del>-    void clearMarks();
</del><ins>+    void flip();
</ins><span class="cx">     void clearNewlyAllocated();
</span><span class="cx">     void sweep();
</span><ins>+    void sweepLargeAllocations();
</ins><span class="cx">     void zombifySweep();
</span><span class="cx">     size_t objectCount();
</span><span class="cx">     size_t size();
</span><span class="lines">@@ -110,16 +150,39 @@
</span><span class="cx">     size_t capacity();
</span><span class="cx"> 
</span><span class="cx">     bool isPagedOut(double deadline);
</span><ins>+    
+    uint64_t version() const { return m_version; }
</ins><span class="cx"> 
</span><del>-    const Vector&lt;MarkedBlock*&gt;&amp; blocksWithNewObjects() const { return m_blocksWithNewObjects; }
</del><ins>+    const Vector&lt;MarkedBlock::Handle*&gt;&amp; blocksWithNewObjects() const { return m_blocksWithNewObjects; }
+    
+    const Vector&lt;LargeAllocation*&gt;&amp; largeAllocations() const { return m_largeAllocations; }
+    unsigned largeAllocationsNurseryOffset() const { return m_largeAllocationsNurseryOffset; }
+    unsigned largeAllocationsOffsetForThisCollection() const { return m_largeAllocationsOffsetForThisCollection; }
+    
+    // These are cached pointers and offsets for quickly searching the large allocations that are
+    // relevant to this collection.
+    LargeAllocation** largeAllocationsForThisCollectionBegin() const { return m_largeAllocationsForThisCollectionBegin; }
+    LargeAllocation** largeAllocationsForThisCollectionEnd() const { return m_largeAllocationsForThisCollectionEnd; }
+    unsigned largeAllocationsForThisCollectionSize() const { return m_largeAllocationsForThisCollectionSize; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx">     friend class JIT;
</span><ins>+    friend class WeakSet;
+    
+    JS_EXPORT_PRIVATE static std::array&lt;size_t, numSizeClasses&gt; s_sizeClassForSizeStep;
+    
+    JS_EXPORT_PRIVATE void* allocateLarge(Subspace&amp;, size_t);
+    JS_EXPORT_PRIVATE void* tryAllocateLarge(Subspace&amp;, size_t);
</ins><span class="cx"> 
</span><ins>+    static void initializeSizeClassForStepSize();
+    
+    void initializeSubspace(Subspace&amp;);
+
</ins><span class="cx">     template&lt;typename Functor&gt; void forEachAllocator(const Functor&amp;);
</span><span class="cx">     template&lt;typename Functor&gt; void forEachSubspace(const Functor&amp;);
</span><del>-    MarkedAllocator&amp; allocatorFor(Subspace&amp;, size_t);
</del><ins>+    
+    void addActiveWeakSet(WeakSet*);
</ins><span class="cx"> 
</span><span class="cx">     Subspace m_destructorSpace;
</span><span class="cx">     Subspace m_normalSpace;
</span><span class="lines">@@ -126,10 +189,20 @@
</span><span class="cx">     Subspace m_auxiliarySpace;
</span><span class="cx"> 
</span><span class="cx">     Heap* m_heap;
</span><ins>+    uint64_t m_version { 42 }; // This can start at any value, including random garbage values.
</ins><span class="cx">     size_t m_capacity;
</span><span class="cx">     bool m_isIterating;
</span><span class="cx">     MarkedBlockSet m_blocks;
</span><del>-    Vector&lt;MarkedBlock*&gt; m_blocksWithNewObjects;
</del><ins>+    Vector&lt;MarkedBlock::Handle*&gt; m_blocksWithNewObjects;
+    Vector&lt;LargeAllocation*&gt; m_largeAllocations;
+    unsigned m_largeAllocationsNurseryOffset { 0 };
+    unsigned m_largeAllocationsOffsetForThisCollection { 0 };
+    unsigned m_largeAllocationsNurseryOffsetForSweep { 0 };
+    LargeAllocation** m_largeAllocationsForThisCollectionBegin { nullptr };
+    LargeAllocation** m_largeAllocationsForThisCollectionEnd { nullptr };
+    unsigned m_largeAllocationsForThisCollectionSize { 0 };
+    SentinelLinkedList&lt;WeakSet, BasicRawSentinelNode&lt;WeakSet&gt;&gt; m_activeWeakSets;
+    SentinelLinkedList&lt;WeakSet, BasicRawSentinelNode&lt;WeakSet&gt;&gt; m_newActiveWeakSets;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename Functor&gt; inline void MarkedSpace::forEachLiveCell(HeapIterationScope&amp;, const Functor&amp; functor)
</span><span class="lines">@@ -137,9 +210,15 @@
</span><span class="cx">     ASSERT(isIterating());
</span><span class="cx">     BlockIterator end = m_blocks.set().end();
</span><span class="cx">     for (BlockIterator it = m_blocks.set().begin(); it != end; ++it) {
</span><del>-        if ((*it)-&gt;forEachLiveCell(functor) == IterationStatus::Done)
-            break;
</del><ins>+        if ((*it)-&gt;handle().forEachLiveCell(functor) == IterationStatus::Done)
+            return;
</ins><span class="cx">     }
</span><ins>+    for (LargeAllocation* allocation : m_largeAllocations) {
+        if (allocation-&gt;isLive()) {
+            if (functor(allocation-&gt;cell(), allocation-&gt;attributes().cellKind) == IterationStatus::Done)
+                return;
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename Functor&gt; inline void MarkedSpace::forEachDeadCell(HeapIterationScope&amp;, const Functor&amp; functor)
</span><span class="lines">@@ -147,22 +226,36 @@
</span><span class="cx">     ASSERT(isIterating());
</span><span class="cx">     BlockIterator end = m_blocks.set().end();
</span><span class="cx">     for (BlockIterator it = m_blocks.set().begin(); it != end; ++it) {
</span><del>-        if ((*it)-&gt;forEachDeadCell(functor) == IterationStatus::Done)
-            break;
</del><ins>+        if ((*it)-&gt;handle().forEachDeadCell(functor) == IterationStatus::Done)
+            return;
</ins><span class="cx">     }
</span><ins>+    for (LargeAllocation* allocation : m_largeAllocations) {
+        if (!allocation-&gt;isLive()) {
+            if (functor(allocation-&gt;cell(), allocation-&gt;attributes().cellKind) == IterationStatus::Done)
+                return;
+        }
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator&amp; MarkedSpace::allocatorFor(size_t bytes)
</del><ins>+inline MarkedAllocator* MarkedSpace::allocatorFor(Subspace&amp; space, size_t bytes)
</ins><span class="cx"> {
</span><ins>+    ASSERT(bytes);
+    if (bytes &lt;= largeCutoff)
+        return space.allocatorForSizeStep[sizeClassToIndex(bytes)];
+    return nullptr;
+}
+
+inline MarkedAllocator* MarkedSpace::allocatorFor(size_t bytes)
+{
</ins><span class="cx">     return allocatorFor(m_normalSpace, bytes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator&amp; MarkedSpace::destructorAllocatorFor(size_t bytes)
</del><ins>+inline MarkedAllocator* MarkedSpace::destructorAllocatorFor(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx">     return allocatorFor(m_destructorSpace, bytes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator&amp; MarkedSpace::auxiliaryAllocatorFor(size_t bytes)
</del><ins>+inline MarkedAllocator* MarkedSpace::auxiliaryAllocatorFor(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx">     return allocatorFor(m_auxiliarySpace, bytes);
</span><span class="cx"> }
</span><span class="lines">@@ -169,68 +262,47 @@
</span><span class="cx"> 
</span><span class="cx"> inline void* MarkedSpace::allocateWithoutDestructor(size_t bytes)
</span><span class="cx"> {
</span><del>-    return allocatorFor(bytes).allocate(bytes);
</del><ins>+    return allocate(m_normalSpace, bytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void* MarkedSpace::allocateWithDestructor(size_t bytes)
</span><span class="cx"> {
</span><del>-    return destructorAllocatorFor(bytes).allocate(bytes);
</del><ins>+    return allocate(m_destructorSpace, bytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void* MarkedSpace::allocateAuxiliary(size_t bytes)
</span><span class="cx"> {
</span><del>-    return auxiliaryAllocatorFor(bytes).allocate(bytes);
</del><ins>+    return allocate(m_auxiliarySpace, bytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-template &lt;typename Functor&gt; inline void MarkedSpace::forEachBlock(const Functor&amp; functor)
</del><ins>+inline void* MarkedSpace::tryAllocateAuxiliary(size_t bytes)
</ins><span class="cx"> {
</span><del>-    forEachSubspace(
-        [&amp;] (Subspace&amp; subspace, AllocatorAttributes) -&gt; IterationStatus {
-            for (size_t i = 0; i &lt; preciseCount; ++i)
-                subspace.preciseAllocators[i].forEachBlock(functor);
-            for (size_t i = 0; i &lt; impreciseCount; ++i)
-                subspace.impreciseAllocators[i].forEachBlock(functor);
-            subspace.largeAllocator.forEachBlock(functor);
-            return IterationStatus::Continue;
-        });
</del><ins>+    return tryAllocate(m_auxiliarySpace, bytes);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void MarkedSpace::didAddBlock(MarkedBlock* block)
</del><ins>+template &lt;typename Functor&gt; inline void MarkedSpace::forEachBlock(const Functor&amp; functor)
</ins><span class="cx"> {
</span><del>-    m_capacity += block-&gt;capacity();
-    m_blocks.add(block);
-}
-
-inline void MarkedSpace::didAllocateInBlock(MarkedBlock* block)
-{
-    m_blocksWithNewObjects.append(block);
-}
-
-inline size_t MarkedSpace::objectCount()
-{
-    size_t result = 0;
-    forEachBlock(
-        [&amp;] (MarkedBlock* block) {
-            result += block-&gt;markCount();
</del><ins>+    forEachAllocator(
+        [&amp;] (MarkedAllocator&amp; allocator) -&gt; IterationStatus {
+            allocator.forEachBlock(functor);
+            return IterationStatus::Continue;
</ins><span class="cx">         });
</span><del>-    return result;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline size_t MarkedSpace::size()
</del><ins>+template &lt;typename Functor&gt;
+void MarkedSpace::forEachAllocator(const Functor&amp; functor)
</ins><span class="cx"> {
</span><del>-    size_t result = 0;
-    forEachBlock(
-        [&amp;] (MarkedBlock* block) {
-            result += block-&gt;markCount() * block-&gt;cellSize();
</del><ins>+    forEachSubspace(
+        [&amp;] (Subspace&amp; subspace, AllocatorAttributes) -&gt; IterationStatus {
+            for (MarkedAllocator* allocator : subspace.bagOfAllocators) {
+                if (functor(*allocator) == IterationStatus::Done)
+                    return IterationStatus::Done;
+            }
+            
+            return IterationStatus::Continue;
</ins><span class="cx">         });
</span><del>-    return result;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline size_t MarkedSpace::capacity()
-{
-    return m_capacity;
-}
-
</del><span class="cx"> template&lt;typename Functor&gt;
</span><span class="cx"> inline void MarkedSpace::forEachSubspace(const Functor&amp; func)
</span><span class="cx"> {
</span><span class="lines">@@ -251,14 +323,14 @@
</span><span class="cx">     func(m_auxiliarySpace, attributes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline MarkedAllocator&amp; MarkedSpace::allocatorFor(Subspace&amp; space, size_t bytes)
</del><ins>+ALWAYS_INLINE size_t MarkedSpace::optimalSizeFor(size_t bytes)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(bytes);
</span><span class="cx">     if (bytes &lt;= preciseCutoff)
</span><del>-        return space.preciseAllocators[(bytes - 1) / preciseStep];
-    if (bytes &lt;= impreciseCutoff)
-        return space.impreciseAllocators[(bytes - 1) / impreciseStep];
-    return space.largeAllocator;
</del><ins>+        return WTF::roundUpToMultipleOf&lt;sizeStep&gt;(bytes);
+    if (bytes &lt;= largeCutoff)
+        return s_sizeClassForSizeStep[sizeClassToIndex(bytes)];
+    return bytes;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapSlotVisitorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -31,14 +31,16 @@
</span><span class="cx"> #include &quot;CopiedBlockInlines.h&quot;
</span><span class="cx"> #include &quot;CopiedSpace.h&quot;
</span><span class="cx"> #include &quot;CopiedSpaceInlines.h&quot;
</span><ins>+#include &quot;HeapCellInlines.h&quot;
</ins><span class="cx"> #include &quot;HeapProfiler.h&quot;
</span><span class="cx"> #include &quot;HeapSnapshotBuilder.h&quot;
</span><span class="cx"> #include &quot;JSArray.h&quot;
</span><span class="cx"> #include &quot;JSDestructibleObject.h&quot;
</span><del>-#include &quot;VM.h&quot;
</del><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;JSString.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#include &quot;SuperSampler.h&quot;
+#include &quot;VM.h&quot;
</ins><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -79,6 +81,7 @@
</span><span class="cx">     , m_bytesCopied(0)
</span><span class="cx">     , m_visitCount(0)
</span><span class="cx">     , m_isInParallelMode(false)
</span><ins>+    , m_version(42)
</ins><span class="cx">     , m_heap(heap)
</span><span class="cx"> #if !ASSERT_DISABLED
</span><span class="cx">     , m_isCheckingForDefaultMarkViolation(false)
</span><span class="lines">@@ -96,9 +99,13 @@
</span><span class="cx"> {
</span><span class="cx">     if (heap()-&gt;operationInProgress() == FullCollection)
</span><span class="cx">         ASSERT(m_opaqueRoots.isEmpty()); // Should have merged by now.
</span><ins>+    else
+        reset();
</ins><span class="cx"> 
</span><span class="cx">     if (HeapProfiler* heapProfiler = vm().heapProfiler())
</span><span class="cx">         m_heapSnapshotBuilder = heapProfiler-&gt;activeSnapshotBuilder();
</span><ins>+    
+    m_version = heap()-&gt;objectSpace().version();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SlotVisitor::reset()
</span><span class="lines">@@ -108,7 +115,6 @@
</span><span class="cx">     m_visitCount = 0;
</span><span class="cx">     m_heapSnapshotBuilder = nullptr;
</span><span class="cx">     ASSERT(!m_currentCell);
</span><del>-    ASSERT(m_stack.isEmpty());
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SlotVisitor::clearMarkStack()
</span><span class="lines">@@ -118,12 +124,43 @@
</span><span class="cx"> 
</span><span class="cx"> void SlotVisitor::append(ConservativeRoots&amp; conservativeRoots)
</span><span class="cx"> {
</span><del>-    JSCell** roots = conservativeRoots.roots();
</del><ins>+    HeapCell** roots = conservativeRoots.roots();
</ins><span class="cx">     size_t size = conservativeRoots.size();
</span><span class="cx">     for (size_t i = 0; i &lt; size; ++i)
</span><del>-        append(roots[i]);
</del><ins>+        appendJSCellOrAuxiliary(roots[i]);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void SlotVisitor::appendJSCellOrAuxiliary(HeapCell* heapCell)
+{
+    if (!heapCell)
+        return;
+    
+    ASSERT(!m_isCheckingForDefaultMarkViolation);
+    
+    if (Heap::testAndSetMarked(m_version, heapCell))
+        return;
+    
+    switch (heapCell-&gt;cellKind()) {
+    case HeapCell::JSCell: {
+        JSCell* jsCell = static_cast&lt;JSCell*&gt;(heapCell);
+        
+        if (!jsCell-&gt;structure()) {
+            ASSERT_NOT_REACHED();
+            return;
+        }
+        
+        jsCell-&gt;setCellState(CellState::NewGrey);
+
+        appendToMarkStack(jsCell);
+        return;
+    }
+        
+    case HeapCell::Auxiliary: {
+        noteLiveAuxiliaryCell(heapCell);
+        return;
+    } }
+}
+
</ins><span class="cx"> void SlotVisitor::append(JSValue value)
</span><span class="cx"> {
</span><span class="cx">     if (!value || !value.isCell())
</span><span class="lines">@@ -145,6 +182,8 @@
</span><span class="cx"> 
</span><span class="cx"> void SlotVisitor::setMarkedAndAppendToMarkStack(JSCell* cell)
</span><span class="cx"> {
</span><ins>+    SuperSamplerScope superSamplerScope(false);
+    
</ins><span class="cx">     ASSERT(!m_isCheckingForDefaultMarkViolation);
</span><span class="cx">     if (!cell)
</span><span class="cx">         return;
</span><span class="lines">@@ -152,27 +191,52 @@
</span><span class="cx"> #if ENABLE(GC_VALIDATION)
</span><span class="cx">     validate(cell);
</span><span class="cx"> #endif
</span><ins>+    
+    if (cell-&gt;isLargeAllocation())
+        setMarkedAndAppendToMarkStack(cell-&gt;largeAllocation(), cell);
+    else
+        setMarkedAndAppendToMarkStack(cell-&gt;markedBlock(), cell);
+}
</ins><span class="cx"> 
</span><del>-    if (Heap::testAndSetMarked(cell) || !cell-&gt;structure()) {
-        ASSERT(cell-&gt;structure());
</del><ins>+template&lt;typename ContainerType&gt;
+ALWAYS_INLINE void SlotVisitor::setMarkedAndAppendToMarkStack(ContainerType&amp; container, JSCell* cell)
+{
+    container.flipIfNecessaryConcurrently(m_version);
+    
+    if (container.testAndSetMarked(cell))
</ins><span class="cx">         return;
</span><del>-    }
-
</del><ins>+    
+    ASSERT(cell-&gt;structure());
+    
</ins><span class="cx">     // Indicate that the object is grey and that:
</span><span class="cx">     // In case of concurrent GC: it's the first time it is grey in this GC cycle.
</span><span class="cx">     // In case of eden collection: it's a new object that became grey rather than an old remembered object.
</span><span class="cx">     cell-&gt;setCellState(CellState::NewGrey);
</span><del>-
-    appendToMarkStack(cell);
</del><ins>+    
+    appendToMarkStack(container, cell);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SlotVisitor::appendToMarkStack(JSCell* cell)
</span><span class="cx"> {
</span><ins>+    if (cell-&gt;isLargeAllocation())
+        appendToMarkStack(cell-&gt;largeAllocation(), cell);
+    else
+        appendToMarkStack(cell-&gt;markedBlock(), cell);
+}
+
+template&lt;typename ContainerType&gt;
+ALWAYS_INLINE void SlotVisitor::appendToMarkStack(ContainerType&amp; container, JSCell* cell)
+{
</ins><span class="cx">     ASSERT(Heap::isMarked(cell));
</span><span class="cx">     ASSERT(!cell-&gt;isZapped());
</span><del>-
</del><ins>+    
+    container.noteMarked();
+    
+    // FIXME: These &quot;just work&quot; because the GC resets these fields before doing anything else. But
+    // that won't be the case when we do concurrent GC.
</ins><span class="cx">     m_visitCount++;
</span><del>-    m_bytesVisited += MarkedBlock::blockFor(cell)-&gt;cellSize();
</del><ins>+    m_bytesVisited += container.cellSize();
+    
</ins><span class="cx">     m_stack.append(cell);
</span><span class="cx"> 
</span><span class="cx">     if (UNLIKELY(m_heapSnapshotBuilder))
</span><span class="lines">@@ -179,6 +243,34 @@
</span><span class="cx">         m_heapSnapshotBuilder-&gt;appendNode(cell);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void SlotVisitor::markAuxiliary(const void* base)
+{
+    HeapCell* cell = bitwise_cast&lt;HeapCell*&gt;(base);
+    
+    if (Heap::testAndSetMarked(m_version, cell)) {
+        RELEASE_ASSERT(Heap::isMarked(cell));
+        return;
+    }
+    
+    noteLiveAuxiliaryCell(cell);
+}
+
+void SlotVisitor::noteLiveAuxiliaryCell(HeapCell* cell)
+{
+    // We get here once per GC under these circumstances:
+    //
+    // Eden collection: if the cell was allocated since the last collection and is live somehow.
+    //
+    // Full collection: if the cell is live somehow.
+    
+    CellContainer container = cell-&gt;cellContainer();
+    
+    container.noteMarked();
+    
+    m_visitCount++;
+    m_bytesVisited += container.cellSize();
+}
+
</ins><span class="cx"> class SetCurrentCellScope {
</span><span class="cx"> public:
</span><span class="cx">     SetCurrentCellScope(SlotVisitor&amp; visitor, const JSCell* cell)
</span><span class="lines">@@ -202,9 +294,9 @@
</span><span class="cx"> ALWAYS_INLINE void SlotVisitor::visitChildren(const JSCell* cell)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(Heap::isMarked(cell));
</span><del>-
</del><ins>+    
</ins><span class="cx">     SetCurrentCellScope currentCellScope(*this, cell);
</span><del>-
</del><ins>+    
</ins><span class="cx">     m_currentObjectCellStateBeforeVisiting = cell-&gt;cellState();
</span><span class="cx">     cell-&gt;setCellState(CellState::OldBlack);
</span><span class="cx">     
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapSlotVisitorh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/SlotVisitor.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -37,8 +37,10 @@
</span><span class="cx"> class ConservativeRoots;
</span><span class="cx"> class GCThreadSharedData;
</span><span class="cx"> class Heap;
</span><ins>+class HeapCell;
</ins><span class="cx"> class HeapSnapshotBuilder;
</span><span class="cx"> template&lt;typename T&gt; class JITWriteBarrier;
</span><ins>+class MarkedBlock;
</ins><span class="cx"> class UnconditionalFinalizer;
</span><span class="cx"> template&lt;typename T&gt; class Weak;
</span><span class="cx"> class WeakReferenceHarvester;
</span><span class="lines">@@ -104,6 +106,10 @@
</span><span class="cx"> 
</span><span class="cx">     void harvestWeakReferences();
</span><span class="cx">     void finalizeUnconditionalFinalizers();
</span><ins>+    
+    // This informs the GC about auxiliary of some size that we are keeping alive. If you don't do
+    // this then the space will be freed at end of GC.
+    void markAuxiliary(const void* base);
</ins><span class="cx"> 
</span><span class="cx">     void copyLater(JSCell*, CopyToken, void*, size_t);
</span><span class="cx">     
</span><span class="lines">@@ -123,11 +129,21 @@
</span><span class="cx">     friend class ParallelModeEnabler;
</span><span class="cx">     
</span><span class="cx">     JS_EXPORT_PRIVATE void append(JSValue); // This is private to encourage clients to use WriteBarrier&lt;T&gt;.
</span><ins>+    void appendJSCellOrAuxiliary(HeapCell*);
</ins><span class="cx">     void appendHidden(JSValue);
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE void setMarkedAndAppendToMarkStack(JSCell*);
</span><ins>+    
+    template&lt;typename ContainerType&gt;
+    void setMarkedAndAppendToMarkStack(ContainerType&amp;, JSCell*);
+    
</ins><span class="cx">     void appendToMarkStack(JSCell*);
</span><span class="cx">     
</span><ins>+    template&lt;typename ContainerType&gt;
+    void appendToMarkStack(ContainerType&amp;, JSCell*);
+    
+    void noteLiveAuxiliaryCell(HeapCell*);
+    
</ins><span class="cx">     JS_EXPORT_PRIVATE void mergeOpaqueRoots();
</span><span class="cx">     void mergeOpaqueRootsIfNecessary();
</span><span class="cx">     void mergeOpaqueRootsIfProfitable();
</span><span class="lines">@@ -144,6 +160,8 @@
</span><span class="cx">     size_t m_visitCount;
</span><span class="cx">     bool m_isInParallelMode;
</span><span class="cx">     
</span><ins>+    uint64_t m_version;
+    
</ins><span class="cx">     Heap&amp; m_heap;
</span><span class="cx"> 
</span><span class="cx">     HeapSnapshotBuilder* m_heapSnapshotBuilder { nullptr };
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakBlockcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;WeakBlock.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;CellContainerInlines.h&quot;
</ins><span class="cx"> #include &quot;Heap.h&quot;
</span><span class="cx"> #include &quot;HeapRootVisitor.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="lines">@@ -34,10 +35,10 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-WeakBlock* WeakBlock::create(Heap&amp; heap, MarkedBlock&amp; markedBlock)
</del><ins>+WeakBlock* WeakBlock::create(Heap&amp; heap, CellContainer container)
</ins><span class="cx"> {
</span><span class="cx">     heap.didAllocateBlock(WeakBlock::blockSize);
</span><del>-    return new (NotNull, fastMalloc(blockSize)) WeakBlock(markedBlock);
</del><ins>+    return new (NotNull, fastMalloc(blockSize)) WeakBlock(container);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WeakBlock::destroy(Heap&amp; heap, WeakBlock* block)
</span><span class="lines">@@ -47,9 +48,9 @@
</span><span class="cx">     heap.didFreeBlock(WeakBlock::blockSize);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-WeakBlock::WeakBlock(MarkedBlock&amp; markedBlock)
</del><ins>+WeakBlock::WeakBlock(CellContainer container)
</ins><span class="cx">     : DoublyLinkedListNode&lt;WeakBlock&gt;()
</span><del>-    , m_markedBlock(&amp;markedBlock)
</del><ins>+    , m_container(container)
</ins><span class="cx"> {
</span><span class="cx">     for (size_t i = 0; i &lt; weakImplCount(); ++i) {
</span><span class="cx">         WeakImpl* weakImpl = &amp;weakImpls()[i];
</span><span class="lines">@@ -101,11 +102,13 @@
</span><span class="cx">     if (isEmpty())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    // If this WeakBlock doesn't belong to a MarkedBlock, we won't even be here.
-    ASSERT(m_markedBlock);
</del><ins>+    // If this WeakBlock doesn't belong to a CellContainer, we won't even be here.
+    ASSERT(m_container);
+    
+    m_container.flipIfNecessary();
</ins><span class="cx"> 
</span><span class="cx">     // We only visit after marking.
</span><del>-    ASSERT(m_markedBlock-&gt;isMarkedOrRetired());
</del><ins>+    ASSERT(m_container.isMarked());
</ins><span class="cx"> 
</span><span class="cx">     SlotVisitor&amp; visitor = heapRootVisitor.visitor();
</span><span class="cx"> 
</span><span class="lines">@@ -119,9 +122,9 @@
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="cx">         const JSValue&amp; jsValue = weakImpl-&gt;jsValue();
</span><del>-        if (m_markedBlock-&gt;isMarkedOrNewlyAllocated(jsValue.asCell()))
</del><ins>+        if (m_container.isMarkedOrNewlyAllocated(jsValue.asCell()))
</ins><span class="cx">             continue;
</span><del>-
</del><ins>+        
</ins><span class="cx">         if (!weakHandleOwner-&gt;isReachableFromOpaqueRoots(Handle&lt;Unknown&gt;::wrapSlot(&amp;const_cast&lt;JSValue&amp;&gt;(jsValue)), weakImpl-&gt;context(), visitor))
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><span class="lines">@@ -135,11 +138,13 @@
</span><span class="cx">     if (isEmpty())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    // If this WeakBlock doesn't belong to a MarkedBlock, we won't even be here.
-    ASSERT(m_markedBlock);
</del><ins>+    // If this WeakBlock doesn't belong to a CellContainer, we won't even be here.
+    ASSERT(m_container);
+    
+    m_container.flipIfNecessary();
</ins><span class="cx"> 
</span><span class="cx">     // We only reap after marking.
</span><del>-    ASSERT(m_markedBlock-&gt;isMarkedOrRetired());
</del><ins>+    ASSERT(m_container.isMarked());
</ins><span class="cx"> 
</span><span class="cx">     for (size_t i = 0; i &lt; weakImplCount(); ++i) {
</span><span class="cx">         WeakImpl* weakImpl = &amp;weakImpls()[i];
</span><span class="lines">@@ -146,7 +151,7 @@
</span><span class="cx">         if (weakImpl-&gt;state() &gt; WeakImpl::Dead)
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        if (m_markedBlock-&gt;isMarkedOrNewlyAllocated(weakImpl-&gt;jsValue().asCell())) {
</del><ins>+        if (m_container.isMarkedOrNewlyAllocated(weakImpl-&gt;jsValue().asCell())) {
</ins><span class="cx">             ASSERT(weakImpl-&gt;state() == WeakImpl::Live);
</span><span class="cx">             continue;
</span><span class="cx">         }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakBlockh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakBlock.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef WeakBlock_h
</span><span class="cx"> #define WeakBlock_h
</span><span class="cx"> 
</span><ins>+#include &quot;CellContainer.h&quot;
</ins><span class="cx"> #include &quot;WeakImpl.h&quot;
</span><span class="cx"> #include &lt;wtf/DoublyLinkedList.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="lines">@@ -34,12 +35,11 @@
</span><span class="cx"> 
</span><span class="cx"> class Heap;
</span><span class="cx"> class HeapRootVisitor;
</span><del>-class MarkedBlock;
</del><span class="cx"> 
</span><span class="cx"> class WeakBlock : public DoublyLinkedListNode&lt;WeakBlock&gt; {
</span><span class="cx"> public:
</span><span class="cx">     friend class WTF::DoublyLinkedListNode&lt;WeakBlock&gt;;
</span><del>-    static const size_t blockSize = 1 * KB; // 1/16 of MarkedBlock size
</del><ins>+    static const size_t blockSize = 256; // 1/16 of MarkedBlock size
</ins><span class="cx"> 
</span><span class="cx">     struct FreeCell {
</span><span class="cx">         FreeCell* next;
</span><span class="lines">@@ -53,7 +53,7 @@
</span><span class="cx">         FreeCell* freeList { nullptr };
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static WeakBlock* create(Heap&amp;, MarkedBlock&amp;);
</del><ins>+    static WeakBlock* create(Heap&amp;, CellContainer);
</ins><span class="cx">     static void destroy(Heap&amp;, WeakBlock*);
</span><span class="cx"> 
</span><span class="cx">     static WeakImpl* asWeakImpl(FreeCell*);
</span><span class="lines">@@ -68,18 +68,18 @@
</span><span class="cx">     void reap();
</span><span class="cx"> 
</span><span class="cx">     void lastChanceToFinalize();
</span><del>-    void disconnectMarkedBlock() { m_markedBlock = nullptr; }
</del><ins>+    void disconnectContainer() { m_container = CellContainer(); }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     static FreeCell* asFreeCell(WeakImpl*);
</span><span class="cx"> 
</span><del>-    explicit WeakBlock(MarkedBlock&amp;);
</del><ins>+    explicit WeakBlock(CellContainer);
</ins><span class="cx">     void finalize(WeakImpl*);
</span><span class="cx">     WeakImpl* weakImpls();
</span><span class="cx">     size_t weakImplCount();
</span><span class="cx">     void addToFreeList(FreeCell**, WeakImpl*);
</span><span class="cx"> 
</span><del>-    MarkedBlock* m_markedBlock;
</del><ins>+    CellContainer m_container;
</ins><span class="cx">     WeakBlock* m_prev;
</span><span class="cx">     WeakBlock* m_next;
</span><span class="cx">     SweepResult m_sweepResult;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakSetcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -34,6 +34,9 @@
</span><span class="cx"> 
</span><span class="cx"> WeakSet::~WeakSet()
</span><span class="cx"> {
</span><ins>+    if (isOnList())
+        remove();
+    
</ins><span class="cx">     Heap&amp; heap = *this-&gt;heap();
</span><span class="cx">     WeakBlock* next = 0;
</span><span class="cx">     for (WeakBlock* block = m_blocks.head(); block; block = next) {
</span><span class="lines">@@ -53,10 +56,10 @@
</span><span class="cx">         if (block-&gt;isLogicallyEmptyButNotFree()) {
</span><span class="cx">             // If this WeakBlock is logically empty, but still has Weaks pointing into it,
</span><span class="cx">             // we can't destroy it just yet. Detach it from the WeakSet and hand ownership
</span><del>-            // to the Heap so we don't pin down the entire 64kB MarkedBlock.
</del><ins>+            // to the Heap so we don't pin down the entire MarkedBlock or LargeAllocation.
</ins><span class="cx">             m_blocks.remove(block);
</span><span class="cx">             heap()-&gt;addLogicallyEmptyWeakBlock(block);
</span><del>-            block-&gt;disconnectMarkedBlock();
</del><ins>+            block-&gt;disconnectContainer();
</ins><span class="cx">         }
</span><span class="cx">         block = nextBlock;
</span><span class="cx">     }
</span><span class="lines">@@ -64,6 +67,22 @@
</span><span class="cx">     resetAllocator();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WeakSet::shrink()
+{
+    WeakBlock* next;
+    for (WeakBlock* block = m_blocks.head(); block; block = next) {
+        next = block-&gt;next();
+
+        if (block-&gt;isEmpty())
+            removeAllocator(block);
+    }
+
+    resetAllocator();
+    
+    if (m_blocks.isEmpty() &amp;&amp; isOnList())
+        remove();
+}
+
</ins><span class="cx"> WeakBlock::FreeCell* WeakSet::findAllocator()
</span><span class="cx"> {
</span><span class="cx">     if (WeakBlock::FreeCell* allocator = tryFindAllocator())
</span><span class="lines">@@ -88,7 +107,10 @@
</span><span class="cx"> 
</span><span class="cx"> WeakBlock::FreeCell* WeakSet::addAllocator()
</span><span class="cx"> {
</span><del>-    WeakBlock* block = WeakBlock::create(*heap(), m_markedBlock);
</del><ins>+    if (m_blocks.isEmpty() &amp;&amp; !isOnList())
+        heap()-&gt;objectSpace().addActiveWeakSet(this);
+    
+    WeakBlock* block = WeakBlock::create(*heap(), m_container);
</ins><span class="cx">     heap()-&gt;didAllocate(WeakBlock::blockSize);
</span><span class="cx">     m_blocks.append(block);
</span><span class="cx">     WeakBlock::SweepResult sweepResult = block-&gt;takeSweepResult();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakSeth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSet.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,15 +26,16 @@
</span><span class="cx"> #ifndef WeakSet_h
</span><span class="cx"> #define WeakSet_h
</span><span class="cx"> 
</span><ins>+#include &quot;CellContainer.h&quot;
</ins><span class="cx"> #include &quot;WeakBlock.h&quot;
</span><ins>+#include &lt;wtf/SentinelLinkedList.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class Heap;
</span><del>-class MarkedBlock;
</del><span class="cx"> class WeakImpl;
</span><span class="cx"> 
</span><del>-class WeakSet {
</del><ins>+class WeakSet : public BasicRawSentinelNode&lt;WeakSet&gt; {
</ins><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> 
</span><span class="cx"> public:
</span><span class="lines">@@ -41,9 +42,12 @@
</span><span class="cx">     static WeakImpl* allocate(JSValue, WeakHandleOwner* = 0, void* context = 0);
</span><span class="cx">     static void deallocate(WeakImpl*);
</span><span class="cx"> 
</span><del>-    WeakSet(VM*, MarkedBlock&amp;);
</del><ins>+    WeakSet(VM*, CellContainer);
</ins><span class="cx">     ~WeakSet();
</span><span class="cx">     void lastChanceToFinalize();
</span><ins>+    
+    CellContainer container() const { return m_container; }
+    void setContainer(CellContainer container) { m_container = container; }
</ins><span class="cx"> 
</span><span class="cx">     Heap* heap() const;
</span><span class="cx">     VM* vm() const;
</span><span class="lines">@@ -50,7 +54,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool isEmpty() const;
</span><span class="cx"> 
</span><del>-    void visit(HeapRootVisitor&amp;);
</del><ins>+    unsigned visit(HeapRootVisitor&amp;);
</ins><span class="cx">     void reap();
</span><span class="cx">     void sweep();
</span><span class="cx">     void shrink();
</span><span class="lines">@@ -66,14 +70,14 @@
</span><span class="cx">     WeakBlock* m_nextAllocator;
</span><span class="cx">     DoublyLinkedList&lt;WeakBlock&gt; m_blocks;
</span><span class="cx">     VM* m_vm;
</span><del>-    MarkedBlock&amp; m_markedBlock;
</del><ins>+    CellContainer m_container;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-inline WeakSet::WeakSet(VM* vm, MarkedBlock&amp; markedBlock)
</del><ins>+inline WeakSet::WeakSet(VM* vm, CellContainer container)
</ins><span class="cx">     : m_allocator(0)
</span><span class="cx">     , m_nextAllocator(0)
</span><span class="cx">     , m_vm(vm)
</span><del>-    , m_markedBlock(markedBlock)
</del><ins>+    , m_container(container)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -103,10 +107,14 @@
</span><span class="cx">         block-&gt;lastChanceToFinalize();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void WeakSet::visit(HeapRootVisitor&amp; visitor)
</del><ins>+inline unsigned WeakSet::visit(HeapRootVisitor&amp; visitor)
</ins><span class="cx"> {
</span><del>-    for (WeakBlock* block = m_blocks.head(); block; block = block-&gt;next())
</del><ins>+    unsigned count = 0;
+    for (WeakBlock* block = m_blocks.head(); block; block = block-&gt;next()) {
+        count++;
</ins><span class="cx">         block-&gt;visit(visitor);
</span><ins>+    }
+    return count;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline void WeakSet::reap()
</span><span class="lines">@@ -115,19 +123,6 @@
</span><span class="cx">         block-&gt;reap();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void WeakSet::shrink()
-{
-    WeakBlock* next;
-    for (WeakBlock* block = m_blocks.head(); block; block = next) {
-        next = block-&gt;next();
-
-        if (block-&gt;isEmpty())
-            removeAllocator(block);
-    }
-
-    resetAllocator();
-}
-
</del><span class="cx"> inline void WeakSet::resetAllocator()
</span><span class="cx"> {
</span><span class="cx">     m_allocator = 0;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreheapWeakSetInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSetInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSetInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/WeakSetInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef WeakSetInlines_h
</span><span class="cx"> #define WeakSetInlines_h
</span><span class="cx"> 
</span><ins>+#include &quot;CellContainerInlines.h&quot;
</ins><span class="cx"> #include &quot;MarkedBlock.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="lines">@@ -32,7 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> inline WeakImpl* WeakSet::allocate(JSValue jsValue, WeakHandleOwner* weakHandleOwner, void* context)
</span><span class="cx"> {
</span><del>-    WeakSet&amp; weakSet = MarkedBlock::blockFor(jsValue.asCell())-&gt;weakSet();
</del><ins>+    WeakSet&amp; weakSet = jsValue.asCell()-&gt;cellContainer().weakSet();
</ins><span class="cx">     WeakBlock::FreeCell* allocator = weakSet.m_allocator;
</span><span class="cx">     if (UNLIKELY(!allocator))
</span><span class="cx">         allocator = weakSet.findAllocator();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorInjectedScriptManagercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/InjectedScriptManager.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include &quot;InjectedScriptHost.h&quot;
</span><span class="cx"> #include &quot;InjectedScriptSource.h&quot;
</span><span class="cx"> #include &quot;InspectorValues.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSInjectedScriptHost.h&quot;
</span><span class="cx"> #include &quot;JSLock.h&quot;
</span><span class="cx"> #include &quot;ScriptObject.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorJSGlobalObjectInspectorControllercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;InspectorFrontendRouter.h&quot;
</span><span class="cx"> #include &quot;InspectorHeapAgent.h&quot;
</span><span class="cx"> #include &quot;InspectorScriptProfilerAgent.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObjectConsoleAgent.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObjectConsoleClient.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorJSJavaScriptCallFramecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/JSJavaScriptCallFrame.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,11 +29,9 @@
</span><span class="cx"> #include &quot;DebuggerScope.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IdentifierInlines.h&quot;
</span><del>-#include &quot;JSCJSValue.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSJavaScriptCallFramePrototype.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectorScriptDebugServercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;DebuggerCallFrame.h&quot;
</span><span class="cx"> #include &quot;DebuggerScope.h&quot;
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSJavaScriptCallFrame.h&quot;
</span><span class="cx"> #include &quot;JSLock.h&quot;
</span><span class="cx"> #include &quot;JavaScriptCallFrame.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinspectoragentsInspectorDebuggerAgentcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> #include &quot;InjectedScriptManager.h&quot;
</span><span class="cx"> #include &quot;InspectorFrontendRouter.h&quot;
</span><span class="cx"> #include &quot;InspectorValues.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;RegularExpression.h&quot;
</span><span class="cx"> #include &quot;ScriptDebugServer.h&quot;
</span><span class="cx"> #include &quot;ScriptObject.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinterpreterCachedCallh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/CachedCall.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/CachedCall.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/CachedCall.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -42,7 +42,8 @@
</span><span class="cx">         CachedCall(CallFrame* callFrame, JSFunction* function, int argumentCount)
</span><span class="cx">             : m_valid(false)
</span><span class="cx">             , m_interpreter(callFrame-&gt;interpreter())
</span><del>-            , m_entryScope(callFrame-&gt;vm(), function-&gt;scope()-&gt;globalObject())
</del><ins>+            , m_vm(callFrame-&gt;vm())
+            , m_entryScope(m_vm, function-&gt;scope()-&gt;globalObject(m_vm))
</ins><span class="cx">         {
</span><span class="cx">             VM&amp; vm = m_entryScope.vm();
</span><span class="cx">             auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="lines">@@ -67,6 +68,7 @@
</span><span class="cx">     private:
</span><span class="cx">         bool m_valid;
</span><span class="cx">         Interpreter* m_interpreter;
</span><ins>+        VM&amp; m_vm;
</ins><span class="cx">         VMEntryScope m_entryScope;
</span><span class="cx">         ProtoCallFrame m_protoCallFrame;
</span><span class="cx">         Vector&lt;JSValue&gt; m_arguments;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinterpreterInterpretercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> #include &quot;JSString.h&quot;
</span><span class="cx"> #include &quot;JSWithScope.h&quot;
</span><span class="cx"> #include &quot;LLIntCLoop.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;LLIntThunks.h&quot;
</span><span class="cx"> #include &quot;LiteralParser.h&quot;
</span><span class="cx"> #include &quot;ObjectPrototype.h&quot;
</span><span class="lines">@@ -85,46 +86,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><del>-intptr_t StackFrame::sourceID() const
-{
-    if (!codeBlock)
-        return noSourceID;
-    return codeBlock-&gt;ownerScriptExecutable()-&gt;sourceID();
-}
-
-String StackFrame::sourceURL() const
-{
-    if (!codeBlock)
-        return ASCIILiteral(&quot;[native code]&quot;);
-
-    String sourceURL = codeBlock-&gt;ownerScriptExecutable()-&gt;sourceURL();
-    if (!sourceURL.isNull())
-        return sourceURL;
-    return emptyString();
-}
-
-String StackFrame::functionName(VM&amp; vm) const
-{
-    if (codeBlock) {
-        switch (codeBlock-&gt;codeType()) {
-        case EvalCode:
-            return ASCIILiteral(&quot;eval code&quot;);
-        case ModuleCode:
-            return ASCIILiteral(&quot;module code&quot;);
-        case FunctionCode:
-            break;
-        case GlobalCode:
-            return ASCIILiteral(&quot;global code&quot;);
-        default:
-            ASSERT_NOT_REACHED();
-        }
-    }
-    String name;
-    if (callee)
-        name = getCalculatedDisplayName(vm, callee.get()).impl();
-    return name.isNull() ? emptyString() : name;
-}
-
</del><span class="cx"> JSValue eval(CallFrame* callFrame)
</span><span class="cx"> {
</span><span class="cx">     VM&amp; vm = callFrame-&gt;vm();
</span><span class="lines">@@ -274,6 +235,7 @@
</span><span class="cx">         return;
</span><span class="cx">     
</span><span class="cx">     JSCell* cell = arguments.asCell();
</span><ins>+
</ins><span class="cx">     switch (cell-&gt;type()) {
</span><span class="cx">     case DirectArgumentsType:
</span><span class="cx">         jsCast&lt;DirectArguments*&gt;(cell)-&gt;copyToArguments(callFrame, firstElementDest, offset, length);
</span><span class="lines">@@ -482,48 +444,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void StackFrame::computeLineAndColumn(unsigned&amp; line, unsigned&amp; column) const
-{
-    if (!codeBlock) {
-        line = 0;
-        column = 0;
-        return;
-    }
-
-    int divot = 0;
-    int unusedStartOffset = 0;
-    int unusedEndOffset = 0;
-    codeBlock-&gt;expressionRangeForBytecodeOffset(bytecodeOffset, divot, unusedStartOffset, unusedEndOffset, line, column);
-
-    ScriptExecutable* executable = codeBlock-&gt;ownerScriptExecutable();
-    if (executable-&gt;hasOverrideLineNumber())
-        line = executable-&gt;overrideLineNumber();
-}
-
-String StackFrame::toString(VM&amp; vm) const
-{
-    StringBuilder traceBuild;
-    String functionName = this-&gt;functionName(vm);
-    String sourceURL = this-&gt;sourceURL();
-    traceBuild.append(functionName);
-    if (!sourceURL.isEmpty()) {
-        if (!functionName.isEmpty())
-            traceBuild.append('@');
-        traceBuild.append(sourceURL);
-        if (codeBlock) {
-            unsigned line;
-            unsigned column;
-            computeLineAndColumn(line, column);
-
-            traceBuild.append(':');
-            traceBuild.appendNumber(line);
-            traceBuild.append(':');
-            traceBuild.appendNumber(column);
-        }
-    }
-    return traceBuild.toString().impl();
-}
-
</del><span class="cx"> static inline bool isWebAssemblyExecutable(ExecutableBase* executable)
</span><span class="cx"> {
</span><span class="cx"> #if !ENABLE(WEBASSEMBLY)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreinterpreterInterpreterh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/interpreter/Interpreter.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> #include &quot;Opcode.h&quot;
</span><span class="cx"> #include &quot;SourceProvider.h&quot;
</span><span class="cx"> #include &quot;StackAlignment.h&quot;
</span><ins>+#include &quot;StackFrame.h&quot;
</ins><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -67,7 +68,7 @@
</span><span class="cx">     struct ProtoCallFrame;
</span><span class="cx">     struct UnlinkedInstruction;
</span><span class="cx"> 
</span><del>-    enum UnwindStart { UnwindFromCurrentFrame, UnwindFromCallerFrame };
</del><ins>+    enum UnwindStart : uint8_t { UnwindFromCurrentFrame, UnwindFromCallerFrame };
</ins><span class="cx"> 
</span><span class="cx">     enum DebugHookID {
</span><span class="cx">         WillExecuteProgram,
</span><span class="lines">@@ -86,20 +87,6 @@
</span><span class="cx">         StackFrameNativeCode
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    struct StackFrame {
-        Strong&lt;JSObject&gt; callee;
-        Strong&lt;CodeBlock&gt; codeBlock;
-        unsigned bytecodeOffset;
-
-        bool isNative() const { return !codeBlock; }
-
-        void computeLineAndColumn(unsigned&amp; line, unsigned&amp; column) const;
-        String functionName(VM&amp;) const;
-        intptr_t sourceID() const;
-        String sourceURL() const;
-        String toString(VM&amp;) const;
-    };
-
</del><span class="cx">     class SuspendExceptionScope {
</span><span class="cx">     public:
</span><span class="cx">         SuspendExceptionScope(VM* vm)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitAssemblyHelpersh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/AssemblyHelpers.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/AssemblyHelpers.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/AssemblyHelpers.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1405,33 +1405,74 @@
</span><span class="cx">     void emitRandomThunk(JSGlobalObject*, GPRReg scratch0, GPRReg scratch1, GPRReg scratch2, FPRReg result);
</span><span class="cx">     void emitRandomThunk(GPRReg scratch0, GPRReg scratch1, GPRReg scratch2, GPRReg scratch3, FPRReg result);
</span><span class="cx"> #endif
</span><del>-    
-    void emitAllocate(GPRReg resultGPR, GPRReg allocatorGPR, GPRReg scratchGPR, JumpList&amp; slowPath)
</del><ins>+
+    // Call this if you know that the value held in allocatorGPR is non-null. This DOES NOT mean
+    // that allocator is non-null; allocator can be null as a signal that we don't know what the
+    // value of allocatorGPR is.
+    void emitAllocateWithNonNullAllocator(GPRReg resultGPR, MarkedAllocator* allocator, GPRReg allocatorGPR, GPRReg scratchGPR, JumpList&amp; slowPath)
</ins><span class="cx">     {
</span><del>-        if (Options::forceGCSlowPaths())
</del><ins>+        // NOTE: This is carefully written so that we can call it while we disallow scratch
+        // register usage.
+        
+        if (Options::forceGCSlowPaths()) {
</ins><span class="cx">             slowPath.append(jump());
</span><ins>+            return;
+        }
+        
+        Jump popPath;
+        Jump done;
+        
+        load32(Address(allocatorGPR, MarkedAllocator::offsetOfFreeList() + OBJECT_OFFSETOF(FreeList, remaining)), resultGPR);
+        popPath = branchTest32(Zero, resultGPR);
+        if (allocator)
+            add32(TrustedImm32(-allocator-&gt;cellSize()), resultGPR, scratchGPR);
</ins><span class="cx">         else {
</span><del>-            loadPtr(Address(allocatorGPR, MarkedAllocator::offsetOfFreeListHead()), resultGPR);
-            slowPath.append(branchTestPtr(Zero, resultGPR));
</del><ins>+            move(resultGPR, scratchGPR);
+            sub32(Address(allocatorGPR, MarkedAllocator::offsetOfCellSize()), scratchGPR);
</ins><span class="cx">         }
</span><ins>+        negPtr(resultGPR);
+        store32(scratchGPR, Address(allocatorGPR, MarkedAllocator::offsetOfFreeList() + OBJECT_OFFSETOF(FreeList, remaining)));
+        Address payloadEndAddr = Address(allocatorGPR, MarkedAllocator::offsetOfFreeList() + OBJECT_OFFSETOF(FreeList, payloadEnd));
+        if (isX86())
+            addPtr(payloadEndAddr, resultGPR);
+        else {
+            loadPtr(payloadEndAddr, scratchGPR);
+            addPtr(scratchGPR, resultGPR);
+        }
</ins><span class="cx">         
</span><ins>+        done = jump();
+        
+        popPath.link(this);
+        
+        loadPtr(Address(allocatorGPR, MarkedAllocator::offsetOfFreeList() + OBJECT_OFFSETOF(FreeList, head)), resultGPR);
+        slowPath.append(branchTestPtr(Zero, resultGPR));
+        
</ins><span class="cx">         // The object is half-allocated: we have what we know is a fresh object, but
</span><span class="cx">         // it's still on the GC's free list.
</span><span class="cx">         loadPtr(Address(resultGPR), scratchGPR);
</span><del>-        storePtr(scratchGPR, Address(allocatorGPR, MarkedAllocator::offsetOfFreeListHead()));
</del><ins>+        storePtr(scratchGPR, Address(allocatorGPR, MarkedAllocator::offsetOfFreeList() + OBJECT_OFFSETOF(FreeList, head)));
+        
+        done.link(this);
</ins><span class="cx">     }
</span><span class="cx">     
</span><ins>+    void emitAllocate(GPRReg resultGPR, MarkedAllocator* allocator, GPRReg allocatorGPR, GPRReg scratchGPR, JumpList&amp; slowPath)
+    {
+        if (!allocator)
+            slowPath.append(branchTestPtr(Zero, allocatorGPR));
+        emitAllocateWithNonNullAllocator(resultGPR, allocator, allocatorGPR, scratchGPR, slowPath);
+    }
+    
</ins><span class="cx">     template&lt;typename StructureType&gt;
</span><del>-    void emitAllocateJSCell(GPRReg resultGPR, GPRReg allocatorGPR, StructureType structure, GPRReg scratchGPR, JumpList&amp; slowPath)
</del><ins>+    void emitAllocateJSCell(GPRReg resultGPR, MarkedAllocator* allocator, GPRReg allocatorGPR, StructureType structure, GPRReg scratchGPR, JumpList&amp; slowPath)
</ins><span class="cx">     {
</span><del>-        emitAllocate(resultGPR, allocatorGPR, scratchGPR, slowPath);
</del><ins>+        emitAllocate(resultGPR, allocator, allocatorGPR, scratchGPR, slowPath);
</ins><span class="cx">         emitStoreStructureWithTypeInfo(structure, resultGPR, scratchGPR);
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     template&lt;typename StructureType, typename StorageType&gt;
</span><del>-    void emitAllocateJSObject(GPRReg resultGPR, GPRReg allocatorGPR, StructureType structure, StorageType storage, GPRReg scratchGPR, JumpList&amp; slowPath)
</del><ins>+    void emitAllocateJSObject(GPRReg resultGPR, MarkedAllocator* allocator, GPRReg allocatorGPR, StructureType structure, StorageType storage, GPRReg scratchGPR, JumpList&amp; slowPath)
</ins><span class="cx">     {
</span><del>-        emitAllocateJSCell(resultGPR, allocatorGPR, structure, scratchGPR, slowPath);
</del><ins>+        emitAllocateJSCell(resultGPR, allocator, allocatorGPR, structure, scratchGPR, slowPath);
</ins><span class="cx">         storePtr(storage, Address(resultGPR, JSObject::butterflyOffset()));
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -1440,9 +1481,13 @@
</span><span class="cx">         GPRReg resultGPR, StructureType structure, StorageType storage, GPRReg scratchGPR1,
</span><span class="cx">         GPRReg scratchGPR2, JumpList&amp; slowPath, size_t size)
</span><span class="cx">     {
</span><del>-        MarkedAllocator* allocator = &amp;vm()-&gt;heap.allocatorForObjectOfType&lt;ClassType&gt;(size);
</del><ins>+        MarkedAllocator* allocator = vm()-&gt;heap.allocatorForObjectOfType&lt;ClassType&gt;(size);
+        if (!allocator) {
+            slowPath.append(jump());
+            return;
+        }
</ins><span class="cx">         move(TrustedImmPtr(allocator), scratchGPR1);
</span><del>-        emitAllocateJSObject(resultGPR, scratchGPR1, structure, storage, scratchGPR2, slowPath);
</del><ins>+        emitAllocateJSObject(resultGPR, allocator, scratchGPR1, structure, storage, scratchGPR2, slowPath);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     template&lt;typename ClassType, typename StructureType, typename StorageType&gt;
</span><span class="lines">@@ -1451,27 +1496,21 @@
</span><span class="cx">         emitAllocateJSObjectWithKnownSize&lt;ClassType&gt;(resultGPR, structure, storage, scratchGPR1, scratchGPR2, slowPath, ClassType::allocationSize(0));
</span><span class="cx">     }
</span><span class="cx">     
</span><ins>+    // allocationSize can be aliased with any of the other input GPRs. If it's not aliased then it
+    // won't be clobbered.
</ins><span class="cx">     void emitAllocateVariableSized(GPRReg resultGPR, MarkedSpace::Subspace&amp; subspace, GPRReg allocationSize, GPRReg scratchGPR1, GPRReg scratchGPR2, JumpList&amp; slowPath)
</span><span class="cx">     {
</span><del>-        static_assert(!(MarkedSpace::preciseStep &amp; (MarkedSpace::preciseStep - 1)), &quot;MarkedSpace::preciseStep must be a power of two.&quot;);
-        static_assert(!(MarkedSpace::impreciseStep &amp; (MarkedSpace::impreciseStep - 1)), &quot;MarkedSpace::impreciseStep must be a power of two.&quot;);
</del><ins>+        static_assert(!(MarkedSpace::sizeStep &amp; (MarkedSpace::sizeStep - 1)), &quot;MarkedSpace::sizeStep must be a power of two.&quot;);
</ins><span class="cx">         
</span><del>-        add32(TrustedImm32(MarkedSpace::preciseStep - 1), allocationSize);
-        Jump notSmall = branch32(AboveOrEqual, allocationSize, TrustedImm32(MarkedSpace::preciseCutoff));
-        rshift32(allocationSize, TrustedImm32(getLSBSet(MarkedSpace::preciseStep)), scratchGPR1);
-        mul32(TrustedImm32(sizeof(MarkedAllocator)), scratchGPR1, scratchGPR1);
-        addPtr(TrustedImmPtr(&amp;subspace.preciseAllocators[0]), scratchGPR1);
-
-        Jump selectedSmallSpace = jump();
-        notSmall.link(this);
-        slowPath.append(branch32(AboveOrEqual, allocationSize, TrustedImm32(MarkedSpace::impreciseCutoff)));
-        rshift32(allocationSize, TrustedImm32(getLSBSet(MarkedSpace::impreciseStep)), scratchGPR1);
-        mul32(TrustedImm32(sizeof(MarkedAllocator)), scratchGPR1, scratchGPR1);
-        addPtr(TrustedImmPtr(&amp;subspace.impreciseAllocators[0]), scratchGPR1);
-
-        selectedSmallSpace.link(this);
</del><ins>+        unsigned stepShift = getLSBSet(MarkedSpace::sizeStep);
</ins><span class="cx">         
</span><del>-        emitAllocate(resultGPR, scratchGPR1, scratchGPR2, slowPath);
</del><ins>+        add32(TrustedImm32(MarkedSpace::sizeStep - 1), allocationSize, scratchGPR1);
+        urshift32(TrustedImm32(stepShift), scratchGPR1);
+        slowPath.append(branch32(Above, scratchGPR1, TrustedImm32(MarkedSpace::largeCutoff &gt;&gt; stepShift)));
+        move(TrustedImmPtr(&amp;subspace.allocatorForSizeStep[0] - 1), scratchGPR2);
+        loadPtr(BaseIndex(scratchGPR2, scratchGPR1, timesPtr()), scratchGPR1);
+        
+        emitAllocate(resultGPR, nullptr, scratchGPR1, scratchGPR2, slowPath);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     template&lt;typename ClassType, typename StructureType&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitCCallHelpersh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/CCallHelpers.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/CCallHelpers.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/CCallHelpers.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -296,6 +296,15 @@
</span><span class="cx">         addCallArgument(arg3);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2, GPRReg arg3)
+    {
+        resetCallArguments();
+        addCallArgument(GPRInfo::callFrameRegister);
+        addCallArgument(arg1);
+        addCallArgument(arg2);
+        addCallArgument(arg3);
+    }
+
</ins><span class="cx">     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3)
</span><span class="cx">     {
</span><span class="cx">         resetCallArguments();
</span><span class="lines">@@ -1408,6 +1417,14 @@
</span><span class="cx">         move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2, GPRReg arg3)
+    {
+        move(arg3, GPRInfo::argumentGPR3);
+        move(arg1, GPRInfo::argumentGPR1);
+        move(arg2, GPRInfo::argumentGPR2);
+        move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
+    }
+
</ins><span class="cx">     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2, TrustedImm32 arg3)
</span><span class="cx">     {
</span><span class="cx">         move(arg1, GPRInfo::argumentGPR1);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitGCAwareJITStubRoutinecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/GCAwareJITStubRoutine.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;DFGCommonData.h&quot;
</span><span class="cx"> #include &quot;Heap.h&quot;
</span><span class="cx"> #include &quot;VM.h&quot;
</span><ins>+#include &quot;JITStubRoutineSet.h&quot;
</ins><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;SlotVisitor.h&quot;
</span><span class="cx"> #include &quot;Structure.h&quot;
</span><span class="lines">@@ -45,7 +46,7 @@
</span><span class="cx">     , m_mayBeExecuting(false)
</span><span class="cx">     , m_isJettisoned(false)
</span><span class="cx"> {
</span><del>-    vm.heap.m_jitStubRoutines.add(this);
</del><ins>+    vm.heap.m_jitStubRoutines-&gt;add(this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> GCAwareJITStubRoutine::~GCAwareJITStubRoutine() { }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx"> #include &quot;SuperSampler.h&quot;
</span><span class="cx"> #include &quot;TypeProfilerLog.h&quot;
</span><span class="cx"> #include &lt;wtf/CryptographicallyRandomNumber.h&gt;
</span><ins>+#include &lt;wtf/SimpleStats.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace std;
</span><span class="cx"> 
</span><span class="lines">@@ -66,6 +67,14 @@
</span><span class="cx">         newCalleeFunction);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JIT::CodeRef JIT::compileCTINativeCall(VM* vm, NativeFunction func)
+{
+    if (!vm-&gt;canUseJIT())
+        return CodeRef::createLLIntCodeRef(llint_native_call_trampoline);
+    JIT jit(vm, 0);
+    return jit.privateCompileCTINativeCall(vm, func);
+}
+
</ins><span class="cx"> JIT::JIT(VM* vm, CodeBlock* codeBlock)
</span><span class="cx">     : JSInterfaceJIT(vm, codeBlock)
</span><span class="cx">     , m_interpreter(vm-&gt;interpreter)
</span><span class="lines">@@ -786,7 +795,7 @@
</span><span class="cx">         patchBuffer,
</span><span class="cx">         (&quot;Baseline JIT code for %s&quot;, toCString(CodeBlockWithJITType(m_codeBlock, JITCode::BaselineJIT)).data()));
</span><span class="cx">     
</span><del>-    m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT.add(
</del><ins>+    m_vm-&gt;machineCodeBytesPerBytecodeWordForBaselineJIT-&gt;add(
</ins><span class="cx">         static_cast&lt;double&gt;(result.size()) /
</span><span class="cx">         static_cast&lt;double&gt;(m_instructions.size()));
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JIT.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -40,17 +40,17 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;CompactJITCodeMap.h&quot;
</span><del>-#include &quot;Interpreter.h&quot;
</del><span class="cx"> #include &quot;JITDisassembler.h&quot;
</span><span class="cx"> #include &quot;JITInlineCacheGenerator.h&quot;
</span><span class="cx"> #include &quot;JITMathIC.h&quot;
</span><span class="cx"> #include &quot;JSInterfaceJIT.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &quot;PCToCodeOriginMap.h&quot;
</span><span class="cx"> #include &quot;UnusedPointer.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+    enum OpcodeID : unsigned;
+
</ins><span class="cx">     class ArrayAllocationProfile;
</span><span class="cx">     class CallLinkInfo;
</span><span class="cx">     class CodeBlock;
</span><span class="lines">@@ -248,14 +248,7 @@
</span><span class="cx">             jit.privateCompileHasIndexedProperty(byValInfo, returnAddress, arrayMode);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        static CodeRef compileCTINativeCall(VM* vm, NativeFunction func)
-        {
-            if (!vm-&gt;canUseJIT()) {
-                return CodeRef::createLLIntCodeRef(llint_native_call_trampoline);
-            }
-            JIT jit(vm, 0);
-            return jit.privateCompileCTINativeCall(vm, func);
-        }
</del><ins>+        static CodeRef compileCTINativeCall(VM*, NativeFunction);
</ins><span class="cx"> 
</span><span class="cx">         static unsigned frameRegisterCountFor(CodeBlock*);
</span><span class="cx">         static int stackPointerOffsetFor(CodeBlock*);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITExceptionscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -90,4 +90,9 @@
</span><span class="cx">     RELEASE_ASSERT(catchRoutine);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void genericUnwind(VM* vm, ExecState* callFrame)
+{
+    genericUnwind(vm, callFrame, UnwindFromCurrentFrame);
+}
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITExceptionsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITExceptions.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,15 +26,15 @@
</span><span class="cx"> #ifndef JITExceptions_h
</span><span class="cx"> #define JITExceptions_h
</span><span class="cx"> 
</span><del>-#include &quot;Interpreter.h&quot;
-#include &quot;JSCJSValue.h&quot;
-
</del><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+enum UnwindStart : uint8_t;
+
</ins><span class="cx"> class ExecState;
</span><span class="cx"> class VM;
</span><span class="cx"> 
</span><del>-void genericUnwind(VM*, ExecState*, UnwindStart = UnwindFromCurrentFrame);
</del><ins>+void genericUnwind(VM*, ExecState*, UnwindStart);
+void genericUnwind(VM*, ExecState*);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOpcodescpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;CopiedSpaceInlines.h&quot;
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><span class="cx"> #include &quot;Heap.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JITInlines.h&quot;
</span><span class="cx"> #include &quot;JSArray.h&quot;
</span><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="lines">@@ -83,7 +84,7 @@
</span><span class="cx"> {
</span><span class="cx">     Structure* structure = currentInstruction[3].u.objectAllocationProfile-&gt;structure();
</span><span class="cx">     size_t allocationSize = JSFinalObject::allocationSize(structure-&gt;inlineCapacity());
</span><del>-    MarkedAllocator* allocator = &amp;m_vm-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</del><ins>+    MarkedAllocator* allocator = m_vm-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</ins><span class="cx"> 
</span><span class="cx">     RegisterID resultReg = regT0;
</span><span class="cx">     RegisterID allocatorReg = regT1;
</span><span class="lines">@@ -90,8 +91,10 @@
</span><span class="cx">     RegisterID scratchReg = regT2;
</span><span class="cx"> 
</span><span class="cx">     move(TrustedImmPtr(allocator), allocatorReg);
</span><ins>+    if (allocator)
+        addSlowCase(Jump());
</ins><span class="cx">     JumpList slowCases;
</span><del>-    emitAllocateJSObject(resultReg, allocatorReg, TrustedImmPtr(structure), TrustedImmPtr(0), scratchReg, slowCases);
</del><ins>+    emitAllocateJSObject(resultReg, allocator, allocatorReg, TrustedImmPtr(structure), TrustedImmPtr(0), scratchReg, slowCases);
</ins><span class="cx">     addSlowCase(slowCases);
</span><span class="cx">     emitPutVirtualRegister(currentInstruction[1].u.operand);
</span><span class="cx"> }
</span><span class="lines">@@ -99,6 +102,7 @@
</span><span class="cx"> void JIT::emitSlow_op_new_object(Instruction* currentInstruction, Vector&lt;SlowCaseEntry&gt;::iterator&amp; iter)
</span><span class="cx"> {
</span><span class="cx">     linkSlowCase(iter);
</span><ins>+    linkSlowCase(iter);
</ins><span class="cx">     int dst = currentInstruction[1].u.operand;
</span><span class="cx">     Structure* structure = currentInstruction[3].u.objectAllocationProfile-&gt;structure();
</span><span class="cx">     callOperation(operationNewObject, structure);
</span><span class="lines">@@ -772,7 +776,7 @@
</span><span class="cx">     hasSeenMultipleCallees.link(this);
</span><span class="cx"> 
</span><span class="cx">     JumpList slowCases;
</span><del>-    emitAllocateJSObject(resultReg, allocatorReg, structureReg, TrustedImmPtr(0), scratchReg, slowCases);
</del><ins>+    emitAllocateJSObject(resultReg, nullptr, allocatorReg, structureReg, TrustedImmPtr(0), scratchReg, slowCases);
</ins><span class="cx">     addSlowCase(slowCases);
</span><span class="cx">     emitPutVirtualRegister(currentInstruction[1].u.operand);
</span><span class="cx"> }
</span><span class="lines">@@ -782,7 +786,8 @@
</span><span class="cx">     linkSlowCase(iter); // Callee::m_type != JSFunctionType.
</span><span class="cx">     linkSlowCase(iter); // doesn't have rare data
</span><span class="cx">     linkSlowCase(iter); // doesn't have an allocation profile
</span><del>-    linkSlowCase(iter); // allocation failed
</del><ins>+    linkSlowCase(iter); // allocation failed (no allocator)
+    linkSlowCase(iter); // allocation failed (allocator empty)
</ins><span class="cx">     linkSlowCase(iter); // cached function didn't match
</span><span class="cx"> 
</span><span class="cx">     JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_create_this);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOpcodes32_64cpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> #include &quot;JSPropertyNameEnumerator.h&quot;
</span><span class="cx"> #include &quot;LinkBuffer.h&quot;
</span><span class="cx"> #include &quot;MaxFrameExtentForSlowPathCall.h&quot;
</span><ins>+#include &quot;Opcode.h&quot;
</ins><span class="cx"> #include &quot;SlowPathCall.h&quot;
</span><span class="cx"> #include &quot;TypeProfilerLog.h&quot;
</span><span class="cx"> #include &quot;VirtualRegister.h&quot;
</span><span class="lines">@@ -163,7 +164,7 @@
</span><span class="cx"> {
</span><span class="cx">     Structure* structure = currentInstruction[3].u.objectAllocationProfile-&gt;structure();
</span><span class="cx">     size_t allocationSize = JSFinalObject::allocationSize(structure-&gt;inlineCapacity());
</span><del>-    MarkedAllocator* allocator = &amp;m_vm-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</del><ins>+    MarkedAllocator* allocator = m_vm-&gt;heap.allocatorForObjectWithoutDestructor(allocationSize);
</ins><span class="cx"> 
</span><span class="cx">     RegisterID resultReg = returnValueGPR;
</span><span class="cx">     RegisterID allocatorReg = regT1;
</span><span class="lines">@@ -170,8 +171,10 @@
</span><span class="cx">     RegisterID scratchReg = regT3;
</span><span class="cx"> 
</span><span class="cx">     move(TrustedImmPtr(allocator), allocatorReg);
</span><ins>+    if (allocator)
+        addSlowCase(Jump());
</ins><span class="cx">     JumpList slowCases;
</span><del>-    emitAllocateJSObject(resultReg, allocatorReg, TrustedImmPtr(structure), TrustedImmPtr(0), scratchReg, slowCases);
</del><ins>+    emitAllocateJSObject(resultReg, allocator, allocatorReg, TrustedImmPtr(structure), TrustedImmPtr(0), scratchReg, slowCases);
</ins><span class="cx">     addSlowCase(slowCases);
</span><span class="cx">     emitStoreCell(currentInstruction[1].u.operand, resultReg);
</span><span class="cx"> }
</span><span class="lines">@@ -179,6 +182,7 @@
</span><span class="cx"> void JIT::emitSlow_op_new_object(Instruction* currentInstruction, Vector&lt;SlowCaseEntry&gt;::iterator&amp; iter)
</span><span class="cx"> {
</span><span class="cx">     linkSlowCase(iter);
</span><ins>+    linkSlowCase(iter);
</ins><span class="cx">     int dst = currentInstruction[1].u.operand;
</span><span class="cx">     Structure* structure = currentInstruction[3].u.objectAllocationProfile-&gt;structure();
</span><span class="cx">     callOperation(operationNewObject, structure);
</span><span class="lines">@@ -1032,7 +1036,7 @@
</span><span class="cx">     hasSeenMultipleCallees.link(this);
</span><span class="cx"> 
</span><span class="cx">     JumpList slowCases;
</span><del>-    emitAllocateJSObject(resultReg, allocatorReg, structureReg, TrustedImmPtr(0), scratchReg, slowCases);
</del><ins>+    emitAllocateJSObject(resultReg, nullptr, allocatorReg, structureReg, TrustedImmPtr(0), scratchReg, slowCases);
</ins><span class="cx">     addSlowCase(slowCases);
</span><span class="cx">     emitStoreCell(currentInstruction[1].u.operand, resultReg);
</span><span class="cx"> }
</span><span class="lines">@@ -1042,7 +1046,8 @@
</span><span class="cx">     linkSlowCase(iter); // Callee::m_type != JSFunctionType.
</span><span class="cx">     linkSlowCase(iter); // doesn't have rare data
</span><span class="cx">     linkSlowCase(iter); // doesn't have an allocation profile
</span><del>-    linkSlowCase(iter); // allocation failed
</del><ins>+    linkSlowCase(iter); // allocation failed (no allocator)
+    linkSlowCase(iter); // allocation failed (allocator empty)
</ins><span class="cx">     linkSlowCase(iter); // cached function didn't match
</span><span class="cx"> 
</span><span class="cx">     JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_create_this);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOperationscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -44,6 +44,7 @@
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;HostCallReturnValue.h&quot;
</span><span class="cx"> #include &quot;ICStats.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JIT.h&quot;
</span><span class="cx"> #include &quot;JITExceptions.h&quot;
</span><span class="cx"> #include &quot;JITToDFGDeferredCompilationCallback.h&quot;
</span><span class="lines">@@ -480,17 +481,6 @@
</span><span class="cx">         repatchPutByID(exec, baseObject, structure, ident, slot, *stubInfo, Direct);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JIT_OPERATION operationReallocateStorageAndFinishPut(ExecState* exec, JSObject* base, Structure* structure, PropertyOffset offset, EncodedJSValue value)
-{
-    VM&amp; vm = exec-&gt;vm();
-    NativeCallFrameTracer tracer(&amp;vm, exec);
-
-    ASSERT(structure-&gt;outOfLineCapacity() &gt; base-&gt;structure(vm)-&gt;outOfLineCapacity());
-    ASSERT(!vm.heap.storageAllocator().fastPathShouldSucceed(structure-&gt;outOfLineCapacity() * sizeof(JSValue)));
-    base-&gt;setStructureAndReallocateStorageIfNecessary(vm, structure);
-    base-&gt;putDirect(vm, offset, JSValue::decode(value));
-}
-
</del><span class="cx"> ALWAYS_INLINE static bool isStringOrSymbol(JSValue value)
</span><span class="cx"> {
</span><span class="cx">     return value.isString() || value.isSymbol();
</span><span class="lines">@@ -2157,7 +2147,6 @@
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!object-&gt;structure()-&gt;outOfLineCapacity());
</span><del>-    DeferGC deferGC(vm.heap);
</del><span class="cx">     Butterfly* result = object-&gt;growOutOfLineStorage(vm, 0, initialOutOfLineCapacity);
</span><span class="cx">     object-&gt;setButterflyWithoutChangingStructure(vm, result);
</span><span class="cx">     return reinterpret_cast&lt;char*&gt;(result);
</span><span class="lines">@@ -2168,7 +2157,6 @@
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     NativeCallFrameTracer tracer(&amp;vm, exec);
</span><span class="cx"> 
</span><del>-    DeferGC deferGC(vm.heap);
</del><span class="cx">     Butterfly* result = object-&gt;growOutOfLineStorage(vm, object-&gt;structure()-&gt;outOfLineCapacity(), newSize);
</span><span class="cx">     object-&gt;setButterflyWithoutChangingStructure(vm, result);
</span><span class="cx">     return reinterpret_cast&lt;char*&gt;(result);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITOperationsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITOperations.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -38,18 +38,27 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+typedef int64_t EncodedJSValue;
+    
</ins><span class="cx"> class ArrayAllocationProfile;
</span><span class="cx"> class ArrayProfile;
</span><ins>+class Butterfly;
</ins><span class="cx"> class CallLinkInfo;
</span><span class="cx"> class CodeBlock;
</span><span class="cx"> class ExecState;
</span><span class="cx"> class JITAddGenerator;
</span><span class="cx"> class JSArray;
</span><ins>+class JSCell;
</ins><span class="cx"> class JSFunction;
</span><ins>+class JSGlobalObject;
</ins><span class="cx"> class JSLexicalEnvironment;
</span><ins>+class JSObject;
</ins><span class="cx"> class JSScope;
</span><ins>+class JSString;
+class JSValue;
</ins><span class="cx"> class RegExpObject;
</span><span class="cx"> class Register;
</span><ins>+class Structure;
</ins><span class="cx"> class StructureStubInfo;
</span><span class="cx"> class SymbolTable;
</span><span class="cx"> class WatchpointSet;
</span><span class="lines">@@ -56,6 +65,7 @@
</span><span class="cx"> 
</span><span class="cx"> struct ByValInfo;
</span><span class="cx"> struct InlineCallFrame;
</span><ins>+struct Instruction;
</ins><span class="cx"> struct ArithProfile;
</span><span class="cx"> 
</span><span class="cx"> typedef ExecState CallFrame;
</span><span class="lines">@@ -72,6 +82,7 @@
</span><span class="cx">     Aap: ArrayAllocationProfile*
</span><span class="cx">     Ap: ArrayProfile*
</span><span class="cx">     Arp: ArithProfile*
</span><ins>+    B: Butterfly*
</ins><span class="cx">     By: ByValInfo*
</span><span class="cx">     C: JSCell*
</span><span class="cx">     Cb: CodeBlock*
</span><span class="lines">@@ -279,6 +290,7 @@
</span><span class="cx"> typedef char* (JIT_OPERATION *P_JITOperation_EStPS)(ExecState*, Structure*, void*, size_t);
</span><span class="cx"> typedef char* (JIT_OPERATION *P_JITOperation_EStSS)(ExecState*, Structure*, size_t, size_t);
</span><span class="cx"> typedef char* (JIT_OPERATION *P_JITOperation_EStZ)(ExecState*, Structure*, int32_t);
</span><ins>+typedef char* (JIT_OPERATION *P_JITOperation_EStZB)(ExecState*, Structure*, int32_t, Butterfly*);
</ins><span class="cx"> typedef char* (JIT_OPERATION *P_JITOperation_EZZ)(ExecState*, int32_t, int32_t);
</span><span class="cx"> typedef SlowPathReturnType (JIT_OPERATION *Sprt_JITOperation_ECli)(ExecState*, CallLinkInfo*);
</span><span class="cx"> typedef StringImpl* (JIT_OPERATION *T_JITOperation_EJss)(ExecState*, JSString*);
</span><span class="lines">@@ -320,7 +332,6 @@
</span><span class="cx"> void JIT_OPERATION operationPutByIdNonStrictBuildList(ExecState*, StructureStubInfo*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, UniquedStringImpl*) WTF_INTERNAL;
</span><span class="cx"> void JIT_OPERATION operationPutByIdDirectStrictBuildList(ExecState*, StructureStubInfo*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, UniquedStringImpl*) WTF_INTERNAL;
</span><span class="cx"> void JIT_OPERATION operationPutByIdDirectNonStrictBuildList(ExecState*, StructureStubInfo*, EncodedJSValue encodedValue, EncodedJSValue encodedBase, UniquedStringImpl*) WTF_INTERNAL;
</span><del>-void JIT_OPERATION operationReallocateStorageAndFinishPut(ExecState*, JSObject*, Structure*, PropertyOffset, EncodedJSValue) WTF_INTERNAL;
</del><span class="cx"> void JIT_OPERATION operationPutByValOptimize(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue, ByValInfo*) WTF_INTERNAL;
</span><span class="cx"> void JIT_OPERATION operationDirectPutByValOptimize(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue, ByValInfo*) WTF_INTERNAL;
</span><span class="cx"> void JIT_OPERATION operationPutByValGeneric(ExecState*, EncodedJSValue, EncodedJSValue, EncodedJSValue, ByValInfo*) WTF_INTERNAL;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITPropertyAccesscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITPropertyAccess.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITPropertyAccess.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITPropertyAccess.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1246,7 +1246,7 @@
</span><span class="cx"> 
</span><span class="cx"> void JIT::emitWriteBarrier(JSCell* owner)
</span><span class="cx"> {
</span><del>-    if (!MarkedBlock::blockFor(owner)-&gt;isMarked(owner)) {
</del><ins>+    if (!owner-&gt;cellContainer().isMarked(owner)) {
</ins><span class="cx">         Jump ownerIsRememberedOrInEden = jumpIfIsRememberedOrInEden(owner);
</span><span class="cx">         callOperation(operationUnconditionalWriteBarrier, owner);
</span><span class="cx">         ownerIsRememberedOrInEden.link(this);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITThunkscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,8 +30,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Executable.h&quot;
</span><span class="cx"> #include &quot;JIT.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;VM.h&quot;
</span><del>-#include &quot;JSCInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejitJITThunksh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jit/JITThunks.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CallData.h&quot;
</span><span class="cx"> #include &quot;Intrinsic.h&quot;
</span><del>-#include &quot;LowLevelInterpreter.h&quot;
</del><span class="cx"> #include &quot;MacroAssemblerCodeRef.h&quot;
</span><span class="cx"> #include &quot;ThunkGenerator.h&quot;
</span><span class="cx"> #include &quot;Weak.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorejsccpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jsc.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jsc.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/jsc.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -635,6 +635,8 @@
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionCheckModuleSyntax(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionPlatformSupportsSamplingProfiler(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionGenerateHeapSnapshot(ExecState*);
</span><ins>+static EncodedJSValue JSC_HOST_CALL functionResetSuperSamplerState(ExecState*);
+static EncodedJSValue JSC_HOST_CALL functionEnsureArrayStorage(ExecState*);
</ins><span class="cx"> #if ENABLE(SAMPLING_PROFILER)
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionStartSamplingProfiler(ExecState*);
</span><span class="cx"> static EncodedJSValue JSC_HOST_CALL functionSamplingProfilerStackTraces(ExecState*);
</span><span class="lines">@@ -869,6 +871,8 @@
</span><span class="cx"> 
</span><span class="cx">         addFunction(vm, &quot;platformSupportsSamplingProfiler&quot;, functionPlatformSupportsSamplingProfiler, 0);
</span><span class="cx">         addFunction(vm, &quot;generateHeapSnapshot&quot;, functionGenerateHeapSnapshot, 0);
</span><ins>+        addFunction(vm, &quot;resetSuperSamplerState&quot;, functionResetSuperSamplerState, 0);
+        addFunction(vm, &quot;ensureArrayStorage&quot;, functionEnsureArrayStorage, 0);
</ins><span class="cx"> #if ENABLE(SAMPLING_PROFILER)
</span><span class="cx">         addFunction(vm, &quot;startSamplingProfiler&quot;, functionStartSamplingProfiler, 0);
</span><span class="cx">         addFunction(vm, &quot;samplingProfilerStackTraces&quot;, functionSamplingProfilerStackTraces, 0);
</span><span class="lines">@@ -1204,7 +1208,7 @@
</span><span class="cx">     JSObject* object = jsDynamicCast&lt;JSObject*&gt;(exec-&gt;argument(0));
</span><span class="cx">     if (!object)
</span><span class="cx">         return JSValue::encode(jsNontrivialString(exec, ASCIILiteral(&quot;&lt;not object&gt;&quot;)));
</span><del>-    return JSValue::encode(jsNontrivialString(exec, toString(&quot;&lt;Public length: &quot;, object-&gt;getArrayLength(), &quot;; vector length: &quot;, object-&gt;getVectorLength(), &quot;&gt;&quot;)));
</del><ins>+    return JSValue::encode(jsNontrivialString(exec, toString(&quot;&lt;Butterfly: &quot;, RawPointer(object-&gt;butterfly()), &quot;; public length: &quot;, object-&gt;getArrayLength(), &quot;; vector length: &quot;, object-&gt;getVectorLength(), &quot;&gt;&quot;)));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> class FunctionJSCStackFunctor {
</span><span class="lines">@@ -1951,6 +1955,21 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+EncodedJSValue JSC_HOST_CALL functionResetSuperSamplerState(ExecState*)
+{
+    resetSuperSamplerState();
+    return JSValue::encode(jsUndefined());
+}
+
+EncodedJSValue JSC_HOST_CALL functionEnsureArrayStorage(ExecState* exec)
+{
+    for (unsigned i = 0; i &lt; exec-&gt;argumentCount(); ++i) {
+        if (JSObject* object = jsDynamicCast&lt;JSObject*&gt;(exec-&gt;argument(0)))
+            object-&gt;ensureArrayStorage(exec-&gt;vm());
+    }
+    return JSValue::encode(jsUndefined());
+}
+
</ins><span class="cx"> #if ENABLE(SAMPLING_PROFILER)
</span><span class="cx"> EncodedJSValue JSC_HOST_CALL functionStartSamplingProfiler(ExecState* exec)
</span><span class="cx"> {
</span><span class="lines">@@ -2062,10 +2081,7 @@
</span><span class="cx">     TRY
</span><span class="cx">         res = jscmain(argc, argv);
</span><span class="cx">     EXCEPT(res = 3)
</span><del>-    if (Options::logHeapStatisticsAtExit())
-        HeapStatistics::reportSuccess();
-    if (Options::reportLLIntStats())
-        LLInt::Data::finalizeStats();
</del><ins>+    finalizeStatsAtEndOfTesting();
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(EFL)
</span><span class="cx">     ecore_shutdown();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntDatacpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntData.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntData.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntData.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -211,7 +211,7 @@
</span><span class="cx">     STATIC_ASSERT(GetPutInfo::initializationShift == 10);
</span><span class="cx">     STATIC_ASSERT(GetPutInfo::initializationBits == 0xffc00);
</span><span class="cx"> 
</span><del>-    STATIC_ASSERT(MarkedBlock::blockMask == ~static_cast&lt;decltype(MarkedBlock::blockMask)&gt;(0x3fff));
</del><ins>+    STATIC_ASSERT(MarkedBlock::blockSize == 16 * 1024);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(bitwise_cast&lt;uintptr_t&gt;(ShadowChicken::Packet::tailMarker()) == static_cast&lt;uintptr_t&gt;(0x7a11));
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntExceptionscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntExceptions.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntExceptions.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntExceptions.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;Instruction.h&quot;
</span><span class="cx"> #include &quot;LLIntCommon.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;LowLevelInterpreter.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntThunkscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;JSInterfaceJIT.h&quot;
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;LLIntCLoop.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;LinkBuffer.h&quot;
</span><span class="cx"> #include &quot;LowLevelInterpreter.h&quot;
</span><span class="cx"> #include &quot;ProtoCallFrame.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLLIntThunksh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LLIntThunks.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> class VM;
</span><span class="cx"> struct ProtoCallFrame;
</span><ins>+typedef int64_t EncodedJSValue;
</ins><span class="cx"> 
</span><span class="cx"> extern &quot;C&quot; {
</span><span class="cx">     EncodedJSValue vmEntryToJavaScript(void*, VM*, ProtoCallFrame*);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1068,24 +1068,6 @@
</span><span class="cx"> .argumentProfileDone:
</span><span class="cx"> end
</span><span class="cx"> 
</span><del>-macro allocateJSObject(allocator, structure, result, scratch1, slowCase)
-    const offsetOfFirstFreeCell = 
-        MarkedAllocator::m_freeList + 
-        MarkedBlock::FreeList::head
-
-    # Get the object from the free list.   
-    loadp offsetOfFirstFreeCell[allocator], result
-    btpz result, slowCase
-    
-    # Remove the object from the free list.
-    loadp [result], scratch1
-    storep scratch1, offsetOfFirstFreeCell[allocator]
-
-    # Initialize the object.
-    storep 0, JSObject::m_butterfly[result]
-    storeStructureWithTypeInfo(result, structure, scratch1)
-end
-
</del><span class="cx"> macro doReturn()
</span><span class="cx">     restoreCalleeSavesUsedByLLInt()
</span><span class="cx">     restoreCallerPCAndCFR()
</span><span class="lines">@@ -1307,6 +1289,18 @@
</span><span class="cx">     dispatch(2)
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+_llint_op_create_this:
+    traceExecution()
+    callOpcodeSlowPath(_slow_path_create_this)
+    dispatch(5)
+
+
+_llint_op_new_object:
+    traceExecution()
+    callOpcodeSlowPath(_llint_slow_path_new_object)
+    dispatch(4)
+
+
</ins><span class="cx"> _llint_op_new_func:
</span><span class="cx">     traceExecution()
</span><span class="cx">     callOpcodeSlowPath(_llint_slow_path_new_func)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpretercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -25,13 +25,17 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;LowLevelInterpreter.h&quot;
</span><ins>+
</ins><span class="cx"> #include &quot;LLIntOfflineAsmConfig.h&quot;
</span><span class="cx"> #include &lt;wtf/InlineASM.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if !ENABLE(JIT)
</span><ins>+#include &quot;CLoopStackInlines.h&quot;
</ins><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><span class="cx"> #include &quot;CommonSlowPaths.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;LLIntCLoop.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;LLIntSlowPaths.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &lt;wtf/Assertions.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpreter32_64asm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -305,7 +305,7 @@
</span><span class="cx"> _handleUncaughtException:
</span><span class="cx">     loadp Callee + PayloadOffset[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">     restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)
</span><span class="cx">     loadp VM::callFrameForCatch[t3], cfr
</span><span class="cx">     storep 0, VM::callFrameForCatch[t3]
</span><span class="lines">@@ -653,7 +653,7 @@
</span><span class="cx"> macro branchIfException(label)
</span><span class="cx">     loadp Callee + PayloadOffset[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">     btiz VM::m_exception[t3], .noException
</span><span class="cx">     jmp label
</span><span class="cx"> .noException:
</span><span class="lines">@@ -702,31 +702,6 @@
</span><span class="cx">     dispatch(2)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-_llint_op_create_this:
-    traceExecution()
-    loadi 8[PC], t0
-    loadp PayloadOffset[cfr, t0, 8], t0
-    bbneq JSCell::m_type[t0], JSFunctionType, .opCreateThisSlow
-    loadp JSFunction::m_rareData[t0], t5
-    btpz t5, .opCreateThisSlow
-    loadp FunctionRareData::m_objectAllocationProfile + ObjectAllocationProfile::m_allocator[t5], t1
-    loadp FunctionRareData::m_objectAllocationProfile + ObjectAllocationProfile::m_structure[t5], t2
-    btpz t1, .opCreateThisSlow
-    loadpFromInstruction(4, t5)
-    bpeq t5, 1, .hasSeenMultipleCallee
-    bpneq t5, t0, .opCreateThisSlow
-.hasSeenMultipleCallee:
-    allocateJSObject(t1, t2, t0, t3, .opCreateThisSlow)
-    loadi 4[PC], t1
-    storei CellTag, TagOffset[cfr, t1, 8]
-    storei t0, PayloadOffset[cfr, t1, 8]
-    dispatch(5)
-
-.opCreateThisSlow:
-    callOpcodeSlowPath(_slow_path_create_this)
-    dispatch(5)
-
-
</del><span class="cx"> _llint_op_to_this:
</span><span class="cx">     traceExecution()
</span><span class="cx">     loadi 4[PC], t0
</span><span class="lines">@@ -742,22 +717,6 @@
</span><span class="cx">     dispatch(4)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-_llint_op_new_object:
-    traceExecution()
-    loadpFromInstruction(3, t0)
-    loadp ObjectAllocationProfile::m_allocator[t0], t1
-    loadp ObjectAllocationProfile::m_structure[t0], t2
-    allocateJSObject(t1, t2, t0, t3, .opNewObjectSlow)
-    loadi 4[PC], t1
-    storei CellTag, TagOffset[cfr, t1, 8]
-    storei t0, PayloadOffset[cfr, t1, 8]
-    dispatch(4)
-
-.opNewObjectSlow:
-    callOpcodeSlowPath(_llint_slow_path_new_object)
-    dispatch(4)
-
-
</del><span class="cx"> _llint_op_check_tdz:
</span><span class="cx">     traceExecution()
</span><span class="cx">     loadisFromInstruction(1, t0)
</span><span class="lines">@@ -1997,7 +1956,7 @@
</span><span class="cx">     # and have set VM::targetInterpreterPCForThrow.
</span><span class="cx">     loadp Callee + PayloadOffset[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">     restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)
</span><span class="cx">     loadp VM::callFrameForCatch[t3], cfr
</span><span class="cx">     storep 0, VM::callFrameForCatch[t3]
</span><span class="lines">@@ -2012,7 +1971,7 @@
</span><span class="cx"> .isCatchableException:
</span><span class="cx">     loadp Callee + PayloadOffset[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx"> 
</span><span class="cx">     loadi VM::m_exception[t3], t0
</span><span class="cx">     storei 0, VM::m_exception[t3]
</span><span class="lines">@@ -2047,7 +2006,7 @@
</span><span class="cx">     # This essentially emulates the JIT's throwing protocol.
</span><span class="cx">     loadp Callee[cfr], t1
</span><span class="cx">     andp MarkedBlockMask, t1
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t1
</del><ins>+    loadp MarkedBlock::m_vm[t1], t1
</ins><span class="cx">     copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)
</span><span class="cx">     jmp VM::targetMachinePCForThrow[t1]
</span><span class="cx"> 
</span><span class="lines">@@ -2066,7 +2025,7 @@
</span><span class="cx">     if X86 or X86_WIN
</span><span class="cx">         subp 8, sp # align stack pointer
</span><span class="cx">         andp MarkedBlockMask, t1
</span><del>-        loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t3
</del><ins>+        loadp MarkedBlock::m_vm[t1], t3
</ins><span class="cx">         storep cfr, VM::topCallFrame[t3]
</span><span class="cx">         move cfr, a0  # a0 = ecx
</span><span class="cx">         storep a0, [sp]
</span><span class="lines">@@ -2076,13 +2035,13 @@
</span><span class="cx">         call executableOffsetToFunction[t1]
</span><span class="cx">         loadp Callee + PayloadOffset[cfr], t3
</span><span class="cx">         andp MarkedBlockMask, t3
</span><del>-        loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+        loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">         addp 8, sp
</span><span class="cx">     elsif ARM or ARMv7 or ARMv7_TRADITIONAL or C_LOOP or MIPS or SH4
</span><span class="cx">         subp 8, sp # align stack pointer
</span><span class="cx">         # t1 already contains the Callee.
</span><span class="cx">         andp MarkedBlockMask, t1
</span><del>-        loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t1
</del><ins>+        loadp MarkedBlock::m_vm[t1], t1
</ins><span class="cx">         storep cfr, VM::topCallFrame[t1]
</span><span class="cx">         move cfr, a0
</span><span class="cx">         loadi Callee + PayloadOffset[cfr], t1
</span><span class="lines">@@ -2095,7 +2054,7 @@
</span><span class="cx">         end
</span><span class="cx">         loadp Callee + PayloadOffset[cfr], t3
</span><span class="cx">         andp MarkedBlockMask, t3
</span><del>-        loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+        loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">         addp 8, sp
</span><span class="cx">     else
</span><span class="cx">         error
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -277,7 +277,7 @@
</span><span class="cx"> _handleUncaughtException:
</span><span class="cx">     loadp Callee[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">     restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)
</span><span class="cx">     loadp VM::callFrameForCatch[t3], cfr
</span><span class="cx">     storep 0, VM::callFrameForCatch[t3]
</span><span class="lines">@@ -559,7 +559,7 @@
</span><span class="cx"> macro branchIfException(label)
</span><span class="cx">     loadp Callee[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">     btqz VM::m_exception[t3], .noException
</span><span class="cx">     jmp label
</span><span class="cx"> .noException:
</span><span class="lines">@@ -607,30 +607,6 @@
</span><span class="cx">     dispatch(2)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-_llint_op_create_this:
-    traceExecution()
-    loadisFromInstruction(2, t0)
-    loadp [cfr, t0, 8], t0
-    bbneq JSCell::m_type[t0], JSFunctionType, .opCreateThisSlow
-    loadp JSFunction::m_rareData[t0], t3
-    btpz t3, .opCreateThisSlow
-    loadp FunctionRareData::m_objectAllocationProfile + ObjectAllocationProfile::m_allocator[t3], t1
-    loadp FunctionRareData::m_objectAllocationProfile + ObjectAllocationProfile::m_structure[t3], t2
-    btpz t1, .opCreateThisSlow
-    loadpFromInstruction(4, t3)
-    bpeq t3, 1, .hasSeenMultipleCallee
-    bpneq t3, t0, .opCreateThisSlow
-.hasSeenMultipleCallee:
-    allocateJSObject(t1, t2, t0, t3, .opCreateThisSlow)
-    loadisFromInstruction(1, t1)
-    storeq t0, [cfr, t1, 8]
-    dispatch(5)
-
-.opCreateThisSlow:
-    callOpcodeSlowPath(_slow_path_create_this)
-    dispatch(5)
-
-
</del><span class="cx"> _llint_op_to_this:
</span><span class="cx">     traceExecution()
</span><span class="cx">     loadisFromInstruction(1, t0)
</span><span class="lines">@@ -647,21 +623,6 @@
</span><span class="cx">     dispatch(4)
</span><span class="cx"> 
</span><span class="cx"> 
</span><del>-_llint_op_new_object:
-    traceExecution()
-    loadpFromInstruction(3, t0)
-    loadp ObjectAllocationProfile::m_allocator[t0], t1
-    loadp ObjectAllocationProfile::m_structure[t0], t2
-    allocateJSObject(t1, t2, t0, t3, .opNewObjectSlow)
-    loadisFromInstruction(1, t1)
-    storeq t0, [cfr, t1, 8]
-    dispatch(4)
-
-.opNewObjectSlow:
-    callOpcodeSlowPath(_llint_slow_path_new_object)
-    dispatch(4)
-
-
</del><span class="cx"> _llint_op_check_tdz:
</span><span class="cx">     traceExecution()
</span><span class="cx">     loadisFromInstruction(1, t0)
</span><span class="lines">@@ -1958,7 +1919,7 @@
</span><span class="cx">     # and have set VM::targetInterpreterPCForThrow.
</span><span class="cx">     loadp Callee[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx">     restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(t3, t0)
</span><span class="cx">     loadp VM::callFrameForCatch[t3], cfr
</span><span class="cx">     storep 0, VM::callFrameForCatch[t3]
</span><span class="lines">@@ -1977,7 +1938,7 @@
</span><span class="cx"> .isCatchableException:
</span><span class="cx">     loadp Callee[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx"> 
</span><span class="cx">     loadq VM::m_exception[t3], t0
</span><span class="cx">     storeq 0, VM::m_exception[t3]
</span><span class="lines">@@ -2004,7 +1965,7 @@
</span><span class="cx"> _llint_throw_from_slow_path_trampoline:
</span><span class="cx">     loadp Callee[cfr], t1
</span><span class="cx">     andp MarkedBlockMask, t1
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t1
</del><ins>+    loadp MarkedBlock::m_vm[t1], t1
</ins><span class="cx">     copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)
</span><span class="cx"> 
</span><span class="cx">     callSlowPath(_llint_slow_path_handle_exception)
</span><span class="lines">@@ -2014,7 +1975,7 @@
</span><span class="cx">     # This essentially emulates the JIT's throwing protocol.
</span><span class="cx">     loadp Callee[cfr], t1
</span><span class="cx">     andp MarkedBlockMask, t1
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t1
</del><ins>+    loadp MarkedBlock::m_vm[t1], t1
</ins><span class="cx">     jmp VM::targetMachinePCForThrow[t1]
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -2029,7 +1990,7 @@
</span><span class="cx">     storep 0, CodeBlock[cfr]
</span><span class="cx">     loadp Callee[cfr], t0
</span><span class="cx">     andp MarkedBlockMask, t0, t1
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t1
</del><ins>+    loadp MarkedBlock::m_vm[t1], t1
</ins><span class="cx">     storep cfr, VM::topCallFrame[t1]
</span><span class="cx">     if ARM64 or C_LOOP
</span><span class="cx">         storep lr, ReturnPC[cfr]
</span><span class="lines">@@ -2051,7 +2012,7 @@
</span><span class="cx">     end
</span><span class="cx">     loadp Callee[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><del>-    loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</del><ins>+    loadp MarkedBlock::m_vm[t3], t3
</ins><span class="cx"> 
</span><span class="cx">     functionEpilogue()
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreparserModuleAnalyzercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/ModuleAnalyzer.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/ModuleAnalyzer.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/ModuleAnalyzer.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,9 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;ModuleAnalyzer.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;IdentifierInlines.h&quot;
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSModuleRecord.h&quot;
</span><span class="cx"> #include &quot;ModuleScopeData.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreparserNodeConstructorsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/NodeConstructors.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/NodeConstructors.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/NodeConstructors.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -23,6 +23,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Nodes.h&quot;
</span><span class="cx"> #include &quot;Lexer.h&quot;
</span><ins>+#include &quot;Opcode.h&quot;
</ins><span class="cx"> #include &quot;Parser.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreparserNodesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/Nodes.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/Nodes.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/parser/Nodes.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;JITCode.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &quot;ParserArena.h&quot;
</span><span class="cx"> #include &quot;ParserTokens.h&quot;
</span><span class="cx"> #include &quot;ResultType.h&quot;
</span><span class="lines">@@ -41,6 +40,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+    enum OpcodeID : unsigned;
+
</ins><span class="cx">     class ArgumentListNode;
</span><span class="cx">     class BytecodeGenerator;
</span><span class="cx">     class FunctionMetadataNode;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreprofilerProfilerBytecodecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><ins>+#include &quot;Opcode.h&quot;
</ins><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace Profiler {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreprofilerProfilerBytecodeh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecode.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,11 +27,14 @@
</span><span class="cx"> #define ProfilerBytecode_h
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><del>-#include &quot;Opcode.h&quot;
</del><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><del>-namespace JSC { namespace Profiler {
</del><ins>+namespace JSC {
</ins><span class="cx"> 
</span><ins>+enum OpcodeID : unsigned;
+
+namespace Profiler {
+
</ins><span class="cx"> class Bytecode {
</span><span class="cx"> public:
</span><span class="cx">     Bytecode()
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreprofilerProfilerBytecodeSequencecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecodeSequence.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecodeSequence.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/profiler/ProfilerBytecodeSequence.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,9 +27,10 @@
</span><span class="cx"> #include &quot;ProfilerBytecodeSequence.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;Operands.h&quot;
</span><del>-#include &quot;JSCInlines.h&quot;
</del><span class="cx"> #include &lt;wtf/StringPrintStream.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace Profiler {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayConventionscppfromrev205702releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeECMAScriptSpecInternalFunctionscpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.cpp (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ECMAScriptSpecInternalFunctions.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;ArrayConventions.h&quot;
+
+#include &quot;JSCInlines.h&quot;
+
+namespace JSC {
+
+#if USE(JSVALUE64)
+void clearArrayMemset(WriteBarrier&lt;Unknown&gt;* base, unsigned count)
+{
+#if CPU(X86_64)
+    uint64_t zero = 0;
+    asm volatile (
+        &quot;rep stosq\n\t&quot;
+        : &quot;+D&quot;(base), &quot;+c&quot;(count)
+        : &quot;a&quot;(zero)
+        : &quot;memory&quot;
+        );
+#else // not CPU(X86_64)
+    memset(base, 0, count * sizeof(WriteBarrier&lt;Unknown&gt;));
+#endif // generic CPU
+}
+
+void clearArrayMemset(double* base, unsigned count)
+{
+#if CPU(X86_64)
+    uint64_t pnan = bitwise_cast&lt;uint64_t&gt;(PNaN);
+    asm volatile (
+        &quot;rep stosq\n\t&quot;
+        : &quot;+D&quot;(base), &quot;+c&quot;(count)
+        : &quot;a&quot;(pnan)
+        : &quot;memory&quot;
+        );
+#else // not CPU(X86_64)
+    // Oh no, we can't actually do any better than this!
+    for (unsigned i = count; i--;)
+        base[i] = PNaN;
+#endif // generic CPU
+}
+#endif // USE(JSVALUE64)
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayConventionsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayConventions.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
</span><del>- *  Copyright (C) 2003, 2007, 2008, 2009, 2012 Apple Inc. All rights reserved.
</del><ins>+ *  Copyright (C) 2003, 2007, 2008, 2009, 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  *  This library is free software; you can redistribute it and/or
</span><span class="cx">  *  modify it under the terms of the GNU Lesser General Public
</span><span class="lines">@@ -70,13 +70,15 @@
</span><span class="cx"> // 0xFFFFFFFF is a bit weird -- is not an array index even though it's an integer.
</span><span class="cx"> #define MAX_ARRAY_INDEX 0xFFFFFFFEU
</span><span class="cx"> 
</span><del>-// The value BASE_VECTOR_LEN is the maximum number of vector elements we'll allocate
</del><ins>+// The value BASE_XXX_VECTOR_LEN is the maximum number of vector elements we'll allocate
</ins><span class="cx"> // for an array that was created with a sepcified length (e.g. a = new Array(123))
</span><del>-#define BASE_VECTOR_LEN 4U
-    
</del><ins>+#define BASE_CONTIGUOUS_VECTOR_LEN 3U
+#define BASE_CONTIGUOUS_VECTOR_LEN_EMPTY 5U
+#define BASE_ARRAY_STORAGE_VECTOR_LEN 4U
+
</ins><span class="cx"> // The upper bound to the size we'll grow a zero length array when the first element
</span><span class="cx"> // is added.
</span><del>-#define FIRST_VECTOR_GROW 4U
</del><ins>+#define FIRST_ARRAY_STORAGE_VECTOR_GROW 4U
</ins><span class="cx"> 
</span><span class="cx"> #define MIN_BEYOND_LENGTH_SPARSE_INDEX 1000
</span><span class="cx"> 
</span><span class="lines">@@ -96,7 +98,7 @@
</span><span class="cx">     return i &gt;= MIN_BEYOND_LENGTH_SPARSE_INDEX &amp;&amp; i &gt; length;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline IndexingHeader indexingHeaderForArray(unsigned length, unsigned vectorLength)
</del><ins>+inline IndexingHeader indexingHeaderForArrayStorage(unsigned length, unsigned vectorLength)
</ins><span class="cx"> {
</span><span class="cx">     IndexingHeader result;
</span><span class="cx">     result.setPublicLength(length);
</span><span class="lines">@@ -104,11 +106,44 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline IndexingHeader baseIndexingHeaderForArray(unsigned length)
</del><ins>+inline IndexingHeader baseIndexingHeaderForArrayStorage(unsigned length)
</ins><span class="cx"> {
</span><del>-    return indexingHeaderForArray(length, BASE_VECTOR_LEN);
</del><ins>+    return indexingHeaderForArrayStorage(length, BASE_ARRAY_STORAGE_VECTOR_LEN);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if USE(JSVALUE64)
+JS_EXPORT_PRIVATE void clearArrayMemset(WriteBarrier&lt;Unknown&gt;* base, unsigned count);
+JS_EXPORT_PRIVATE void clearArrayMemset(double* base, unsigned count);
+#endif // USE(JSVALUE64)
+
+ALWAYS_INLINE void clearArray(WriteBarrier&lt;Unknown&gt;* base, unsigned count)
+{
+#if USE(JSVALUE64)
+    const unsigned minCountForMemset = 100;
+    if (count &gt;= minCountForMemset) {
+        clearArrayMemset(base, count);
+        return;
+    }
+#endif
+    
+    for (unsigned i = count; i--;)
+        base[i].clear();
+}
+
+ALWAYS_INLINE void clearArray(double* base, unsigned count)
+{
+#if USE(JSVALUE64)
+    const unsigned minCountForMemset = 100;
+    if (count &gt;= minCountForMemset) {
+        clearArrayMemset(base, count);
+        return;
+    }
+#endif
+    
+    for (unsigned i = count; i--;)
+        base[i] = PNaN;
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // ArrayConventions_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1006,7 +1006,7 @@
</span><span class="cx">         if (UNLIKELY(vm.exception()))
</span><span class="cx">             return JSValue::encode(jsUndefined());
</span><span class="cx">     }
</span><del>-
</del><ins>+    
</ins><span class="cx">     setLength(exec, thisObj, length - deleteCount + additionalArgs);
</span><span class="cx">     return JSValue::encode(result);
</span><span class="cx"> }
</span><span class="lines">@@ -1143,6 +1143,7 @@
</span><span class="cx">     unsigned firstArraySize = firstButterfly-&gt;publicLength();
</span><span class="cx"> 
</span><span class="cx">     IndexingType type = first-&gt;mergeIndexingTypeForCopying(indexingTypeForValue(second) | IsArray);
</span><ins>+    
</ins><span class="cx">     if (type == NonArray)
</span><span class="cx">         type = first-&gt;indexingType();
</span><span class="cx"> 
</span><span class="lines">@@ -1171,7 +1172,7 @@
</span><span class="cx">     auto scope = DECLARE_THROW_SCOPE(vm);
</span><span class="cx"> 
</span><span class="cx">     JSArray* firstArray = jsCast&lt;JSArray*&gt;(exec-&gt;uncheckedArgument(0));
</span><del>-
</del><ins>+    
</ins><span class="cx">     // This code assumes that neither array has set Symbol.isConcatSpreadable. If the first array
</span><span class="cx">     // has indexed accessors then one of those accessors might change the value of Symbol.isConcatSpreadable
</span><span class="cx">     // on the second argument.
</span><span class="lines">@@ -1187,7 +1188,7 @@
</span><span class="cx">         return concatAppendOne(exec, vm, firstArray, second);
</span><span class="cx"> 
</span><span class="cx">     JSArray* secondArray = jsCast&lt;JSArray*&gt;(second);
</span><del>-
</del><ins>+    
</ins><span class="cx">     Butterfly* firstButterfly = firstArray-&gt;butterfly();
</span><span class="cx">     Butterfly* secondButterfly = secondArray-&gt;butterfly();
</span><span class="cx"> 
</span><span class="lines">@@ -1194,7 +1195,8 @@
</span><span class="cx">     unsigned firstArraySize = firstButterfly-&gt;publicLength();
</span><span class="cx">     unsigned secondArraySize = secondButterfly-&gt;publicLength();
</span><span class="cx"> 
</span><del>-    IndexingType type = firstArray-&gt;mergeIndexingTypeForCopying(secondArray-&gt;indexingType());
</del><ins>+    IndexingType secondType = secondArray-&gt;indexingType();
+    IndexingType type = firstArray-&gt;mergeIndexingTypeForCopying(secondType);
</ins><span class="cx">     if (type == NonArray || !firstArray-&gt;canFastCopy(vm, secondArray) || firstArraySize + secondArraySize &gt;= MIN_SPARSE_ARRAY_INDEX) {
</span><span class="cx">         JSArray* result = constructEmptyArray(exec, nullptr, firstArraySize + secondArraySize);
</span><span class="cx">         if (vm.exception())
</span><span class="lines">@@ -1213,7 +1215,7 @@
</span><span class="cx">     JSArray* result = JSArray::tryCreateUninitialized(vm, resultStructure, firstArraySize + secondArraySize);
</span><span class="cx">     if (!result)
</span><span class="cx">         return JSValue::encode(throwOutOfMemoryError(exec, scope));
</span><del>-
</del><ins>+    
</ins><span class="cx">     if (type == ArrayWithDouble) {
</span><span class="cx">         double* buffer = result-&gt;butterfly()-&gt;contiguousDouble().data();
</span><span class="cx">         memcpy(buffer, firstButterfly-&gt;contiguousDouble().data(), sizeof(JSValue) * firstArraySize);
</span><span class="lines">@@ -1221,7 +1223,12 @@
</span><span class="cx">     } else if (type != ArrayWithUndecided) {
</span><span class="cx">         WriteBarrier&lt;Unknown&gt;* buffer = result-&gt;butterfly()-&gt;contiguous().data();
</span><span class="cx">         memcpy(buffer, firstButterfly-&gt;contiguous().data(), sizeof(JSValue) * firstArraySize);
</span><del>-        memcpy(buffer + firstArraySize, secondButterfly-&gt;contiguous().data(), sizeof(JSValue) * secondArraySize);
</del><ins>+        if (secondType != ArrayWithUndecided)
+            memcpy(buffer + firstArraySize, secondButterfly-&gt;contiguous().data(), sizeof(JSValue) * secondArraySize);
+        else {
+            for (unsigned i = secondArraySize; i--;)
+                buffer[i + firstArraySize].clear();
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     result-&gt;butterfly()-&gt;setPublicLength(firstArraySize + secondArraySize);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeArrayStorageh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayStorage.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayStorage.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ArrayStorage.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,7 +29,9 @@
</span><span class="cx"> #include &quot;ArrayConventions.h&quot;
</span><span class="cx"> #include &quot;Butterfly.h&quot;
</span><span class="cx"> #include &quot;IndexingHeader.h&quot;
</span><ins>+#include &quot;MarkedSpace.h&quot;
</ins><span class="cx"> #include &quot;SparseArrayValueMap.h&quot;
</span><ins>+#include &quot;Structure.h&quot;
</ins><span class="cx"> #include &quot;WriteBarrier.h&quot;
</span><span class="cx"> #include &lt;wtf/Noncopyable.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -58,7 +60,7 @@
</span><span class="cx">     // We steal two fields from the indexing header: vectorLength and length.
</span><span class="cx">     unsigned length() const { return indexingHeader()-&gt;publicLength(); }
</span><span class="cx">     void setLength(unsigned length) { indexingHeader()-&gt;setPublicLength(length); }
</span><del>-    unsigned vectorLength() { return indexingHeader()-&gt;vectorLength(); }
</del><ins>+    unsigned vectorLength() const { return indexingHeader()-&gt;vectorLength(); }
</ins><span class="cx">     void setVectorLength(unsigned length) { indexingHeader()-&gt;setVectorLength(length); }
</span><span class="cx">     
</span><span class="cx">     ALWAYS_INLINE void copyHeaderFromDuringGC(const ArrayStorage&amp; other)
</span><span class="lines">@@ -99,6 +101,66 @@
</span><span class="cx">     {
</span><span class="cx">         return ArrayStorage::vectorOffset() + vectorLength * sizeof(WriteBarrier&lt;Unknown&gt;);
</span><span class="cx">     }
</span><ins>+    
+    static size_t totalSizeFor(unsigned indexBias, size_t propertyCapacity, unsigned vectorLength)
+    {
+        return Butterfly::totalSize(indexBias, propertyCapacity, true, sizeFor(vectorLength));
+    }
+    
+    size_t totalSize(size_t propertyCapacity) const
+    {
+        return totalSizeFor(m_indexBias, propertyCapacity, vectorLength());
+    }
+    
+    size_t totalSize(Structure* structure) const
+    {
+        return totalSize(structure-&gt;outOfLineCapacity());
+    }
+    
+    static unsigned availableVectorLength(unsigned indexBias, size_t propertyCapacity, unsigned vectorLength)
+    {
+        size_t cellSize = MarkedSpace::optimalSizeFor(totalSizeFor(indexBias, propertyCapacity, vectorLength));
+        
+        vectorLength = (cellSize - totalSizeFor(indexBias, propertyCapacity, 0)) / sizeof(WriteBarrier&lt;Unknown&gt;);
+
+        return vectorLength;
+    }
+    
+    static unsigned availableVectorLength(unsigned indexBias, Structure* structure, unsigned vectorLength)
+    {
+        return availableVectorLength(indexBias, structure-&gt;outOfLineCapacity(), vectorLength);
+    }
+    
+    unsigned availableVectorLength(size_t propertyCapacity, unsigned vectorLength)
+    {
+        return availableVectorLength(m_indexBias, propertyCapacity, vectorLength);
+    }
+    
+    unsigned availableVectorLength(Structure* structure, unsigned vectorLength)
+    {
+        return availableVectorLength(structure-&gt;outOfLineCapacity(), vectorLength);
+    }
+
+    static unsigned optimalVectorLength(unsigned indexBias, size_t propertyCapacity, unsigned vectorLength)
+    {
+        vectorLength = std::max(BASE_ARRAY_STORAGE_VECTOR_LEN, vectorLength);
+        return availableVectorLength(indexBias, propertyCapacity, vectorLength);
+    }
+    
+    static unsigned optimalVectorLength(unsigned indexBias, Structure* structure, unsigned vectorLength)
+    {
+        return optimalVectorLength(indexBias, structure-&gt;outOfLineCapacity(), vectorLength);
+    }
+    
+    unsigned optimalVectorLength(size_t propertyCapacity, unsigned vectorLength)
+    {
+        return optimalVectorLength(m_indexBias, propertyCapacity, vectorLength);
+    }
+    
+    unsigned optimalVectorLength(Structure* structure, unsigned vectorLength)
+    {
+        return optimalVectorLength(structure-&gt;outOfLineCapacity(), vectorLength);
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeAuxiliaryBarrierhfromrev205702releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSIDBCursorWithValueCustomcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrier.h (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBCursorWithValueCustom.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrier.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrier.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,63 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+namespace JSC {
+
+class JSCell;
+class VM;
+
+// An Auxiliary barrier is a barrier that does not try to reason about the value being stored into
+// it, other than interpreting a falsy value as not needing a barrier. It's OK to use this for either
+// JSCells or any other kind of data, so long as it responds to operator!().
+template&lt;typename T&gt;
+class AuxiliaryBarrier {
+public:
+    AuxiliaryBarrier() { }
+    
+    template&lt;typename U&gt;
+    AuxiliaryBarrier(VM&amp;, JSCell*, U&amp;&amp;);
+    
+    void clear() { m_value = T(); }
+    
+    template&lt;typename U&gt;
+    void set(VM&amp;, JSCell*, U&amp;&amp;);
+    
+    const T&amp; get() const { return m_value; }
+    
+    T* slot() { return &amp;m_value; }
+    
+    explicit operator bool() const { return !!m_value; }
+    
+    template&lt;typename U&gt;
+    void setWithoutBarrier(U&amp;&amp; value) { m_value = std::forward&lt;U&gt;(value); }
+    
+private:
+    T m_value;
+};
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeAuxiliaryBarrierInlineshfromrev205702releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingContactSelectedEventCustomcpp"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrierInlines.h (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrierInlines.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/AuxiliaryBarrierInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;AuxiliaryBarrier.h&quot;
+#include &quot;Heap.h&quot;
+#include &quot;VM.h&quot;
+
+namespace JSC {
+
+template&lt;typename T&gt;
+template&lt;typename U&gt;
+AuxiliaryBarrier&lt;T&gt;::AuxiliaryBarrier(VM&amp; vm, JSCell* owner, U&amp;&amp; value)
+{
+    m_value = std::forward&lt;U&gt;(value);
+    vm.heap.writeBarrier(owner);
+}
+
+template&lt;typename T&gt;
+template&lt;typename U&gt;
+void AuxiliaryBarrier&lt;T&gt;::set(VM&amp; vm, JSCell* owner, U&amp;&amp; value)
+{
+    m_value = std::forward&lt;U&gt;(value);
+    vm.heap.writeBarrier(owner);
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeButterflyh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Butterfly.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Butterfly.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Butterfly.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -90,6 +90,12 @@
</span><span class="cx">         return reinterpret_cast&lt;Butterfly*&gt;(static_cast&lt;EncodedJSValue*&gt;(base) + preCapacity + propertyCapacity + 1);
</span><span class="cx">     }
</span><span class="cx">     
</span><ins>+    ALWAYS_INLINE static unsigned availableContiguousVectorLength(size_t propertyCapacity, unsigned vectorLength);
+    static unsigned availableContiguousVectorLength(Structure*, unsigned vectorLength);
+    
+    ALWAYS_INLINE static unsigned optimalContiguousVectorLength(size_t propertyCapacity, unsigned vectorLength);
+    static unsigned optimalContiguousVectorLength(Structure*, unsigned vectorLength);
+    
</ins><span class="cx">     // This method is here not just because it's handy, but to remind you that
</span><span class="cx">     // the whole point of butterflies is to do evil pointer arithmetic.
</span><span class="cx">     static Butterfly* fromPointer(char* ptr)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeButterflyInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ButterflyInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ButterflyInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ButterflyInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -35,12 +35,38 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+ALWAYS_INLINE unsigned Butterfly::availableContiguousVectorLength(size_t propertyCapacity, unsigned vectorLength)
+{
+    size_t cellSize = totalSize(0, propertyCapacity, true, sizeof(EncodedJSValue) * vectorLength);
+    cellSize = MarkedSpace::optimalSizeFor(cellSize);
+    vectorLength = (cellSize - totalSize(0, propertyCapacity, true, 0)) / sizeof(EncodedJSValue);
+    return vectorLength;
+}
+
+ALWAYS_INLINE unsigned Butterfly::availableContiguousVectorLength(Structure* structure, unsigned vectorLength)
+{
+    return availableContiguousVectorLength(structure ? structure-&gt;outOfLineCapacity() : 0, vectorLength);
+}
+
+ALWAYS_INLINE unsigned Butterfly::optimalContiguousVectorLength(size_t propertyCapacity, unsigned vectorLength)
+{
+    if (!vectorLength)
+        vectorLength = BASE_CONTIGUOUS_VECTOR_LEN_EMPTY;
+    else
+        vectorLength = std::max(BASE_CONTIGUOUS_VECTOR_LEN, vectorLength);
+    return availableContiguousVectorLength(propertyCapacity, vectorLength);
+}
+
+ALWAYS_INLINE unsigned Butterfly::optimalContiguousVectorLength(Structure* structure, unsigned vectorLength)
+{
+    return optimalContiguousVectorLength(structure ? structure-&gt;outOfLineCapacity() : 0, vectorLength);
+}
+
</ins><span class="cx"> inline Butterfly* Butterfly::createUninitialized(VM&amp; vm, JSCell* intendedOwner, size_t preCapacity, size_t propertyCapacity, bool hasIndexingHeader, size_t indexingPayloadSizeInBytes)
</span><span class="cx"> {
</span><del>-    void* temp;
</del><span class="cx">     size_t size = totalSize(preCapacity, propertyCapacity, hasIndexingHeader, indexingPayloadSizeInBytes);
</span><del>-    RELEASE_ASSERT(vm.heap.tryAllocateStorage(intendedOwner, size, &amp;temp));
-    Butterfly* result = fromBase(temp, preCapacity, propertyCapacity);
</del><ins>+    void* base = vm.heap.allocateAuxiliary(intendedOwner, size);
+    Butterfly* result = fromBase(base, preCapacity, propertyCapacity);
</ins><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -119,7 +145,8 @@
</span><span class="cx">     void* theBase = base(0, propertyCapacity);
</span><span class="cx">     size_t oldSize = totalSize(0, propertyCapacity, hadIndexingHeader, oldIndexingPayloadSizeInBytes);
</span><span class="cx">     size_t newSize = totalSize(0, propertyCapacity, true, newIndexingPayloadSizeInBytes);
</span><del>-    if (!vm.heap.tryReallocateStorage(intendedOwner, &amp;theBase, oldSize, newSize))
</del><ins>+    theBase = vm.heap.tryReallocateAuxiliary(intendedOwner, theBase, oldSize, newSize);
+    if (!theBase)
</ins><span class="cx">         return 0;
</span><span class="cx">     return fromBase(theBase, 0, propertyCapacity);
</span><span class="cx"> }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeClonedArgumentscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ClonedArguments.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ClonedArguments.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ClonedArguments.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -44,16 +44,19 @@
</span><span class="cx"> ClonedArguments* ClonedArguments::createEmpty(
</span><span class="cx">     VM&amp; vm, Structure* structure, JSFunction* callee, unsigned length)
</span><span class="cx"> {
</span><del>-    unsigned vectorLength = std::max(BASE_VECTOR_LEN, length);
</del><ins>+    unsigned vectorLength = length;
</ins><span class="cx">     if (vectorLength &gt; MAX_STORAGE_VECTOR_LENGTH)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    void* temp;
-    if (!vm.heap.tryAllocateStorage(0, Butterfly::totalSize(0, structure-&gt;outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)), &amp;temp))
</del><ins>+    void* temp = vm.heap.tryAllocateAuxiliary(nullptr, Butterfly::totalSize(0, structure-&gt;outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)));
+    if (!temp)
</ins><span class="cx">         return 0;
</span><span class="cx">     Butterfly* butterfly = Butterfly::fromBase(temp, 0, structure-&gt;outOfLineCapacity());
</span><span class="cx">     butterfly-&gt;setVectorLength(vectorLength);
</span><span class="cx">     butterfly-&gt;setPublicLength(length);
</span><ins>+    
+    for (unsigned i = length; i &lt; vectorLength; ++i)
+        butterfly-&gt;contiguous()[i].clear();
</ins><span class="cx"> 
</span><span class="cx">     ClonedArguments* result =
</span><span class="cx">         new (NotNull, allocateCell&lt;ClonedArguments&gt;(vm.heap))
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeCommonSlowPathsExceptionscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CallFrame.h&quot;
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JITExceptions.h&quot;
</span><span class="cx"> #include &quot;LLIntCommon.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeCommonSlowPathsExceptionsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/CommonSlowPathsExceptions.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,11 +26,10 @@
</span><span class="cx"> #ifndef CommonSlowPathExceptions_h
</span><span class="cx"> #define CommonSlowPathExceptions_h
</span><span class="cx"> 
</span><del>-#include &quot;MacroAssemblerCodeRef.h&quot;
-
</del><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class ExecState;
</span><ins>+class JSObject;
</ins><span class="cx"> 
</span><span class="cx"> namespace CommonSlowPaths {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeDataViewcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DataView.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DataView.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DataView.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;DataView.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSDataView.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeDirectArgumentsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DirectArguments.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DirectArguments.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/DirectArguments.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef DirectArguments_h
</span><span class="cx"> #define DirectArguments_h
</span><span class="cx"> 
</span><ins>+#include &quot;CopyBarrier.h&quot;
</ins><span class="cx"> #include &quot;DirectArgumentsOffset.h&quot;
</span><span class="cx"> #include &quot;GenericArguments.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeECMAScriptSpecInternalFunctionscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ECMAScriptSpecInternalFunctions.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ECMAScriptSpecInternalFunctions.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ECMAScriptSpecInternalFunctions.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CallFrame.h&quot;
</span><span class="cx"> #include &quot;ConstructData.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;RegExpObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,14 +28,16 @@
</span><span class="cx"> #include &quot;ErrorConstructor.h&quot;
</span><span class="cx"> #include &quot;ExceptionHelpers.h&quot;
</span><span class="cx"> #include &quot;FunctionPrototype.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JSArray.h&quot;
</span><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;JSString.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;NativeErrorConstructor.h&quot;
</span><del>-#include &quot;JSCInlines.h&quot;
</del><span class="cx"> #include &quot;SourceCode.h&quot;
</span><ins>+#include &quot;StackFrame.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Error.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ErrorInstance.h&quot;
</span><span class="cx"> #include &quot;InternalFunction.h&quot;
</span><del>-#include &quot;Interpreter.h&quot;
</del><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;ThrowScope.h&quot;
</span><span class="cx"> #include &lt;stdint.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorInstancecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;JSScope.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObjectFunctions.h&quot;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeErrorInstanceh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ErrorInstance.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -21,7 +21,7 @@
</span><span class="cx"> #ifndef ErrorInstance_h
</span><span class="cx"> #define ErrorInstance_h
</span><span class="cx"> 
</span><del>-#include &quot;Interpreter.h&quot;
</del><ins>+#include &quot;JSObject.h&quot;
</ins><span class="cx"> #include &quot;RuntimeType.h&quot;
</span><span class="cx"> #include &quot;SourceProvider.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeExceptioncpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeExceptionh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Exception.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,7 +26,8 @@
</span><span class="cx"> #ifndef Exception_h
</span><span class="cx"> #define Exception_h
</span><span class="cx"> 
</span><del>-#include &quot;Interpreter.h&quot;
</del><ins>+#include &quot;JSObject.h&quot;
+#include &quot;StackFrame.h&quot;
</ins><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeGeneratorPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/GeneratorPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/GeneratorPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/GeneratorPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,10 +27,8 @@
</span><span class="cx"> #include &quot;GeneratorPrototype.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;GeneratorPrototype.lut.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeInternalFunctioncpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/InternalFunction.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/InternalFunction.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/InternalFunction.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -37,6 +37,8 @@
</span><span class="cx"> InternalFunction::InternalFunction(VM&amp; vm, Structure* structure)
</span><span class="cx">     : JSDestructibleObject(vm, structure)
</span><span class="cx"> {
</span><ins>+    // exec-&gt;vm() wants callees to not be large allocations.
+    RELEASE_ASSERT(!isLargeAllocation());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InternalFunction::finishCreation(VM&amp; vm, const String&amp; name)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlCollatorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,6 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2015 Andy VanWagoner (thetalecrafter@gmail.com)
</span><span class="cx">  * Copyright (C) 2015 Sukolsak Sakshuwong (sukolsak@gmail.com)
</span><ins>+ * Copyright (C) 2016 Apple Inc. All Rights Reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -33,8 +34,7 @@
</span><span class="cx"> #include &quot;IntlCollatorConstructor.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><span class="cx"> #include &quot;JSBoundFunction.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><span class="cx"> #include &quot;SlotVisitorInlines.h&quot;
</span><span class="cx"> #include &quot;StructureInlines.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlCollatorConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,11 +33,8 @@
</span><span class="cx"> #include &quot;IntlCollator.h&quot;
</span><span class="cx"> #include &quot;IntlCollatorPrototype.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;Lookup.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlCollatorPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlCollatorPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,10 +32,7 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IntlCollator.h&quot;
</span><span class="cx"> #include &quot;JSBoundFunction.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSObject.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlDateTimeFormatcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormat.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -34,12 +34,12 @@
</span><span class="cx"> #include &quot;IntlDateTimeFormatConstructor.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><span class="cx"> #include &quot;JSBoundFunction.h&quot;
</span><del>-#include &quot;JSCellInlines.h&quot;
</del><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><span class="cx"> #include &lt;unicode/ucal.h&gt;
</span><span class="cx"> #include &lt;unicode/udatpg.h&gt;
</span><span class="cx"> #include &lt;unicode/uenum.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlDateTimeFormatConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,11 +33,8 @@
</span><span class="cx"> #include &quot;IntlDateTimeFormatPrototype.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><span class="cx"> #include &quot;IntlObjectInlines.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;Lookup.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlDateTimeFormatPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlDateTimeFormatPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -35,10 +35,8 @@
</span><span class="cx"> #include &quot;IntlDateTimeFormat.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><span class="cx"> #include &quot;JSBoundFunction.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlNumberFormatcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormat.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -34,7 +34,6 @@
</span><span class="cx"> #include &quot;IntlNumberFormatConstructor.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><span class="cx"> #include &quot;JSBoundFunction.h&quot;
</span><del>-#include &quot;JSCellInlines.h&quot;
</del><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlNumberFormatConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,11 +33,8 @@
</span><span class="cx"> #include &quot;IntlNumberFormatPrototype.h&quot;
</span><span class="cx"> #include &quot;IntlObject.h&quot;
</span><span class="cx"> #include &quot;IntlObjectInlines.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;Lookup.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlNumberFormatPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlNumberFormatPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,10 +33,8 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IntlNumberFormat.h&quot;
</span><span class="cx"> #include &quot;JSBoundFunction.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIntlObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlObject.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlObject.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IntlObject.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx"> #include &lt;wtf/Assertions.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> #include &lt;wtf/PlatformUserPreferredLanguages.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeIteratorPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IteratorPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IteratorPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/IteratorPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,11 +27,9 @@
</span><span class="cx"> #include &quot;IteratorPrototype.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSArraycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -60,6 +60,54 @@
</span><span class="cx">     return butterfly;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSArray* JSArray::tryCreateUninitialized(VM&amp; vm, Structure* structure, unsigned initialLength)
+{
+    if (initialLength &gt; MAX_STORAGE_VECTOR_LENGTH)
+        return 0;
+
+    unsigned outOfLineStorage = structure-&gt;outOfLineCapacity();
+
+    Butterfly* butterfly;
+    IndexingType indexingType = structure-&gt;indexingType();
+    if (LIKELY(!hasAnyArrayStorage(indexingType))) {
+        ASSERT(
+            hasUndecided(indexingType)
+            || hasInt32(indexingType)
+            || hasDouble(indexingType)
+            || hasContiguous(indexingType));
+
+        unsigned vectorLength = Butterfly::optimalContiguousVectorLength(structure, initialLength);
+        void* temp = vm.heap.tryAllocateAuxiliary(nullptr, Butterfly::totalSize(0, outOfLineStorage, true, vectorLength * sizeof(EncodedJSValue)));
+        if (!temp)
+            return nullptr;
+        butterfly = Butterfly::fromBase(temp, 0, outOfLineStorage);
+        butterfly-&gt;setVectorLength(vectorLength);
+        butterfly-&gt;setPublicLength(initialLength);
+        if (hasDouble(indexingType)) {
+            for (unsigned i = initialLength; i &lt; vectorLength; ++i)
+                butterfly-&gt;contiguousDouble()[i] = PNaN;
+        } else {
+            for (unsigned i = initialLength; i &lt; vectorLength; ++i)
+                butterfly-&gt;contiguous()[i].clear();
+        }
+    } else {
+        unsigned vectorLength = ArrayStorage::optimalVectorLength(0, structure, initialLength);
+        void* temp = vm.heap.tryAllocateAuxiliary(nullptr, Butterfly::totalSize(0, outOfLineStorage, true, ArrayStorage::sizeFor(vectorLength)));
+        if (!temp)
+            return nullptr;
+        butterfly = Butterfly::fromBase(temp, 0, outOfLineStorage);
+        *butterfly-&gt;indexingHeader() = indexingHeaderForArrayStorage(initialLength, vectorLength);
+        ArrayStorage* storage = butterfly-&gt;arrayStorage();
+        storage-&gt;m_indexBias = 0;
+        storage-&gt;m_sparseMap.clear();
+        storage-&gt;m_numValuesInVector = initialLength;
+        for (unsigned i = initialLength; i &lt; vectorLength; ++i)
+            storage-&gt;m_vector[i].clear();
+    }
+
+    return createWithButterfly(vm, structure, butterfly);
+}
+
</ins><span class="cx"> void JSArray::setLengthWritable(ExecState* exec, bool writable)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isLengthWritable() || !writable);
</span><span class="lines">@@ -243,13 +291,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // This method makes room in the vector, but leaves the new space for count slots uncleared.
</span><del>-bool JSArray::unshiftCountSlowCase(VM&amp; vm, bool addToFront, unsigned count)
</del><ins>+bool JSArray::unshiftCountSlowCase(VM&amp; vm, DeferGC&amp;, bool addToFront, unsigned count)
</ins><span class="cx"> {
</span><span class="cx">     ArrayStorage* storage = ensureArrayStorage(vm);
</span><span class="cx">     Butterfly* butterfly = storage-&gt;butterfly();
</span><del>-    unsigned propertyCapacity = structure(vm)-&gt;outOfLineCapacity();
-    unsigned propertySize = structure(vm)-&gt;outOfLineSize();
-
</del><ins>+    Structure* structure = this-&gt;structure(vm);
+    unsigned propertyCapacity = structure-&gt;outOfLineCapacity();
+    unsigned propertySize = structure-&gt;outOfLineSize();
+    
</ins><span class="cx">     // If not, we should have handled this on the fast path.
</span><span class="cx">     ASSERT(!addToFront || count &gt; storage-&gt;m_indexBias);
</span><span class="cx"> 
</span><span class="lines">@@ -261,7 +310,8 @@
</span><span class="cx">     //  * desiredCapacity - how large should we like to grow the vector to - based on 2x requiredVectorLength.
</span><span class="cx"> 
</span><span class="cx">     unsigned length = storage-&gt;length();
</span><del>-    unsigned usedVectorLength = min(storage-&gt;vectorLength(), length);
</del><ins>+    unsigned oldVectorLength = storage-&gt;vectorLength();
+    unsigned usedVectorLength = min(oldVectorLength, length);
</ins><span class="cx">     ASSERT(usedVectorLength &lt;= MAX_STORAGE_VECTOR_LENGTH);
</span><span class="cx">     // Check that required vector length is possible, in an overflow-safe fashion.
</span><span class="cx">     if (count &gt; MAX_STORAGE_VECTOR_LENGTH - usedVectorLength)
</span><span class="lines">@@ -272,23 +322,29 @@
</span><span class="cx">     ASSERT(storage-&gt;vectorLength() &lt;= MAX_STORAGE_VECTOR_LENGTH &amp;&amp; (MAX_STORAGE_VECTOR_LENGTH - storage-&gt;vectorLength()) &gt;= storage-&gt;m_indexBias);
</span><span class="cx">     unsigned currentCapacity = storage-&gt;vectorLength() + storage-&gt;m_indexBias;
</span><span class="cx">     // The calculation of desiredCapacity won't overflow, due to the range of MAX_STORAGE_VECTOR_LENGTH.
</span><del>-    unsigned desiredCapacity = min(MAX_STORAGE_VECTOR_LENGTH, max(BASE_VECTOR_LEN, requiredVectorLength) &lt;&lt; 1);
</del><ins>+    // FIXME: This code should be fixed to avoid internal fragmentation. It's not super high
+    // priority since increaseVectorLength() will &quot;fix&quot; any mistakes we make, but it would be cool
+    // to get this right eventually.
+    unsigned desiredCapacity = min(MAX_STORAGE_VECTOR_LENGTH, max(BASE_ARRAY_STORAGE_VECTOR_LEN, requiredVectorLength) &lt;&lt; 1);
</ins><span class="cx"> 
</span><span class="cx">     // Step 2:
</span><span class="cx">     // We're either going to choose to allocate a new ArrayStorage, or we're going to reuse the existing one.
</span><span class="cx"> 
</span><del>-    DeferGC deferGC(vm.heap);
</del><span class="cx">     void* newAllocBase = 0;
</span><span class="cx">     unsigned newStorageCapacity;
</span><ins>+    bool allocatedNewStorage;
</ins><span class="cx">     // If the current storage array is sufficiently large (but not too large!) then just keep using it.
</span><span class="cx">     if (currentCapacity &gt; desiredCapacity &amp;&amp; isDenseEnoughForVector(currentCapacity, requiredVectorLength)) {
</span><del>-        newAllocBase = butterfly-&gt;base(structure(vm));
</del><ins>+        newAllocBase = butterfly-&gt;base(structure);
</ins><span class="cx">         newStorageCapacity = currentCapacity;
</span><ins>+        allocatedNewStorage = false;
</ins><span class="cx">     } else {
</span><span class="cx">         size_t newSize = Butterfly::totalSize(0, propertyCapacity, true, ArrayStorage::sizeFor(desiredCapacity));
</span><del>-        if (!vm.heap.tryAllocateStorage(this, newSize, &amp;newAllocBase))
</del><ins>+        newAllocBase = vm.heap.tryAllocateAuxiliary(this, newSize);
+        if (!newAllocBase)
</ins><span class="cx">             return false;
</span><span class="cx">         newStorageCapacity = desiredCapacity;
</span><ins>+        allocatedNewStorage = true;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Step 3:
</span><span class="lines">@@ -306,7 +362,7 @@
</span><span class="cx">         // Atomic decay, + the post-capacity cannot be greater than what is available.
</span><span class="cx">         postCapacity = min((storage-&gt;vectorLength() - length) &gt;&gt; 1, newStorageCapacity - requiredVectorLength);
</span><span class="cx">         // If we're moving contents within the same allocation, the post-capacity is being reduced.
</span><del>-        ASSERT(newAllocBase != butterfly-&gt;base(structure(vm)) || postCapacity &lt; storage-&gt;vectorLength() - length);
</del><ins>+        ASSERT(newAllocBase != butterfly-&gt;base(structure) || postCapacity &lt; storage-&gt;vectorLength() - length);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     unsigned newVectorLength = requiredVectorLength + postCapacity;
</span><span class="lines">@@ -318,17 +374,24 @@
</span><span class="cx">         ASSERT(count + usedVectorLength &lt;= newVectorLength);
</span><span class="cx">         memmove(newButterfly-&gt;arrayStorage()-&gt;m_vector + count, storage-&gt;m_vector, sizeof(JSValue) * usedVectorLength);
</span><span class="cx">         memmove(newButterfly-&gt;propertyStorage() - propertySize, butterfly-&gt;propertyStorage() - propertySize, sizeof(JSValue) * propertySize + sizeof(IndexingHeader) + ArrayStorage::sizeFor(0));
</span><del>-    } else if ((newAllocBase != butterfly-&gt;base(structure(vm))) || (newIndexBias != storage-&gt;m_indexBias)) {
</del><ins>+        
+        if (allocatedNewStorage) {
+            // We will set the vectorLength to newVectorLength. We populated requiredVectorLength
+            // (usedVectorLength + count), which is less. Clear the difference.
+            for (unsigned i = requiredVectorLength; i &lt; newVectorLength; ++i)
+                newButterfly-&gt;arrayStorage()-&gt;m_vector[i].clear();
+        }
+    } else if ((newAllocBase != butterfly-&gt;base(structure)) || (newIndexBias != storage-&gt;m_indexBias)) {
</ins><span class="cx">         memmove(newButterfly-&gt;propertyStorage() - propertySize, butterfly-&gt;propertyStorage() - propertySize, sizeof(JSValue) * propertySize + sizeof(IndexingHeader) + ArrayStorage::sizeFor(0));
</span><span class="cx">         memmove(newButterfly-&gt;arrayStorage()-&gt;m_vector, storage-&gt;m_vector, sizeof(JSValue) * usedVectorLength);
</span><del>-
-        WriteBarrier&lt;Unknown&gt;* newVector = newButterfly-&gt;arrayStorage()-&gt;m_vector;
</del><ins>+        
</ins><span class="cx">         for (unsigned i = requiredVectorLength; i &lt; newVectorLength; i++)
</span><del>-            newVector[i].clear();
</del><ins>+            newButterfly-&gt;arrayStorage()-&gt;m_vector[i].clear();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     newButterfly-&gt;arrayStorage()-&gt;setVectorLength(newVectorLength);
</span><span class="cx">     newButterfly-&gt;arrayStorage()-&gt;m_indexBias = newIndexBias;
</span><ins>+    
</ins><span class="cx">     setButterflyWithoutChangingStructure(vm, newButterfly);
</span><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="lines">@@ -337,7 +400,7 @@
</span><span class="cx"> bool JSArray::setLengthWithArrayStorage(ExecState* exec, unsigned newLength, bool throwException, ArrayStorage* storage)
</span><span class="cx"> {
</span><span class="cx">     unsigned length = storage-&gt;length();
</span><del>-
</del><ins>+    
</ins><span class="cx">     // If the length is read only then we enter sparse mode, so should enter the following 'if'.
</span><span class="cx">     ASSERT(isLengthWritable() || storage-&gt;m_sparseMap);
</span><span class="cx"> 
</span><span class="lines">@@ -997,6 +1060,10 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned vectorLength = storage-&gt;vectorLength();
</span><span class="cx"> 
</span><ins>+    // Need to have GC deferred around the unshiftCountSlowCase(), since that leaves the butterfly in
+    // a weird state: some parts of it will be left uninitialized, which we will fill in here.
+    DeferGC deferGC(vm.heap);
+    
</ins><span class="cx">     if (moveFront &amp;&amp; storage-&gt;m_indexBias &gt;= count) {
</span><span class="cx">         Butterfly* newButterfly = storage-&gt;butterfly()-&gt;unshift(structure(), count);
</span><span class="cx">         storage = newButterfly-&gt;arrayStorage();
</span><span class="lines">@@ -1005,7 +1072,7 @@
</span><span class="cx">         setButterflyWithoutChangingStructure(vm, newButterfly);
</span><span class="cx">     } else if (!moveFront &amp;&amp; vectorLength - length &gt;= count)
</span><span class="cx">         storage = storage-&gt;butterfly()-&gt;arrayStorage();
</span><del>-    else if (unshiftCountSlowCase(vm, moveFront, count))
</del><ins>+    else if (unshiftCountSlowCase(vm, deferGC, moveFront, count))
</ins><span class="cx">         storage = arrayStorage();
</span><span class="cx">     else {
</span><span class="cx">         throwOutOfMemoryError(exec, scope);
</span><span class="lines">@@ -1199,7 +1266,6 @@
</span><span class="cx">     ASSERT(length == this-&gt;length());
</span><span class="cx"> 
</span><span class="cx">     Butterfly* butterfly = m_butterfly.get();
</span><del>-    
</del><span class="cx">     switch (indexingType()) {
</span><span class="cx">     case ArrayClass:
</span><span class="cx">         return;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSArrayh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArray.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
</span><del>- *  Copyright (C) 2003, 2007, 2008, 2009, 2012, 2015 Apple Inc. All rights reserved.
</del><ins>+ *  Copyright (C) 2003, 2007, 2008, 2009, 2012, 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  *  This library is free software; you can redistribute it and/or
</span><span class="cx">  *  modify it under the terms of the GNU Lesser General Public
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx">     // contents are known at time of creation. Clients of this interface must:
</span><span class="cx">     //   - null-check the result (indicating out of memory, or otherwise unable to allocate vector).
</span><span class="cx">     //   - call 'initializeIndex' for all properties in sequence, for 0 &lt;= i &lt; initialLength.
</span><del>-    static JSArray* tryCreateUninitialized(VM&amp;, Structure*, unsigned initialLength);
</del><ins>+    JS_EXPORT_PRIVATE static JSArray* tryCreateUninitialized(VM&amp;, Structure*, unsigned initialLength);
</ins><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static bool defineOwnProperty(JSObject*, ExecState*, PropertyName, const PropertyDescriptor&amp;, bool throwException);
</span><span class="cx"> 
</span><span class="lines">@@ -168,7 +168,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool unshiftCountWithAnyIndexingType(ExecState*, unsigned startIndex, unsigned count);
</span><span class="cx">     bool unshiftCountWithArrayStorage(ExecState*, unsigned startIndex, unsigned count, ArrayStorage*);
</span><del>-    bool unshiftCountSlowCase(VM&amp;, bool, unsigned);
</del><ins>+    bool unshiftCountSlowCase(VM&amp;, DeferGC&amp;, bool, unsigned);
</ins><span class="cx"> 
</span><span class="cx">     bool setLengthWithArrayStorage(ExecState*, unsigned newLength, bool throwException, ArrayStorage*);
</span><span class="cx">     void setLengthWritable(ExecState*, bool writable);
</span><span class="lines">@@ -177,7 +177,8 @@
</span><span class="cx"> inline Butterfly* createContiguousArrayButterfly(VM&amp; vm, JSCell* intendedOwner, unsigned length, unsigned&amp; vectorLength)
</span><span class="cx"> {
</span><span class="cx">     IndexingHeader header;
</span><del>-    vectorLength = std::max(length, BASE_VECTOR_LEN);
</del><ins>+    vectorLength = Butterfly::optimalContiguousVectorLength(
+        intendedOwner ? intendedOwner-&gt;structure(vm) : 0, length);
</ins><span class="cx">     header.setVectorLength(vectorLength);
</span><span class="cx">     header.setPublicLength(length);
</span><span class="cx">     Butterfly* result = Butterfly::create(
</span><span class="lines">@@ -188,11 +189,11 @@
</span><span class="cx"> inline Butterfly* createArrayButterfly(VM&amp; vm, JSCell* intendedOwner, unsigned initialLength)
</span><span class="cx"> {
</span><span class="cx">     Butterfly* butterfly = Butterfly::create(
</span><del>-        vm, intendedOwner, 0, 0, true, baseIndexingHeaderForArray(initialLength),
-        ArrayStorage::sizeFor(BASE_VECTOR_LEN));
</del><ins>+        vm, intendedOwner, 0, 0, true, baseIndexingHeaderForArrayStorage(initialLength),
+        ArrayStorage::sizeFor(BASE_ARRAY_STORAGE_VECTOR_LEN));
</ins><span class="cx">     ArrayStorage* storage = butterfly-&gt;arrayStorage();
</span><ins>+    storage-&gt;m_sparseMap.clear();
</ins><span class="cx">     storage-&gt;m_indexBias = 0;
</span><del>-    storage-&gt;m_sparseMap.clear();
</del><span class="cx">     storage-&gt;m_numValuesInVector = 0;
</span><span class="cx">     return butterfly;
</span><span class="cx"> }
</span><span class="lines">@@ -211,62 +212,22 @@
</span><span class="cx">             || hasContiguous(structure-&gt;indexingType()));
</span><span class="cx">         unsigned vectorLength;
</span><span class="cx">         butterfly = createContiguousArrayButterfly(vm, 0, initialLength, vectorLength);
</span><del>-        ASSERT(initialLength &lt; MIN_ARRAY_STORAGE_CONSTRUCTION_LENGTH);
-        if (hasDouble(structure-&gt;indexingType())) {
-            for (unsigned i = 0; i &lt; vectorLength; ++i)
-                butterfly-&gt;contiguousDouble()[i] = PNaN;
-        }
</del><ins>+        if (hasDouble(structure-&gt;indexingType()))
+            clearArray(butterfly-&gt;contiguousDouble().data(), vectorLength);
+        else
+            clearArray(butterfly-&gt;contiguous().data(), vectorLength);
</ins><span class="cx">     } else {
</span><span class="cx">         ASSERT(
</span><span class="cx">             structure-&gt;indexingType() == ArrayWithSlowPutArrayStorage
</span><span class="cx">             || structure-&gt;indexingType() == ArrayWithArrayStorage);
</span><span class="cx">         butterfly = createArrayButterfly(vm, 0, initialLength);
</span><ins>+        for (unsigned i = 0; i &lt; BASE_ARRAY_STORAGE_VECTOR_LEN; ++i)
+            butterfly-&gt;arrayStorage()-&gt;m_vector[i].clear();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     return createWithButterfly(vm, structure, butterfly);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline JSArray* JSArray::tryCreateUninitialized(VM&amp; vm, Structure* structure, unsigned initialLength)
-{
-    unsigned vectorLength = std::max(BASE_VECTOR_LEN, initialLength);
-    if (vectorLength &gt; MAX_STORAGE_VECTOR_LENGTH)
-        return 0;
-
-    unsigned outOfLineStorage = structure-&gt;outOfLineCapacity();
-
-    Butterfly* butterfly;
-    if (LIKELY(!hasAnyArrayStorage(structure-&gt;indexingType()))) {
-        ASSERT(
-            hasUndecided(structure-&gt;indexingType())
-            || hasInt32(structure-&gt;indexingType())
-            || hasDouble(structure-&gt;indexingType())
-            || hasContiguous(structure-&gt;indexingType()));
-
-        void* temp;
-        if (!vm.heap.tryAllocateStorage(0, Butterfly::totalSize(0, outOfLineStorage, true, vectorLength * sizeof(EncodedJSValue)), &amp;temp))
-            return 0;
-        butterfly = Butterfly::fromBase(temp, 0, outOfLineStorage);
-        butterfly-&gt;setVectorLength(vectorLength);
-        butterfly-&gt;setPublicLength(initialLength);
-        if (hasDouble(structure-&gt;indexingType())) {
-            for (unsigned i = initialLength; i &lt; vectorLength; ++i)
-                butterfly-&gt;contiguousDouble()[i] = PNaN;
-        }
-    } else {
-        void* temp;
-        if (!vm.heap.tryAllocateStorage(0, Butterfly::totalSize(0, outOfLineStorage, true, ArrayStorage::sizeFor(vectorLength)), &amp;temp))
-            return 0;
-        butterfly = Butterfly::fromBase(temp, 0, outOfLineStorage);
-        *butterfly-&gt;indexingHeader() = indexingHeaderForArray(initialLength, vectorLength);
-        ArrayStorage* storage = butterfly-&gt;arrayStorage();
-        storage-&gt;m_indexBias = 0;
-        storage-&gt;m_sparseMap.clear();
-        storage-&gt;m_numValuesInVector = initialLength;
-    }
-
-    return createWithButterfly(vm, structure, butterfly);
-}
-
</del><span class="cx"> inline JSArray* JSArray::createWithButterfly(VM&amp; vm, Structure* structure, Butterfly* butterfly)
</span><span class="cx"> {
</span><span class="cx">     JSArray* array = new (NotNull, allocateCell&lt;JSArray&gt;(vm.heap)) JSArray(vm, structure, butterfly);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSArrayBufferViewh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArrayBufferView.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArrayBufferView.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSArrayBufferView.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #ifndef JSArrayBufferView_h
</span><span class="cx"> #define JSArrayBufferView_h
</span><span class="cx"> 
</span><ins>+#include &quot;CopyBarrier.h&quot;
</ins><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -41,7 +41,6 @@
</span><span class="cx"> #include &quot;GCIncomingRefCountedInlines.h&quot;
</span><span class="cx"> #include &quot;HeapInlines.h&quot;
</span><span class="cx"> #include &quot;IdentifierInlines.h&quot;
</span><del>-#include &quot;Interpreter.h&quot;
</del><span class="cx"> #include &quot;JSArrayBufferViewInlines.h&quot;
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="cx"> #include &quot;JSFunctionInlines.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCJSValuecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCJSValue.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCJSValue.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCJSValue.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,11 +29,10 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;ExceptionHelpers.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;NumberObject.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> #include &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/StringExtras.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -278,7 +277,11 @@
</span><span class="cx">             out.print(&quot;Symbol: &quot;, RawPointer(asCell()));
</span><span class="cx">         else if (structure-&gt;classInfo()-&gt;isSubClassOf(Structure::info()))
</span><span class="cx">             out.print(&quot;Structure: &quot;, inContext(*jsCast&lt;Structure*&gt;(asCell()), context));
</span><del>-        else {
</del><ins>+        else if (structure-&gt;classInfo()-&gt;isSubClassOf(JSObject::info())) {
+            out.print(&quot;Object: &quot;, RawPointer(asCell()));
+            out.print(&quot; with butterfly &quot;, RawPointer(asObject(asCell())-&gt;butterfly()));
+            out.print(&quot; (&quot;, inContext(*structure, context), &quot;)&quot;);
+        } else {
</ins><span class="cx">             out.print(&quot;Cell: &quot;, RawPointer(asCell()));
</span><span class="cx">             out.print(&quot; (&quot;, inContext(*structure, context), &quot;)&quot;);
</span><span class="cx">         }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCalleecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCallee.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCallee.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCallee.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,13 +27,9 @@
</span><span class="cx"> #include &quot;JSCallee.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCell.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
</del><span class="cx"> #include &quot;StackVisitor.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -43,6 +39,7 @@
</span><span class="cx">     : Base(vm, structure)
</span><span class="cx">     , m_scope(vm, this, globalObject)
</span><span class="cx"> {
</span><ins>+    RELEASE_ASSERT(!isLargeAllocation());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSCallee::JSCallee(VM&amp; vm, JSScope* scope, Structure* structure)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCellcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -58,7 +58,7 @@
</span><span class="cx"> 
</span><span class="cx"> size_t JSCell::estimatedSize(JSCell* cell)
</span><span class="cx"> {
</span><del>-    return MarkedBlock::blockFor(cell)-&gt;cellSize();
</del><ins>+    return cell-&gt;cellSize();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSCell::copyBackingStore(JSCell*, CopyVisitor&amp;, CopyToken)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCellh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCell.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> 
</span><span class="cx">     enum CreatingEarlyCellTag { CreatingEarlyCell };
</span><span class="cx">     JSCell(CreatingEarlyCellTag);
</span><del>-
</del><ins>+    
</ins><span class="cx"> protected:
</span><span class="cx">     JSCell(VM&amp;, Structure*);
</span><span class="cx">     JS_EXPORT_PRIVATE static void destroy(JSCell*);
</span><span class="lines">@@ -108,8 +108,6 @@
</span><span class="cx"> 
</span><span class="cx">     const char* className() const;
</span><span class="cx"> 
</span><del>-    VM* vm() const;
-
</del><span class="cx">     // Extracting the value.
</span><span class="cx">     JS_EXPORT_PRIVATE bool getString(ExecState*, String&amp;) const;
</span><span class="cx">     JS_EXPORT_PRIVATE String getString(ExecState*) const; // null string if not a string
</span><span class="lines">@@ -190,6 +188,8 @@
</span><span class="cx">     {
</span><span class="cx">         return OBJECT_OFFSETOF(JSCell, m_cellState);
</span><span class="cx">     }
</span><ins>+    
+    void callDestructor(VM&amp;);
</ins><span class="cx"> 
</span><span class="cx">     static const TypedArrayType TypedArrayStorageType = NotTypedArray;
</span><span class="cx"> protected:
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSCellInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCellInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCellInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSCellInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -113,16 +113,13 @@
</span><span class="cx">     visitor.appendUnbarrieredPointer(&amp;structure);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline VM* JSCell::vm() const
-{
-    return MarkedBlock::blockFor(this)-&gt;vm();
-}
-
</del><span class="cx"> ALWAYS_INLINE VM&amp; ExecState::vm() const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(callee());
</span><span class="cx">     ASSERT(callee()-&gt;vm());
</span><del>-    return *calleeAsValue().asCell()-&gt;vm();
</del><ins>+    ASSERT(!callee()-&gt;isLargeAllocation());
+    // This is an important optimization since we access this so often.
+    return *calleeAsValue().asCell()-&gt;markedBlock().vm();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="lines">@@ -233,12 +230,19 @@
</span><span class="cx">         &amp;&amp; !structure.typeInfo().overridesGetOwnPropertySlot();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline const ClassInfo* JSCell::classInfo() const
</del><ins>+ALWAYS_INLINE const ClassInfo* JSCell::classInfo() const
</ins><span class="cx"> {
</span><del>-    MarkedBlock* block = MarkedBlock::blockFor(this);
-    if (block-&gt;needsDestruction() &amp;&amp; !(inlineTypeFlags() &amp; StructureIsImmortal))
</del><ins>+    if (isLargeAllocation()) {
+        LargeAllocation&amp; allocation = largeAllocation();
+        if (allocation.attributes().destruction == NeedsDestruction
+            &amp;&amp; !(inlineTypeFlags() &amp; StructureIsImmortal))
+            return static_cast&lt;const JSDestructibleObject*&gt;(this)-&gt;classInfo();
+        return structure(*allocation.vm())-&gt;classInfo();
+    }
+    MarkedBlock&amp; block = markedBlock();
+    if (block.needsDestruction() &amp;&amp; !(inlineTypeFlags() &amp; StructureIsImmortal))
</ins><span class="cx">         return static_cast&lt;const JSDestructibleObject*&gt;(this)-&gt;classInfo();
</span><del>-    return structure(*block-&gt;vm())-&gt;classInfo();
</del><ins>+    return structure(*block.vm())-&gt;classInfo();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline bool JSCell::toBoolean(ExecState* exec) const
</span><span class="lines">@@ -257,6 +261,18 @@
</span><span class="cx">     return MixedTriState;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void JSCell::callDestructor(VM&amp; vm)
+{
+    if (isZapped())
+        return;
+    ASSERT(structureID());
+    if (inlineTypeFlags() &amp; StructureIsImmortal)
+        structure(vm)-&gt;classInfo()-&gt;methodTable.destroy(this);
+    else
+        jsCast&lt;JSDestructibleObject*&gt;(this)-&gt;classInfo()-&gt;methodTable.destroy(this);
+    zap();
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // JSCellInlines_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSFunctioncpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -64,7 +64,7 @@
</span><span class="cx"> 
</span><span class="cx"> JSFunction* JSFunction::create(VM&amp; vm, FunctionExecutable* executable, JSScope* scope)
</span><span class="cx"> {
</span><del>-    return create(vm, executable, scope, scope-&gt;globalObject()-&gt;functionStructure());
</del><ins>+    return create(vm, executable, scope, scope-&gt;globalObject(vm)-&gt;functionStructure());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> JSFunction* JSFunction::create(VM&amp; vm, FunctionExecutable* executable, JSScope* scope, Structure* structure)
</span><span class="lines">@@ -78,7 +78,7 @@
</span><span class="cx"> JSFunction* JSFunction::create(VM&amp; vm, WebAssemblyExecutable* executable, JSScope* scope)
</span><span class="cx"> {
</span><span class="cx">     JSFunction* function = new (NotNull, allocateCell&lt;JSFunction&gt;(vm.heap)) JSFunction(vm, executable, scope);
</span><del>-    ASSERT(function-&gt;structure()-&gt;globalObject());
</del><ins>+    ASSERT(function-&gt;structure(vm)-&gt;globalObject());
</ins><span class="cx">     function-&gt;finishCreation(vm);
</span><span class="cx">     return function;
</span><span class="cx"> }
</span><span class="lines">@@ -145,9 +145,9 @@
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     JSObject* prototype = jsDynamicCast&lt;JSObject*&gt;(get(exec, vm.propertyNames-&gt;prototype));
</span><span class="cx">     if (!prototype)
</span><del>-        prototype = globalObject()-&gt;objectPrototype();
</del><ins>+        prototype = globalObject(vm)-&gt;objectPrototype();
</ins><span class="cx">     FunctionRareData* rareData = FunctionRareData::create(vm);
</span><del>-    rareData-&gt;initializeObjectAllocationProfile(globalObject()-&gt;vm(), prototype, inlineCapacity);
</del><ins>+    rareData-&gt;initializeObjectAllocationProfile(vm, prototype, inlineCapacity);
</ins><span class="cx"> 
</span><span class="cx">     // A DFG compilation thread may be trying to read the rare data
</span><span class="cx">     // We want to ensure that it sees it properly allocated
</span><span class="lines">@@ -163,8 +163,8 @@
</span><span class="cx">     VM&amp; vm = exec-&gt;vm();
</span><span class="cx">     JSObject* prototype = jsDynamicCast&lt;JSObject*&gt;(get(exec, vm.propertyNames-&gt;prototype));
</span><span class="cx">     if (!prototype)
</span><del>-        prototype = globalObject()-&gt;objectPrototype();
-    m_rareData-&gt;initializeObjectAllocationProfile(globalObject()-&gt;vm(), prototype, inlineCapacity);
</del><ins>+        prototype = globalObject(vm)-&gt;objectPrototype();
+    m_rareData-&gt;initializeObjectAllocationProfile(vm, prototype, inlineCapacity);
</ins><span class="cx">     return m_rareData.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -345,26 +345,26 @@
</span><span class="cx"> 
</span><span class="cx"> bool JSFunction::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot&amp; slot)
</span><span class="cx"> {
</span><ins>+    VM&amp; vm = exec-&gt;vm();
</ins><span class="cx">     JSFunction* thisObject = jsCast&lt;JSFunction*&gt;(object);
</span><span class="cx">     if (thisObject-&gt;isHostOrBuiltinFunction()) {
</span><del>-        thisObject-&gt;reifyBoundNameIfNeeded(exec, propertyName);
</del><ins>+        thisObject-&gt;reifyBoundNameIfNeeded(vm, exec, propertyName);
</ins><span class="cx">         return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (propertyName == exec-&gt;propertyNames().prototype &amp;&amp; !thisObject-&gt;jsExecutable()-&gt;isArrowFunction()) {
-        VM&amp; vm = exec-&gt;vm();
</del><ins>+    if (propertyName == vm.propertyNames-&gt;prototype &amp;&amp; !thisObject-&gt;jsExecutable()-&gt;isArrowFunction()) {
</ins><span class="cx">         unsigned attributes;
</span><span class="cx">         PropertyOffset offset = thisObject-&gt;getDirectOffset(vm, propertyName, attributes);
</span><span class="cx">         if (!isValidOffset(offset)) {
</span><span class="cx">             JSObject* prototype = nullptr;
</span><span class="cx">             if (thisObject-&gt;jsExecutable()-&gt;parseMode() == SourceParseMode::GeneratorWrapperFunctionMode)
</span><del>-                prototype = constructEmptyObject(exec, thisObject-&gt;globalObject()-&gt;generatorPrototype());
</del><ins>+                prototype = constructEmptyObject(exec, thisObject-&gt;globalObject(vm)-&gt;generatorPrototype());
</ins><span class="cx">             else
</span><span class="cx">                 prototype = constructEmptyObject(exec);
</span><span class="cx"> 
</span><del>-            prototype-&gt;putDirect(vm, exec-&gt;propertyNames().constructor, thisObject, DontEnum);
-            thisObject-&gt;putDirect(vm, exec-&gt;propertyNames().prototype, prototype, DontDelete | DontEnum);
-            offset = thisObject-&gt;getDirectOffset(vm, exec-&gt;propertyNames().prototype, attributes);
</del><ins>+            prototype-&gt;putDirect(vm, vm.propertyNames-&gt;constructor, thisObject, DontEnum);
+            thisObject-&gt;putDirect(vm, vm.propertyNames-&gt;prototype, prototype, DontDelete | DontEnum);
+            offset = thisObject-&gt;getDirectOffset(vm, vm.propertyNames-&gt;prototype, attributes);
</ins><span class="cx">             ASSERT(isValidOffset(offset));
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -371,11 +371,11 @@
</span><span class="cx">         slot.setValue(thisObject, attributes, thisObject-&gt;getDirect(offset), offset);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (propertyName == exec-&gt;propertyNames().arguments) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;arguments) {
</ins><span class="cx">         if (thisObject-&gt;jsExecutable()-&gt;isStrictMode() || thisObject-&gt;jsExecutable()-&gt;isClassConstructorFunction()) {
</span><span class="cx">             bool result = Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx">             if (!result) {
</span><del>-                GetterSetter* errorGetterSetter = thisObject-&gt;globalObject()-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter();
</del><ins>+                GetterSetter* errorGetterSetter = thisObject-&gt;globalObject(vm)-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter();
</ins><span class="cx">                 thisObject-&gt;putDirectAccessor(exec, propertyName, errorGetterSetter, DontDelete | DontEnum | Accessor);
</span><span class="cx">                 result = Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx">                 ASSERT(result);
</span><span class="lines">@@ -386,11 +386,11 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (propertyName == exec-&gt;propertyNames().caller) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;caller) {
</ins><span class="cx">         if (thisObject-&gt;jsExecutable()-&gt;isStrictMode() || thisObject-&gt;jsExecutable()-&gt;isClassConstructorFunction()) {
</span><span class="cx">             bool result = Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx">             if (!result) {
</span><del>-                GetterSetter* errorGetterSetter = thisObject-&gt;globalObject()-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter();
</del><ins>+                GetterSetter* errorGetterSetter = thisObject-&gt;globalObject(vm)-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter();
</ins><span class="cx">                 thisObject-&gt;putDirectAccessor(exec, propertyName, errorGetterSetter, DontDelete | DontEnum | Accessor);
</span><span class="cx">                 result = Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx">                 ASSERT(result);
</span><span class="lines">@@ -401,7 +401,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    thisObject-&gt;reifyLazyPropertyIfNeeded(exec, propertyName);
</del><ins>+    thisObject-&gt;reifyLazyPropertyIfNeeded(vm, exec, propertyName);
</ins><span class="cx"> 
</span><span class="cx">     return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
</span><span class="cx"> }
</span><span class="lines">@@ -437,11 +437,11 @@
</span><span class="cx">         return ordinarySetSlow(exec, thisObject, propertyName, value, slot.thisValue(), slot.isStrictMode());
</span><span class="cx"> 
</span><span class="cx">     if (thisObject-&gt;isHostOrBuiltinFunction()) {
</span><del>-        thisObject-&gt;reifyBoundNameIfNeeded(exec, propertyName);
</del><ins>+        thisObject-&gt;reifyBoundNameIfNeeded(vm, exec, propertyName);
</ins><span class="cx">         return Base::put(thisObject, exec, propertyName, value, slot);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (propertyName == exec-&gt;propertyNames().prototype) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;prototype) {
</ins><span class="cx">         // Make sure prototype has been reified, such that it can only be overwritten
</span><span class="cx">         // following the rules set out in ECMA-262 8.12.9.
</span><span class="cx">         PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
</span><span class="lines">@@ -453,7 +453,7 @@
</span><span class="cx">         scope.release();
</span><span class="cx">         return Base::put(thisObject, exec, propertyName, value, dontCache);
</span><span class="cx">     }
</span><del>-    if (thisObject-&gt;jsExecutable()-&gt;isStrictMode() &amp;&amp; (propertyName == exec-&gt;propertyNames().arguments || propertyName == exec-&gt;propertyNames().caller)) {
</del><ins>+    if (thisObject-&gt;jsExecutable()-&gt;isStrictMode() &amp;&amp; (propertyName == vm.propertyNames-&gt;arguments || propertyName == vm.propertyNames-&gt;caller)) {
</ins><span class="cx">         // This will trigger the property to be reified, if this is not already the case!
</span><span class="cx">         bool okay = thisObject-&gt;hasProperty(exec, propertyName);
</span><span class="cx">         ASSERT_UNUSED(okay, okay);
</span><span class="lines">@@ -460,12 +460,12 @@
</span><span class="cx">         scope.release();
</span><span class="cx">         return Base::put(thisObject, exec, propertyName, value, slot);
</span><span class="cx">     }
</span><del>-    if (propertyName == exec-&gt;propertyNames().arguments || propertyName == exec-&gt;propertyNames().caller) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;arguments || propertyName == vm.propertyNames-&gt;caller) {
</ins><span class="cx">         if (slot.isStrictMode())
</span><span class="cx">             throwTypeError(exec, scope, StrictModeReadonlyPropertyWriteError);
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><del>-    thisObject-&gt;reifyLazyPropertyIfNeeded(exec, propertyName);
</del><ins>+    thisObject-&gt;reifyLazyPropertyIfNeeded(vm, exec, propertyName);
</ins><span class="cx">     scope.release();
</span><span class="cx">     return Base::put(thisObject, exec, propertyName, value, slot);
</span><span class="cx"> }
</span><span class="lines">@@ -474,16 +474,17 @@
</span><span class="cx"> {
</span><span class="cx">     JSFunction* thisObject = jsCast&lt;JSFunction*&gt;(cell);
</span><span class="cx">     if (thisObject-&gt;isHostOrBuiltinFunction())
</span><del>-        thisObject-&gt;reifyBoundNameIfNeeded(exec, propertyName);
</del><ins>+        thisObject-&gt;reifyBoundNameIfNeeded(exec-&gt;vm(), exec, propertyName);
</ins><span class="cx">     else if (exec-&gt;vm().deletePropertyMode() != VM::DeletePropertyMode::IgnoreConfigurable) {
</span><span class="cx">         // For non-host functions, don't let these properties by deleted - except by DefineOwnProperty.
</span><ins>+        VM&amp; vm = exec-&gt;vm();
</ins><span class="cx">         FunctionExecutable* executable = thisObject-&gt;jsExecutable();
</span><del>-        if (propertyName == exec-&gt;propertyNames().arguments
-            || (propertyName == exec-&gt;propertyNames().prototype &amp;&amp; !executable-&gt;isArrowFunction())
-            || propertyName == exec-&gt;propertyNames().caller)
</del><ins>+        if (propertyName == vm.propertyNames-&gt;arguments
+            || (propertyName == vm.propertyNames-&gt;prototype &amp;&amp; !executable-&gt;isArrowFunction())
+            || propertyName == vm.propertyNames-&gt;caller)
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        thisObject-&gt;reifyLazyPropertyIfNeeded(exec, propertyName);
</del><ins>+        thisObject-&gt;reifyLazyPropertyIfNeeded(vm, exec, propertyName);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     return Base::deleteProperty(thisObject, exec, propertyName);
</span><span class="lines">@@ -496,11 +497,11 @@
</span><span class="cx"> 
</span><span class="cx">     JSFunction* thisObject = jsCast&lt;JSFunction*&gt;(object);
</span><span class="cx">     if (thisObject-&gt;isHostOrBuiltinFunction()) {
</span><del>-        thisObject-&gt;reifyBoundNameIfNeeded(exec, propertyName);
</del><ins>+        thisObject-&gt;reifyBoundNameIfNeeded(vm, exec, propertyName);
</ins><span class="cx">         return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (propertyName == exec-&gt;propertyNames().prototype) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;prototype) {
</ins><span class="cx">         // Make sure prototype has been reified, such that it can only be overwritten
</span><span class="cx">         // following the rules set out in ECMA-262 8.12.9.
</span><span class="cx">         PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
</span><span class="lines">@@ -511,24 +512,24 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     bool valueCheck;
</span><del>-    if (propertyName == exec-&gt;propertyNames().arguments) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;arguments) {
</ins><span class="cx">         if (thisObject-&gt;jsExecutable()-&gt;isStrictMode()) {
</span><span class="cx">             PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
</span><span class="cx">             if (!Base::getOwnPropertySlot(thisObject, exec, propertyName, slot))
</span><del>-                thisObject-&gt;putDirectAccessor(exec, propertyName, thisObject-&gt;globalObject()-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter(), DontDelete | DontEnum | Accessor);
</del><ins>+                thisObject-&gt;putDirectAccessor(exec, propertyName, thisObject-&gt;globalObject(vm)-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter(), DontDelete | DontEnum | Accessor);
</ins><span class="cx">             return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
</span><span class="cx">         }
</span><span class="cx">         valueCheck = !descriptor.value() || sameValue(exec, descriptor.value(), retrieveArguments(exec, thisObject));
</span><del>-    } else if (propertyName == exec-&gt;propertyNames().caller) {
</del><ins>+    } else if (propertyName == vm.propertyNames-&gt;caller) {
</ins><span class="cx">         if (thisObject-&gt;jsExecutable()-&gt;isStrictMode()) {
</span><span class="cx">             PropertySlot slot(thisObject, PropertySlot::InternalMethodType::VMInquiry);
</span><span class="cx">             if (!Base::getOwnPropertySlot(thisObject, exec, propertyName, slot))
</span><del>-                thisObject-&gt;putDirectAccessor(exec, propertyName, thisObject-&gt;globalObject()-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter(), DontDelete | DontEnum | Accessor);
</del><ins>+                thisObject-&gt;putDirectAccessor(exec, propertyName, thisObject-&gt;globalObject(vm)-&gt;throwTypeErrorArgumentsCalleeAndCallerGetterSetter(), DontDelete | DontEnum | Accessor);
</ins><span class="cx">             return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
</span><span class="cx">         }
</span><span class="cx">         valueCheck = !descriptor.value() || sameValue(exec, descriptor.value(), retrieveCallerFunction(exec, thisObject));
</span><span class="cx">     } else {
</span><del>-        thisObject-&gt;reifyLazyPropertyIfNeeded(exec, propertyName);
</del><ins>+        thisObject-&gt;reifyLazyPropertyIfNeeded(vm, exec, propertyName);
</ins><span class="cx">         return Base::defineOwnProperty(object, exec, propertyName, descriptor, throwException);
</span><span class="cx">     }
</span><span class="cx">      
</span><span class="lines">@@ -590,6 +591,7 @@
</span><span class="cx"> 
</span><span class="cx"> void JSFunction::setFunctionName(ExecState* exec, JSValue value)
</span><span class="cx"> {
</span><ins>+    VM&amp; vm = exec-&gt;vm();
</ins><span class="cx">     // The &quot;name&quot; property may have been already been defined as part of a property list in an
</span><span class="cx">     // object literal (and therefore reified).
</span><span class="cx">     if (hasReifiedName())
</span><span class="lines">@@ -605,7 +607,6 @@
</span><span class="cx">         else
</span><span class="cx">             name = makeString('[', String(uid), ']');
</span><span class="cx">     } else {
</span><del>-        VM&amp; vm = exec-&gt;vm();
</del><span class="cx">         JSString* jsStr = value.toString(exec);
</span><span class="cx">         if (vm.exception())
</span><span class="cx">             return;
</span><span class="lines">@@ -613,12 +614,11 @@
</span><span class="cx">         if (vm.exception())
</span><span class="cx">             return;
</span><span class="cx">     }
</span><del>-    reifyName(exec, name);
</del><ins>+    reifyName(vm, exec, name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSFunction::reifyLength(ExecState* exec)
</del><ins>+void JSFunction::reifyLength(VM&amp; vm)
</ins><span class="cx"> {
</span><del>-    VM&amp; vm = exec-&gt;vm();
</del><span class="cx">     FunctionRareData* rareData = this-&gt;rareData(vm);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!hasReifiedLength());
</span><span class="lines">@@ -625,13 +625,13 @@
</span><span class="cx">     ASSERT(!isHostFunction());
</span><span class="cx">     JSValue initialValue = jsNumber(jsExecutable()-&gt;parameterCount());
</span><span class="cx">     unsigned initialAttributes = DontEnum | ReadOnly;
</span><del>-    const Identifier&amp; identifier = exec-&gt;propertyNames().length;
</del><ins>+    const Identifier&amp; identifier = vm.propertyNames-&gt;length;
</ins><span class="cx">     putDirect(vm, identifier, initialValue, initialAttributes);
</span><span class="cx"> 
</span><span class="cx">     rareData-&gt;setHasReifiedLength();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSFunction::reifyName(ExecState* exec)
</del><ins>+void JSFunction::reifyName(VM&amp; vm, ExecState* exec)
</ins><span class="cx"> {
</span><span class="cx">     const Identifier&amp; ecmaName = jsExecutable()-&gt;ecmaName();
</span><span class="cx">     String name;
</span><span class="lines">@@ -642,18 +642,17 @@
</span><span class="cx">         name = exec-&gt;propertyNames().defaultKeyword.string();
</span><span class="cx">     else
</span><span class="cx">         name = ecmaName.string();
</span><del>-    reifyName(exec, name);
</del><ins>+    reifyName(vm, exec, name);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSFunction::reifyName(ExecState* exec, String name)
</del><ins>+void JSFunction::reifyName(VM&amp; vm, ExecState* exec, String name)
</ins><span class="cx"> {
</span><del>-    VM&amp; vm = exec-&gt;vm();
</del><span class="cx">     FunctionRareData* rareData = this-&gt;rareData(vm);
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!hasReifiedName());
</span><span class="cx">     ASSERT(!isHostFunction());
</span><span class="cx">     unsigned initialAttributes = DontEnum | ReadOnly;
</span><del>-    const Identifier&amp; propID = exec-&gt;propertyNames().name;
</del><ins>+    const Identifier&amp; propID = vm.propertyNames-&gt;name;
</ins><span class="cx"> 
</span><span class="cx">     if (exec-&gt;lexicalGlobalObject()-&gt;needsSiteSpecificQuirks()) {
</span><span class="cx">         auto illegalCharMatcher = [] (UChar ch) -&gt; bool {
</span><span class="lines">@@ -672,20 +671,20 @@
</span><span class="cx">     rareData-&gt;setHasReifiedName();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSFunction::reifyLazyPropertyIfNeeded(ExecState* exec, PropertyName propertyName)
</del><ins>+void JSFunction::reifyLazyPropertyIfNeeded(VM&amp; vm, ExecState* exec, PropertyName propertyName)
</ins><span class="cx"> {
</span><del>-    if (propertyName == exec-&gt;propertyNames().length) {
</del><ins>+    if (propertyName == vm.propertyNames-&gt;length) {
</ins><span class="cx">         if (!hasReifiedLength())
</span><del>-            reifyLength(exec);
-    } else if (propertyName == exec-&gt;propertyNames().name) {
</del><ins>+            reifyLength(vm);
+    } else if (propertyName == vm.propertyNames-&gt;name) {
</ins><span class="cx">         if (!hasReifiedName())
</span><del>-            reifyName(exec);
</del><ins>+            reifyName(vm, exec);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSFunction::reifyBoundNameIfNeeded(ExecState* exec, PropertyName propertyName)
</del><ins>+void JSFunction::reifyBoundNameIfNeeded(VM&amp; vm, ExecState* exec, PropertyName propertyName)
</ins><span class="cx"> {
</span><del>-    const Identifier&amp; nameIdent = exec-&gt;propertyNames().name;
</del><ins>+    const Identifier&amp; nameIdent = vm.propertyNames-&gt;name;
</ins><span class="cx">     if (propertyName != nameIdent)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="lines">@@ -693,7 +692,6 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     if (this-&gt;inherits(JSBoundFunction::info())) {
</span><del>-        VM&amp; vm = exec-&gt;vm();
</del><span class="cx">         FunctionRareData* rareData = this-&gt;rareData(vm);
</span><span class="cx">         String name = makeString(&quot;bound &quot;, static_cast&lt;NativeExecutable*&gt;(m_executable.get())-&gt;name());
</span><span class="cx">         unsigned initialAttributes = DontEnum | ReadOnly;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSFunctionh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunction.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -189,11 +189,11 @@
</span><span class="cx"> 
</span><span class="cx">     bool hasReifiedLength() const;
</span><span class="cx">     bool hasReifiedName() const;
</span><del>-    void reifyLength(ExecState*);
-    void reifyName(ExecState*);
-    void reifyBoundNameIfNeeded(ExecState*, PropertyName);
-    void reifyName(ExecState*, String name);
-    void reifyLazyPropertyIfNeeded(ExecState*, PropertyName propertyName);
</del><ins>+    void reifyLength(VM&amp;);
+    void reifyName(VM&amp;, ExecState*);
+    void reifyBoundNameIfNeeded(VM&amp;, ExecState*, PropertyName);
+    void reifyName(VM&amp;, ExecState*, String name);
+    void reifyLazyPropertyIfNeeded(VM&amp;, ExecState*, PropertyName propertyName);
</ins><span class="cx"> 
</span><span class="cx">     friend class LLIntOffsetsExtractor;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSFunctionInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunctionInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunctionInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSFunctionInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -35,7 +35,7 @@
</span><span class="cx">     VM&amp; vm, FunctionExecutable* executable, JSScope* scope)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(executable-&gt;singletonFunction()-&gt;hasBeenInvalidated());
</span><del>-    return createImpl(vm, executable, scope, scope-&gt;globalObject()-&gt;functionStructure());
</del><ins>+    return createImpl(vm, executable, scope, scope-&gt;globalObject(vm)-&gt;functionStructure());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline JSFunction::JSFunction(VM&amp; vm, FunctionExecutable* executable, JSScope* scope, Structure* structure)
</span><span class="lines">@@ -47,7 +47,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBASSEMBLY)
</span><span class="cx"> inline JSFunction::JSFunction(VM&amp; vm, WebAssemblyExecutable* executable, JSScope* scope)
</span><del>-    : Base(vm, scope, scope-&gt;globalObject()-&gt;functionStructure())
</del><ins>+    : Base(vm, scope, scope-&gt;globalObject(vm)-&gt;functionStructure())
</ins><span class="cx">     , m_executable(vm, this, executable)
</span><span class="cx">     , m_rareData()
</span><span class="cx"> {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSGenericTypedArrayViewInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSGenericTypedArrayViewInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -520,25 +520,15 @@
</span><span class="cx">     // up. But if you do *anything* to trigger a GC watermark check, it will know
</span><span class="cx">     // that you *had* done those allocations and it will GC appropriately.
</span><span class="cx">     Heap* heap = Heap::heap(thisObject);
</span><ins>+    VM&amp; vm = *heap-&gt;vm();
</ins><span class="cx">     DeferGCForAWhile deferGC(*heap);
</span><span class="cx">     
</span><span class="cx">     ASSERT(!thisObject-&gt;hasIndexingHeader());
</span><span class="cx"> 
</span><del>-    size_t size = thisObject-&gt;byteSize();
-    
-    if (thisObject-&gt;m_mode == FastTypedArray
-        &amp;&amp; !thisObject-&gt;butterfly() &amp;&amp; size &gt;= sizeof(IndexingHeader)) {
-        ASSERT(thisObject-&gt;m_vector);
-        // Reuse already allocated memory if at all possible.
-        thisObject-&gt;m_butterfly.setWithoutBarrier(
-            bitwise_cast&lt;IndexingHeader*&gt;(thisObject-&gt;vector())-&gt;butterfly());
-    } else {
-        RELEASE_ASSERT(!thisObject-&gt;hasIndexingHeader());
-        VM&amp; vm = *heap-&gt;vm();
-        thisObject-&gt;m_butterfly.set(vm, thisObject, Butterfly::createOrGrowArrayRight(
-            thisObject-&gt;butterfly(), vm, thisObject, thisObject-&gt;structure(),
-            thisObject-&gt;structure()-&gt;outOfLineCapacity(), false, 0, 0));
-    }
</del><ins>+    RELEASE_ASSERT(!thisObject-&gt;hasIndexingHeader());
+    thisObject-&gt;m_butterfly.set(vm, thisObject, Butterfly::createOrGrowArrayRight(
+        thisObject-&gt;butterfly(), vm, thisObject, thisObject-&gt;structure(),
+        thisObject-&gt;structure()-&gt;outOfLineCapacity(), false, 0, 0));
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;ArrayBuffer&gt; buffer;
</span><span class="cx">     
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromisecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromise.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromise.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromise.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,10 +27,7 @@
</span><span class="cx"> #include &quot;JSInternalPromise.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSObjectInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromiseConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,11 +27,9 @@
</span><span class="cx"> #include &quot;JSInternalPromiseConstructor.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSInternalPromise.h&quot;
</span><span class="cx"> #include &quot;JSInternalPromisePrototype.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;JSInternalPromiseConstructor.lut.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromiseDeferredcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseDeferred.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseDeferred.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromiseDeferred.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,13 +29,9 @@
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSInternalPromise.h&quot;
</span><span class="cx"> #include &quot;JSInternalPromiseConstructor.h&quot;
</span><del>-#include &quot;JSObjectInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSInternalPromisePrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromisePrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromisePrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSInternalPromisePrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,12 +28,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSInternalPromise.h&quot;
</span><span class="cx"> #include &quot;Microtask.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSJobcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSJob.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSJob.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSJob.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,12 +28,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;Microtask.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
</del><span class="cx"> #include &quot;StrongInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSMapIteratorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSMapIterator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSMapIterator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSMapIterator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple, Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2016 Apple, Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,12 +26,9 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSMapIterator.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSMap.h&quot;
</span><span class="cx"> #include &quot;MapDataInlines.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSModuleNamespaceObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,14 +27,10 @@
</span><span class="cx"> #include &quot;JSModuleNamespaceObject.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><del>-#include &quot;IdentifierInlines.h&quot;
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSModuleEnvironment.h&quot;
</span><span class="cx"> #include &quot;JSModuleRecord.h&quot;
</span><span class="cx"> #include &quot;JSPropertyNameIterator.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSModuleRecordcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleRecord.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleRecord.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSModuleRecord.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,15 +28,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;Executable.h&quot;
</span><del>-#include &quot;IdentifierInlines.h&quot;
-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;Interpreter.h&quot;
+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSMap.h&quot;
</span><span class="cx"> #include &quot;JSModuleEnvironment.h&quot;
</span><span class="cx"> #include &quot;JSModuleNamespaceObject.h&quot;
</span><del>-#include &quot;JSObjectInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -88,77 +88,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ALWAYS_INLINE void JSObject::copyButterfly(CopyVisitor&amp; visitor, Butterfly* butterfly, size_t storageSize)
-{
-    ASSERT(butterfly);
-    
-    Structure* structure = this-&gt;structure();
-    
-    size_t propertyCapacity = structure-&gt;outOfLineCapacity();
-    size_t preCapacity;
-    size_t indexingPayloadSizeInBytes;
-    bool hasIndexingHeader = this-&gt;hasIndexingHeader();
-    if (UNLIKELY(hasIndexingHeader)) {
-        preCapacity = butterfly-&gt;indexingHeader()-&gt;preCapacity(structure);
-        indexingPayloadSizeInBytes = butterfly-&gt;indexingHeader()-&gt;indexingPayloadSizeInBytes(structure);
-    } else {
-        preCapacity = 0;
-        indexingPayloadSizeInBytes = 0;
-    }
-    size_t capacityInBytes = Butterfly::totalSize(preCapacity, propertyCapacity, hasIndexingHeader, indexingPayloadSizeInBytes);
-    if (visitor.checkIfShouldCopy(butterfly-&gt;base(preCapacity, propertyCapacity))) {
-        Butterfly* newButterfly = Butterfly::createUninitializedDuringCollection(visitor, preCapacity, propertyCapacity, hasIndexingHeader, indexingPayloadSizeInBytes);
-
-        // Copy the properties.
-        PropertyStorage currentTarget = newButterfly-&gt;propertyStorage();
-        PropertyStorage currentSource = butterfly-&gt;propertyStorage();
-        for (size_t count = storageSize; count--;)
-            (--currentTarget)-&gt;setWithoutWriteBarrier((--currentSource)-&gt;get());
-        
-        if (UNLIKELY(hasIndexingHeader)) {
-            *newButterfly-&gt;indexingHeader() = *butterfly-&gt;indexingHeader();
-            
-            // Copy the array if appropriate.
-            
-            WriteBarrier&lt;Unknown&gt;* currentTarget;
-            WriteBarrier&lt;Unknown&gt;* currentSource;
-            size_t count;
-            
-            switch (this-&gt;indexingType()) {
-            case ALL_UNDECIDED_INDEXING_TYPES:
-            case ALL_CONTIGUOUS_INDEXING_TYPES:
-            case ALL_INT32_INDEXING_TYPES:
-            case ALL_DOUBLE_INDEXING_TYPES: {
-                currentTarget = newButterfly-&gt;contiguous().data();
-                currentSource = butterfly-&gt;contiguous().data();
-                RELEASE_ASSERT(newButterfly-&gt;publicLength() &lt;= newButterfly-&gt;vectorLength());
-                count = newButterfly-&gt;vectorLength();
-                break;
-            }
-                
-            case ALL_ARRAY_STORAGE_INDEXING_TYPES: {
-                newButterfly-&gt;arrayStorage()-&gt;copyHeaderFromDuringGC(*butterfly-&gt;arrayStorage());
-                currentTarget = newButterfly-&gt;arrayStorage()-&gt;m_vector;
-                currentSource = butterfly-&gt;arrayStorage()-&gt;m_vector;
-                count = newButterfly-&gt;arrayStorage()-&gt;vectorLength();
-                break;
-            }
-                
-            default:
-                currentTarget = 0;
-                currentSource = 0;
-                count = 0;
-                break;
-            }
-
-            memcpy(currentTarget, currentSource, count * sizeof(EncodedJSValue));
-        }
-        
-        m_butterfly.setWithoutBarrier(newButterfly);
-        visitor.didCopy(butterfly-&gt;base(preCapacity, propertyCapacity), capacityInBytes);
-    } 
-}
-
</del><span class="cx"> ALWAYS_INLINE void JSObject::visitButterfly(SlotVisitor&amp; visitor, Butterfly* butterfly, Structure* structure)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(butterfly);
</span><span class="lines">@@ -166,22 +95,21 @@
</span><span class="cx">     size_t storageSize = structure-&gt;outOfLineSize();
</span><span class="cx">     size_t propertyCapacity = structure-&gt;outOfLineCapacity();
</span><span class="cx">     size_t preCapacity;
</span><del>-    size_t indexingPayloadSizeInBytes;
</del><span class="cx">     bool hasIndexingHeader = this-&gt;hasIndexingHeader();
</span><del>-    if (UNLIKELY(hasIndexingHeader)) {
</del><ins>+    if (UNLIKELY(hasIndexingHeader))
</ins><span class="cx">         preCapacity = butterfly-&gt;indexingHeader()-&gt;preCapacity(structure);
</span><del>-        indexingPayloadSizeInBytes = butterfly-&gt;indexingHeader()-&gt;indexingPayloadSizeInBytes(structure);
-    } else {
</del><ins>+    else
</ins><span class="cx">         preCapacity = 0;
</span><del>-        indexingPayloadSizeInBytes = 0;
-    }
-    size_t capacityInBytes = Butterfly::totalSize(preCapacity, propertyCapacity, hasIndexingHeader, indexingPayloadSizeInBytes);
</del><ins>+    
+    HeapCell* base = bitwise_cast&lt;HeapCell*&gt;(butterfly-&gt;base(preCapacity, propertyCapacity));
+    
+    ASSERT(Heap::heap(base) == visitor.heap());
</ins><span class="cx"> 
</span><ins>+    // Keep the butterfly alive.
+    visitor.markAuxiliary(base);
+    
</ins><span class="cx">     // Mark the properties.
</span><span class="cx">     visitor.appendValuesHidden(butterfly-&gt;propertyStorage() - storageSize, storageSize);
</span><del>-    visitor.copyLater(
-        this, ButterflyCopyToken,
-        butterfly-&gt;base(preCapacity, propertyCapacity), capacityInBytes);
</del><span class="cx">     
</span><span class="cx">     // Mark the array if appropriate.
</span><span class="cx">     switch (this-&gt;indexingType()) {
</span><span class="lines">@@ -225,19 +153,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void JSObject::copyBackingStore(JSCell* cell, CopyVisitor&amp; visitor, CopyToken token)
-{
-    JSObject* thisObject = jsCast&lt;JSObject*&gt;(cell);
-    ASSERT_GC_OBJECT_INHERITS(thisObject, info());
-
-    if (token != ButterflyCopyToken)
-        return;
-    
-    Butterfly* butterfly = thisObject-&gt;m_butterfly.get();
-    if (butterfly)
-        thisObject-&gt;copyButterfly(visitor, butterfly, thisObject-&gt;structure()-&gt;outOfLineSize());
-}
-
</del><span class="cx"> void JSObject::heapSnapshot(JSCell* cell, HeapSnapshotBuilder&amp; builder)
</span><span class="cx"> {
</span><span class="cx">     JSObject* thisObject = jsCast&lt;JSObject*&gt;(cell);
</span><span class="lines">@@ -783,10 +698,10 @@
</span><span class="cx">     if (!vm.prototypeMap.isPrototype(this))
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    globalObject()-&gt;haveABadTime(vm);
</del><ins>+    globalObject(vm)-&gt;haveABadTime(vm);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-Butterfly* JSObject::createInitialIndexedStorage(VM&amp; vm, unsigned length, size_t elementSize)
</del><ins>+Butterfly* JSObject::createInitialIndexedStorage(VM&amp; vm, unsigned length)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(length &lt; MAX_ARRAY_INDEX);
</span><span class="cx">     IndexingType oldType = indexingType();
</span><span class="lines">@@ -793,10 +708,12 @@
</span><span class="cx">     ASSERT_UNUSED(oldType, !hasIndexedProperties(oldType));
</span><span class="cx">     ASSERT(!structure()-&gt;needsSlowPutIndexing());
</span><span class="cx">     ASSERT(!indexingShouldBeSparse());
</span><del>-    unsigned vectorLength = std::max(length, BASE_VECTOR_LEN);
</del><ins>+    Structure* structure = this-&gt;structure(vm);
+    unsigned propertyCapacity = structure-&gt;outOfLineCapacity();
+    unsigned vectorLength = Butterfly::optimalContiguousVectorLength(propertyCapacity, length);
</ins><span class="cx">     Butterfly* newButterfly = Butterfly::createOrGrowArrayRight(
</span><del>-        m_butterfly.get(), vm, this, structure(), structure()-&gt;outOfLineCapacity(), false, 0,
-        elementSize * vectorLength);
</del><ins>+        m_butterfly.get(), vm, this, structure, propertyCapacity, false, 0,
+        sizeof(EncodedJSValue) * vectorLength);
</ins><span class="cx">     newButterfly-&gt;setPublicLength(length);
</span><span class="cx">     newButterfly-&gt;setVectorLength(vectorLength);
</span><span class="cx">     return newButterfly;
</span><span class="lines">@@ -805,7 +722,7 @@
</span><span class="cx"> Butterfly* JSObject::createInitialUndecided(VM&amp; vm, unsigned length)
</span><span class="cx"> {
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><del>-    Butterfly* newButterfly = createInitialIndexedStorage(vm, length, sizeof(EncodedJSValue));
</del><ins>+    Butterfly* newButterfly = createInitialIndexedStorage(vm, length);
</ins><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), NonPropertyTransition::AllocateUndecided);
</span><span class="cx">     setStructureAndButterfly(vm, newStructure, newButterfly);
</span><span class="cx">     return newButterfly;
</span><span class="lines">@@ -814,7 +731,9 @@
</span><span class="cx"> ContiguousJSValues JSObject::createInitialInt32(VM&amp; vm, unsigned length)
</span><span class="cx"> {
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><del>-    Butterfly* newButterfly = createInitialIndexedStorage(vm, length, sizeof(EncodedJSValue));
</del><ins>+    Butterfly* newButterfly = createInitialIndexedStorage(vm, length);
+    for (unsigned i = newButterfly-&gt;vectorLength(); i--;)
+        newButterfly-&gt;contiguousInt32()[i].setWithoutWriteBarrier(JSValue());
</ins><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), NonPropertyTransition::AllocateInt32);
</span><span class="cx">     setStructureAndButterfly(vm, newStructure, newButterfly);
</span><span class="cx">     return newButterfly-&gt;contiguousInt32();
</span><span class="lines">@@ -823,7 +742,7 @@
</span><span class="cx"> ContiguousDoubles JSObject::createInitialDouble(VM&amp; vm, unsigned length)
</span><span class="cx"> {
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><del>-    Butterfly* newButterfly = createInitialIndexedStorage(vm, length, sizeof(double));
</del><ins>+    Butterfly* newButterfly = createInitialIndexedStorage(vm, length);
</ins><span class="cx">     for (unsigned i = newButterfly-&gt;vectorLength(); i--;)
</span><span class="cx">         newButterfly-&gt;contiguousDouble()[i] = PNaN;
</span><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), NonPropertyTransition::AllocateDouble);
</span><span class="lines">@@ -834,7 +753,9 @@
</span><span class="cx"> ContiguousJSValues JSObject::createInitialContiguous(VM&amp; vm, unsigned length)
</span><span class="cx"> {
</span><span class="cx">     DeferGC deferGC(vm.heap);
</span><del>-    Butterfly* newButterfly = createInitialIndexedStorage(vm, length, sizeof(EncodedJSValue));
</del><ins>+    Butterfly* newButterfly = createInitialIndexedStorage(vm, length);
+    for (unsigned i = newButterfly-&gt;vectorLength(); i--;)
+        newButterfly-&gt;contiguous()[i].setWithoutWriteBarrier(JSValue());
</ins><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), NonPropertyTransition::AllocateContiguous);
</span><span class="cx">     setStructureAndButterfly(vm, newStructure, newButterfly);
</span><span class="cx">     return newButterfly-&gt;contiguous();
</span><span class="lines">@@ -857,6 +778,8 @@
</span><span class="cx">     result-&gt;m_sparseMap.clear();
</span><span class="cx">     result-&gt;m_numValuesInVector = 0;
</span><span class="cx">     result-&gt;m_indexBias = 0;
</span><ins>+    for (size_t i = vectorLength; i--;)
+        result-&gt;m_vector[i].setWithoutWriteBarrier(JSValue());
</ins><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure, structure-&gt;suggestedArrayStorageTransition());
</span><span class="cx">     setStructureAndButterfly(vm, newStructure, newButterfly);
</span><span class="cx">     return result;
</span><span class="lines">@@ -864,12 +787,18 @@
</span><span class="cx"> 
</span><span class="cx"> ArrayStorage* JSObject::createInitialArrayStorage(VM&amp; vm)
</span><span class="cx"> {
</span><del>-    return createArrayStorage(vm, 0, BASE_VECTOR_LEN);
</del><ins>+    return createArrayStorage(
+        vm, 0, ArrayStorage::optimalVectorLength(0, structure(vm)-&gt;outOfLineCapacity(), 0));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ContiguousJSValues JSObject::convertUndecidedToInt32(VM&amp; vm)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasUndecided(indexingType()));
</span><ins>+
+    Butterfly* butterfly = m_butterfly.get();
+    for (unsigned i = butterfly-&gt;vectorLength(); i--;)
+        butterfly-&gt;contiguousInt32()[i].setWithoutWriteBarrier(JSValue());
+
</ins><span class="cx">     setStructure(vm, Structure::nonPropertyTransition(vm, structure(vm), NonPropertyTransition::AllocateInt32));
</span><span class="cx">     return m_butterfly.get()-&gt;contiguousInt32();
</span><span class="cx"> }
</span><span class="lines">@@ -889,6 +818,11 @@
</span><span class="cx"> ContiguousJSValues JSObject::convertUndecidedToContiguous(VM&amp; vm)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasUndecided(indexingType()));
</span><ins>+
+    Butterfly* butterfly = m_butterfly.get();
+    for (unsigned i = butterfly-&gt;vectorLength(); i--;)
+        butterfly-&gt;contiguous()[i].setWithoutWriteBarrier(JSValue());
+
</ins><span class="cx">     setStructure(vm, Structure::nonPropertyTransition(vm, structure(vm), NonPropertyTransition::AllocateContiguous));
</span><span class="cx">     return m_butterfly.get()-&gt;contiguous();
</span><span class="cx"> }
</span><span class="lines">@@ -925,8 +859,10 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned vectorLength = m_butterfly.get()-&gt;vectorLength();
</span><span class="cx">     ArrayStorage* storage = constructConvertedArrayStorageWithoutCopyingElements(vm, vectorLength);
</span><del>-    // No need to copy elements.
</del><span class="cx">     
</span><ins>+    for (unsigned i = vectorLength; i--;)
+        storage-&gt;m_vector[i].setWithoutWriteBarrier(JSValue());
+    
</ins><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), transition);
</span><span class="cx">     setStructureAndButterfly(vm, newStructure, storage-&gt;butterfly());
</span><span class="cx">     return storage;
</span><span class="lines">@@ -946,11 +882,12 @@
</span><span class="cx">         WriteBarrier&lt;Unknown&gt;* current = &amp;butterfly-&gt;contiguousInt32()[i];
</span><span class="cx">         double* currentAsDouble = bitwise_cast&lt;double*&gt;(current);
</span><span class="cx">         JSValue v = current-&gt;get();
</span><del>-        if (!v) {
</del><ins>+        // NOTE: Since this may be used during initialization, v could be garbage. If it's garbage,
+        // that means it will be overwritten later.
+        if (!v.isInt32()) {
</ins><span class="cx">             *currentAsDouble = PNaN;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span><del>-        ASSERT(v.isInt32());
</del><span class="cx">         *currentAsDouble = v.asInt32();
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="lines">@@ -974,13 +911,11 @@
</span><span class="cx">     unsigned vectorLength = m_butterfly.get()-&gt;vectorLength();
</span><span class="cx">     ArrayStorage* newStorage = constructConvertedArrayStorageWithoutCopyingElements(vm, vectorLength);
</span><span class="cx">     Butterfly* butterfly = m_butterfly.get();
</span><del>-    for (unsigned i = 0; i &lt; butterfly-&gt;publicLength(); i++) {
</del><ins>+    for (unsigned i = 0; i &lt; vectorLength; i++) {
</ins><span class="cx">         JSValue v = butterfly-&gt;contiguous()[i].get();
</span><del>-        if (v) {
-            newStorage-&gt;m_vector[i].setWithoutWriteBarrier(v);
</del><ins>+        newStorage-&gt;m_vector[i].setWithoutWriteBarrier(v);
+        if (v)
</ins><span class="cx">             newStorage-&gt;m_numValuesInVector++;
</span><del>-        } else
-            ASSERT(newStorage-&gt;m_vector[i].get().isEmpty());
</del><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), transition);
</span><span class="lines">@@ -1022,13 +957,11 @@
</span><span class="cx">     unsigned vectorLength = m_butterfly.get()-&gt;vectorLength();
</span><span class="cx">     ArrayStorage* newStorage = constructConvertedArrayStorageWithoutCopyingElements(vm, vectorLength);
</span><span class="cx">     Butterfly* butterfly = m_butterfly.get();
</span><del>-    for (unsigned i = 0; i &lt; butterfly-&gt;publicLength(); i++) {
</del><ins>+    for (unsigned i = 0; i &lt; vectorLength; i++) {
</ins><span class="cx">         double value = butterfly-&gt;contiguousDouble()[i];
</span><del>-        if (value == value) {
-            newStorage-&gt;m_vector[i].setWithoutWriteBarrier(JSValue(JSValue::EncodeAsDouble, value));
</del><ins>+        newStorage-&gt;m_vector[i].setWithoutWriteBarrier(JSValue(JSValue::EncodeAsDouble, value));
+        if (value == value)
</ins><span class="cx">             newStorage-&gt;m_numValuesInVector++;
</span><del>-        } else
-            ASSERT(newStorage-&gt;m_vector[i].get().isEmpty());
</del><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), transition);
</span><span class="lines">@@ -1049,13 +982,11 @@
</span><span class="cx">     unsigned vectorLength = m_butterfly.get()-&gt;vectorLength();
</span><span class="cx">     ArrayStorage* newStorage = constructConvertedArrayStorageWithoutCopyingElements(vm, vectorLength);
</span><span class="cx">     Butterfly* butterfly = m_butterfly.get();
</span><del>-    for (unsigned i = 0; i &lt; butterfly-&gt;publicLength(); i++) {
</del><ins>+    for (unsigned i = 0; i &lt; vectorLength; i++) {
</ins><span class="cx">         JSValue v = butterfly-&gt;contiguous()[i].get();
</span><del>-        if (v) {
-            newStorage-&gt;m_vector[i].setWithoutWriteBarrier(v);
</del><ins>+        newStorage-&gt;m_vector[i].setWithoutWriteBarrier(v);
+        if (v)
</ins><span class="cx">             newStorage-&gt;m_numValuesInVector++;
</span><del>-        } else
-            ASSERT(newStorage-&gt;m_vector[i].get().isEmpty());
</del><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     Structure* newStructure = Structure::nonPropertyTransition(vm, structure(vm), transition);
</span><span class="lines">@@ -2406,7 +2337,7 @@
</span><span class="cx">         }
</span><span class="cx">         if (structure(vm)-&gt;needsSlowPutIndexing()) {
</span><span class="cx">             // Convert the indexing type to the SlowPutArrayStorage and retry.
</span><del>-            createArrayStorage(vm, i + 1, getNewVectorLength(0, 0, i + 1));
</del><ins>+            createArrayStorage(vm, i + 1, getNewVectorLength(0, 0, 0, i + 1));
</ins><span class="cx">             return putByIndex(this, exec, i, value, shouldThrow);
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="lines">@@ -2547,7 +2478,7 @@
</span><span class="cx">                 exec, i, value, attributes, mode, createArrayStorage(vm, 0, 0));
</span><span class="cx">         }
</span><span class="cx">         if (structure(vm)-&gt;needsSlowPutIndexing()) {
</span><del>-            ArrayStorage* storage = createArrayStorage(vm, i + 1, getNewVectorLength(0, 0, i + 1));
</del><ins>+            ArrayStorage* storage = createArrayStorage(vm, i + 1, getNewVectorLength(0, 0, 0, i + 1));
</ins><span class="cx">             storage-&gt;m_vector[i].set(vm, this, value);
</span><span class="cx">             storage-&gt;m_numValuesInVector++;
</span><span class="cx">             return true;
</span><span class="lines">@@ -2666,7 +2597,8 @@
</span><span class="cx">     putDirectWithoutTransition(vm, propertyName, function, attributes);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ALWAYS_INLINE unsigned JSObject::getNewVectorLength(unsigned currentVectorLength, unsigned currentLength, unsigned desiredLength)
</del><ins>+// NOTE: This method is for ArrayStorage vectors.
+ALWAYS_INLINE unsigned JSObject::getNewVectorLength(unsigned indexBias, unsigned currentVectorLength, unsigned currentLength, unsigned desiredLength)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(desiredLength &lt;= MAX_STORAGE_VECTOR_LENGTH);
</span><span class="cx"> 
</span><span class="lines">@@ -2683,25 +2615,27 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT(increasedLength &gt;= desiredLength);
</span><span class="cx"> 
</span><del>-    lastArraySize = std::min(increasedLength, FIRST_VECTOR_GROW);
</del><ins>+    lastArraySize = std::min(increasedLength, FIRST_ARRAY_STORAGE_VECTOR_GROW);
</ins><span class="cx"> 
</span><del>-    return std::min(increasedLength, MAX_STORAGE_VECTOR_LENGTH);
</del><ins>+    return ArrayStorage::optimalVectorLength(
+        indexBias, structure()-&gt;outOfLineCapacity(),
+        std::min(increasedLength, MAX_STORAGE_VECTOR_LENGTH));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ALWAYS_INLINE unsigned JSObject::getNewVectorLength(unsigned desiredLength)
</span><span class="cx"> {
</span><del>-    unsigned vectorLength;
-    unsigned length;
</del><ins>+    unsigned indexBias = 0;
+    unsigned vectorLength = 0;
+    unsigned length = 0;
</ins><span class="cx">     
</span><span class="cx">     if (hasIndexedProperties(indexingType())) {
</span><ins>+        if (ArrayStorage* storage = arrayStorageOrNull())
+            indexBias = storage-&gt;m_indexBias;
</ins><span class="cx">         vectorLength = m_butterfly.get()-&gt;vectorLength();
</span><span class="cx">         length = m_butterfly.get()-&gt;publicLength();
</span><del>-    } else {
-        vectorLength = 0;
-        length = 0;
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    return getNewVectorLength(vectorLength, length, desiredLength);
</del><ins>+    return getNewVectorLength(indexBias, vectorLength, length, desiredLength);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;IndexingType indexingShape&gt;
</span><span class="lines">@@ -2754,19 +2688,28 @@
</span><span class="cx"> 
</span><span class="cx"> bool JSObject::increaseVectorLength(VM&amp; vm, unsigned newLength)
</span><span class="cx"> {
</span><ins>+    ArrayStorage* storage = arrayStorage();
+    
+    unsigned vectorLength = storage-&gt;vectorLength();
+    unsigned availableVectorLength = storage-&gt;availableVectorLength(structure(vm), vectorLength); 
+    if (availableVectorLength &gt;= newLength) {
+        // The cell was already big enough for the desired length!
+        for (unsigned i = vectorLength; i &lt; availableVectorLength; ++i)
+            storage-&gt;m_vector[i].clear();
+        storage-&gt;setVectorLength(availableVectorLength);
+        return true;
+    }
+    
</ins><span class="cx">     // This function leaves the array in an internally inconsistent state, because it does not move any values from sparse value map
</span><span class="cx">     // to the vector. Callers have to account for that, because they can do it more efficiently.
</span><span class="cx">     if (newLength &gt; MAX_STORAGE_VECTOR_LENGTH)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    ArrayStorage* storage = arrayStorage();
-    
</del><span class="cx">     if (newLength &gt;= MIN_SPARSE_ARRAY_INDEX
</span><span class="cx">         &amp;&amp; !isDenseEnoughForVector(newLength, storage-&gt;m_numValuesInVector))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><span class="cx">     unsigned indexBias = storage-&gt;m_indexBias;
</span><del>-    unsigned vectorLength = storage-&gt;vectorLength();
</del><span class="cx">     ASSERT(newLength &gt; vectorLength);
</span><span class="cx">     unsigned newVectorLength = getNewVectorLength(newLength);
</span><span class="cx"> 
</span><span class="lines">@@ -2779,6 +2722,8 @@
</span><span class="cx">             ArrayStorage::sizeFor(vectorLength), ArrayStorage::sizeFor(newVectorLength));
</span><span class="cx">         if (!newButterfly)
</span><span class="cx">             return false;
</span><ins>+        for (unsigned i = vectorLength; i &lt; newVectorLength; ++i)
+            newButterfly-&gt;arrayStorage()-&gt;m_vector[i].clear();
</ins><span class="cx">         newButterfly-&gt;arrayStorage()-&gt;setVectorLength(newVectorLength);
</span><span class="cx">         setButterflyWithoutChangingStructure(vm, newButterfly);
</span><span class="cx">         return true;
</span><span class="lines">@@ -2793,6 +2738,8 @@
</span><span class="cx">         newIndexBias, true, ArrayStorage::sizeFor(newVectorLength));
</span><span class="cx">     if (!newButterfly)
</span><span class="cx">         return false;
</span><ins>+    for (unsigned i = vectorLength; i &lt; newVectorLength; ++i)
+        newButterfly-&gt;arrayStorage()-&gt;m_vector[i].clear();
</ins><span class="cx">     newButterfly-&gt;arrayStorage()-&gt;setVectorLength(newVectorLength);
</span><span class="cx">     newButterfly-&gt;arrayStorage()-&gt;m_indexBias = newIndexBias;
</span><span class="cx">     setButterflyWithoutChangingStructure(vm, newButterfly);
</span><span class="lines">@@ -2807,25 +2754,41 @@
</span><span class="cx">     ASSERT(hasContiguous(indexingType()) || hasInt32(indexingType()) || hasDouble(indexingType()) || hasUndecided(indexingType()));
</span><span class="cx">     ASSERT(length &gt; butterfly-&gt;vectorLength());
</span><span class="cx">     
</span><del>-    unsigned newVectorLength = std::min(
-        length &lt;&lt; 1,
-        MAX_STORAGE_VECTOR_LENGTH);
</del><span class="cx">     unsigned oldVectorLength = butterfly-&gt;vectorLength();
</span><del>-    DeferGC deferGC(vm.heap);
-    butterfly = butterfly-&gt;growArrayRight(
-        vm, this, structure(), structure()-&gt;outOfLineCapacity(), true,
-        oldVectorLength * sizeof(EncodedJSValue),
-        newVectorLength * sizeof(EncodedJSValue));
-    if (!butterfly)
-        return false;
-    m_butterfly.set(vm, this, butterfly);
</del><ins>+    unsigned newVectorLength;
+    
+    Structure* structure = this-&gt;structure(vm);
+    unsigned propertyCapacity = structure-&gt;outOfLineCapacity();
+    
+    unsigned availableOldLength =
+        Butterfly::availableContiguousVectorLength(propertyCapacity, oldVectorLength);
+    if (availableOldLength &gt;= length) {
+        // This is the case where someone else selected a vector length that caused internal
+        // fragmentation. If we did our jobs right, this would never happen. But I bet we will mess
+        // this up, so this defense should stay.
+        newVectorLength = availableOldLength;
+    } else {
+        newVectorLength = Butterfly::optimalContiguousVectorLength(
+            propertyCapacity, std::min(length &lt;&lt; 1, MAX_STORAGE_VECTOR_LENGTH));
+        butterfly = butterfly-&gt;growArrayRight(
+            vm, this, structure, propertyCapacity, true,
+            oldVectorLength * sizeof(EncodedJSValue),
+            newVectorLength * sizeof(EncodedJSValue));
+        if (!butterfly)
+            return false;
+        m_butterfly.set(vm, this, butterfly);
+    }
</ins><span class="cx"> 
</span><span class="cx">     butterfly-&gt;setVectorLength(newVectorLength);
</span><span class="cx"> 
</span><span class="cx">     if (hasDouble(indexingType())) {
</span><span class="cx">         for (unsigned i = oldVectorLength; i &lt; newVectorLength; ++i)
</span><del>-            butterfly-&gt;contiguousDouble().data()[i] = PNaN;
</del><ins>+            butterfly-&gt;contiguousDouble()[i] = PNaN;
+    } else {
+        for (unsigned i = oldVectorLength; i &lt; newVectorLength; ++i)
+            butterfly-&gt;contiguous()[i].clear();
</ins><span class="cx">     }
</span><ins>+
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSObjecth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObject.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,15 +26,14 @@
</span><span class="cx"> #include &quot;ArgList.h&quot;
</span><span class="cx"> #include &quot;ArrayConventions.h&quot;
</span><span class="cx"> #include &quot;ArrayStorage.h&quot;
</span><ins>+#include &quot;AuxiliaryBarrier.h&quot;
</ins><span class="cx"> #include &quot;Butterfly.h&quot;
</span><span class="cx"> #include &quot;CallFrame.h&quot;
</span><span class="cx"> #include &quot;ClassInfo.h&quot;
</span><span class="cx"> #include &quot;CommonIdentifiers.h&quot;
</span><del>-#include &quot;CopyBarrier.h&quot;
</del><span class="cx"> #include &quot;CustomGetterSetter.h&quot;
</span><span class="cx"> #include &quot;DeferGC.h&quot;
</span><span class="cx"> #include &quot;Heap.h&quot;
</span><del>-#include &quot;HeapInlines.h&quot;
</del><span class="cx"> #include &quot;IndexingHeaderInlines.h&quot;
</span><span class="cx"> #include &quot;JSCell.h&quot;
</span><span class="cx"> #include &quot;PropertySlot.h&quot;
</span><span class="lines">@@ -103,7 +102,6 @@
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static size_t estimatedSize(JSCell*);
</span><span class="cx">     JS_EXPORT_PRIVATE static void visitChildren(JSCell*, SlotVisitor&amp;);
</span><del>-    JS_EXPORT_PRIVATE static void copyBackingStore(JSCell*, CopyVisitor&amp;, CopyToken);
</del><span class="cx">     JS_EXPORT_PRIVATE static void heapSnapshot(JSCell*, HeapSnapshotBuilder&amp;);
</span><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE static String className(const JSObject*);
</span><span class="lines">@@ -420,6 +418,8 @@
</span><span class="cx">         initializeIndex(vm, i, v, indexingType());
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // NOTE: Clients of this method may call it more than once for any index, and this is supposed
+    // to work.
</ins><span class="cx">     void initializeIndex(VM&amp; vm, unsigned i, JSValue v, IndexingType indexingType)
</span><span class="cx">     {
</span><span class="cx">         Butterfly* butterfly = m_butterfly.get();
</span><span class="lines">@@ -692,8 +692,6 @@
</span><span class="cx">         
</span><span class="cx">     void setStructure(VM&amp;, Structure*);
</span><span class="cx">     void setStructureAndButterfly(VM&amp;, Structure*, Butterfly*);
</span><del>-    void setStructureAndReallocateStorageIfNecessary(VM&amp;, unsigned oldCapacity, Structure*);
-    void setStructureAndReallocateStorageIfNecessary(VM&amp;, Structure*);
</del><span class="cx"> 
</span><span class="cx">     JS_EXPORT_PRIVATE void convertToDictionary(VM&amp;);
</span><span class="cx"> 
</span><span class="lines">@@ -710,6 +708,13 @@
</span><span class="cx">         return structure()-&gt;globalObject();
</span><span class="cx">     }
</span><span class="cx">         
</span><ins>+    JSGlobalObject* globalObject(VM&amp; vm) const
+    {
+        ASSERT(structure(vm)-&gt;globalObject());
+        ASSERT(!isGlobalObject() || ((JSObject*)structure()-&gt;globalObject()) == this);
+        return structure(vm)-&gt;globalObject();
+    }
+        
</ins><span class="cx">     void switchToSlowPutArrayStorage(VM&amp;);
</span><span class="cx">         
</span><span class="cx">     // The receiver is the prototype in this case. The following:
</span><span class="lines">@@ -803,7 +808,6 @@
</span><span class="cx">     JSObject(VM&amp;, Structure*, Butterfly* = 0);
</span><span class="cx">         
</span><span class="cx">     void visitButterfly(SlotVisitor&amp;, Butterfly*, Structure*);
</span><del>-    void copyButterfly(CopyVisitor&amp;, Butterfly*, size_t storageSize);
</del><span class="cx"> 
</span><span class="cx">     // Call this if you know that the object is in a mode where it has array
</span><span class="cx">     // storage. This will assert otherwise.
</span><span class="lines">@@ -914,7 +918,7 @@
</span><span class="cx">     void isObject();
</span><span class="cx">     void isString();
</span><span class="cx">         
</span><del>-    Butterfly* createInitialIndexedStorage(VM&amp;, unsigned length, size_t elementSize);
</del><ins>+    Butterfly* createInitialIndexedStorage(VM&amp;, unsigned length);
</ins><span class="cx">         
</span><span class="cx">     ArrayStorage* enterDictionaryIndexingModeWhenArrayStorageAlreadyExists(VM&amp;, ArrayStorage*);
</span><span class="cx">         
</span><span class="lines">@@ -938,7 +942,7 @@
</span><span class="cx">     bool putDirectIndexBeyondVectorLengthWithArrayStorage(ExecState*, unsigned propertyName, JSValue, unsigned attributes, PutDirectIndexMode, ArrayStorage*);
</span><span class="cx">     JS_EXPORT_PRIVATE bool putDirectIndexBeyondVectorLength(ExecState*, unsigned propertyName, JSValue, unsigned attributes, PutDirectIndexMode);
</span><span class="cx">         
</span><del>-    unsigned getNewVectorLength(unsigned currentVectorLength, unsigned currentLength, unsigned desiredLength);
</del><ins>+    unsigned getNewVectorLength(unsigned indexBias, unsigned currentVectorLength, unsigned currentLength, unsigned desiredLength);
</ins><span class="cx">     unsigned getNewVectorLength(unsigned desiredLength);
</span><span class="cx"> 
</span><span class="cx">     ArrayStorage* constructConvertedArrayStorageWithoutCopyingElements(VM&amp;, unsigned neededLength);
</span><span class="lines">@@ -955,7 +959,7 @@
</span><span class="cx">     JS_EXPORT_PRIVATE ArrayStorage* ensureArrayStorageSlow(VM&amp;);
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    CopyBarrier&lt;Butterfly&gt; m_butterfly;
</del><ins>+    AuxiliaryBarrier&lt;Butterfly*&gt; m_butterfly;
</ins><span class="cx"> #if USE(JSVALUE32_64)
</span><span class="cx"> private:
</span><span class="cx">     uint32_t m_padding;
</span><span class="lines">@@ -1417,8 +1421,16 @@
</span><span class="cx">     
</span><span class="cx">     validateOffset(offset);
</span><span class="cx">     ASSERT(newStructure-&gt;isValidOffset(offset));
</span><del>-    setStructureAndReallocateStorageIfNecessary(vm, newStructure);
-
</del><ins>+    DeferGC deferGC(vm.heap);
+    size_t oldCapacity = structure-&gt;outOfLineCapacity();
+    size_t newCapacity = newStructure-&gt;outOfLineCapacity();
+    ASSERT(oldCapacity &lt;= newCapacity);
+    if (oldCapacity == newCapacity)
+        setStructure(vm, newStructure);
+    else {
+        Butterfly* newButterfly = growOutOfLineStorage(vm, oldCapacity, newCapacity);
+        setStructureAndButterfly(vm, newStructure, newButterfly);
+    }
</ins><span class="cx">     putDirect(vm, offset, value);
</span><span class="cx">     slot.setNewProperty(this, offset);
</span><span class="cx">     if (attributes &amp; ReadOnly)
</span><span class="lines">@@ -1426,27 +1438,6 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline void JSObject::setStructureAndReallocateStorageIfNecessary(VM&amp; vm, unsigned oldCapacity, Structure* newStructure)
-{
-    ASSERT(oldCapacity &lt;= newStructure-&gt;outOfLineCapacity());
-    
-    if (oldCapacity == newStructure-&gt;outOfLineCapacity()) {
-        setStructure(vm, newStructure);
-        return;
-    }
-
-    DeferGC deferGC(vm.heap); 
-    Butterfly* newButterfly = growOutOfLineStorage(
-        vm, oldCapacity, newStructure-&gt;outOfLineCapacity());
-    setStructureAndButterfly(vm, newStructure, newButterfly);
-}
-
-inline void JSObject::setStructureAndReallocateStorageIfNecessary(VM&amp; vm, Structure* newStructure)
-{
-    setStructureAndReallocateStorageIfNecessary(
-        vm, structure(vm)-&gt;outOfLineCapacity(), newStructure);
-}
-
</del><span class="cx"> inline bool JSObject::putOwnDataProperty(VM&amp; vm, PropertyName propertyName, JSValue value, PutPropertySlot&amp; slot)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(value);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSObjectInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObjectInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObjectInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSObjectInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org)
</span><span class="cx">  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
</span><del>- *  Copyright (C) 2003-2006, 2008, 2009, 2012-2015 Apple Inc. All rights reserved.
</del><ins>+ *  Copyright (C) 2003-2006, 2008, 2009, 2012-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *  Copyright (C) 2007 Eric Seidel (eric@webkit.org)
</span><span class="cx">  *
</span><span class="cx">  *  This library is free software; you can redistribute it and/or
</span><span class="lines">@@ -24,6 +24,7 @@
</span><span class="cx"> #ifndef JSObjectInlines_h
</span><span class="cx"> #define JSObjectInlines_h
</span><span class="cx"> 
</span><ins>+#include &quot;AuxiliaryBarrierInlines.h&quot;
</ins><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;JSObject.h&quot;
</span><span class="cx"> #include &quot;Lookup.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromisecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromise.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromise.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromise.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,12 +28,9 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSPromiseConstructor.h&quot;
</span><span class="cx"> #include &quot;Microtask.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromiseConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -32,14 +32,12 @@
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSPromise.h&quot;
</span><span class="cx"> #include &quot;JSPromisePrototype.h&quot;
</span><span class="cx"> #include &quot;Lookup.h&quot;
</span><span class="cx"> #include &quot;NumberObject.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromiseDeferredcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromiseDeferred.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,13 +29,10 @@
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;Exception.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;JSPromise.h&quot;
</span><span class="cx"> #include &quot;JSPromiseConstructor.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPromisePrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPromisePrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,13 +29,11 @@
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSPromise.h&quot;
</span><span class="cx"> #include &quot;Microtask.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSPropertyNameIteratorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSPropertyNameIterator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple, Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple, Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,13 +26,9 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSPropertyNameIterator.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;IdentifierInlines.h&quot;
</del><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSPropertyNameEnumerator.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSScopecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -217,6 +217,7 @@
</span><span class="cx"> 
</span><span class="cx"> JSObject* JSScope::resolve(ExecState* exec, JSScope* scope, const Identifier&amp; ident)
</span><span class="cx"> {
</span><ins>+    VM&amp; vm = exec-&gt;vm();
</ins><span class="cx">     ScopeChainIterator end = scope-&gt;end();
</span><span class="cx">     ScopeChainIterator it = scope-&gt;begin();
</span><span class="cx">     while (1) {
</span><span class="lines">@@ -225,7 +226,7 @@
</span><span class="cx"> 
</span><span class="cx">         // Global scope.
</span><span class="cx">         if (++it == end) {
</span><del>-            JSScope* globalScopeExtension = scope-&gt;globalObject()-&gt;globalScopeExtension();
</del><ins>+            JSScope* globalScopeExtension = scope-&gt;globalObject(vm)-&gt;globalScopeExtension();
</ins><span class="cx">             if (UNLIKELY(globalScopeExtension)) {
</span><span class="cx">                 if (object-&gt;hasProperty(exec, ident))
</span><span class="cx">                     return object;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSScopeh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSScope.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx">     JSScope* next();
</span><span class="cx"> 
</span><span class="cx">     JSGlobalObject* globalObject();
</span><del>-    VM* vm();
</del><ins>+    JSGlobalObject* globalObject(VM&amp;);
</ins><span class="cx">     JSObject* globalThis();
</span><span class="cx"> 
</span><span class="cx">     SymbolTable* symbolTable();
</span><span class="lines">@@ -129,9 +129,9 @@
</span><span class="cx">     return structure()-&gt;globalObject();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline VM* JSScope::vm()
</del><ins>+inline JSGlobalObject* JSScope::globalObject(VM&amp; vm)
</ins><span class="cx"> { 
</span><del>-    return MarkedBlock::blockFor(this)-&gt;vm();
</del><ins>+    return structure(vm)-&gt;globalObject();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> inline Register&amp; Register::operator=(JSScope* scope)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSSetIteratorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSSetIterator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSSetIterator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSSetIterator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple, Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2016 Apple, Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,12 +26,9 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSSetIterator.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSSet.h&quot;
</span><span class="cx"> #include &quot;MapDataInlines.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSStringIteratorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSStringIterator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSStringIterator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSStringIterator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,9 +28,7 @@
</span><span class="cx"> #include &quot;JSStringIterator.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSTemplateRegistryKeycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTemplateRegistryKey.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTemplateRegistryKey.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTemplateRegistryKey.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2015 Yusuke Suzuki &lt;utatane.tea@gmail.com&gt;.
</span><ins>+ * Copyright (C) 2016 Apple Inc. All Rights Reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,9 +27,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSTemplateRegistryKey.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;VM.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSTypedArrayViewConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,9 +30,8 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;JSCBuiltins.h&quot;
</span><del>-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGenericTypedArrayViewConstructorInlines.h&quot;
</span><del>-#include &quot;JSObject.h&quot;
</del><span class="cx"> #include &quot;JSTypedArrayViewPrototype.h&quot;
</span><span class="cx"> #include &quot;JSTypedArrays.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSTypedArrayViewPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSTypedArrayViewPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #include &quot;BuiltinNames.h&quot;
</span><span class="cx"> #include &quot;CallFrame.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><del>-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSGenericTypedArrayViewPrototypeFunctions.h&quot;
</span><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSWeakMapcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakMap.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakMap.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakMap.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,11 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSWeakMap.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;WeakMapData.h&quot;
</span><del>-#include &quot;WriteBarrierInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeJSWeakSetcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakSet.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakSet.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/JSWeakSet.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,11 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSWeakSet.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;WeakMapData.h&quot;
</span><del>-#include &quot;WriteBarrierInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeMapConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,13 +29,11 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSMap.h&quot;
</span><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;MapPrototype.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeMapIteratorPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapIteratorPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapIteratorPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapIteratorPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,10 +27,8 @@
</span><span class="cx"> #include &quot;MapIteratorPrototype.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSMapIterator.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeMapPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/MapPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,13 +31,11 @@
</span><span class="cx"> #include &quot;ExceptionHelpers.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSFunctionInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSMap.h&quot;
</span><span class="cx"> #include &quot;JSMapIterator.h&quot;
</span><span class="cx"> #include &quot;Lookup.h&quot;
</span><span class="cx"> #include &quot;MapDataInlines.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;MapPrototype.lut.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeNativeErrorConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeErrorConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -22,6 +22,7 @@
</span><span class="cx"> #include &quot;NativeErrorConstructor.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ErrorInstance.h&quot;
</span><ins>+#include &quot;Interpreter.h&quot;
</ins><span class="cx"> #include &quot;JSFunction.h&quot;
</span><span class="cx"> #include &quot;JSString.h&quot;
</span><span class="cx"> #include &quot;NativeErrorPrototype.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeNativeStdFunctionCellcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeStdFunctionCell.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeStdFunctionCell.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/NativeStdFunctionCell.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,10 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;NativeStdFunctionCell.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;JSFunctionInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeOperationsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Operations.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Operations.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Operations.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -199,6 +199,20 @@
</span><span class="cx">     return jsAddSlowCase(callFrame, v1, v2);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline bool scribbleFreeCells()
+{
+    return !ASSERT_DISABLED || Options::scribbleFreeCells();
+}
+
+inline void scribble(void* base, size_t size)
+{
+    for (size_t i = size / sizeof(EncodedJSValue); i--;) {
+        // Use a 16-byte aligned value to ensure that it passes the cell check.
+        static_cast&lt;EncodedJSValue*&gt;(base)[i] = JSValue::encode(
+            bitwise_cast&lt;JSCell*&gt;(static_cast&lt;intptr_t&gt;(0xbadbeef0)));
+    }
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // Operations_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeOptionscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -370,7 +370,7 @@
</span><span class="cx">         Options::useOSREntryToDFG() = false;
</span><span class="cx">         Options::useOSREntryToFTL() = false;
</span><span class="cx">     }
</span><del>-
</del><ins>+    
</ins><span class="cx"> #if PLATFORM(IOS) &amp;&amp; !PLATFORM(IOS_SIMULATOR) &amp;&amp; __IPHONE_OS_VERSION_MIN_REQUIRED &gt;= 100000
</span><span class="cx">     // Override globally for now. Longer term we'll just make the default
</span><span class="cx">     // be to have this option enabled, and have platforms that don't support
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeOptionsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/Options.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -182,6 +182,11 @@
</span><span class="cx">     v(bool, testTheFTL, false, Normal, nullptr) \
</span><span class="cx">     v(bool, verboseSanitizeStack, false, Normal, nullptr) \
</span><span class="cx">     v(bool, useGenerationalGC, true, Normal, nullptr) \
</span><ins>+    v(bool, scribbleFreeCells, false, Normal, nullptr) \
+    v(double, sizeClassProgression, 1.4, Normal, nullptr) \
+    v(unsigned, largeAllocationCutoff, 100000, Normal, nullptr) \
+    v(bool, dumpSizeClasses, false, Normal, nullptr) \
+    v(bool, useBumpAllocator, true, Normal, nullptr) \
</ins><span class="cx">     v(bool, eagerlyUpdateTopCallFrame, false, Normal, nullptr) \
</span><span class="cx">     \
</span><span class="cx">     v(bool, useOSREntryToDFG, true, Normal, nullptr) \
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimePropertyTablecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/PropertyTable.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/PropertyTable.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/PropertyTable.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,10 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;PropertyMapHashTable.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeProxyConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,8 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IdentifierInlines.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><span class="cx"> #include &quot;ObjectPrototype.h&quot;
</span><span class="cx"> #include &quot;ProxyObject.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeProxyObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyObject.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyObject.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyObject.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,8 +29,7 @@
</span><span class="cx"> #include &quot;ArrayConstructor.h&quot;
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IdentifierInlines.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><span class="cx"> #include &quot;SlotVisitorInlines.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeProxyRevokecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyRevoke.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyRevoke.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ProxyRevoke.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,10 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;ProxyRevoke.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;ProxyObject.h&quot;
</span><del>-#include &quot;SlotVisitorInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -296,13 +296,13 @@
</span><span class="cx">     m_regExpBytecode = Yarr::byteCompile(pattern, &amp;vm-&gt;m_regExpAllocator, &amp;vm-&gt;m_regExpAllocatorLock);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-int RegExp::match(VM&amp; vm, const String&amp; s, unsigned startOffset, Vector&lt;int, 32&gt;&amp; ovector)
</del><ins>+int RegExp::match(VM&amp; vm, const String&amp; s, unsigned startOffset, Vector&lt;int&gt;&amp; ovector)
</ins><span class="cx"> {
</span><span class="cx">     return matchInline(vm, s, startOffset, ovector);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool RegExp::matchConcurrently(
</span><del>-    VM&amp; vm, const String&amp; s, unsigned startOffset, int&amp; position, Vector&lt;int, 32&gt;&amp; ovector)
</del><ins>+    VM&amp; vm, const String&amp; s, unsigned startOffset, int&amp; position, Vector&lt;int&gt;&amp; ovector)
</ins><span class="cx"> {
</span><span class="cx">     ConcurrentJITLocker locker(m_lock);
</span><span class="cx"> 
</span><span class="lines">@@ -382,7 +382,7 @@
</span><span class="cx"> void RegExp::matchCompareWithInterpreter(const String&amp; s, int startOffset, int* offsetVector, int jitResult)
</span><span class="cx"> {
</span><span class="cx">     int offsetVectorSize = (m_numSubpatterns + 1) * 2;
</span><del>-    Vector&lt;int, 32&gt; interpreterOvector;
</del><ins>+    Vector&lt;int&gt; interpreterOvector;
</ins><span class="cx">     interpreterOvector.resize(offsetVectorSize);
</span><span class="cx">     int* interpreterOffsetVector = interpreterOvector.data();
</span><span class="cx">     int interpreterResult = 0;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExph"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExp.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -64,10 +64,10 @@
</span><span class="cx">     bool isValid() const { return !m_constructionError &amp;&amp; m_flags != InvalidFlags; }
</span><span class="cx">     const char* errorMessage() const { return m_constructionError; }
</span><span class="cx"> 
</span><del>-    JS_EXPORT_PRIVATE int match(VM&amp;, const String&amp;, unsigned startOffset, Vector&lt;int, 32&gt;&amp; ovector);
</del><ins>+    JS_EXPORT_PRIVATE int match(VM&amp;, const String&amp;, unsigned startOffset, Vector&lt;int&gt;&amp; ovector);
</ins><span class="cx"> 
</span><span class="cx">     // Returns false if we couldn't run the regular expression for any reason.
</span><del>-    bool matchConcurrently(VM&amp;, const String&amp;, unsigned startOffset, int&amp; position, Vector&lt;int, 32&gt;&amp; ovector);
</del><ins>+    bool matchConcurrently(VM&amp;, const String&amp;, unsigned startOffset, int&amp; position, Vector&lt;int&gt;&amp; ovector);
</ins><span class="cx">     
</span><span class="cx">     JS_EXPORT_PRIVATE MatchResult match(VM&amp;, const String&amp;, unsigned startOffset);
</span><span class="cx"> 
</span><span class="lines">@@ -74,7 +74,8 @@
</span><span class="cx">     bool matchConcurrently(VM&amp;, const String&amp;, unsigned startOffset, MatchResult&amp;);
</span><span class="cx"> 
</span><span class="cx">     // Call these versions of the match functions if you're desperate for performance.
</span><del>-    int matchInline(VM&amp;, const String&amp;, unsigned startOffset, Vector&lt;int, 32&gt;&amp; ovector);
</del><ins>+    template&lt;typename VectorType&gt;
+    int matchInline(VM&amp;, const String&amp;, unsigned startOffset, VectorType&amp; ovector);
</ins><span class="cx">     MatchResult matchInline(VM&amp;, const String&amp;, unsigned startOffset);
</span><span class="cx">     
</span><span class="cx">     unsigned numSubpatterns() const { return m_numSubpatterns; }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpConstructorh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpConstructor.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpConstructor.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpConstructor.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> 
</span><span class="cx">     RegExpCachedResult m_cachedResult;
</span><span class="cx">     bool m_multiline;
</span><del>-    Vector&lt;int, 32&gt; m_ovector;
</del><ins>+    Vector&lt;int&gt; m_ovector;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> RegExpConstructor* asRegExpConstructor(JSValue);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -94,7 +94,8 @@
</span><span class="cx">     compile(&amp;vm, charSize);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-ALWAYS_INLINE int RegExp::matchInline(VM&amp; vm, const String&amp; s, unsigned startOffset, Vector&lt;int, 32&gt;&amp; ovector)
</del><ins>+template&lt;typename VectorType&gt;
+ALWAYS_INLINE int RegExp::matchInline(VM&amp; vm, const String&amp; s, unsigned startOffset, VectorType&amp; ovector)
</ins><span class="cx"> {
</span><span class="cx"> #if ENABLE(REGEXP_TRACING)
</span><span class="cx">     m_rtMatchCallCount++;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpMatchesArrayh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpMatchesArray.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpMatchesArray.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpMatchesArray.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -34,17 +34,20 @@
</span><span class="cx"> 
</span><span class="cx"> ALWAYS_INLINE JSArray* tryCreateUninitializedRegExpMatchesArray(VM&amp; vm, Structure* structure, unsigned initialLength)
</span><span class="cx"> {
</span><del>-    unsigned vectorLength = std::max(BASE_VECTOR_LEN, initialLength);
</del><ins>+    unsigned vectorLength = initialLength;
</ins><span class="cx">     if (vectorLength &gt; MAX_STORAGE_VECTOR_LENGTH)
</span><span class="cx">         return 0;
</span><span class="cx"> 
</span><del>-    void* temp;
-    if (!vm.heap.tryAllocateStorage(0, Butterfly::totalSize(0, structure-&gt;outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)), &amp;temp))
-        return 0;
</del><ins>+    void* temp = vm.heap.tryAllocateAuxiliary(nullptr, Butterfly::totalSize(0, structure-&gt;outOfLineCapacity(), true, vectorLength * sizeof(EncodedJSValue)));
+    if (!temp)
+        return nullptr;
</ins><span class="cx">     Butterfly* butterfly = Butterfly::fromBase(temp, 0, structure-&gt;outOfLineCapacity());
</span><span class="cx">     butterfly-&gt;setVectorLength(vectorLength);
</span><span class="cx">     butterfly-&gt;setPublicLength(initialLength);
</span><del>-
</del><ins>+    
+    for (unsigned i = initialLength; i &lt; vectorLength; ++i)
+        butterfly-&gt;contiguous()[i].clear();
+    
</ins><span class="cx">     return JSArray::createWithButterfly(vm, structure, butterfly);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -67,40 +70,54 @@
</span><span class="cx">     // FIXME: This should handle array allocation errors gracefully.
</span><span class="cx">     // https://bugs.webkit.org/show_bug.cgi?id=155144
</span><span class="cx">     
</span><ins>+    auto setProperties = [&amp;] () {
+        array-&gt;putDirect(vm, RegExpMatchesArrayIndexPropertyOffset, jsNumber(result.start));
+        array-&gt;putDirect(vm, RegExpMatchesArrayInputPropertyOffset, input);
+    };
+    
+    unsigned numSubpatterns = regExp-&gt;numSubpatterns();
+    
</ins><span class="cx">     if (UNLIKELY(globalObject-&gt;isHavingABadTime())) {
</span><del>-        array = JSArray::tryCreateUninitialized(vm, globalObject-&gt;regExpMatchesArrayStructure(), regExp-&gt;numSubpatterns() + 1);
</del><ins>+        array = JSArray::tryCreateUninitialized(vm, globalObject-&gt;regExpMatchesArrayStructure(), numSubpatterns + 1);
</ins><span class="cx">         
</span><ins>+        setProperties();
+        
+        array-&gt;initializeIndex(vm, 0, jsUndefined());
+        
+        for (unsigned i = 1; i &lt;= numSubpatterns; ++i)
+            array-&gt;initializeIndex(vm, i, jsUndefined());
+        
+        // Now the object is safe to scan by GC.
+        
</ins><span class="cx">         array-&gt;initializeIndex(vm, 0, jsSubstringOfResolved(vm, input, result.start, result.end - result.start));
</span><span class="cx">         
</span><del>-        if (unsigned numSubpatterns = regExp-&gt;numSubpatterns()) {
-            for (unsigned i = 1; i &lt;= numSubpatterns; ++i) {
-                int start = subpatternResults[2 * i];
-                if (start &gt;= 0)
-                    array-&gt;initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start));
-                else
-                    array-&gt;initializeIndex(vm, i, jsUndefined());
-            }
</del><ins>+        for (unsigned i = 1; i &lt;= numSubpatterns; ++i) {
+            int start = subpatternResults[2 * i];
+            if (start &gt;= 0)
+                array-&gt;initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start));
</ins><span class="cx">         }
</span><span class="cx">     } else {
</span><del>-        array = tryCreateUninitializedRegExpMatchesArray(vm, globalObject-&gt;regExpMatchesArrayStructure(), regExp-&gt;numSubpatterns() + 1);
</del><ins>+        array = tryCreateUninitializedRegExpMatchesArray(vm, globalObject-&gt;regExpMatchesArrayStructure(), numSubpatterns + 1);
</ins><span class="cx">         RELEASE_ASSERT(array);
</span><span class="cx">         
</span><ins>+        setProperties();
+        
+        array-&gt;initializeIndex(vm, 0, jsUndefined(), ArrayWithContiguous);
+        
+        for (unsigned i = 1; i &lt;= numSubpatterns; ++i)
+            array-&gt;initializeIndex(vm, i, jsUndefined(), ArrayWithContiguous);
+        
+        // Now the object is safe to scan by GC.
+
</ins><span class="cx">         array-&gt;initializeIndex(vm, 0, jsSubstringOfResolved(vm, input, result.start, result.end - result.start), ArrayWithContiguous);
</span><span class="cx">         
</span><del>-        if (unsigned numSubpatterns = regExp-&gt;numSubpatterns()) {
-            for (unsigned i = 1; i &lt;= numSubpatterns; ++i) {
-                int start = subpatternResults[2 * i];
-                if (start &gt;= 0)
-                    array-&gt;initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start), ArrayWithContiguous);
-                else
-                    array-&gt;initializeIndex(vm, i, jsUndefined(), ArrayWithContiguous);
-            }
</del><ins>+        for (unsigned i = 1; i &lt;= numSubpatterns; ++i) {
+            int start = subpatternResults[2 * i];
+            if (start &gt;= 0)
+                array-&gt;initializeIndex(vm, i, JSRopeString::createSubstringOfResolved(vm, input, start, subpatternResults[2 * i + 1] - start), ArrayWithContiguous);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    array-&gt;putDirect(vm, RegExpMatchesArrayIndexPropertyOffset, jsNumber(result.start));
-    array-&gt;putDirect(vm, RegExpMatchesArrayInputPropertyOffset, input);
-
</del><span class="cx">     return array;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRegExpPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RegExpPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -503,12 +503,14 @@
</span><span class="cx">     unsigned&amp; matchPosition, bool regExpIsSticky, bool regExpIsUnicode,
</span><span class="cx">     const ControlFunc&amp; control, const PushFunc&amp; push)
</span><span class="cx"> {
</span><ins>+    Vector&lt;int&gt; ovector;
+        
</ins><span class="cx">     while (matchPosition &lt; inputSize) {
</span><span class="cx">         if (control() == AbortSplit)
</span><span class="cx">             return;
</span><span class="cx">         
</span><del>-        Vector&lt;int, 32&gt; ovector;
-
</del><ins>+        ovector.resize(0);
+        
</ins><span class="cx">         // a. Perform ? Set(splitter, &quot;lastIndex&quot;, q, true).
</span><span class="cx">         // b. Let z be ? RegExpExec(splitter, S).
</span><span class="cx">         int mpos = regexp-&gt;match(vm, input, matchPosition, ovector);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeRuntimeTypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RuntimeType.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RuntimeType.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/RuntimeType.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,8 +28,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;RuntimeType.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValue.h&quot;
-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSamplingProfilercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SamplingProfiler.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SamplingProfiler.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SamplingProfiler.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;Executable.h&quot;
</span><span class="cx"> #include &quot;HeapInlines.h&quot;
</span><span class="cx"> #include &quot;HeapIterationScope.h&quot;
</span><ins>+#include &quot;HeapUtil.h&quot;
</ins><span class="cx"> #include &quot;InlineCallFrame.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="lines">@@ -357,7 +358,6 @@
</span><span class="cx">     RELEASE_ASSERT(m_lock.isLocked());
</span><span class="cx"> 
</span><span class="cx">     TinyBloomFilter filter = m_vm.heap.objectSpace().blocks().filter();
</span><del>-    MarkedBlockSet&amp; markedBlockSet = m_vm.heap.objectSpace().blocks();
</del><span class="cx"> 
</span><span class="cx">     for (UnprocessedStackTrace&amp; unprocessedStackTrace : m_unprocessedStackTraces) {
</span><span class="cx">         m_stackTraces.append(StackTrace());
</span><span class="lines">@@ -391,7 +391,7 @@
</span><span class="cx">             JSValue callee = JSValue::decode(encodedCallee);
</span><span class="cx">             StackFrame&amp; stackFrame = stackTrace.frames.last();
</span><span class="cx">             bool alreadyHasExecutable = !!stackFrame.executable;
</span><del>-            if (!Heap::isValueGCObject(filter, markedBlockSet, callee)) {
</del><ins>+            if (!HeapUtil::isValueGCObject(m_vm.heap, filter, callee)) {
</ins><span class="cx">                 if (!alreadyHasExecutable)
</span><span class="cx">                     stackFrame.frameType = FrameType::Unknown;
</span><span class="cx">                 return;
</span><span class="lines">@@ -436,7 +436,7 @@
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            RELEASE_ASSERT(Heap::isPointerGCObject(filter, markedBlockSet, executable));
</del><ins>+            RELEASE_ASSERT(HeapUtil::isPointerGCObjectJSCell(m_vm.heap, filter, executable));
</ins><span class="cx">             stackFrame.frameType = FrameType::Executable;
</span><span class="cx">             stackFrame.executable = executable;
</span><span class="cx">             m_liveCellPointers.add(executable);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSetConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,14 +29,12 @@
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;JSSet.h&quot;
</span><span class="cx"> #include &quot;MapData.h&quot;
</span><span class="cx"> #include &quot;SetPrototype.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSetIteratorPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetIteratorPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetIteratorPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetIteratorPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,10 +27,8 @@
</span><span class="cx"> #include &quot;SetIteratorPrototype.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSSetIterator.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeSetPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/SetPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,13 +31,11 @@
</span><span class="cx"> #include &quot;ExceptionHelpers.h&quot;
</span><span class="cx"> #include &quot;GetterSetter.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSFunctionInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSSet.h&quot;
</span><span class="cx"> #include &quot;JSSetIterator.h&quot;
</span><span class="cx"> #include &quot;Lookup.h&quot;
</span><span class="cx"> #include &quot;MapDataInlines.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;SetPrototype.lut.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStackFramecpp"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.cpp (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,119 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;StackFrame.h&quot;
+
+#include &quot;CodeBlock.h&quot;
+#include &quot;DebuggerPrimitives.h&quot;
+#include &quot;JSCInlines.h&quot;
+#include &lt;wtf/text/StringBuilder.h&gt;
+
+namespace JSC {
+
+intptr_t StackFrame::sourceID() const
+{
+    if (!codeBlock)
+        return noSourceID;
+    return codeBlock-&gt;ownerScriptExecutable()-&gt;sourceID();
+}
+
+String StackFrame::sourceURL() const
+{
+    if (!codeBlock)
+        return ASCIILiteral(&quot;[native code]&quot;);
+
+    String sourceURL = codeBlock-&gt;ownerScriptExecutable()-&gt;sourceURL();
+    if (!sourceURL.isNull())
+        return sourceURL;
+    return emptyString();
+}
+
+String StackFrame::functionName(VM&amp; vm) const
+{
+    if (codeBlock) {
+        switch (codeBlock-&gt;codeType()) {
+        case EvalCode:
+            return ASCIILiteral(&quot;eval code&quot;);
+        case ModuleCode:
+            return ASCIILiteral(&quot;module code&quot;);
+        case FunctionCode:
+            break;
+        case GlobalCode:
+            return ASCIILiteral(&quot;global code&quot;);
+        default:
+            ASSERT_NOT_REACHED();
+        }
+    }
+    String name;
+    if (callee)
+        name = getCalculatedDisplayName(vm, callee.get()).impl();
+    return name.isNull() ? emptyString() : name;
+}
+
+void StackFrame::computeLineAndColumn(unsigned&amp; line, unsigned&amp; column) const
+{
+    if (!codeBlock) {
+        line = 0;
+        column = 0;
+        return;
+    }
+
+    int divot = 0;
+    int unusedStartOffset = 0;
+    int unusedEndOffset = 0;
+    codeBlock-&gt;expressionRangeForBytecodeOffset(bytecodeOffset, divot, unusedStartOffset, unusedEndOffset, line, column);
+
+    ScriptExecutable* executable = codeBlock-&gt;ownerScriptExecutable();
+    if (executable-&gt;hasOverrideLineNumber())
+        line = executable-&gt;overrideLineNumber();
+}
+
+String StackFrame::toString(VM&amp; vm) const
+{
+    StringBuilder traceBuild;
+    String functionName = this-&gt;functionName(vm);
+    String sourceURL = this-&gt;sourceURL();
+    traceBuild.append(functionName);
+    if (!sourceURL.isEmpty()) {
+        if (!functionName.isEmpty())
+            traceBuild.append('@');
+        traceBuild.append(sourceURL);
+        if (codeBlock) {
+            unsigned line;
+            unsigned column;
+            computeLineAndColumn(line, column);
+
+            traceBuild.append(':');
+            traceBuild.appendNumber(line);
+            traceBuild.append(':');
+            traceBuild.appendNumber(column);
+        }
+    }
+    return traceBuild.toString().impl();
+}
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStackFramehfromrev205702releasesWebKitGTKwebkit214SourceJavaScriptCoreheapHeapCellh"></a>
<div class="copfile"><h4>Copied: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.h (from rev 205702, releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/heap/HeapCell.h) (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StackFrame.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,50 @@
</span><ins>+/*
+ * Copyright (C) 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
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include &quot;Strong.h&quot;
+
+namespace JSC {
+
+class CodeBlock;
+class JSObject;
+
+struct StackFrame {
+    Strong&lt;JSObject&gt; callee;
+    Strong&lt;CodeBlock&gt; codeBlock;
+    unsigned bytecodeOffset;
+    
+    bool isNative() const { return !codeBlock; }
+    
+    void computeLineAndColumn(unsigned&amp; line, unsigned&amp; column) const;
+    String functionName(VM&amp;) const;
+    intptr_t sourceID() const;
+    String sourceURL() const;
+    String toString(VM&amp;) const;
+};
+
+} // namespace JSC
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStringConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><span class="cx"> #include &quot;StringPrototype.h&quot;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStringIteratorPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringIteratorPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringIteratorPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StringIteratorPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,12 +27,10 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;StringIteratorPrototype.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSStringIterator.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> 
</span><span class="cx"> #include &quot;StringIteratorPrototype.lut.h&quot;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeStructureInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StructureInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StructureInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/StructureInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -242,7 +242,6 @@
</span><span class="cx"> 
</span><span class="cx"> ALWAYS_INLINE WriteBarrier&lt;PropertyTable&gt;&amp; Structure::propertyTable()
</span><span class="cx"> {
</span><del>-    ASSERT(!globalObject() || (!globalObject()-&gt;vm().heap.isCollecting() || globalObject()-&gt;vm().heap.isHeapSnapshotting()));
</del><span class="cx">     return m_propertyTableUnsafe;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTemplateRegistrycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TemplateRegistry.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TemplateRegistry.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TemplateRegistry.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,10 +26,9 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;TemplateRegistry.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;ObjectConstructor.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> #include &quot;WeakGCMapInlines.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTestRunnerUtilscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013-2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -27,7 +27,9 @@
</span><span class="cx"> #include &quot;TestRunnerUtils.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;CodeBlock.h&quot;
</span><ins>+#include &quot;HeapStatistics.h&quot;
</ins><span class="cx"> #include &quot;JSCInlines.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -150,5 +152,14 @@
</span><span class="cx">     return optimizeNextInvocation(exec-&gt;uncheckedArgument(0));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// This is a hook called at the bitter end of some of our tests.
+void finalizeStatsAtEndOfTesting()
+{
+    if (Options::logHeapStatisticsAtExit())
+        HeapStatistics::reportSuccess();
+    if (Options::reportLLIntStats())
+        LLInt::Data::finalizeStats();
+}
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTestRunnerUtilsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TestRunnerUtils.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -53,6 +53,8 @@
</span><span class="cx"> JS_EXPORT_PRIVATE unsigned numberOfStaticOSRExitFuzzChecks();
</span><span class="cx"> JS_EXPORT_PRIVATE unsigned numberOfOSRExitFuzzChecks();
</span><span class="cx"> 
</span><ins>+JS_EXPORT_PRIVATE void finalizeStatsAtEndOfTesting();
+
</ins><span class="cx"> } // namespace JSC
</span><span class="cx"> 
</span><span class="cx"> #endif // TestRunnerUtils_h
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeThrowScopecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ThrowScope.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ThrowScope.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/ThrowScope.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,7 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;ThrowScope.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;VM.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTypeProfilerLogcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeProfilerLog.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeProfilerLog.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeProfilerLog.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,7 +29,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;TypeProfilerLog.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;TypeLocation.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeTypeSetcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeSet.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeSet.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/TypeSet.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,8 +27,7 @@
</span><span class="cx"> #include &quot;TypeSet.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;InspectorProtocolObjects.h&quot;
</span><del>-#include &quot;JSCJSValue.h&quot;
-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -69,6 +69,7 @@
</span><span class="cx"> #include &quot;JSPropertyNameEnumerator.h&quot;
</span><span class="cx"> #include &quot;JSTemplateRegistryKey.h&quot;
</span><span class="cx"> #include &quot;JSWithScope.h&quot;
</span><ins>+#include &quot;LLIntData.h&quot;
</ins><span class="cx"> #include &quot;Lexer.h&quot;
</span><span class="cx"> #include &quot;Lookup.h&quot;
</span><span class="cx"> #include &quot;MapData.h&quot;
</span><span class="lines">@@ -98,6 +99,7 @@
</span><span class="cx"> #include &quot;WeakMapData.h&quot;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/ProcessID.h&gt;
</span><ins>+#include &lt;wtf/SimpleStats.h&gt;
</ins><span class="cx"> #include &lt;wtf/StringPrintStream.h&gt;
</span><span class="cx"> #include &lt;wtf/Threading.h&gt;
</span><span class="cx"> #include &lt;wtf/WTFThreadData.h&gt;
</span><span class="lines">@@ -106,6 +108,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if !ENABLE(JIT)
</span><span class="cx"> #include &quot;CLoopStack.h&quot;
</span><ins>+#include &quot;CLoopStackInlines.h&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="lines">@@ -162,6 +165,7 @@
</span><span class="cx">     , m_atomicStringTable(vmType == Default ? wtfThreadData().atomicStringTable() : new AtomicStringTable)
</span><span class="cx">     , propertyNames(nullptr)
</span><span class="cx">     , emptyList(new MarkedArgumentBuffer)
</span><ins>+    , machineCodeBytesPerBytecodeWordForBaselineJIT(std::make_unique&lt;SimpleStats&gt;())
</ins><span class="cx">     , customGetterSetterFunctionMap(*this)
</span><span class="cx">     , stringCache(*this)
</span><span class="cx">     , symbolImplToSymbolMap(*this)
</span><span class="lines">@@ -873,4 +877,16 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if !ENABLE(JIT)
+bool VM::ensureStackCapacityForCLoop(Register* newTopOfStack)
+{
+    return interpreter-&gt;cloopStack().ensureCapacityFor(newTopOfStack);
+}
+
+bool VM::isSafeToRecurseSoftCLoop() const
+{
+    return interpreter-&gt;cloopStack().isSafeToRecurse();
+}
+#endif // !ENABLE(JIT)
+
</ins><span class="cx"> } // namespace JSC
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VM.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -39,7 +39,6 @@
</span><span class="cx"> #include &quot;JITThunks.h&quot;
</span><span class="cx"> #include &quot;JSCJSValue.h&quot;
</span><span class="cx"> #include &quot;JSLock.h&quot;
</span><del>-#include &quot;LLIntData.h&quot;
</del><span class="cx"> #include &quot;MacroAssemblerCodeRef.h&quot;
</span><span class="cx"> #include &quot;Microtask.h&quot;
</span><span class="cx"> #include &quot;NumericStrings.h&quot;
</span><span class="lines">@@ -60,7 +59,6 @@
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><del>-#include &lt;wtf/SimpleStats.h&gt;
</del><span class="cx"> #include &lt;wtf/StackBounds.h&gt;
</span><span class="cx"> #include &lt;wtf/Stopwatch.h&gt;
</span><span class="cx"> #include &lt;wtf/ThreadSafeRefCounted.h&gt;
</span><span class="lines">@@ -72,6 +70,11 @@
</span><span class="cx"> #include &lt;wtf/ListHashSet.h&gt;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+namespace WTF {
+class SimpleStats;
+} // namespace WTF
+using WTF::SimpleStats;
+
</ins><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="cx"> class BuiltinExecutables;
</span><span class="lines">@@ -342,7 +345,7 @@
</span><span class="cx">     SmallStrings smallStrings;
</span><span class="cx">     NumericStrings numericStrings;
</span><span class="cx">     DateInstanceCache dateInstanceCache;
</span><del>-    WTF::SimpleStats machineCodeBytesPerBytecodeWordForBaselineJIT;
</del><ins>+    std::unique_ptr&lt;SimpleStats&gt; machineCodeBytesPerBytecodeWordForBaselineJIT;
</ins><span class="cx">     WeakGCMap&lt;std::pair&lt;CustomGetterSetter*, int&gt;, JSCustomGetterSetterFunction&gt; customGetterSetterFunctionMap;
</span><span class="cx">     WeakGCMap&lt;StringImpl*, JSString, PtrHash&lt;StringImpl*&gt;&gt; stringCache;
</span><span class="cx">     Strong&lt;JSString&gt; lastCachedString;
</span><span class="lines">@@ -642,6 +645,11 @@
</span><span class="cx">         m_lastException = exception;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if !ENABLE(JIT)    
+    bool ensureStackCapacityForCLoop(Register* newTopOfStack);
+    bool isSafeToRecurseSoftCLoop() const;
+#endif // !ENABLE(JIT)
+
</ins><span class="cx">     JS_EXPORT_PRIVATE void throwException(ExecState*, Exception*);
</span><span class="cx">     JS_EXPORT_PRIVATE JSValue throwException(ExecState*, JSValue);
</span><span class="cx">     JS_EXPORT_PRIVATE JSObject* throwException(ExecState*, JSObject*);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMEntryScopeh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMEntryScope.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMEntryScope.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMEntryScope.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,7 +26,6 @@
</span><span class="cx"> #ifndef VMEntryScope_h
</span><span class="cx"> #define VMEntryScope_h
</span><span class="cx"> 
</span><del>-#include &quot;Interpreter.h&quot;
</del><span class="cx"> #include &lt;wtf/StackBounds.h&gt;
</span><span class="cx"> #include &lt;wtf/StackStats.h&gt;
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeVMInlinesh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMInlines.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMInlines.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/VMInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,10 +30,6 @@
</span><span class="cx"> #include &quot;VM.h&quot;
</span><span class="cx"> #include &quot;Watchdog.h&quot;
</span><span class="cx"> 
</span><del>-#if !ENABLE(JIT)
-#include &quot;CLoopStackInlines.h&quot;
-#endif
-
</del><span class="cx"> namespace JSC {
</span><span class="cx">     
</span><span class="cx"> bool VM::ensureStackCapacityFor(Register* newTopOfStack)
</span><span class="lines">@@ -42,7 +38,7 @@
</span><span class="cx">     ASSERT(wtfThreadData().stack().isGrowingDownward());
</span><span class="cx">     return newTopOfStack &gt;= m_softStackLimit;
</span><span class="cx"> #else
</span><del>-    return interpreter-&gt;cloopStack().ensureCapacityFor(newTopOfStack);
</del><ins>+    return ensureStackCapacityForCLoop(newTopOfStack);
</ins><span class="cx"> #endif
</span><span class="cx">     
</span><span class="cx"> }
</span><span class="lines">@@ -51,7 +47,7 @@
</span><span class="cx"> {
</span><span class="cx">     bool safe = isSafeToRecurse(m_softStackLimit);
</span><span class="cx"> #if !ENABLE(JIT)
</span><del>-    safe = safe &amp;&amp; interpreter-&gt;cloopStack().isSafeToRecurse();
</del><ins>+    safe = safe &amp;&amp; isSafeToRecurseSoftCLoop();
</ins><span class="cx"> #endif
</span><span class="cx">     return safe;
</span><span class="cx"> }
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakMapConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple, Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2016 Apple, Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,12 +28,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;JSWeakMap.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> #include &quot;WeakMapPrototype.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakMapDatacpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapData.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapData.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapData.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,8 +29,7 @@
</span><span class="cx"> #include &quot;CopiedAllocator.h&quot;
</span><span class="cx"> #include &quot;CopyVisitorInlines.h&quot;
</span><span class="cx"> #include &quot;ExceptionHelpers.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;SlotVisitorInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #include &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakMapPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakMapPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,9 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;WeakMapPrototype.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSWeakMap.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> #include &quot;WeakMapData.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakSetConstructorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetConstructor.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetConstructor.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetConstructor.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2015 Apple, Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2016 Apple, Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,12 +28,10 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;Error.h&quot;
</span><span class="cx"> #include &quot;IteratorOperations.h&quot;
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;JSCellInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSObjectInlines.h&quot;
</span><span class="cx"> #include &quot;JSWeakSet.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> #include &quot;WeakSetPrototype.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoreruntimeWeakSetPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/runtime/WeakSetPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,9 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;WeakSetPrototype.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSWeakSet.h&quot;
</span><del>-#include &quot;StructureInlines.h&quot;
</del><span class="cx"> #include &quot;WeakMapData.h&quot;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoretestRegExpcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/testRegExp.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/testRegExp.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/testRegExp.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -191,7 +191,7 @@
</span><span class="cx"> static bool testOneRegExp(VM&amp; vm, RegExp* regexp, RegExpTest* regExpTest, bool verbose, unsigned int lineNumber)
</span><span class="cx"> {
</span><span class="cx">     bool result = true;
</span><del>-    Vector&lt;int, 32&gt; outVector;
</del><ins>+    Vector&lt;int&gt; outVector;
</ins><span class="cx">     outVector.resize(regExpTest-&gt;expectVector.size());
</span><span class="cx">     int matchResult = regexp-&gt;match(vm, regExpTest-&gt;subject, regExpTest-&gt;offset, outVector);
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoretoolsJSDollarVMcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVM.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVM.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVM.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,8 +26,7 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;JSDollarVM.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;JSCJSValueInlines.h&quot;
-#include &quot;StructureInlines.h&quot;
</del><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceJavaScriptCoretoolsJSDollarVMPrototypecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/JavaScriptCore/tools/JSDollarVMPrototype.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -146,7 +146,13 @@
</span><span class="cx"> bool JSDollarVMPrototype::isInObjectSpace(Heap* heap, void* ptr)
</span><span class="cx"> {
</span><span class="cx">     MarkedBlock* candidate = MarkedBlock::blockFor(ptr);
</span><del>-    return heap-&gt;objectSpace().blocks().set().contains(candidate);
</del><ins>+    if (heap-&gt;objectSpace().blocks().set().contains(candidate))
+        return true;
+    for (LargeAllocation* allocation : heap-&gt;objectSpace().largeAllocations()) {
+        if (allocation-&gt;contains(ptr))
+            return true;
+    }
+    return false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool JSDollarVMPrototype::isInStorageSpace(Heap* heap, void* ptr)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+        
+        I needed tryFastAlignedMalloc() so I added it.
+
+        * wtf/FastMalloc.cpp:
+        (WTF::tryFastAlignedMalloc):
+        * wtf/FastMalloc.h:
+        * wtf/ParkingLot.cpp:
+        (WTF::ParkingLot::forEachImpl):
+        (WTF::ParkingLot::forEach): Deleted.
+        * wtf/ParkingLot.h:
+        (WTF::ParkingLot::parkConditionally):
+        (WTF::ParkingLot::unparkOne):
+        (WTF::ParkingLot::forEach):
+        * wtf/ScopedLambda.h:
+        (WTF::scopedLambdaRef):
+        * wtf/SentinelLinkedList.h:
+        (WTF::SentinelLinkedList::forEach):
+        (WTF::RawNode&gt;::takeFrom):
+        * wtf/SimpleStats.h:
+        (WTF::SimpleStats::operator bool):
+        (WTF::SimpleStats::operator!): Deleted.
+
</ins><span class="cx"> 2016-09-02  JF Bastien  &lt;jfbastien@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         bitwise_cast infinite loops if called from the default constructor in ToType
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfFastMalloccpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,7 +1,6 @@
</span><del>-// Copyright (c) 2005, 2007, Google Inc. All rights reserved.
-
</del><span class="cx"> /*
</span><del>- * Copyright (C) 2005-2009, 2011, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (c) 2005, 2007, Google Inc. All rights reserved.
+ * Copyright (C) 2005-2009, 2011, 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="cx">  * are met:
</span><span class="lines">@@ -102,6 +101,11 @@
</span><span class="cx">     return _aligned_malloc(size, alignment);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void* tryFastAlignedMalloc(size_t alignment, size_t size) 
+{
+    return _aligned_malloc(size, alignment);
+}
+
</ins><span class="cx"> void fastAlignedFree(void* p) 
</span><span class="cx"> {
</span><span class="cx">     _aligned_free(p);
</span><span class="lines">@@ -116,6 +120,13 @@
</span><span class="cx">     return p;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void* tryFastAlignedMalloc(size_t alignment, size_t size) 
+{
+    void* p = nullptr;
+    posix_memalign(&amp;p, alignment, size);
+    return p;
+}
+
</ins><span class="cx"> void fastAlignedFree(void* p) 
</span><span class="cx"> {
</span><span class="cx">     free(p);
</span><span class="lines">@@ -241,6 +252,11 @@
</span><span class="cx">     return bmalloc::api::memalign(alignment, size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void* tryFastAlignedMalloc(size_t alignment, size_t size) 
+{
+    return bmalloc::api::tryMemalign(alignment, size);
+}
+
</ins><span class="cx"> void fastAlignedFree(void* p) 
</span><span class="cx"> {
</span><span class="cx">     bmalloc::api::free(p);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfFastMalloch"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/FastMalloc.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- *  Copyright (C) 2005-2009, 2015 Apple Inc. All rights reserved.
</del><ins>+ *  Copyright (C) 2005-2009, 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  *  This library is free software; you can redistribute it and/or
</span><span class="cx">  *  modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -55,6 +55,7 @@
</span><span class="cx"> 
</span><span class="cx"> // Allocations from fastAlignedMalloc() must be freed using fastAlignedFree().
</span><span class="cx"> WTF_EXPORT_PRIVATE void* fastAlignedMalloc(size_t alignment, size_t);
</span><ins>+WTF_EXPORT_PRIVATE void* tryFastAlignedMalloc(size_t alignment, size_t);
</ins><span class="cx"> WTF_EXPORT_PRIVATE void fastAlignedFree(void*);
</span><span class="cx"> 
</span><span class="cx"> WTF_EXPORT_PRIVATE size_t fastMallocSize(const void*);
</span><span class="lines">@@ -110,6 +111,7 @@
</span><span class="cx"> using WTF::fastRealloc;
</span><span class="cx"> using WTF::fastStrDup;
</span><span class="cx"> using WTF::fastZeroedMalloc;
</span><ins>+using WTF::tryFastAlignedMalloc;
</ins><span class="cx"> using WTF::tryFastCalloc;
</span><span class="cx"> using WTF::tryFastMalloc;
</span><span class="cx"> using WTF::tryFastZeroedMalloc;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfParkingLotcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -767,7 +767,7 @@
</span><span class="cx">         dataLog(toString(currentThread(), &quot;: done unparking.\n&quot;));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-NEVER_INLINE void ParkingLot::forEach(std::function&lt;void(ThreadIdentifier, const void*)&gt; callback)
</del><ins>+NEVER_INLINE void ParkingLot::forEachImpl(const ScopedLambda&lt;void(ThreadIdentifier, const void*)&gt;&amp; callback)
</ins><span class="cx"> {
</span><span class="cx">     Vector&lt;Bucket*&gt; bucketsToUnlock = lockHashtable();
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfParkingLoth"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ParkingLot.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -66,14 +66,14 @@
</span><span class="cx">     template&lt;typename ValidationFunctor, typename BeforeSleepFunctor&gt;
</span><span class="cx">     static ParkResult parkConditionally(
</span><span class="cx">         const void* address,
</span><del>-        ValidationFunctor&amp;&amp; validation,
-        BeforeSleepFunctor&amp;&amp; beforeSleep,
</del><ins>+        const ValidationFunctor&amp; validation,
+        const BeforeSleepFunctor&amp; beforeSleep,
</ins><span class="cx">         Clock::time_point timeout)
</span><span class="cx">     {
</span><span class="cx">         return parkConditionallyImpl(
</span><span class="cx">             address,
</span><del>-            scopedLambda&lt;bool()&gt;(std::forward&lt;ValidationFunctor&gt;(validation)),
-            scopedLambda&lt;void()&gt;(std::forward&lt;BeforeSleepFunctor&gt;(beforeSleep)),
</del><ins>+            scopedLambdaRef&lt;bool()&gt;(validation),
+            scopedLambdaRef&lt;void()&gt;(beforeSleep),
</ins><span class="cx">             timeout);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -124,9 +124,9 @@
</span><span class="cx">     // moment nobody can add any threads to the queue because the queue lock is still held. Also,
</span><span class="cx">     // WTF::Lock uses the timeToBeFair and token mechanism to implement eventual fairness.
</span><span class="cx">     template&lt;typename Callback&gt;
</span><del>-    static void unparkOne(const void* address, Callback&amp;&amp; callback)
</del><ins>+    static void unparkOne(const void* address, const Callback&amp; callback)
</ins><span class="cx">     {
</span><del>-        unparkOneImpl(address, scopedLambda&lt;intptr_t(UnparkResult)&gt;(std::forward&lt;Callback&gt;(callback)));
</del><ins>+        unparkOneImpl(address, scopedLambdaRef&lt;intptr_t(UnparkResult)&gt;(callback));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Unparks every thread from the queue associated with the given address, which cannot be null.
</span><span class="lines">@@ -145,7 +145,11 @@
</span><span class="cx">     // As well as many other possible interleavings that all have T1 before T2 and T3 before T4 but are
</span><span class="cx">     // otherwise unconstrained. This method is useful primarily for debugging. It's also used by unit
</span><span class="cx">     // tests.
</span><del>-    WTF_EXPORT_PRIVATE static void forEach(std::function&lt;void(ThreadIdentifier, const void*)&gt;);
</del><ins>+    template&lt;typename Func&gt;
+    static void forEach(const Func&amp; func)
+    {
+        forEachImpl(scopedLambdaRef&lt;void(ThreadIdentifier, const void*)&gt;(func));
+    }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     WTF_EXPORT_PRIVATE static ParkResult parkConditionallyImpl(
</span><span class="lines">@@ -157,7 +161,7 @@
</span><span class="cx">     WTF_EXPORT_PRIVATE static void unparkOneImpl(
</span><span class="cx">         const void* address, const ScopedLambda&lt;intptr_t(UnparkResult)&gt;&amp; callback);
</span><span class="cx"> 
</span><del>-    WTF_EXPORT_PRIVATE static void forEachImpl(const std::function&lt;void(ThreadIdentifier, const void*)&gt;&amp;);
</del><ins>+    WTF_EXPORT_PRIVATE static void forEachImpl(const ScopedLambda&lt;void(ThreadIdentifier, const void*)&gt;&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WTF
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfScopedLambdah"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ScopedLambda.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ScopedLambda.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/ScopedLambda.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -126,10 +126,65 @@
</span><span class="cx">     return ScopedLambdaFunctor&lt;FunctionType, Functor&gt;(WTFMove(functor));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;typename FunctionType, typename Functor&gt; class ScopedLambdaRefFunctor;
+template&lt;typename ResultType, typename... ArgumentTypes, typename Functor&gt;
+class ScopedLambdaRefFunctor&lt;ResultType (ArgumentTypes...), Functor&gt; : public ScopedLambda&lt;ResultType (ArgumentTypes...)&gt; {
+public:
+    ScopedLambdaRefFunctor(const Functor&amp; functor)
+        : ScopedLambda&lt;ResultType (ArgumentTypes...)&gt;(implFunction, this)
+        , m_functor(&amp;functor)
+    {
+    }
+    
+    // We need to make sure that copying and moving ScopedLambdaRefFunctor results in a
+    // ScopedLambdaRefFunctor whose ScopedLambda supertype still points to this rather than
+    // other.
+    ScopedLambdaRefFunctor(const ScopedLambdaRefFunctor&amp; other)
+        : ScopedLambda&lt;ResultType (ArgumentTypes...)&gt;(implFunction, this)
+        , m_functor(other.m_functor)
+    {
+    }
+
+    ScopedLambdaRefFunctor(ScopedLambdaRefFunctor&amp;&amp; other)
+        : ScopedLambda&lt;ResultType (ArgumentTypes...)&gt;(implFunction, this)
+        , m_functor(other.m_functor)
+    {
+    }
+    
+    ScopedLambdaRefFunctor&amp; operator=(const ScopedLambdaRefFunctor&amp; other)
+    {
+        m_functor = other.m_functor;
+        return *this;
+    }
+    
+    ScopedLambdaRefFunctor&amp; operator=(ScopedLambdaRefFunctor&amp;&amp; other)
+    {
+        m_functor = other.m_functor;
+        return *this;
+    }
+
+private:
+    static ResultType implFunction(void* argument, ArgumentTypes... arguments)
+    {
+        return (*static_cast&lt;ScopedLambdaRefFunctor*&gt;(argument)-&gt;m_functor)(arguments...);
+    }
+
+    const Functor* m_functor;
+};
+
+// This is for when you already refer to a functor by reference, and you know its lifetime is
+// good. This just creates a ScopedLambda that points to your functor.
+template&lt;typename FunctionType, typename Functor&gt;
+ScopedLambdaRefFunctor&lt;FunctionType, Functor&gt; scopedLambdaRef(const Functor&amp; functor)
+{
+    return ScopedLambdaRefFunctor&lt;FunctionType, Functor&gt;(functor);
+}
+
</ins><span class="cx"> } // namespace WTF
</span><span class="cx"> 
</span><span class="cx"> using WTF::ScopedLambda;
</span><span class="cx"> using WTF::scopedLambda;
</span><ins>+using WTF::scopedLambdaRef;
</ins><span class="cx"> 
</span><span class="cx"> #endif // ScopedLambda_h
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfSentinelLinkedListh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SentinelLinkedList.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SentinelLinkedList.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SentinelLinkedList.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -101,7 +101,19 @@
</span><span class="cx">     iterator end();
</span><span class="cx">     
</span><span class="cx">     bool isEmpty() { return begin() == end(); }
</span><del>-
</del><ins>+    
+    template&lt;typename Func&gt;
+    void forEach(const Func&amp; func)
+    {
+        for (iterator iter = begin(); iter != end();) {
+            iterator next = iter-&gt;next();
+            func(iter);
+            iter = next;
+        }
+    }
+    
+    void takeFrom(SentinelLinkedList&lt;T, RawNode&gt;&amp;);
+    
</ins><span class="cx"> private:
</span><span class="cx">     RawNode m_headSentinel;
</span><span class="cx">     RawNode m_tailSentinel;
</span><span class="lines">@@ -244,8 +256,24 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template &lt;typename T, typename RawNode&gt;
+inline void SentinelLinkedList&lt;T, RawNode&gt;::takeFrom(SentinelLinkedList&lt;T, RawNode&gt;&amp; other)
+{
+    if (other.isEmpty())
+        return;
+    
+    m_tailSentinel.prev()-&gt;setNext(other.m_headSentinel.next());
+    other.m_headSentinel.next()-&gt;setPrev(m_tailSentinel.prev());
+    
+    m_tailSentinel.setPrev(other.m_tailSentinel.prev());
+    m_tailSentinel.prev()-&gt;setNext(&amp;m_tailSentinel);
+
+    other.m_headSentinel.setNext(&amp;other.m_tailSentinel);
+    other.m_tailSentinel.setPrev(&amp;other.m_headSentinel);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}
+
</ins><span class="cx"> using WTF::BasicRawSentinelNode;
</span><span class="cx"> using WTF::SentinelLinkedList;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWTFwtfSimpleStatsh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SimpleStats.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SimpleStats.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WTF/wtf/SimpleStats.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -49,9 +49,9 @@
</span><span class="cx">         m_sumOfSquares += value * value;
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    bool operator!() const
</del><ins>+    explicit operator bool() const
</ins><span class="cx">     {
</span><del>-        return !m_count;
</del><ins>+        return !!m_count;
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     double count() const
</span><span class="lines">@@ -110,5 +110,7 @@
</span><span class="cx"> 
</span><span class="cx"> } // namespace WTF
</span><span class="cx"> 
</span><ins>+using WTF::SimpleStats;
+
</ins><span class="cx"> #endif // SimpleStats_h
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,50 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+
+        No new tests because no new WebCore behavior.
+        
+        Just rewiring #includes.
+
+        * ForwardingHeaders/heap/HeapInlines.h: Added.
+        * ForwardingHeaders/interpreter/Interpreter.h: Removed.
+        * ForwardingHeaders/runtime/AuxiliaryBarrierInlines.h: Added.
+        * Modules/indexeddb/IDBCursorWithValue.cpp:
+        * Modules/indexeddb/client/TransactionOperation.cpp:
+        * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
+        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+        * bindings/js/JSApplePayPaymentAuthorizedEventCustom.cpp:
+        * bindings/js/JSApplePayPaymentMethodSelectedEventCustom.cpp:
+        * bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp:
+        * bindings/js/JSApplePayShippingMethodSelectedEventCustom.cpp:
+        * bindings/js/JSClientRectCustom.cpp:
+        * bindings/js/JSDOMBinding.cpp:
+        * bindings/js/JSDOMBinding.h:
+        * bindings/js/JSDeviceMotionEventCustom.cpp:
+        * bindings/js/JSDeviceOrientationEventCustom.cpp:
+        * bindings/js/JSErrorEventCustom.cpp:
+        * bindings/js/JSIDBCursorWithValueCustom.cpp:
+        * bindings/js/JSIDBIndexCustom.cpp:
+        * bindings/js/JSPopStateEventCustom.cpp:
+        * bindings/js/JSWebGL2RenderingContextCustom.cpp:
+        * bindings/js/JSWorkerGlobalScopeCustom.cpp:
+        * bindings/js/WorkerScriptController.cpp:
+        * contentextensions/ContentExtensionParser.cpp:
+        * dom/ErrorEvent.cpp:
+        * html/HTMLCanvasElement.cpp:
+        * html/MediaDocument.cpp:
+        * inspector/CommandLineAPIModule.cpp:
+        * loader/EmptyClients.cpp:
+        * page/CaptionUserPreferences.cpp:
+        * page/Frame.cpp:
+        * page/PageGroup.cpp:
+        * page/UserContentController.cpp:
+        * platform/mock/mediasource/MockBox.cpp:
+        * testing/GCObservation.cpp:
+
</ins><span class="cx"> 2016-09-05  Fujii Hironori  &lt;Hironori.Fujii@sony.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CMake] Duplicated IDL files in WebCore_IDL_FILES
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreForwardingHeadersheapHeapInlinesh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/heap/HeapInlines.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/heap/HeapInlines.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/heap/HeapInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+#pragma once
+#include &lt;JavaScriptCore/HeapInlines.h&gt;
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreForwardingHeadersinterpreterInterpreterh"></a>
<div class="delfile"><h4>Deleted: releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/interpreter/Interpreter.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/interpreter/Interpreter.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/interpreter/Interpreter.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,4 +0,0 @@
</span><del>-#ifndef WebCore_FWD_Interpreter_h
-#define WebCore_FWD_Interpreter_h
-#include &lt;JavaScriptCore/Interpreter.h&gt;
-#endif
</del></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreForwardingHeadersruntimeAuxiliaryBarrierInlinesh"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/runtime/AuxiliaryBarrierInlines.h (0 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/runtime/AuxiliaryBarrierInlines.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ForwardingHeaders/runtime/AuxiliaryBarrierInlines.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -0,0 +1,3 @@
</span><ins>+#pragma once
+#include &lt;JavaScriptCore/AuxiliaryBarrierInlines.h&gt;
+
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbIDBCursorWithValuecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/IDBCursorWithValue.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/IDBCursorWithValue.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/IDBCursorWithValue.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> Ref&lt;IDBCursorWithValue&gt; IDBCursorWithValue::create(IDBTransaction&amp; transaction, IDBObjectStore&amp; objectStore, const IDBCursorInfo&amp; info)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbclientTransactionOperationcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/client/TransactionOperation.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/client/TransactionOperation.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/client/TransactionOperation.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBCursor.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> namespace IDBClient {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbserverSQLiteIDBBackingStorecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -45,7 +45,9 @@
</span><span class="cx"> #include &quot;SQLiteStatement.h&quot;
</span><span class="cx"> #include &quot;SQLiteTransaction.h&quot;
</span><span class="cx"> #include &quot;ThreadSafeDataBuffer.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><ins>+#include &lt;runtime/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSGlobalObject.h&gt;
</span><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -39,6 +39,8 @@
</span><span class="cx"> #include &quot;ScopeGuard.h&quot;
</span><span class="cx"> #include &quot;SerializedScriptValue.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseConnection.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
+#include &lt;runtime/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayPaymentAuthorizedEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentAuthorizedEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentAuthorizedEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentAuthorizedEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(APPLE_PAY)
</span><span class="cx"> 
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayPaymentMethodSelectedEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentMethodSelectedEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentMethodSelectedEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayPaymentMethodSelectedEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(APPLE_PAY)
</span><span class="cx"> 
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingContactSelectedEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingContactSelectedEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(APPLE_PAY)
</span><span class="cx"> 
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSApplePayShippingMethodSelectedEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingMethodSelectedEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingMethodSelectedEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSApplePayShippingMethodSelectedEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,10 +28,9 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(APPLE_PAY)
</span><span class="cx"> 
</span><del>-#include &lt;runtime/IdentifierInlines.h&gt;
-#include &lt;runtime/JSCJSValueInlines.h&gt;
</del><ins>+#include &lt;runtime/JSCInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/ObjectConstructor.h&gt;
</span><del>-#include &lt;runtime/StructureInlines.h&gt;
</del><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSClientRectCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSClientRectCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSClientRectCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSClientRectCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ClientRect.h&quot;
</span><span class="cx"> #include &lt;bytecode/CodeBlock.h&gt;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
+#include &lt;runtime/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/IdentifierInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSObject.h&gt;
</span><span class="cx"> #include &lt;runtime/ObjectConstructor.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDOMBindingcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -38,7 +38,6 @@
</span><span class="cx"> #include &lt;bytecode/CodeBlock.h&gt;
</span><span class="cx"> #include &lt;inspector/ScriptCallStack.h&gt;
</span><span class="cx"> #include &lt;inspector/ScriptCallStackFactory.h&gt;
</span><del>-#include &lt;interpreter/Interpreter.h&gt;
</del><span class="cx"> #include &lt;runtime/DateInstance.h&gt;
</span><span class="cx"> #include &lt;runtime/Error.h&gt;
</span><span class="cx"> #include &lt;runtime/ErrorHandlingScope.h&gt;
</span><span class="lines">@@ -49,6 +48,7 @@
</span><span class="cx"> #include &lt;stdarg.h&gt;
</span><span class="cx"> #include &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/unicode/CharacterNames.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> using namespace Inspector;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDOMBindingh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDOMBinding.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -30,9 +30,11 @@
</span><span class="cx"> #include &quot;ScriptWrappableInlines.h&quot;
</span><span class="cx"> #include &quot;WebCoreTypedArrayController.h&quot;
</span><span class="cx"> #include &lt;cstddef&gt;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;heap/SlotVisitorInlines.h&gt;
</span><span class="cx"> #include &lt;heap/Weak.h&gt;
</span><span class="cx"> #include &lt;heap/WeakInlines.h&gt;
</span><ins>+#include &lt;runtime/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/Error.h&gt;
</span><span class="cx"> #include &lt;runtime/IteratorOperations.h&gt;
</span><span class="cx"> #include &lt;runtime/JSArray.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDeviceMotionEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceMotionEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceMotionEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceMotionEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,6 +31,8 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DeviceMotionData.h&quot;
</span><span class="cx"> #include &quot;DeviceMotionEvent.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
+#include &lt;runtime/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/IdentifierInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/ObjectConstructor.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSDeviceOrientationEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceOrientationEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceOrientationEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSDeviceOrientationEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DeviceOrientationData.h&quot;
</span><span class="cx"> #include &quot;DeviceOrientationEvent.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSErrorEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSErrorEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSErrorEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSErrorEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #include &quot;JSErrorEvent.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;ErrorEvent.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSIDBCursorWithValueCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBCursorWithValueCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBCursorWithValueCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBCursorWithValueCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBCursorWithValue.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSIDBIndexCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBIndexCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBIndexCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSIDBIndexCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBIndex.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSPerformanceTimingCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPerformanceTimingCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPerformanceTimingCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPerformanceTimingCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,8 @@
</span><span class="cx"> #if ENABLE(WEB_TIMING)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DOMWrapperWorld.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
+#include &lt;runtime/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/IdentifierInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSObject.h&gt;
</span><span class="cx"> #include &lt;runtime/ObjectConstructor.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSPopStateEventCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPopStateEventCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPopStateEventCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSPopStateEventCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DOMWrapperWorld.h&quot;
</span><span class="cx"> #include &quot;JSHistory.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCJSValueInlines.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSWebGL2RenderingContextCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWebGL2RenderingContextCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #if ENABLE(WEBGL) &amp;&amp; ENABLE(WEBGL2)
</span><span class="cx"> #include &quot;JSWebGL2RenderingContext.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/Error.h&gt;
</span><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="cx"> #include &quot;WebGL2RenderingContext.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsJSWorkerGlobalScopeCustomcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/JSWorkerGlobalScopeCustom.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -41,7 +41,6 @@
</span><span class="cx"> #include &quot;WorkerGlobalScope.h&quot;
</span><span class="cx"> #include &quot;WorkerLocation.h&quot;
</span><span class="cx"> #include &quot;WorkerNavigator.h&quot;
</span><del>-#include &lt;interpreter/Interpreter.h&gt;
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEB_SOCKETS)
</span><span class="cx"> #include &quot;JSWebSocket.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorebindingsjsWorkerScriptControllercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/WorkerScriptController.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/WorkerScriptController.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/bindings/js/WorkerScriptController.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -39,7 +39,6 @@
</span><span class="cx"> #include &quot;WorkerThread.h&quot;
</span><span class="cx"> #include &lt;bindings/ScriptValue.h&gt;
</span><span class="cx"> #include &lt;heap/StrongInlines.h&gt;
</span><del>-#include &lt;interpreter/Interpreter.h&gt;
</del><span class="cx"> #include &lt;runtime/Completion.h&gt;
</span><span class="cx"> #include &lt;runtime/Error.h&gt;
</span><span class="cx"> #include &lt;runtime/Exception.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorecontentextensionsContentExtensionParsercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/contentextensions/ContentExtensionParser.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/contentextensions/ContentExtensionParser.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/contentextensions/ContentExtensionParser.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -35,12 +35,9 @@
</span><span class="cx"> #include &quot;ContentExtensionRule.h&quot;
</span><span class="cx"> #include &quot;ContentExtensionsBackend.h&quot;
</span><span class="cx"> #include &quot;ContentExtensionsDebugging.h&quot;
</span><del>-#include &lt;JavaScriptCore/IdentifierInlines.h&gt;
-#include &lt;JavaScriptCore/JSCJSValueInlines.h&gt;
</del><ins>+#include &lt;JavaScriptCore/JSCInlines.h&gt;
</ins><span class="cx"> #include &lt;JavaScriptCore/JSGlobalObject.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSONObject.h&gt;
</span><del>-#include &lt;JavaScriptCore/JSObjectInlines.h&gt;
-#include &lt;JavaScriptCore/StructureInlines.h&gt;
</del><span class="cx"> #include &lt;JavaScriptCore/VM.h&gt;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoredomErrorEventcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/dom/ErrorEvent.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/dom/ErrorEvent.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/dom/ErrorEvent.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;DOMWrapperWorld.h&quot;
</span><span class="cx"> #include &quot;EventNames.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorehtmlHTMLCanvasElementcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/html/HTMLCanvasElement.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/html/HTMLCanvasElement.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/html/HTMLCanvasElement.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> #include &lt;runtime/JSCInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/JSLock.h&gt;
</span><span class="cx"> #include &lt;wtf/RAMSize.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(WEBGL)    
</span><span class="cx"> #include &quot;WebGLContextAttributes.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorehtmlMediaDocumentcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/html/MediaDocument.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/html/MediaDocument.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/html/MediaDocument.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx"> #include &quot;ScriptController.h&quot;
</span><span class="cx"> #include &quot;ShadowRoot.h&quot;
</span><span class="cx"> #include &quot;TypedElementDescendantIterator.h&quot;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreinspectorCommandLineAPIModulecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/inspector/CommandLineAPIModule.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/inspector/CommandLineAPIModule.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/inspector/CommandLineAPIModule.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;CommandLineAPIModuleSource.h&quot;
</span><span class="cx"> #include &quot;JSDOMGlobalObject.h&quot;
</span><span class="cx"> #include &quot;WebInjectedScriptManager.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;inspector/InjectedScript.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace JSC;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreloaderEmptyClientscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/loader/EmptyClients.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/loader/EmptyClients.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/loader/EmptyClients.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx"> #include &quot;StorageNamespaceProvider.h&quot;
</span><span class="cx"> #include &quot;ThreadableWebSocketChannel.h&quot;
</span><span class="cx"> #include &quot;UserContentProvider.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorepageCaptionUserPreferencescpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/page/CaptionUserPreferences.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/page/CaptionUserPreferences.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/page/CaptionUserPreferences.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> #include &quot;UserContentTypes.h&quot;
</span><span class="cx"> #include &quot;UserStyleSheet.h&quot;
</span><span class="cx"> #include &quot;UserStyleSheetTypes.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCellInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorepageFramecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/page/Frame.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/page/Frame.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/page/Frame.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -110,6 +110,7 @@
</span><span class="cx"> #include &lt;bindings/ScriptValue.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCountedLeakCounter.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> #include &lt;yarr/RegularExpression.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorepagePageGroupcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/page/PageGroup.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/page/PageGroup.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/page/PageGroup.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;SecurityOrigin.h&quot;
</span><span class="cx"> #include &quot;Settings.h&quot;
</span><span class="cx"> #include &quot;StorageNamespace.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span><span class="cx"> #include &lt;wtf/StdLibExtras.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCorepageUserContentControllercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/page/UserContentController.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/page/UserContentController.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/page/UserContentController.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;DOMWrapperWorld.h&quot;
</span><span class="cx"> #include &quot;UserScript.h&quot;
</span><span class="cx"> #include &quot;UserStyleSheet.h&quot;
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;runtime/JSCellInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/StructureInlines.h&gt;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformmockmediasourceMockBoxcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/mock/mediasource/MockBox.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/mock/mediasource/MockBox.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/mock/mediasource/MockBox.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(MEDIA_SOURCE)
</span><span class="cx"> 
</span><ins>+#include &lt;JavaScriptCore/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;JavaScriptCore/JSCJSValueInlines.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/TypedArrayInlines.h&gt;
</span><span class="cx"> #include &lt;runtime/ArrayBuffer.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoretestingGCObservationcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/testing/GCObservation.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/testing/GCObservation.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/testing/GCObservation.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -26,6 +26,8 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;GCObservation.h&quot;
</span><span class="cx"> 
</span><ins>+#include &lt;heap/HeapInlines.h&gt;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> GCObservation::GCObservation(JSC::JSObject* object)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+        
+        Just rewiring some #includes.
+
+        * UIProcess/ViewGestureController.cpp:
+        * UIProcess/WebPageProxy.cpp:
+        * UIProcess/WebProcessPool.cpp:
+        * UIProcess/WebProcessProxy.cpp:
+        * WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp:
+        * WebProcess/Plugins/Netscape/JSNPObject.cpp:
+
</ins><span class="cx"> 2016-09-05  Gustavo Noronha Silva  &lt;gustavo.noronha@collabora.co.uk&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] GL_PACK_ROW_LENGTH is not available in GLES2
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2UIProcessViewGestureControllercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/ViewGestureController.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/ViewGestureController.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/ViewGestureController.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #import &quot;WebProcessProxy.h&quot;
</span><span class="cx"> #import &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #import &lt;wtf/NeverDestroyed.h&gt;
</span><ins>+#import &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebPageProxy.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebPageProxy.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -125,6 +125,7 @@
</span><span class="cx"> #include &lt;WebCore/WindowFeatures.h&gt;
</span><span class="cx"> #include &lt;stdio.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/StringView.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2UIProcessWebProcessPoolcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessPool.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessPool.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessPool.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -74,6 +74,7 @@
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(BATTERY_STATUS)
</span><span class="cx"> #include &quot;WebBatteryManagerProxy.h&quot;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2UIProcessWebProcessProxycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessProxy.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessProxy.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/UIProcess/WebProcessProxy.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -56,6 +56,7 @@
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2WebProcessInjectedBundleDOMInjectedBundleRangeHandlecpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #include &quot;ShareableBitmap.h&quot;
</span><span class="cx"> #include &quot;WebImage.h&quot;
</span><span class="cx"> #include &lt;JavaScriptCore/APICast.h&gt;
</span><ins>+#include &lt;JavaScriptCore/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;WebCore/Document.h&gt;
</span><span class="cx"> #include &lt;WebCore/FloatRect.h&gt;
</span><span class="cx"> #include &lt;WebCore/Frame.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebKit2WebProcessPluginsNetscapeJSNPObjectcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/WebKit2/WebProcess/Plugins/Netscape/JSNPObject.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2010 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2010, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;NPJSObject.h&quot;
</span><span class="cx"> #include &quot;NPRuntimeObjectMap.h&quot;
</span><span class="cx"> #include &quot;NPRuntimeUtilities.h&quot;
</span><ins>+#include &lt;JavaScriptCore/AuxiliaryBarrierInlines.h&gt;
</ins><span class="cx"> #include &lt;JavaScriptCore/Error.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/IdentifierInlines.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSGlobalObject.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourcebmallocChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/bmalloc/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/bmalloc/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/bmalloc/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+        
+        I needed to tryMemalign, so I added such a thing.
+
+        * bmalloc/Allocator.cpp:
+        (bmalloc::Allocator::allocate):
+        (bmalloc::Allocator::tryAllocate):
+        (bmalloc::Allocator::allocateImpl):
+        * bmalloc/Allocator.h:
+        * bmalloc/Cache.h:
+        (bmalloc::Cache::tryAllocate):
+        * bmalloc/bmalloc.h:
+        (bmalloc::api::tryMemalign):
+
</ins><span class="cx"> 2016-08-30  Geoffrey Garen  &lt;ggaren@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         bmalloc: speed up the lock slow path
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourcebmallocbmallocAllocatorcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -64,6 +64,18 @@
</span><span class="cx"> 
</span><span class="cx"> void* Allocator::allocate(size_t alignment, size_t size)
</span><span class="cx"> {
</span><ins>+    bool crashOnFailure = true;
+    return allocateImpl(alignment, size, crashOnFailure);
+}
+
+void* Allocator::tryAllocate(size_t alignment, size_t size)
+{
+    bool crashOnFailure = false;
+    return allocateImpl(alignment, size, crashOnFailure);
+}
+
+void* Allocator::allocateImpl(size_t alignment, size_t size, bool crashOnFailure)
+{
</ins><span class="cx">     BASSERT(isPowerOfTwo(alignment));
</span><span class="cx"> 
</span><span class="cx">     if (!m_isBmallocEnabled) {
</span><span class="lines">@@ -80,7 +92,10 @@
</span><span class="cx">         return allocate(roundUpToMultipleOf(alignment, size));
</span><span class="cx"> 
</span><span class="cx">     std::lock_guard&lt;StaticMutex&gt; lock(PerProcess&lt;Heap&gt;::mutex());
</span><del>-    return PerProcess&lt;Heap&gt;::getFastCase()-&gt;allocateLarge(lock, alignment, size);
</del><ins>+    Heap* heap = PerProcess&lt;Heap&gt;::getFastCase();
+    if (crashOnFailure)
+        return heap-&gt;allocateLarge(lock, alignment, size);
+    return heap-&gt;tryAllocateLarge(lock, alignment, size);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void* Allocator::reallocate(void* object, size_t newSize)
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourcebmallocbmallocAllocatorh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Allocator.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -43,6 +43,7 @@
</span><span class="cx"> 
</span><span class="cx">     void* tryAllocate(size_t);
</span><span class="cx">     void* allocate(size_t);
</span><ins>+    void* tryAllocate(size_t alignment, size_t);
</ins><span class="cx">     void* allocate(size_t alignment, size_t);
</span><span class="cx">     void* reallocate(void*, size_t);
</span><span class="cx"> 
</span><span class="lines">@@ -49,6 +50,8 @@
</span><span class="cx">     void scavenge();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void* allocateImpl(size_t alignment, size_t, bool crashOnFailure);
+    
</ins><span class="cx">     bool allocateFastCase(size_t, void*&amp;);
</span><span class="cx">     void* allocateSlowCase(size_t);
</span><span class="cx">     
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourcebmallocbmallocCacheh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Cache.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Cache.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/Cache.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> 
</span><span class="cx">     static void* tryAllocate(size_t);
</span><span class="cx">     static void* allocate(size_t);
</span><ins>+    static void* tryAllocate(size_t alignment, size_t);
</ins><span class="cx">     static void* allocate(size_t alignment, size_t);
</span><span class="cx">     static void deallocate(void*);
</span><span class="cx">     static void* reallocate(void*, size_t);
</span><span class="lines">@@ -79,6 +80,14 @@
</span><span class="cx">     return cache-&gt;allocator().allocate(size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline void* Cache::tryAllocate(size_t alignment, size_t size)
+{
+    Cache* cache = PerThread&lt;Cache&gt;::getFastCase();
+    if (!cache)
+        return allocateSlowCaseNullCache(alignment, size);
+    return cache-&gt;allocator().tryAllocate(alignment, size);
+}
+
</ins><span class="cx"> inline void* Cache::allocate(size_t alignment, size_t size)
</span><span class="cx"> {
</span><span class="cx">     Cache* cache = PerThread&lt;Cache&gt;::getFastCase();
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214Sourcebmallocbmallocbmalloch"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/bmalloc.h (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/bmalloc.h        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Source/bmalloc/bmalloc/bmalloc.h        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2014-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -43,6 +43,12 @@
</span><span class="cx">     return Cache::allocate(size);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// Returns null on failure.
+inline void* tryMemalign(size_t alignment, size_t size)
+{
+    return Cache::tryAllocate(alignment, size);
+}
+
</ins><span class="cx"> // Crashes on failure.
</span><span class="cx"> inline void* memalign(size_t alignment, size_t size)
</span><span class="cx"> {
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214ToolsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Tools/ChangeLog (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Tools/ChangeLog        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Tools/ChangeLog        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-08-31  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        Butterflies should be allocated in Auxiliary MarkedSpace instead of CopiedSpace and we should rewrite as much of the GC as needed to make this not a regression
+        https://bugs.webkit.org/show_bug.cgi?id=160125
+
+        Reviewed by Geoffrey Garen and Keith Miller.
+
+        * DumpRenderTree/TestRunner.cpp:
+        * DumpRenderTree/mac/DumpRenderTree.mm:
+        (DumpRenderTreeMain):
+        * Scripts/run-jsc-stress-tests:
+        * TestWebKitAPI/Tests/WTF/Vector.cpp:
+        (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2016-09-03  Youenn Fablet  &lt;youenn@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         run-webkit-tests should detect w3c test resource files
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214ToolsDumpRenderTreeTestRunnercpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/TestRunner.cpp (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/TestRunner.cpp        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/TestRunner.cpp        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> #include &quot;WorkQueue.h&quot;
</span><span class="cx"> #include &quot;WorkQueueItem.h&quot;
</span><span class="cx"> #include &lt;JavaScriptCore/APICast.h&gt;
</span><ins>+#include &lt;JavaScriptCore/HeapInlines.h&gt;
</ins><span class="cx"> #include &lt;JavaScriptCore/JSContextRef.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSCTestRunnerUtils.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSObjectRef.h&gt;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214ToolsDumpRenderTreemacDumpRenderTreemm"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/mac/DumpRenderTree.mm (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Tools/DumpRenderTree/mac/DumpRenderTree.mm        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -56,9 +56,7 @@
</span><span class="cx"> #import &quot;WorkQueue.h&quot;
</span><span class="cx"> #import &quot;WorkQueueItem.h&quot;
</span><span class="cx"> #import &lt;CoreFoundation/CoreFoundation.h&gt;
</span><del>-#import &lt;JavaScriptCore/HeapStatistics.h&gt;
-#import &lt;JavaScriptCore/LLIntData.h&gt;
-#import &lt;JavaScriptCore/Options.h&gt;
</del><ins>+#import &lt;JavaScriptCore/TestRunnerUtils.h&gt;
</ins><span class="cx"> #import &lt;WebCore/LogInitialization.h&gt;
</span><span class="cx"> #import &lt;WebKit/DOMElement.h&gt;
</span><span class="cx"> #import &lt;WebKit/DOMExtensions.h&gt;
</span><span class="lines">@@ -1429,10 +1427,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     [WebCoreStatistics garbageCollectJavaScriptObjects];
</span><span class="cx">     [WebCoreStatistics emptyCache]; // Otherwise SVGImages trigger false positives for Frame/Node counts
</span><del>-    if (JSC::Options::logHeapStatisticsAtExit())
-        JSC::HeapStatistics::reportSuccess();
-    if (JSC::Options::reportLLIntStats())
-        JSC::LLInt::Data::finalizeStats();
</del><ins>+    JSC::finalizeStatsAtEndOfTesting();
</ins><span class="cx">     [pool release];
</span><span class="cx">     returningFromMain = true;
</span><span class="cx">     return 0;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214ToolsScriptsrunjscstresstests"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Tools/Scripts/run-jsc-stress-tests (205716 => 205717)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Tools/Scripts/run-jsc-stress-tests        2016-09-09 08:42:48 UTC (rev 205716)
+++ releases/WebKitGTK/webkit-2.14/Tools/Scripts/run-jsc-stress-tests        2016-09-09 08:55:20 UTC (rev 205717)
</span><span class="lines">@@ -420,7 +420,7 @@
</span><span class="cx"> # We force all tests to use a smaller (1.5M) stack so that stack overflow tests can run faster.
</span><span class="cx"> BASE_OPTIONS = [&quot;--useFTLJIT=false&quot;, &quot;--useFunctionDotArguments=true&quot;, &quot;--maxPerThreadStackUsage=1572864&quot;]
</span><span class="cx"> EAGER_OPTIONS = [&quot;--thresholdForJITAfterWarmUp=10&quot;, &quot;--thresholdForJITSoon=10&quot;, &quot;--thresholdForOptimizeAfterWarmUp=20&quot;, &quot;--thresholdForOptimizeAfterLongWarmUp=20&quot;, &quot;--thresholdForOptimizeSoon=20&quot;, &quot;--thresholdForFTLOptimizeAfterWarmUp=20&quot;, &quot;--thresholdForFTLOptimizeSoon=20&quot;, &quot;--maximumEvalCacheableSourceLength=150000&quot;, &quot;--useEagerCodeBlockJettisonTiming=true&quot;]
</span><del>-NO_CJIT_OPTIONS = [&quot;--useConcurrentJIT=false&quot;, &quot;--thresholdForJITAfterWarmUp=100&quot;]
</del><ins>+NO_CJIT_OPTIONS = [&quot;--useConcurrentJIT=false&quot;, &quot;--thresholdForJITAfterWarmUp=100&quot;, &quot;--scribbleFreeCells=true&quot;]
</ins><span class="cx"> FTL_OPTIONS = [&quot;--useFTLJIT=true&quot;]
</span><span class="cx"> 
</span><span class="cx"> $runlist = []
</span></span></pre>
</div>
</div>

</body>
</html>