Visiting a WeakBlock should report bytes visited, since we reported them allocated.
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2016-02-08  Andreas Kling  <akling@apple.com>
2
3         Visiting a WeakBlock should report bytes visited, since we reported them allocated.
4         <https://webkit.org/b/153978>
5
6         Reviewed by Darin Adler.
7
8         When creating a WeakBlock, we tell Heap that we've allocated 1 KB (WeakBlock::blockSize)
9         of memory. Consequently, when visiting a WeakBlock, we should also report 1 KB of memory
10         visited. Otherwise Heap will think that those 1 KB already went away.
11
12         This was causing us to underestimate heap size, which affects collection scheduling.
13
14         * heap/SlotVisitor.h:
15         (JSC::SlotVisitor::reportMemoryVisited):
16         * heap/WeakBlock.cpp:
17         (JSC::WeakBlock::visit):
18
19 2016-02-07  Saam barati  <sbarati@apple.com>
20
21         Follow up patch to: [ES6] bound functions .name property should be "bound " + the target function's name 
22         https://bugs.webkit.org/show_bug.cgi?id=153796
23
24         Reviewed by Darin Adler.
25
26         This follow-up patch addresses some comments/suggestions by
27         Ryosuke, Darin, and Joe. It simplifies JSBoundFunction::toStringName
28         and adds some tests for bound names.
29
30         * runtime/JSBoundFunction.cpp:
31         (JSC::hasInstanceBoundFunction):
32         (JSC::JSBoundFunction::create):
33         (JSC::JSBoundFunction::toStringName):
34
35 2016-02-07  Filip Pizlo  <fpizlo@apple.com>
36
37         String.match should defend against matches that would crash the VM
38         https://bugs.webkit.org/show_bug.cgi?id=153964
39         rdar://problem/24301119
40
41         Reviewed by Saam Barati.
42
43         This fixes a crash in an internal test case.
44
45         * runtime/ArgList.cpp:
46         (JSC::MarkedArgumentBuffer::slowAppend): Use best practices to ensure that the size we
47             compute makes sense. Crash if it stops making sense, since most users of this API assume
48             that they are creating something small enough to fit on the stack.
49         * runtime/ArgList.h:
50         (JSC::MarkedArgumentBuffer::~MarkedArgumentBuffer):
51         (JSC::MarkedArgumentBuffer::size):
52         (JSC::MarkedArgumentBuffer::operator new): Deleted. These were ineffective. According to the
53             debugger, we were still calling system malloc. So, I changed the code to use fastMalloc()
54             directly.
55         (JSC::MarkedArgumentBuffer::operator delete): Deleted.
56         * runtime/StringPrototype.cpp:
57         (JSC::stringProtoFuncMatch): Explicitly defend against absurd sizes. Of course, it's still
58             possible to crash the VM on OOME. That's sort of always been the philosophy of JSC - we
59             don't guarantee that you'll get a nice-looking error whenever you run out of memory,
60             since in a GC'd environment you can't really guarantee those things. But, if you have a
61             match that obvious won't fit in memory, then reporting an error is useful in case this is
62             a developer experimenting with a buggy regexp.
63
64 2016-02-07  Dan Bernstein  <mitz@apple.com>
65
66         [Cocoa] Replace __has_include guards around inclusion of Apple-internal-SDK headers with USE(APPLE_INTERNAL_SDK)
67         https://bugs.webkit.org/show_bug.cgi?id=153963
68
69         Reviewed by Sam Weinig.
70
71         * inspector/remote/RemoteInspectorXPCConnection.mm:
72
73 2016-02-06  Filip Pizlo  <fpizlo@apple.com>
74
75         FTL must store the call site index before runtime calls, even if it's the tail call slow path
76         https://bugs.webkit.org/show_bug.cgi?id=153955
77         rdar://problem/24290970
78
79         Reviewed by Saam Barati.
80
81         This is necessary because you could throw an exception in a host call on the tail call's slow
82         path. That'll route us to lookupExceptionHandler(), which unwinds starting with the call site
83         index of our frame. Bad things happen if it's not set. Prior to this patch it was possible
84         for the call site index field to be uninitialized, which meant that the throwing machinery
85         was making a wild guess about where we are.
86
87         * ftl/FTLLowerDFGToLLVM.cpp:
88         (JSC::FTL::DFG::LowerDFGToLLVM::compileTailCall):
89         * tests/stress/tail-call-host-call-throw.js: Added.
90
91 2016-02-06  Darin Adler  <darin@apple.com>
92
93         Finish auditing call sites of upper() and lower(), eliminate many, and rename the functions
94         https://bugs.webkit.org/show_bug.cgi?id=153905
95
96         Reviewed by Sam Weinig.
97
98         * runtime/IntlObject.cpp:
99         (JSC::canonicalLangTag): Use converToASCIIUppercase on the language tag.
100
101         * runtime/StringPrototype.cpp:
102         (JSC::stringProtoFuncToLowerCase): Tweak style and update for name change.
103         (JSC::stringProtoFuncToUpperCase): Ditto.
104
105 2016-02-06  Chris Dumez  <cdumez@apple.com>
106
107         Object.getOwnPropertyDescriptor() does not work on sub-frame's window
108         https://bugs.webkit.org/show_bug.cgi?id=153925
109
110         Reviewed by Darin Adler.
111
112         Calling Object.getOwnPropertyDescriptor() on a sub-frame's window was
113         returning undefined for that window's own properties. The reason was
114         that the check getOwnPropertySlot() is using to make sure the
115         PropertySlot is not for a property coming from the prototype was wrong.
116
117         The check was checking that 'this != slotBase' which works fine unless
118         this is a JSProxy (e.g. JSDOMWindowShell). To handle proxies, the code
119         was also checking that 'slotBase.toThis() != this', attempting to
120         get the slotBase/Window's proxy. However, due to the implementation of
121         toThis(), we were getting the lexical global object's proxy instead of
122         slotBase's proxy. To avoid this issue, the new code explicitly checks
123         if 'this' is a JSProxy and makes sure 'JSProxy::target() != slotBase',
124         instead of using toThis().
125
126         * runtime/JSObject.cpp:
127         (JSC::JSObject::getOwnPropertyDescriptor):
128
129 2016-02-06  Andreas Kling  <akling@apple.com>
130
131         [iOS] Throw away linked code when navigating to a new page.
132         <https://webkit.org/b/153851>
133
134         Reviewed by Gavin Barraclough.
135
136         Add a VM API for throwing away linked code only.
137
138         * runtime/VM.cpp:
139         (JSC::VM::deleteAllLinkedCode):
140         * runtime/VM.h:
141
142 2016-02-06  Commit Queue  <commit-queue@webkit.org>
143
144         Unreviewed, rolling out r196104.
145         https://bugs.webkit.org/show_bug.cgi?id=153940
146
147         Regressed Speedometer on iOS (Requested by kling on #webkit).
148
149         Reverted changeset:
150
151         "[iOS] Throw away linked code when navigating to a new page."
152         https://bugs.webkit.org/show_bug.cgi?id=153851
153         http://trac.webkit.org/changeset/196104
154
155 2016-02-05  Alex Christensen  <achristensen@webkit.org>
156
157         Fix internal Windows build
158         https://bugs.webkit.org/show_bug.cgi?id=153930
159         <rdar://problem/24534864>
160
161         Reviewed by Mark Lam.
162
163         * JavaScriptCore.vcxproj/JavaScriptCore.proj:
164         I made a typo in r196144.
165
166 2016-02-05  Saam barati  <sbarati@apple.com>
167
168         Web Inspector: Include SamplingProfiler's expression-level data for stack frames in the protocol
169         https://bugs.webkit.org/show_bug.cgi?id=153455
170         <rdar://problem/24335884>
171
172         Reviewed by Joseph Pecoraro.
173
174         We now send the sampling profiler's expression-level
175         line/column info in the inspector protocol.
176
177         * inspector/agents/InspectorScriptProfilerAgent.cpp:
178         (Inspector::buildSamples):
179         * inspector/protocol/ScriptProfiler.json:
180         * runtime/SamplingProfiler.h:
181         (JSC::SamplingProfiler::StackFrame::hasExpressionInfo):
182
183 2016-02-05  Saam barati  <sbarati@apple.com>
184
185         follow-up to: JSC Sampling Profiler: (host) is confusing in cases where I would expect to see JS name
186         https://bugs.webkit.org/show_bug.cgi?id=153663
187         <rdar://problem/24415092>
188
189         Rubber stamped by Joseph Pecoraro.
190
191         We were performing operations that required us to
192         hold the VM lock even when we might not have been holding it.
193         We now ensure we're holding it.
194
195         * inspector/agents/InspectorScriptProfilerAgent.cpp:
196         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
197
198 2016-02-05  Filip Pizlo  <fpizlo@apple.com>
199
200         Arrayify for a typed array shouldn't create a monster
201         https://bugs.webkit.org/show_bug.cgi?id=153908
202         rdar://problem/24290639
203
204         Reviewed by Mark Lam.
205
206         Previously if you convinced the DFG to emit an Arrayify to ArrayStorage and then gave it a
207         typed array, you'd corrupt the object.
208
209         * runtime/JSArrayBufferView.cpp:
210         (WTF::printInternal):
211         * runtime/JSArrayBufferView.h:
212         * runtime/JSGenericTypedArrayViewInlines.h:
213         (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren):
214         (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory):
215         * runtime/JSObject.cpp:
216         (JSC::JSObject::copyButterfly):
217         (JSC::JSObject::enterDictionaryIndexingMode):
218         (JSC::JSObject::ensureInt32Slow):
219         (JSC::JSObject::ensureDoubleSlow):
220         (JSC::JSObject::ensureContiguousSlow):
221         (JSC::JSObject::ensureArrayStorageSlow):
222         (JSC::JSObject::growOutOfLineStorage):
223         (JSC::getBoundSlotBaseFunctionForGetterSetter):
224         * runtime/Structure.h:
225         * tests/stress/arrayify-array-storage-typed-array.js: Added. This test failed.
226         * tests/stress/arrayify-int32-typed-array.js: Added. This test case already had other protections, but we beefed them up.
227
228 2016-02-04  Joseph Pecoraro  <pecoraro@apple.com>
229
230         Web Inspector: InspectorTimelineAgent doesn't need to recompile functions because it now uses the sampling profiler
231         https://bugs.webkit.org/show_bug.cgi?id=153500
232         <rdar://problem/24352458>
233
234         Reviewed by Timothy Hatcher.
235
236         Be more explicit about enabling legacy profiling.
237
238         * jsc.cpp:
239         * runtime/Executable.cpp:
240         (JSC::ScriptExecutable::newCodeBlockFor):
241         * runtime/JSGlobalObject.cpp:
242         (JSC::JSGlobalObject::hasLegacyProfiler):
243         (JSC::JSGlobalObject::createProgramCodeBlock):
244         (JSC::JSGlobalObject::createEvalCodeBlock):
245         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
246         (JSC::JSGlobalObject::hasProfiler): Deleted.
247         * runtime/JSGlobalObject.h:
248         (JSC::JSGlobalObject::supportsLegacyProfiling):
249         (JSC::JSGlobalObject::supportsProfiling): Deleted.
250
251 2016-02-04  Keith Miller  <keith_miller@apple.com>
252
253         ArrayPrototype should have a destroy function
254         https://bugs.webkit.org/show_bug.cgi?id=153847
255
256         Reviewed by Filip Pizlo.
257
258         ArrayPrototype should have an destroy function as it now has a unique_ptr member that
259         needs to be freed at the end of the object's life cycle. Also, this patch adds an
260         option, gcAtEnd, that will cause jsc.cpp to do a garbage collection before exiting.
261
262         * jsc.cpp:
263         (runJSC):
264         (jscmain):
265         * runtime/ArrayPrototype.cpp:
266         (JSC::ArrayPrototype::create):
267         (JSC::ArrayPrototype::destroy):
268         * runtime/ArrayPrototype.h:
269         * runtime/Options.h:
270
271 2016-02-04  Filip Pizlo  <fpizlo@apple.com>
272
273         REGRESSION(192409): Cannot rely on add32() to zero-extend
274         https://bugs.webkit.org/show_bug.cgi?id=153897
275
276         Unreviewed rollout of r192409.
277
278         * assembler/MacroAssemblerARM64.h:
279         (JSC::MacroAssemblerARM64::add32):
280         (JSC::MacroAssemblerARM64::add64):
281         * assembler/MacroAssemblerARMv7.h:
282         (JSC::MacroAssemblerARMv7::add32):
283         * assembler/MacroAssemblerX86.h:
284         (JSC::MacroAssemblerX86::add32):
285         * assembler/MacroAssemblerX86Common.h:
286         (JSC::MacroAssemblerX86Common::add32):
287         (JSC::MacroAssemblerX86Common::add8):
288         (JSC::MacroAssemblerX86Common::branchAdd32):
289         (JSC::MacroAssemblerX86Common::generateTest32):
290         (JSC::MacroAssemblerX86Common::clz32AfterBsr):
291         (JSC::MacroAssemblerX86Common::add32AndSetFlags): Deleted.
292         * assembler/MacroAssemblerX86_64.h:
293         (JSC::MacroAssemblerX86_64::add32):
294         (JSC::MacroAssemblerX86_64::add64):
295         (JSC::MacroAssemblerX86_64::branchAdd64):
296         (JSC::MacroAssemblerX86_64::repatchCall):
297         (JSC::MacroAssemblerX86_64::clz64AfterBsr):
298         (JSC::MacroAssemblerX86_64::add64AndSetFlags): Deleted.
299
300 2016-02-04  Andreas Kling  <akling@apple.com>
301
302         Remove dead ENABLE(BYTECODE_COMMENTS) cruft.
303         <https://webkit.org/b/153888>
304
305         Reviewed by Antti Koivisto.
306
307         * bytecode/UnlinkedCodeBlock.cpp:
308         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): Deleted.
309         * bytecode/UnlinkedCodeBlock.h:
310         (JSC::UnlinkedCodeBlock::shrinkToFit): Deleted.
311
312 2016-02-04  Saam barati  <sbarati@apple.com>
313
314         JSC Sampling Profiler: (host) is confusing in cases where I would expect to see JS name
315         https://bugs.webkit.org/show_bug.cgi?id=153663
316         <rdar://problem/24415092>
317
318         Reviewed by Geoffrey Garen.
319
320         We now collect the Callee in the processed StackFrame
321         when the Callee is a valid GC object. We later ask
322         the Callee for it's .displayName or .name property.
323         When we don't have a valid callee, we will still
324         use the Executable for this information.
325
326         This helps us come up with good names for frames where 
327         the Callee object is a bound function or an InternalFunction.
328
329         * inspector/agents/InspectorScriptProfilerAgent.cpp:
330         (Inspector::InspectorScriptProfilerAgent::addEvent):
331         (Inspector::buildSamples):
332         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
333         * runtime/SamplingProfiler.cpp:
334         (JSC::reportStats):
335         (JSC::FrameWalker::walk):
336         (JSC::SamplingProfiler::processUnverifiedStackTraces):
337         (JSC::SamplingProfiler::visit):
338         (JSC::SamplingProfiler::shutdown):
339         (JSC::SamplingProfiler::clearData):
340         (JSC::SamplingProfiler::StackFrame::nameFromCallee):
341         (JSC::SamplingProfiler::StackFrame::displayName):
342         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
343         (JSC::SamplingProfiler::stackTracesAsJSON):
344         * runtime/SamplingProfiler.h:
345         (JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame):
346         (JSC::SamplingProfiler::StackFrame::StackFrame):
347         * tests/stress/sampling-profiler-basic.js:
348         (platformSupportsSamplingProfiler.nothing):
349         (platformSupportsSamplingProfiler.top):
350         * tests/stress/sampling-profiler-bound-function-name.js: Added.
351         (platformSupportsSamplingProfiler.foo):
352         (platformSupportsSamplingProfiler.bar):
353         (platformSupportsSamplingProfiler.let.baz):
354         (platformSupportsSamplingProfiler):
355         * tests/stress/sampling-profiler-display-name.js: Added.
356         (platformSupportsSamplingProfiler.foo):
357         (platformSupportsSamplingProfiler.baz):
358         (platformSupportsSamplingProfiler.):
359         (platformSupportsSamplingProfiler.bar):
360         (platformSupportsSamplingProfiler.jaz):
361         (platformSupportsSamplingProfiler.makeFunction.let.result):
362         (platformSupportsSamplingProfiler.makeFunction):
363         * tests/stress/sampling-profiler-internal-function-name.js: Added.
364         (platformSupportsSamplingProfiler.foo):
365         (platformSupportsSamplingProfiler.bar):
366         (platformSupportsSamplingProfiler):
367
368 2016-02-04  Chris Dumez  <cdumez@apple.com>
369
370         Object.getOwnPropertyDescriptor() returns incomplete descriptor for instance properties
371         https://bugs.webkit.org/show_bug.cgi?id=153817
372
373         Reviewed by Geoffrey Garen.
374
375         Extend support for Object.getOwnPropertyDescriptor() on native bindings
376         to instance properties (e.g. Unforgeable properties or Global object
377         properties) so that the returned descriptor has getter / setter
378         functions, as expected.
379
380         * runtime/JSObject.cpp:
381         (JSC::JSObject::reifyAllStaticProperties):
382         Add method that reifies all static properties, including the custom
383         accessors. This is similar to what is done eagerly on the prototype
384         objects in the bindings code.
385
386         (JSC::JSObject::getOwnPropertyDescriptor):
387         getOwnPropertyDescriptor() would previously fails for custom accessors
388         that are on the instance because getDirect() does not check the static
389         property table and those custom accessors were not reified (We only
390         reified all properties eagerly - including custom accessors - on
391         prototype objects. To address this issue, we now call
392         reifyAllStaticProperties() if the call to getDirect() fails and then
393         call getDirect() again. This fix is however insufficient for Window
394         properties because |this| is a JSDOMWindowShell / JSProxy in this case
395         and getDirect() / reifyAllStaticProperties() would fail as the proxy
396         does not actually have the properties. This issue was addressed by
397         checking if |this| is a JSProxy and then using JSProxy::target() instead
398         of |this| for the calls to getDirect() and for the reification.
399
400         * runtime/JSObject.h:
401         * runtime/Lookup.h:
402         (JSC::reifyStaticProperty):
403         (JSC::reifyStaticProperties):
404         Move most code in reifyStaticProperties() to a separate function so the
405         code can be shared with JSObject::reifyAllStaticProperties().
406         reifyStaticProperties() is currently called by the bindings on the
407         prototype objects.
408
409 2016-02-04  Alex Christensen  <achristensen@webkit.org>
410
411         Fix internal Windows build
412         https://bugs.webkit.org/show_bug.cgi?id=153886
413         <rdar://problem/24499887>
414
415         Reviewed by Mark Lam.
416
417         * JavaScriptCore.vcxproj/JavaScriptCore.proj:
418         In r190253 I changed the directory of the headers from AppleInternal/include/JavaScriptCore 
419         to AppleInternal/include/private/JavaScriptCore.  This is ok for WebCore and WebKit, but not
420         other projects, such as CFNetwork, which expect the public API headers to be in the old location.
421         This used to be done by a combination of copy-files.cmd and the old JavaScriptCore.proj.
422         This change copies all the API headers, which copies everything in copy-files.cmd except APIShims.h
423         which does not exist any more.  It copies additional headers that were not copied before, but
424         I think this is beneficial so we do not forget to add new public headers to a list of public headers
425         to be copied in the internal build.  Having extra public headers in the internal Windows build is
426         not a problem because only internal clients use the internal Windows build.
427
428 2016-02-03  Yusuke Suzuki  <utatane.tea@gmail.com>
429
430         [JSC] Make some classes non JSDestructibleObject
431         https://bugs.webkit.org/show_bug.cgi?id=153838
432
433         Reviewed by Geoffrey Garen.
434
435         SymbolPrototype, JSMapIterator and JSSetIterator are trivially destructible.
436         So there is no need to inherit JSDestructibleObject.
437
438         * runtime/JSMapIterator.cpp:
439         (JSC::JSMapIterator::destroy): Deleted.
440         * runtime/JSMapIterator.h:
441         * runtime/JSSetIterator.cpp:
442         (JSC::JSSetIterator::destroy): Deleted.
443         * runtime/JSSetIterator.h:
444         * runtime/MapData.h:
445         * runtime/SymbolPrototype.h:
446
447 2016-02-03  Yusuke Suzuki  <utatane.tea@gmail.com>
448
449         [JSC] Symbol structure has unnecessary flags
450         https://bugs.webkit.org/show_bug.cgi?id=153840
451
452         Reviewed by Saam Barati.
453
454         * runtime/Symbol.h:
455         * tests/stress/symbol-get-own-property.js: Added.
456         (shouldBe):
457
458 2016-02-03  Andreas Kling  <akling@apple.com>
459
460         [iOS] Throw away linked code when navigating to a new page.
461         <https://webkit.org/b/153851>
462
463         Reviewed by Gavin Barraclough.
464
465         Add a VM API for throwing away linked code only.
466
467         * runtime/VM.cpp:
468         (JSC::VM::deleteAllLinkedCode):
469         * runtime/VM.h:
470
471 2016-02-03  Michael Catanzaro  <mcatanzaro@igalia.com>
472
473         [GTK][EFL] Switch FTL to B3
474         https://bugs.webkit.org/show_bug.cgi?id=153478
475
476         Reviewed by Csaba Osztrogonác.
477
478         Conditionalize code to make it possible to build FTL completely without LLVM.
479
480         * CMakeLists.txt:
481         * dfg/DFGCommon.h:
482         * dfg/DFGPlan.cpp:
483         (JSC::DFG::Plan::compileInThreadImpl):
484         * ftl/FTLAbbreviatedTypes.h:
485         * ftl/FTLFail.cpp:
486         (JSC::FTL::fail):
487         * ftl/FTLState.cpp:
488         (JSC::FTL::State::State):
489         (JSC::FTL::State::~State):
490
491 2016-02-03  Carlos Garcia Campos  <cgarcia@igalia.com>
492
493         Unreviewed. Fix JavaScriptCore build with B3 enabled.
494
495         Include <limits.h> for UINT_MAX.
496
497         * b3/B3StackSlot.h:
498         * b3/air/AirStackSlot.h:
499
500 2016-02-02  Caitlin Potter  <caitp@igalia.com>
501
502         JSSymbolTableObject::deleteProperty() crashes deleting Symbols
503         https://bugs.webkit.org/show_bug.cgi?id=153816
504
505         Reviewed by Darin Adler.
506
507         Changes JSSymbolTableObject::deleteProperty() to check if its
508         symbolTable() contains the property's uid() rather than publicName().
509         This ensures that it will not crash in the case of Symbols.
510
511         * runtime/JSSymbolTableObject.cpp:
512         (JSC::JSSymbolTableObject::deleteProperty):
513         * tests/es6/Object_static_methods_Object.getOwnPropertyDescriptors.js:
514         (testGlobalProxy):
515         * tests/stress/regress-153816.js: Added.
516         (deleteSymbolFromJSSymbolTableObject):
517
518 2016-02-02  Benjamin Poulain  <benjamin@webkit.org>
519
520         [JSC] Do not copy FP when lowering FramePointer
521         https://bugs.webkit.org/show_bug.cgi?id=153769
522
523         Reviewed by Michael Saboff.
524
525         That extra move is just wasted time. The fewer Moves we have,
526         the happier IRC is.
527
528         * b3/B3LowerToAir.cpp:
529         (JSC::B3::Air::LowerToAir::tmp):
530         (JSC::B3::Air::LowerToAir::lower):
531
532 2016-02-02  Keith Miller  <keith_miller@apple.com>
533
534         DFG, FTL, B3, and Air should all have a unique option for printing their graphs
535         https://bugs.webkit.org/show_bug.cgi?id=153815
536
537         Reviewed by Benjamin Poulain.
538
539         This patch adds a new printing option for each of the DFG/FTL compilation phases.
540
541         * b3/B3Common.cpp:
542         (JSC::B3::shouldDumpIR):
543         (JSC::B3::shouldDumpIRAtEachPhase):
544         * b3/B3Common.h:
545         * b3/B3Generate.cpp:
546         (JSC::B3::generateToAir):
547         * b3/B3PhaseScope.cpp:
548         (JSC::B3::PhaseScope::PhaseScope):
549         * b3/air/AirGenerate.cpp:
550         (JSC::B3::Air::prepareForGeneration):
551         * b3/air/AirPhaseScope.cpp:
552         (JSC::B3::Air::PhaseScope::PhaseScope):
553         * dfg/DFGCFAPhase.cpp:
554         (JSC::DFG::CFAPhase::run):
555         * dfg/DFGCommon.h:
556         (JSC::DFG::shouldDumpGraphAtEachPhase):
557         * dfg/DFGPhase.cpp:
558         (JSC::DFG::Phase::beginPhase):
559         * runtime/Options.cpp:
560         (JSC::recomputeDependentOptions):
561         * runtime/Options.h:
562
563 2016-02-02  Caitlin Potter  <caitp@igalia.com>
564
565         [JSC] make Object.getOwnPropertyDescriptors() work with non-JSObject types
566         https://bugs.webkit.org/show_bug.cgi?id=153814
567
568         Reviewed by Yusuke Suzuki.
569
570         * runtime/ObjectConstructor.cpp:
571         (JSC::objectConstructorGetOwnPropertyDescriptors):
572         * tests/es6/Object_static_methods_Object.getOwnPropertyDescriptors.js:
573         (testGlobalProxy):
574
575 2016-02-02  Aakash Jain  <aakash_jain@apple.com>
576
577         Remove references to CallFrameInlines.h
578         https://bugs.webkit.org/show_bug.cgi?id=153810
579
580         Reviewed by Mark Lam.
581
582         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
583         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
584
585 2016-02-02  Caitlin Potter  <caitp@igalia.com>
586
587         [JSC] Implement Object.getOwnPropertyDescriptors() proposal
588         https://bugs.webkit.org/show_bug.cgi?id=153799
589
590         Reviewed by Darin Adler.
591
592         Implements the Object.getOwnPropertyDescriptors() proposal, which
593         reached Stage 3 in the TC39 process in January 2016.
594         https://github.com/tc39/proposal-object-getownpropertydescriptors
595
596         The method extracts a set of property descriptor objects, which can
597         be safely used via `Object.create()`.
598
599         * runtime/ObjectConstructor.cpp:
600         (JSC::objectConstructorGetOwnPropertyDescriptors):
601
602 2016-02-02  Filip Pizlo  <fpizlo@apple.com>
603
604         B3 should be able to compile trivial self-loops
605         https://bugs.webkit.org/show_bug.cgi?id=153802
606         rdar://problem/24465632
607
608         Reviewed by Michael Saboff.
609
610         Tail-duplicating a self-loop would mean doing a kind of loop unrolling. It wouldn't be
611         profitable even if it did work. It turns out that it doesn't work, because we edit the target
612         block before reading the source block, which breaks if the target and source block are the
613         same.
614
615         This disables tail duplication of self-loops, adds a test, and adds better validation for this
616         issue.
617
618         * b3/B3DuplicateTails.cpp:
619         * b3/B3Procedure.cpp:
620         (JSC::B3::Procedure::resetReachability):
621         * b3/testb3.cpp:
622         (JSC::B3::testComputeDivisionMagic):
623         (JSC::B3::testTrivialInfiniteLoop):
624         (JSC::B3::zero):
625         (JSC::B3::run):
626
627 2016-02-02  Saam barati  <sbarati@apple.com>
628
629         [ES6] bound functions .name property should be "bound " + the target function's name
630         https://bugs.webkit.org/show_bug.cgi?id=153796
631
632         Reviewed by Mark Lam.
633
634         See http://tc39.github.io/ecma262/#sec-function.prototype.bind for details.
635         What the spec says:
636         ```
637         function foo() { }
638         foo.bind(null).name === "bound foo"
639
640         (function bar() { }).bind(null).name === "bound bar"
641         ```
642
643         * runtime/FunctionPrototype.cpp:
644         (JSC::functionProtoFuncToString):
645         * runtime/JSBoundFunction.cpp:
646         (JSC::hasInstanceBoundFunction):
647         (JSC::JSBoundFunction::create):
648         (JSC::JSBoundFunction::visitChildren):
649         (JSC::JSBoundFunction::toStringName):
650         * runtime/JSBoundFunction.h:
651         (JSC::JSBoundFunction::boundThis):
652         (JSC::JSBoundFunction::boundArgs):
653         (JSC::JSBoundFunction::createStructure):
654         * tests/es6.yaml:
655
656 2016-02-02  Filip Pizlo  <fpizlo@apple.com>
657
658         Get rid of anonymous stack slots
659         https://bugs.webkit.org/show_bug.cgi?id=151128
660
661         Reviewed by Mark Lam.
662
663         When I first designed stack slots, the idea was that an "anonymous" stack slot was one that
664         behaved exactly like a C variable: if it never escaped, it would not need to get stack space
665         for the entire lifetime of the function - it could get any slab of stack so long as it
666         didn't interfere with other stack slots that would be live at the same time. The reason I
667         called them "anonymous" is that external code could not get its address. This felt like it
668         gave the stack slot anonymity. But it was never a good name for this concept.
669
670         Then I had the register allocator lower temporaries to anonymous stack slots when it spilled
671         them. Spilling became the sole client of anonymous stack slots.
672
673         Then I realized that there was an aspect of how spill slots work that make them want
674         slightly different semantics than a normal C variable. A C variable is a proper memory
675         location - you could do a store to only some bytes in the variable, and it's reasonable to
676         expect that this will not destroy the other bytes in the variable. But that means that to
677         compute their liveness, you have to do something like a per-byte liveness. That's overkill
678         for spill slots. You want any store to the spill slot to kill the whole slot even if it
679         writes to just part of the slot. This matches how temporaries work. So rather than implement
680         per-byte liveness, I decided to change the semantics of anonymous stack slots to make them
681         work like how I wanted spill slots to work. This was quite dirty, and put B3 in the awkward
682         situation that B3's anonymous stack slots behaved like spill slots. But it was OK since
683         nobody used anonymous stack slots in B3.
684
685         Then I added tail duplication, which required having a mechanism for introducing non-SSA
686         variables in B3. I decided to use anonymous stack slots for this purpose. All of a sudden
687         this all felt like it made sense: anonymous stack slots were just like variables! Hooray for
688         the amazing foresight of anonymous stack slots!
689
690         But then I realized that this was all very bad. We want B3 to be able to optimize Store and
691         Load operations by reasoning about how they affect bytes in memory. For example, if you do
692         a Load of a 64-bit value, and then you modify just the low 32 bits of that value, and then
693         you do a 64-bit store back to the same location, then it would be better to transform this
694         into 32-bit operations. We don't do this optimization yet, but it's the kind of thing that
695         we want B3 to be able to do. To do it, we need Store to mean that it only affects N bytes
696         starting at the pointer, where N is the size of the thing being stored. But that's not what
697         Store means for anonymous stack slots. For anonymous slots, storing to any byte in the slot
698         clobbers all bytes in the slot. We were never clear if you need to store directly to an
699         anonymous slot to get this behavior, or if any pointer that points to an anoymous slot must
700         exhibit this behavior when stored to. Neither kinds of semantics make sense to me.
701
702         This change fixes the problem by eradicating anonymous stack slots. In B3, they are replaced
703         with Variables. In Air, they are replaced with a different stack slot kind, called Spill.
704         There is no such thing as stack slot kinds in B3 anymore, all B3 stack slots are locked. In
705         Air, there is still the concept of stack slot kind - Locked or Spill.
706
707         B3 Variables are awesome. They are exactly what they seem to be. They have a type. They are
708         declared at the top level in the Procedure. You can access them with new opcodes, Get and
709         Set. This greatly simplifies demoting SSA values to variables and promoting them back to
710         SSA. I even made the instruction selector do the right things for variables, which means
711         that introducing variables won't hurt instruction selection (there will be extra moves, but
712         IRC will kill them). It's great to have non-SSA variables as an explicit concept in IR
713         because it means that you don't have to do any magic to use them - they Just Work.
714
715         Air spill slots behave almost like anonymous stack slots, with one exception: you cannot
716         escape them. We validate this by making it illegal to UseAddr on a spill slot. This removes
717         the need to answer awkward questions like: does a 32-bit Def on a pointer that may point to
718         a 64-bit spill slot do anything to the 32 bits above the pointer?  Does it write zero to it?
719         Does it write zero to it just when the pointer actually points to a spill slot or always?
720         These are silly questions, and we don't have to answer them because the only way to refer to
721         a spill slot is directly. No escaping means no aliasing.
722
723         This doesn't affect performance. It just makes the compiler more fun to work with by
724         removing some cognitive dissonance.
725
726         * CMakeLists.txt:
727         * JavaScriptCore.xcodeproj/project.pbxproj:
728         * b3/B3ArgumentRegValue.h:
729         * b3/B3CCallValue.h:
730         * b3/B3CheckValue.cpp:
731         (JSC::B3::CheckValue::cloneImpl):
732         (JSC::B3::CheckValue::CheckValue):
733         * b3/B3CheckValue.h:
734         * b3/B3Const32Value.h:
735         * b3/B3Const64Value.h:
736         * b3/B3ConstDoubleValue.h:
737         * b3/B3ConstFloatValue.h:
738         * b3/B3ConstPtrValue.h:
739         (JSC::B3::ConstPtrValue::ConstPtrValue):
740         * b3/B3ControlValue.cpp:
741         (JSC::B3::ControlValue::convertToJump):
742         (JSC::B3::ControlValue::convertToOops):
743         (JSC::B3::ControlValue::dumpMeta):
744         * b3/B3ControlValue.h:
745         * b3/B3Effects.cpp:
746         (JSC::B3::Effects::interferes):
747         (JSC::B3::Effects::dump):
748         * b3/B3Effects.h:
749         (JSC::B3::Effects::mustExecute):
750         * b3/B3EliminateCommonSubexpressions.cpp:
751         * b3/B3FixSSA.cpp:
752         (JSC::B3::demoteValues):
753         (JSC::B3::fixSSA):
754         * b3/B3FixSSA.h:
755         * b3/B3IndexMap.h:
756         (JSC::B3::IndexMap::resize):
757         (JSC::B3::IndexMap::clear):
758         (JSC::B3::IndexMap::size):
759         (JSC::B3::IndexMap::operator[]):
760         * b3/B3IndexSet.h:
761         (JSC::B3::IndexSet::contains):
762         (JSC::B3::IndexSet::size):
763         (JSC::B3::IndexSet::isEmpty):
764         * b3/B3LowerToAir.cpp:
765         (JSC::B3::Air::LowerToAir::run):
766         (JSC::B3::Air::LowerToAir::lower):
767         * b3/B3MemoryValue.h:
768         * b3/B3Opcode.cpp:
769         (WTF::printInternal):
770         * b3/B3Opcode.h:
771         * b3/B3PatchpointValue.cpp:
772         (JSC::B3::PatchpointValue::cloneImpl):
773         (JSC::B3::PatchpointValue::PatchpointValue):
774         * b3/B3PatchpointValue.h:
775         * b3/B3Procedure.cpp:
776         (JSC::B3::Procedure::Procedure):
777         (JSC::B3::Procedure::addBlock):
778         (JSC::B3::Procedure::addStackSlot):
779         (JSC::B3::Procedure::addVariable):
780         (JSC::B3::Procedure::clone):
781         (JSC::B3::Procedure::addIntConstant):
782         (JSC::B3::Procedure::dump):
783         (JSC::B3::Procedure::deleteStackSlot):
784         (JSC::B3::Procedure::deleteVariable):
785         (JSC::B3::Procedure::deleteValue):
786         (JSC::B3::Procedure::deleteOrphans):
787         (JSC::B3::Procedure::calleeSaveRegisters):
788         (JSC::B3::Procedure::addValueImpl):
789         (JSC::B3::Procedure::setBlockOrderImpl):
790         (JSC::B3::Procedure::addAnonymousStackSlot): Deleted.
791         (JSC::B3::Procedure::addStackSlotIndex): Deleted.
792         (JSC::B3::Procedure::addValueIndex): Deleted.
793         * b3/B3Procedure.h:
794         (JSC::B3::Procedure::setBlockOrder):
795         (JSC::B3::Procedure::stackSlots):
796         (JSC::B3::Procedure::variables):
797         (JSC::B3::Procedure::values):
798         (JSC::B3::Procedure::StackSlotsCollection::StackSlotsCollection): Deleted.
799         (JSC::B3::Procedure::StackSlotsCollection::size): Deleted.
800         (JSC::B3::Procedure::StackSlotsCollection::at): Deleted.
801         (JSC::B3::Procedure::StackSlotsCollection::operator[]): Deleted.
802         (JSC::B3::Procedure::StackSlotsCollection::iterator::iterator): Deleted.
803         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator*): Deleted.
804         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator++): Deleted.
805         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator==): Deleted.
806         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator!=): Deleted.
807         (JSC::B3::Procedure::StackSlotsCollection::iterator::findNext): Deleted.
808         (JSC::B3::Procedure::StackSlotsCollection::begin): Deleted.
809         (JSC::B3::Procedure::StackSlotsCollection::end): Deleted.
810         (JSC::B3::Procedure::ValuesCollection::ValuesCollection): Deleted.
811         (JSC::B3::Procedure::ValuesCollection::iterator::iterator): Deleted.
812         (JSC::B3::Procedure::ValuesCollection::iterator::operator*): Deleted.
813         (JSC::B3::Procedure::ValuesCollection::iterator::operator++): Deleted.
814         (JSC::B3::Procedure::ValuesCollection::iterator::operator==): Deleted.
815         (JSC::B3::Procedure::ValuesCollection::iterator::operator!=): Deleted.
816         (JSC::B3::Procedure::ValuesCollection::iterator::findNext): Deleted.
817         (JSC::B3::Procedure::ValuesCollection::begin): Deleted.
818         (JSC::B3::Procedure::ValuesCollection::end): Deleted.
819         (JSC::B3::Procedure::ValuesCollection::size): Deleted.
820         (JSC::B3::Procedure::ValuesCollection::at): Deleted.
821         (JSC::B3::Procedure::ValuesCollection::operator[]): Deleted.
822         * b3/B3ProcedureInlines.h:
823         (JSC::B3::Procedure::add):
824         * b3/B3ReduceStrength.cpp:
825         * b3/B3SlotBaseValue.h:
826         * b3/B3SparseCollection.h: Added.
827         (JSC::B3::SparseCollection::SparseCollection):
828         (JSC::B3::SparseCollection::add):
829         (JSC::B3::SparseCollection::addNew):
830         (JSC::B3::SparseCollection::remove):
831         (JSC::B3::SparseCollection::size):
832         (JSC::B3::SparseCollection::isEmpty):
833         (JSC::B3::SparseCollection::at):
834         (JSC::B3::SparseCollection::operator[]):
835         (JSC::B3::SparseCollection::iterator::iterator):
836         (JSC::B3::SparseCollection::iterator::operator*):
837         (JSC::B3::SparseCollection::iterator::operator++):
838         (JSC::B3::SparseCollection::iterator::operator==):
839         (JSC::B3::SparseCollection::iterator::operator!=):
840         (JSC::B3::SparseCollection::iterator::findNext):
841         (JSC::B3::SparseCollection::begin):
842         (JSC::B3::SparseCollection::end):
843         * b3/B3StackSlot.cpp:
844         (JSC::B3::StackSlot::deepDump):
845         (JSC::B3::StackSlot::StackSlot):
846         * b3/B3StackSlot.h:
847         (JSC::B3::StackSlot::byteSize):
848         (JSC::B3::StackSlot::index):
849         (JSC::B3::StackSlot::setOffsetFromFP):
850         (JSC::B3::StackSlot::kind): Deleted.
851         (JSC::B3::StackSlot::isLocked): Deleted.
852         * b3/B3StackSlotKind.cpp: Removed.
853         * b3/B3StackSlotKind.h: Removed.
854         * b3/B3StackmapValue.cpp:
855         (JSC::B3::StackmapValue::dumpMeta):
856         (JSC::B3::StackmapValue::StackmapValue):
857         * b3/B3StackmapValue.h:
858         * b3/B3SwitchValue.cpp:
859         (JSC::B3::SwitchValue::cloneImpl):
860         (JSC::B3::SwitchValue::SwitchValue):
861         * b3/B3SwitchValue.h:
862         * b3/B3UpsilonValue.h:
863         * b3/B3Validate.cpp:
864         * b3/B3Value.cpp:
865         (JSC::B3::Value::replaceWithIdentity):
866         (JSC::B3::Value::replaceWithNop):
867         (JSC::B3::Value::replaceWithPhi):
868         (JSC::B3::Value::dump):
869         (JSC::B3::Value::effects):
870         (JSC::B3::Value::checkOpcode):
871         * b3/B3Value.h:
872         * b3/B3Variable.cpp: Added.
873         (JSC::B3::Variable::~Variable):
874         (JSC::B3::Variable::dump):
875         (JSC::B3::Variable::deepDump):
876         (JSC::B3::Variable::Variable):
877         * b3/B3Variable.h: Added.
878         (JSC::B3::Variable::type):
879         (JSC::B3::Variable::index):
880         (JSC::B3::DeepVariableDump::DeepVariableDump):
881         (JSC::B3::DeepVariableDump::dump):
882         (JSC::B3::deepDump):
883         * b3/B3VariableValue.cpp: Added.
884         (JSC::B3::VariableValue::~VariableValue):
885         (JSC::B3::VariableValue::dumpMeta):
886         (JSC::B3::VariableValue::cloneImpl):
887         (JSC::B3::VariableValue::VariableValue):
888         * b3/B3VariableValue.h: Added.
889         * b3/air/AirAllocateStack.cpp:
890         (JSC::B3::Air::allocateStack):
891         * b3/air/AirCode.cpp:
892         (JSC::B3::Air::Code::addStackSlot):
893         (JSC::B3::Air::Code::addSpecial):
894         (JSC::B3::Air::Code::cCallSpecial):
895         * b3/air/AirCode.h:
896         (JSC::B3::Air::Code::begin):
897         (JSC::B3::Air::Code::end):
898         (JSC::B3::Air::Code::stackSlots):
899         (JSC::B3::Air::Code::specials):
900         (JSC::B3::Air::Code::forAllTmps):
901         (JSC::B3::Air::Code::StackSlotsCollection::StackSlotsCollection): Deleted.
902         (JSC::B3::Air::Code::StackSlotsCollection::size): Deleted.
903         (JSC::B3::Air::Code::StackSlotsCollection::at): Deleted.
904         (JSC::B3::Air::Code::StackSlotsCollection::operator[]): Deleted.
905         (JSC::B3::Air::Code::StackSlotsCollection::iterator::iterator): Deleted.
906         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator*): Deleted.
907         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator++): Deleted.
908         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator==): Deleted.
909         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator!=): Deleted.
910         (JSC::B3::Air::Code::StackSlotsCollection::begin): Deleted.
911         (JSC::B3::Air::Code::StackSlotsCollection::end): Deleted.
912         (JSC::B3::Air::Code::SpecialsCollection::SpecialsCollection): Deleted.
913         (JSC::B3::Air::Code::SpecialsCollection::size): Deleted.
914         (JSC::B3::Air::Code::SpecialsCollection::at): Deleted.
915         (JSC::B3::Air::Code::SpecialsCollection::operator[]): Deleted.
916         (JSC::B3::Air::Code::SpecialsCollection::iterator::iterator): Deleted.
917         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator*): Deleted.
918         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator++): Deleted.
919         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator==): Deleted.
920         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator!=): Deleted.
921         (JSC::B3::Air::Code::SpecialsCollection::begin): Deleted.
922         (JSC::B3::Air::Code::SpecialsCollection::end): Deleted.
923         * b3/air/AirFixObviousSpills.cpp:
924         * b3/air/AirInstInlines.h:
925         * b3/air/AirIteratedRegisterCoalescing.cpp:
926         * b3/air/AirLiveness.h:
927         * b3/air/AirLowerAfterRegAlloc.cpp:
928         (JSC::B3::Air::lowerAfterRegAlloc):
929         * b3/air/AirSpecial.cpp:
930         (JSC::B3::Air::Special::Special):
931         * b3/air/AirSpecial.h:
932         * b3/air/AirSpillEverything.cpp:
933         (JSC::B3::Air::spillEverything):
934         * b3/air/AirStackSlot.cpp:
935         (JSC::B3::Air::StackSlot::dump):
936         (JSC::B3::Air::StackSlot::deepDump):
937         (JSC::B3::Air::StackSlot::StackSlot):
938         * b3/air/AirStackSlot.h:
939         (JSC::B3::Air::StackSlot::byteSize):
940         (JSC::B3::Air::StackSlot::kind):
941         (JSC::B3::Air::StackSlot::isLocked):
942         (JSC::B3::Air::StackSlot::isSpill):
943         (JSC::B3::Air::StackSlot::index):
944         (JSC::B3::Air::StackSlot::ensureSize):
945         * b3/air/AirStackSlotKind.cpp: Copied from Source/JavaScriptCore/b3/B3StackSlotKind.cpp.
946         (WTF::printInternal):
947         * b3/air/AirStackSlotKind.h: Copied from Source/JavaScriptCore/b3/B3StackSlotKind.h.
948         * b3/air/opcode_generator.rb:
949         * b3/air/testair.cpp:
950         (JSC::B3::Air::testShuffleBroadcastAllRegs):
951         (JSC::B3::Air::testShuffleShiftAllRegs):
952         (JSC::B3::Air::testShuffleRotateAllRegs):
953         * b3/testb3.cpp:
954         (JSC::B3::testStackSlot):
955         (JSC::B3::testStoreLoadStackSlot):
956         * ftl/FTLB3Output.cpp:
957         (JSC::FTL::Output::lockedStackSlot):
958         (JSC::FTL::Output::neg):
959         * ftl/FTLLowerDFGToLLVM.cpp:
960         (JSC::FTL::DFG::LowerDFGToLLVM::compileInvalidationPoint):
961
962 2016-02-02  Yusuke Suzuki  <utatane.tea@gmail.com>
963
964         [JSC] Introduce BytecodeIntrinsic constant rep like @undefined
965         https://bugs.webkit.org/show_bug.cgi?id=153737
966
967         Reviewed by Darin Adler.
968
969         This patch enhances existing BytecodeIntrinsic mechanism to accept `@xxx` form,
970         that will be used to represent bytecode intrinsic constants.
971         After this change, we can use 2 forms for bytecode intrinsics. (1) Function form (like, @toString(value))
972         and (2) Constant form (like @undefined).
973
974         Bytecode intrinsic constants allow us to easily expose constant values from C++ world.
975         For example, we can expose ArrayIterationKind flags to JS world without using private global variables.
976         Exposed constant values are loaded from bytecodes directly through constant registers.
977         While previously we expose them through private global variables, bytecode intrinsic constants
978         can be loaded directly from CodeBlock. And later, it will become JSConstant in DFG.
979
980         And by using this mechanism, we implement several constants. @undefined, @arrayIterationKindKeyValue etc.
981
982         * builtins/ArrayConstructor.js:
983         (from):
984         * builtins/ArrayIteratorPrototype.js:
985         (next):
986         * builtins/ArrayPrototype.js:
987         (reduce):
988         (reduceRight):
989         (every):
990         (forEach):
991         (filter):
992         (map):
993         (some):
994         (fill):
995         (find):
996         (findIndex):
997         (includes):
998         (sort.compactSparse):
999         (sort.compactSlow):
1000         (sort.compact):
1001         (sort):
1002         (copyWithin):
1003         * builtins/DatePrototype.js:
1004         (toLocaleString.toDateTimeOptionsAnyAll):
1005         (toLocaleString):
1006         (toLocaleDateString.toDateTimeOptionsDateDate):
1007         (toLocaleDateString):
1008         (toLocaleTimeString.toDateTimeOptionsTimeTime):
1009         (toLocaleTimeString):
1010         * builtins/GeneratorPrototype.js:
1011         (generatorResume):
1012         * builtins/GlobalObject.js:
1013         (isDictionary):
1014         * builtins/InternalPromiseConstructor.js:
1015         (internalAll.newResolveElement):
1016         (internalAll):
1017         * builtins/IteratorPrototype.js:
1018         (symbolIteratorGetter):
1019         (symbolIterator): Deleted.
1020         * builtins/MapPrototype.js:
1021         (forEach):
1022         * builtins/ModuleLoaderObject.js:
1023         (newRegistryEntry):
1024         (forceFulfillPromise):
1025         (commitInstantiated):
1026         (requestFetch):
1027         (requestTranslate):
1028         (requestInstantiate):
1029         (requestLink):
1030         (provide):
1031         * builtins/PromiseConstructor.js:
1032         (all.newResolveElement):
1033         (all):
1034         (race):
1035         (reject):
1036         (resolve):
1037         * builtins/PromiseOperations.js:
1038         (newPromiseCapability.executor):
1039         (newPromiseCapability):
1040         (rejectPromise):
1041         (fulfillPromise):
1042         (createResolvingFunctions.resolve):
1043         (createResolvingFunctions.reject):
1044         (createResolvingFunctions):
1045         (promiseReactionJob):
1046         (promiseResolveThenableJob):
1047         (initializePromise):
1048         * builtins/PromisePrototype.js:
1049         (catch):
1050         (then):
1051         * builtins/SetPrototype.js:
1052         (forEach):
1053         * builtins/StringConstructor.js:
1054         (raw):
1055         * builtins/StringIteratorPrototype.js:
1056         (next):
1057         * builtins/StringPrototype.js:
1058         (localeCompare):
1059         * builtins/TypedArrayConstructor.js:
1060         (of):
1061         (from):
1062         * builtins/TypedArrayPrototype.js:
1063         (every):
1064         (find):
1065         (findIndex):
1066         (forEach):
1067         (some):
1068         (reduce):
1069         (reduceRight):
1070         (map):
1071         (filter):
1072         * bytecode/BytecodeIntrinsicRegistry.cpp:
1073         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
1074         (JSC::BytecodeIntrinsicRegistry::lookup):
1075         * bytecode/BytecodeIntrinsicRegistry.h:
1076         * bytecompiler/NodesCodegen.cpp:
1077         * parser/ASTBuilder.h:
1078         (JSC::ASTBuilder::createResolve):
1079         (JSC::ASTBuilder::makeFunctionCallNode):
1080         * parser/NodeConstructors.h:
1081         (JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):
1082         * parser/Nodes.h:
1083         (JSC::ExpressionNode::isBytecodeIntrinsicNode):
1084         (JSC::BytecodeIntrinsicNode::type):
1085         (JSC::BytecodeIntrinsicNode::emitter):
1086         * parser/Parser.cpp:
1087         (JSC::Parser<LexerType>::parseProperty):
1088         (JSC::Parser<LexerType>::parsePrimaryExpression):
1089         * parser/SyntaxChecker.h:
1090         (JSC::SyntaxChecker::createResolve):
1091         * runtime/CommonIdentifiers.cpp:
1092         (JSC::CommonIdentifiers::CommonIdentifiers): Deleted.
1093         * runtime/CommonIdentifiers.h:
1094         (JSC::CommonIdentifiers::bytecodeIntrinsicRegistry): Deleted.
1095         * runtime/IteratorPrototype.cpp:
1096         (JSC::IteratorPrototype::finishCreation):
1097         * runtime/JSGlobalObject.cpp:
1098         (JSC::JSGlobalObject::init): Deleted.
1099         * runtime/VM.cpp:
1100         (JSC::VM::VM):
1101         * runtime/VM.h:
1102         (JSC::VM::bytecodeIntrinsicRegistry):
1103
1104 2016-02-02  Per Arne Vollan  <peavo@outlook.com>
1105
1106         [B3][Win64] Compile fixes.
1107         https://bugs.webkit.org/show_bug.cgi?id=153605
1108
1109         Reviewed by Filip Pizlo.
1110
1111         Fix remaining compile errors on Win64.
1112
1113         * CMakeLists.txt:
1114         * b3/B3CFG.h:
1115         (JSC::B3::CFG::newMap):
1116         * ftl/FTLJITCode.h:
1117
1118 2016-02-01  Chris Dumez  <cdumez@apple.com>
1119
1120         object.__lookupGetter__() / object.__lookupSetter__() does not work for native bindings
1121         https://bugs.webkit.org/show_bug.cgi?id=153765
1122         <rdar://problem/24439699>
1123
1124         Reviewed by Oliver Hunt.
1125
1126         Add support for CustomAccessor slots to objectProtoFuncLookupGetter() and
1127         objectProtoFuncLookupSetter() by return getOwnPropertyDescriptor().get / set.
1128         getOwnPropertyDescriptor() now correctly deals with CustomAccessors since
1129         r196001.
1130
1131         * runtime/ObjectPrototype.cpp:
1132         (JSC::objectProtoFuncLookupGetter):
1133         (JSC::objectProtoFuncLookupSetter):
1134
1135 2016-02-01  Chris Dumez  <cdumez@apple.com>
1136
1137         Native Bindings Descriptors are Incomplete
1138         https://bugs.webkit.org/show_bug.cgi?id=140575
1139         <rdar://problem/19506502>
1140
1141         Reviewed by Oliver Hunt.
1142
1143         This patch is based on initial work by Joe Pecoraro and Matthew Mirman.
1144
1145         This patch was initially rolled out for breaking chromeexperiments.com,
1146         presumably because our IDL attributes were not marked as [configurable]
1147         at the time. However, since r190104, our IDL attributes are now
1148         configurable. Based on local testing, chromeexperiments.com seems to be
1149         working fine now.
1150
1151         * JavaScriptCore.xcodeproj/project.pbxproj:
1152         * inspector/InjectedScriptSource.js:
1153         (endsWith):
1154         (InjectedScript.prototype.processProperties):
1155         * runtime/JSBoundSlotBaseFunction.cpp: Added.
1156         (JSC::boundSlotBaseFunctionCall):
1157         (JSC::JSBoundSlotBaseFunction::JSBoundSlotBaseFunction):
1158         (JSC::JSBoundSlotBaseFunction::create):
1159         (JSC::JSBoundSlotBaseFunction::visitChildren):
1160         (JSC::JSBoundSlotBaseFunction::finishCreation):
1161         * runtime/JSBoundSlotBaseFunction.h: Added.
1162         (JSC::JSBoundSlotBaseFunction::createStructure):
1163         (JSC::JSBoundSlotBaseFunction::boundSlotBase):
1164         (JSC::JSBoundSlotBaseFunction::customGetterSetter):
1165         (JSC::JSBoundSlotBaseFunction::isSetter):
1166         * runtime/JSGlobalObject.cpp:
1167         (JSC::JSGlobalObject::init):
1168         (JSC::JSGlobalObject::visitChildren):
1169         * runtime/JSGlobalObject.h:
1170         (JSC::JSGlobalObject::boundSlotBaseFunctionStructure):
1171         * runtime/JSObject.cpp:
1172         (JSC::getBoundSlotBaseFunctionForGetterSetter):
1173         (JSC::JSObject::getOwnPropertyDescriptor):
1174         * runtime/VM.cpp:
1175         (JSC::VM::VM):
1176         * runtime/VM.h:
1177
1178 2016-02-01  Joseph Pecoraro  <pecoraro@apple.com>
1179
1180         Web Inspector: High Level Memory Overview Instrument
1181         https://bugs.webkit.org/show_bug.cgi?id=153516
1182         <rdar://problem/24356378>
1183
1184         Reviewed by Brian Burg.
1185
1186         * CMakeLists.txt:
1187         * Configurations/FeatureDefines.xcconfig:
1188         * DerivedSources.make:
1189         * inspector/protocol/Memory.json: Added.
1190         * inspector/scripts/codegen/generator.py:
1191         New Memory domain guarded by ENABLE(RESOURCE_USAGE).
1192         This feature flag was already used in WebCore.
1193
1194 2016-02-01  Benjamin Poulain  <benjamin@webkit.org>
1195
1196         [JSC] IRC can coalesce the frame pointer with a Tmp that is modified
1197         https://bugs.webkit.org/show_bug.cgi?id=153694
1198
1199         Reviewed by Filip Pizlo.
1200
1201         Let's say we have:
1202             Move(FP, Tmp1)
1203             Add64(#1, Tmp1)
1204
1205         If we were to coalesce the Move, we would modify the frame pointer.
1206         Well, that's exactly what was happening with IRC.
1207
1208         Since the epilogue is not know to Air before IRC, the liveness analysis
1209         never discovers that FP is live when Tmp1 is UseDef by Add64. Adding
1210         FP would a be a problem anyway for a bunch of reasons.
1211
1212         I tried two ways to prevent IRC to override IRC:
1213         1) Add an interference edge with FP for all non-duplication Defs.
1214         2) Let coalesce() know about FP and constraint any coalescing with a re-Def.
1215
1216         The two are within margin of error for performance. The second one was considerably
1217         more complicated. This patch implements the first one.
1218
1219         Some extra note:
1220         -It is very important to not increment the degree of a Tmp when making it interfere
1221          with FP. FP is not a valid color, it is not counted in the "K" colors considered
1222          for coloring. Increasing the degree with the edge to FP would make every stage
1223          pessimistic since there is an extra degree that can never be removed.
1224         -I put "interferenceEdges" and "adjacencyList" in an inconsistent state.
1225          This is intentional, "interferenceEdges" is used to test the existence of an edge,
1226          "adjacencyList" is used to go over all the edges. In this case, we don't want
1227          the edge with FP to be considered when pruning the graph.
1228
1229         * b3/air/AirIteratedRegisterCoalescing.cpp:
1230         One branch could be transformed into an assertion: TmpLiveness is type specific now.
1231         * b3/testb3.cpp:
1232         (JSC::B3::testOverrideFramePointer):
1233         (JSC::B3::run):
1234
1235 2016-02-01  Csaba Osztrogonác  <ossy@webkit.org>
1236
1237         Unreviewed speculative buildfix.
1238
1239         * dfg/DFGCommon.h: FTL_USES_B3 should be false if FTL JIT is disabled.
1240
1241 2016-01-31  Dan Bernstein  <mitz@apple.com>
1242
1243         [Cocoa] Remove unused definition of HAVE_HEADER_DETECTION_H
1244         https://bugs.webkit.org/show_bug.cgi?id=153729
1245
1246         Reviewed by Sam Weinig.
1247
1248         After r141700, HAVE_HEADER_DETECTION_H is no longer used.
1249
1250         * Configurations/Base.xcconfig:
1251
1252 2016-01-30  Filip Pizlo  <fpizlo@apple.com>
1253
1254         B3->Air lowering should use MoveFloat more
1255         https://bugs.webkit.org/show_bug.cgi?id=153714
1256
1257         Reviewed by Sam Weinig.
1258
1259         This is a very minor and benign bug. It just means that we will use the more canonical
1260         MoveFloat instruction when moving floats, rather than using MoveDouble.
1261
1262         * b3/B3LowerToAir.cpp:
1263         (JSC::B3::Air::LowerToAir::relaxedMoveForType):
1264
1265 2016-01-31  Yusuke Suzuki  <utatane.tea@gmail.com>
1266
1267         Should not predict OtherObj for ToThis with primitive types under strict mode
1268         https://bugs.webkit.org/show_bug.cgi?id=153544
1269
1270         Reviewed by Filip Pizlo.
1271
1272         Currently, ToThis predicates OtherObj for primitive values.
1273         But it's not true in strict mode.
1274         In strict mode, ToThis does nothing on primitive values.
1275
1276         In this patch, we
1277
1278         1. fix prediction. Handles primitive types in strict mode. And we also handles StringObject.
1279         2. convert it to Identity if the argument should be predicted as primitive types.
1280
1281         This optimization is important to implement Primitive.prototype.methods[1].
1282         Otherwise, we always got BadType OSR exits.
1283
1284         [1]: https://bugs.webkit.org/show_bug.cgi?id=143889
1285
1286         * dfg/DFGAbstractInterpreterInlines.h:
1287         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1288         * dfg/DFGConstantFoldingPhase.cpp:
1289         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1290         * dfg/DFGFixupPhase.cpp:
1291         (JSC::DFG::FixupPhase::fixupNode):
1292         (JSC::DFG::FixupPhase::fixupToThis):
1293         * dfg/DFGPredictionPropagationPhase.cpp:
1294         (JSC::DFG::PredictionPropagationPhase::propagate):
1295         * tests/stress/to-this-boolean.js: Added.
1296         (Boolean.prototype.negate):
1297         (Boolean.prototype.negate2):
1298         * tests/stress/to-this-double.js: Added.
1299         (Number.prototype.negate):
1300         * tests/stress/to-this-int32.js: Added.
1301         (Number.prototype.negate):
1302         * tests/stress/to-this-int52.js: Added.
1303         (Number.prototype.negate):
1304         * tests/stress/to-this-number.js: Added.
1305         (Number.prototype.negate):
1306         * tests/stress/to-this-string.js: Added.
1307         (String.prototype.prefix):
1308         (String.prototype.first):
1309         (String.prototype.second):
1310         * tests/stress/to-this-symbol.js: Added.
1311         (Symbol.prototype.identity):
1312         (Symbol.prototype.identity2):
1313
1314 2016-01-31  Guillaume Emont  <guijemont@igalia.com>
1315
1316         [mips] don't save to a callee saved register too early
1317         https://bugs.webkit.org/show_bug.cgi?id=153463
1318
1319         If we save $gp to $s4 in pichdr, then in some cases, we were
1320         overwriting $s4 before LLInt's pushCalleeSaves() is called (as pichdr
1321         is at the very beginning of a function). Now we save $gp to $s4 at the
1322         end of pushCalleeSaves().
1323
1324         Reviewed by Michael Saboff.
1325
1326         * offlineasm/mips.rb:
1327         * llint/LowLevelInterpreter.asm:
1328         Move the saving of $gp to $s4 from pichdr to pushCalleeSaves(). Take
1329         the opportunity to only save $s4 as we never use the other callee
1330         saved registers.
1331
1332 2016-01-30  Commit Queue  <commit-queue@webkit.org>
1333
1334         Unreviewed, rolling out r195799 and r195828.
1335         https://bugs.webkit.org/show_bug.cgi?id=153722
1336
1337         Caused assertion failures, severely affecting EWS (Requested
1338         by ap on #webkit).
1339
1340         Reverted changesets:
1341
1342         "Web Inspector: InspectorTimelineAgent doesn't need to
1343         recompile functions because it now uses the sampling profiler"
1344         https://bugs.webkit.org/show_bug.cgi?id=153500
1345         http://trac.webkit.org/changeset/195799
1346
1347         "Attempt to fix the Windows build after r195799"
1348         http://trac.webkit.org/changeset/195828
1349
1350 2016-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
1351
1352         [B3] JetStream/quicksort.c fails/hangs on Linux with GCC
1353         https://bugs.webkit.org/show_bug.cgi?id=153647
1354
1355         Reviewed by Filip Pizlo.
1356
1357         In B3ComputeDivisionMagic, we accidentally perform sub, add operation onto signed integer. (In this case, int32_t)
1358         But integer overflow is undefined behavior in C![1][2]
1359         As a result, in GCC 4.9 release build, computeDivisionMagic(2) returns unexpected value.
1360         `divisor = 2`
1361         `d = 2`
1362         `signedMin = INT32_MIN = -2147483647 (-0x7fffffff)`
1363         `t = signedMin`
1364         `anc = t - 1 - (t % ad)` Oops, we performed overflow operation!
1365
1366         So, `anc` value becomes undefined.
1367         In this patch, we first cast all the operated values to unsigned one.
1368         Reading the code, there are no operations that depends on signedness. (For example, we used aboveEqual like unsigned operations for comparison.)
1369
1370         [1]: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
1371         [2]: http://dl.acm.org/citation.cfm?id=2522728
1372
1373         * b3/B3ComputeDivisionMagic.h:
1374         (JSC::B3::computeDivisionMagic):
1375         * b3/testb3.cpp:
1376         (JSC::B3::testComputeDivisionMagic):
1377         (JSC::B3::run):
1378
1379 2016-01-30  Andreas Kling  <akling@apple.com>
1380
1381         Shrink Heap::m_executables after cleaning it.
1382         <https://webkit.org/b/153682>
1383
1384         Reviewed by Darin Adler.
1385
1386         The Heap::m_executables Vector was never shrunk down, despite sometimes
1387         getting pretty huge (~500kB in my longest-running WebContent process.)
1388
1389         After GC has finished pruning unmarked Executables, shrink the Vector.
1390
1391         * heap/Heap.cpp:
1392         (JSC::Heap::clearUnmarkedExecutables):
1393
1394 2016-01-29  Ada Chan  <adachan@apple.com>
1395
1396         Enable VIDEO_PRESENTATION_MODE only in Debug and Release builds on Mac
1397         https://bugs.webkit.org/show_bug.cgi?id=153665
1398
1399         Reviewed by Dan Bernstein.
1400
1401         * Configurations/FeatureDefines.xcconfig:
1402
1403 2016-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
1404
1405         [B3] REGRESSION(r195882): Should break early after modConstant replaceWithNewValue succeeds
1406         https://bugs.webkit.org/show_bug.cgi?id=153711
1407
1408         Reviewed by Filip Pizlo.
1409
1410         Should break after modConstant replaceWithNewValue succeeds. m_value is already replaced with Identity
1411         if modConstant succeeds. So it does not have any children. m_value->child(1) breaks testb3.
1412
1413         * b3/B3ReduceStrength.cpp:
1414
1415 2016-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
1416
1417         Enable SamplingProfiler on POSIX environment
1418         https://bugs.webkit.org/show_bug.cgi?id=153584
1419
1420         Reviewed by Michael Saboff.
1421
1422         In this patch, we implement suspend and resume mechanizm for POSIX threads.
1423         And with GLIBC, we can retrieve registers from it.
1424
1425         We take the following strategy.
1426
1427         Suspend side.
1428         1. install sigaction to the threads.
1429         2. in the profiler (suspend / resume callers), emit signal with pthread_kill and wait with POSIX semaphore.
1430         3. in the signal handler, up the POSIX semaphore. Use sem_post because it is the async-signal-safe function in POSIX.
1431         4. in the signal handler, perform sigsuspend to stop the thread until being resumed.
1432         5. in the profiler, we can be waken up from the semaphore because (3) ups.
1433
1434         Resume side.
1435         1. in the profiler, emit signal and wait on the semaphore.
1436         2. in the signal handler, it is waken up from the sigsuspend.
1437         3. in the signal handler, up the semaphore.
1438         4. in the profiler, the profiler is waken up from the semaphore. It is ensured that the given thread is resumed by the signal.
1439
1440         * heap/MachineStackMarker.cpp:
1441         (pthreadSignalHandlerSuspendResume):
1442         (JSC::MachineThreads::Thread::Thread):
1443         (JSC::MachineThreads::Thread::~Thread):
1444         (JSC::MachineThreads::Thread::suspend):
1445         (JSC::MachineThreads::Thread::resume):
1446         (JSC::MachineThreads::Thread::getRegisters):
1447         (JSC::MachineThreads::Thread::Registers::stackPointer):
1448         (JSC::MachineThreads::Thread::Registers::framePointer):
1449         (JSC::MachineThreads::Thread::Registers::instructionPointer):
1450         (JSC::MachineThreads::Thread::Registers::llintPC):
1451         (JSC::MachineThreads::Thread::freeRegisters):
1452         * heap/MachineStackMarker.h:
1453         * runtime/SamplingProfiler.cpp:
1454         (JSC::reportStats):
1455         * tests/stress/call-varargs-from-inlined-code-with-odd-number-of-arguments.js:
1456         * tests/stress/call-varargs-from-inlined-code.js:
1457         * tests/stress/v8-earley-boyer-strict.js:
1458
1459 2016-01-29  Filip Pizlo  <fpizlo@apple.com>
1460
1461         B3 should reduce Mod(value, constant) to Div and Mul so that our Div optimizations can do things
1462         https://bugs.webkit.org/show_bug.cgi?id=153693
1463
1464         Reviewed by Saam Barati.
1465
1466         The most efficient way to handle Mod(value, constant) is to reduce it to
1467         Sub(value, Mul(Div(value, constant), constant)) and then let the Div optimizations do their
1468         thing.
1469
1470         In the future we could add special handling of Mod(value, 1 << constant), but it's not
1471         obvious that this would produce better code than reducing through Div, if we also make sure
1472         that we have great optimizations for Mul and Div.
1473
1474         * b3/B3ReduceStrength.cpp:
1475
1476 2016-01-29  Keith Miller  <keith_miller@apple.com>
1477
1478         Array.prototype native functions should use Symbol.species to construct the result
1479         https://bugs.webkit.org/show_bug.cgi?id=153660
1480
1481         Reviewed by Saam Barati.
1482
1483         This patch adds support for Symbol.species in the Array.prototype native functions.
1484         We make an optimization to avoid regressions on some benchmarks by using an
1485         adaptive watchpoint to check if Array.prototype.constructor is ever changed.
1486
1487         * runtime/ArrayPrototype.cpp:
1488         (JSC::putLength):
1489         (JSC::setLength):
1490         (JSC::speciesConstructArray):
1491         (JSC::arrayProtoFuncConcat):
1492         (JSC::arrayProtoFuncSlice):
1493         (JSC::arrayProtoFuncSplice):
1494         (JSC::ArrayPrototype::setConstructor):
1495         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::ArrayPrototypeAdaptiveInferredPropertyWatchpoint):
1496         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire):
1497         * runtime/ArrayPrototype.h:
1498         (JSC::ArrayPrototype::didChangeConstructorProperty):
1499         * runtime/ConstructData.cpp:
1500         (JSC::construct):
1501         * runtime/ConstructData.h:
1502         * runtime/JSGlobalObject.cpp:
1503         (JSC::JSGlobalObject::init):
1504         * tests/es6.yaml:
1505         * tests/stress/array-species-functions.js: Added.
1506         (Symbol.species):
1507         (funcThrows):
1508         (test.species):
1509         (test):
1510
1511 2016-01-29  Filip Pizlo  <fpizlo@apple.com>
1512
1513         CallLinkStatus should trust BadCell exit sites whenever there is no stub
1514         https://bugs.webkit.org/show_bug.cgi?id=153691
1515
1516         Reviewed by Benjamin Poulain.
1517
1518         This fixes a regression in our treatment of inlining failure exit sites when deciding if we
1519         should inline a call.
1520
1521         A long time ago, a BadCell exit site would ensure that a CallLinkStatus returned
1522         takesSlowPath.
1523
1524         But then we added closure calls. A BadCell exit site might just mean that we should do
1525         closure call inlining. We added a BadExecutable exit site to indicate that even closure call
1526         inlining had failed. BadCell would no longer force CallLinkStatus to return takesSlowPath,
1527         but BadExecutable would stuff do so.
1528
1529         But then we unified the IR for checking functions and executables, and the DFG stopped using
1530         the BadExecutable exit kind. Probably this change disabled our ability to use exit site
1531         counting for deciding when to takesSlowPath. But this isn't necessarily a disaster, since
1532         any time you exited in this way, you'd be taken to a baseline call inline cache, and that
1533         inline cache would record the slow path.
1534
1535         But then we introduced polymorphic call inlining. Polymorphic call inlining means that call
1536         unlinking, like when one of the callees is optimized, will reset the stub. We also made it
1537         so that the stub is like a gate for the slow path count. A clear inline cache must first
1538         cause the creation of a stub and then cause it to overflow before the slow path is counted.
1539
1540         So, if the DFG or FTL exits on a cell check associated with a particular callsite being
1541         speculatively inlined, then it's possible that nobody will know about the exit because:
1542
1543         - The exit kind is BadCell but CallLinkStatus needs BadExecutable to disable inlining.
1544
1545         - Between when we tiered up to the DFG (or FTL) and when the exit happened, one of the
1546           callees was tiered up, causing the baseline CallLinkInfo to be unlinked. Therefore, after
1547           the exit, the inline cache is in a reset state and will not count the call as taking slow
1548           path.
1549
1550         The challenge when dealing with this is that often, we will have an super early compilation
1551         of a minimorphic call site before we have seen all of its small set of callees. For example
1552         we may have seen only one of two possible callees. That early compilation will OSR exit, and
1553         in trunk, will be recompiled with bimorphic speculative inlining. That's a pretty good
1554         outcome. Basically, we are trusting that if during the time that the function has been
1555         running prior to a given compilation, a callsite has only seen a small number of callees,
1556         then it's safe to assume that it won't see another one anytime soon.
1557
1558         So, simply forcing the CallLinkStatus to set takesSlowPath any time there was a BadCell exit
1559         would hurt our performance in some cases, because trunk prior to this change would have their
1560         final compilation use speculative inlining, and this change would make guarded inlining
1561         instead.
1562
1563         The compromise that I came up with relies on the fact that a CallLinkInfo must be reset quite
1564         frequently for it to routinely happen in between tier-up to DFG (or FTL) and an exit. So,
1565         most likely, such a CallLinkInfo will also show up as being clear when the CallLinkStatus
1566         is built during DFG profiling. The CallLinkStatus will then fall back on the CallLinkInfo's
1567         lastSeenCallee field, which is persistent across resets. This change just makes it so that
1568         CallLinkStatus sets takesSlowPath if there is a BadCell exit and the status had to be
1569         inferred from the lastSeenCallee.
1570
1571         This change reduces pointless recompilations in gbemu. It's an 11% speed-up on gbemu. It
1572         doesn't seem to hurt any benchmarks.
1573
1574         * bytecode/CallLinkStatus.cpp:
1575         (JSC::CallLinkStatus::computeFor):
1576         (JSC::CallLinkStatus::computeExitSiteData):
1577         (JSC::CallLinkStatus::computeFromCallLinkInfo):
1578         * bytecode/CallLinkStatus.h:
1579         (JSC::CallLinkStatus::CallLinkStatus):
1580         (JSC::CallLinkStatus::at):
1581         (JSC::CallLinkStatus::operator[]):
1582         (JSC::CallLinkStatus::isProved):
1583         (JSC::CallLinkStatus::isBasedOnStub):
1584         (JSC::CallLinkStatus::canOptimize):
1585         (JSC::CallLinkStatus::maxNumArguments):
1586         (JSC::CallLinkStatus::ExitSiteData::ExitSiteData): Deleted.
1587
1588 2016-01-29  Saam barati  <sbarati@apple.com>
1589
1590         Pack FunctionExecutable and UnlinkedFunctionExecutable harder
1591         https://bugs.webkit.org/show_bug.cgi?id=153687
1592
1593         Reviewed by Andreas Kling.
1594
1595         This patch reduces FunctionExecutable from 120 to 104 bytes.
1596         This patch reduces UnlinkedFunctionExecutable from 144 to 136 bytes.
1597
1598         * bytecode/ExecutableInfo.h:
1599         * bytecode/UnlinkedFunctionExecutable.cpp:
1600         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1601         * bytecode/UnlinkedFunctionExecutable.h:
1602         * parser/ParserModes.h:
1603         (JSC::functionNameScopeIsDynamic):
1604         * runtime/Executable.cpp:
1605         (JSC::ScriptExecutable::ScriptExecutable):
1606         * runtime/Executable.h:
1607         (JSC::ScriptExecutable::needsActivation):
1608         (JSC::ScriptExecutable::isArrowFunctionContext):
1609         (JSC::ScriptExecutable::isStrictMode):
1610         (JSC::ScriptExecutable::derivedContextType):
1611         (JSC::ScriptExecutable::ecmaMode):
1612         (JSC::ScriptExecutable::finishCreation):
1613
1614 2016-01-29  Saam barati  <sbarati@apple.com>
1615
1616         JSC Sampling Profiler: Come up with a (program counter => CodeOrigin) mapping
1617         https://bugs.webkit.org/show_bug.cgi?id=152629
1618
1619         Reviewed by Filip Pizlo.
1620
1621         This patch implements a mapping from PC to CodeOrigin
1622         that lives off of JITed CodeBlocks. We build this mapping
1623         while JITing code, and then we compress it and store
1624         it on the CodeBlock. We only build the mapping if a debugger
1625         has ever been attached to any global object.
1626
1627         CodeBlock consults this mapping when searching for a CodeOrigin
1628         for a given PC, but it also consults other code ranges
1629         off the main path that may own the PC. Specifically, it searches
1630         through inline caches, OSRExits, and LazySlowPaths.
1631
1632         To find PC info for the LLInt, we also save the LLInt pc when
1633         taking a stack trace where the top frame is in LLInt code.
1634
1635         This patch also cleans up code inside the SamplingProfier.
1636         I realized a bug in the SamplingProfiler's implementation.
1637         We used to walk the inline stack while gathering a stack
1638         trace. This is wrong. It's super dangerous to do this because
1639         we might pause the JSC process while it's modifying its
1640         CodeOrigin table. We used to walk the inline stack while
1641         taking a stack trace because doing so could save us from
1642         having to verify a particular stack trace. This patch changes that.
1643         We now have to verify all stack traces taken. This verification step
1644         includes walking the inline stack.
1645
1646         Because we have a PC=>CodeOrigin map, we can now gather more
1647         detailed information about the top-frame we pause. This allows
1648         us to correctly observe inlining. It also allows us to observe
1649         expression-level line/column information for the top frame.
1650         The reason we don't consult this mapping for parent frames is 
1651         that all parent frames should set the CallSiteIndex on the call
1652         frame header, which means we can consult that value to get inlining 
1653         and expression-level line/column information.
1654
1655         * CMakeLists.txt:
1656         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1657         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1658         * JavaScriptCore.xcodeproj/project.pbxproj:
1659         * assembler/AbstractMacroAssembler.h:
1660         (JSC::AbstractMacroAssembler::Label::Label):
1661         (JSC::AbstractMacroAssembler::Label::operator==):
1662         (JSC::AbstractMacroAssembler::Label::isSet):
1663         * assembler/AssemblerBuffer.h:
1664         (JSC::AssemblerLabel::labelAtOffset):
1665         (JSC::AssemblerLabel::operator==):
1666         * b3/B3Generate.cpp:
1667         * b3/B3Origin.h:
1668         (JSC::B3::Origin::data):
1669         (JSC::B3::Origin::operator==):
1670         * b3/B3PCToOriginMap.h: Added.
1671         (JSC::B3::PCToOriginMap::PCToOriginMap):
1672         (JSC::B3::PCToOriginMap::appendItem):
1673         (JSC::B3::PCToOriginMap::ranges):
1674         * b3/B3Procedure.h:
1675         (JSC::B3::Procedure::pcToOriginMap):
1676         (JSC::B3::Procedure::releasePCToOriginMap):
1677         * b3/air/AirGenerate.cpp:
1678         (JSC::B3::Air::generate):
1679         * bytecode/CodeBlock.cpp:
1680         (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
1681         (JSC::CodeBlock::setPCToCodeOriginMap):
1682         (JSC::CodeBlock::findPC):
1683         * bytecode/CodeBlock.h:
1684         (JSC::CodeBlock::jitCodeMap):
1685         (JSC::CodeBlock::bytecodeOffset):
1686         * bytecode/CodeOrigin.h:
1687         (JSC::CodeOrigin::operator==):
1688         (JSC::CodeOriginHash::hash):
1689         (JSC::CodeOriginHash::equal):
1690         * bytecode/InlineCallFrame.h:
1691         (JSC::baselineCodeBlockForOriginAndBaselineCodeBlock):
1692         (JSC::CodeOrigin::walkUpInlineStack):
1693         * bytecode/PolymorphicAccess.h:
1694         (JSC::PolymorphicAccess::containsPC):
1695         * bytecode/StructureStubInfo.cpp:
1696         (JSC::StructureStubInfo::visitWeakReferences):
1697         (JSC::StructureStubInfo::containsPC):
1698         * bytecode/StructureStubInfo.h:
1699         * bytecode/UnlinkedCodeBlock.h:
1700         (JSC::UnlinkedCodeBlock::hasExpressionInfo):
1701         (JSC::UnlinkedCodeBlock::expressionInfo):
1702         (JSC::UnlinkedCodeBlock::setThisRegister):
1703         * debugger/Debugger.cpp:
1704         (JSC::Debugger::attach):
1705         * dfg/DFGJITCode.cpp:
1706         (JSC::DFG::JITCode::validateReferences):
1707         (JSC::DFG::JITCode::findPC):
1708         * dfg/DFGJITCode.h:
1709         (JSC::DFG::JITCode::commonDataOffset):
1710         * dfg/DFGJITCompiler.cpp:
1711         (JSC::DFG::JITCompiler::JITCompiler):
1712         (JSC::DFG::JITCompiler::link):
1713         (JSC::DFG::JITCompiler::compile):
1714         (JSC::DFG::JITCompiler::compileFunction):
1715         (JSC::DFG::JITCompiler::recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded):
1716         (JSC::DFG::JITCompiler::setEndOfMainPath):
1717         (JSC::DFG::JITCompiler::setEndOfCode):
1718         * dfg/DFGJITCompiler.h:
1719         (JSC::DFG::JITCompiler::setStartOfCode):
1720         (JSC::DFG::JITCompiler::setForNode):
1721         (JSC::DFG::JITCompiler::addCallSite):
1722         (JSC::DFG::JITCompiler::pcToCodeOriginMapBuilder):
1723         (JSC::DFG::JITCompiler::setEndOfMainPath): Deleted.
1724         (JSC::DFG::JITCompiler::setEndOfCode): Deleted.
1725         * dfg/DFGSlowPathGenerator.h:
1726         (JSC::DFG::SlowPathGenerator::call):
1727         (JSC::DFG::SlowPathGenerator::origin):
1728         * dfg/DFGSpeculativeJIT.cpp:
1729         (JSC::DFG::SpeculativeJIT::addSlowPathGenerator):
1730         (JSC::DFG::SpeculativeJIT::runSlowPathGenerators):
1731         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
1732         * dfg/DFGSpeculativeJIT.h:
1733         * ftl/FTLB3Compile.cpp:
1734         (JSC::FTL::compile):
1735         * ftl/FTLJITCode.cpp:
1736         (JSC::FTL::JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite):
1737         (JSC::FTL::JITCode::findPC):
1738         * ftl/FTLJITCode.h:
1739         (JSC::FTL::JITCode::b3Code):
1740         * heap/MachineStackMarker.cpp:
1741         (JSC::MachineThreads::Thread::Registers::instructionPointer):
1742         (JSC::MachineThreads::Thread::Registers::llintPC):
1743         (JSC::MachineThreads::Thread::freeRegisters):
1744         * heap/MachineStackMarker.h:
1745         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1746         (Inspector::InspectorScriptProfilerAgent::addEvent):
1747         (Inspector::buildSamples):
1748         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
1749         * jit/JIT.cpp:
1750         (JSC::JIT::JIT):
1751         (JSC::JIT::privateCompileMainPass):
1752         (JSC::JIT::privateCompileSlowCases):
1753         (JSC::JIT::privateCompile):
1754         * jit/JIT.h:
1755         * jit/JITCode.h:
1756         (JSC::JITCode::findPC):
1757         * jit/PCToCodeOriginMap.cpp: Added.
1758         (JSC::PCToCodeOriginMapBuilder::PCToCodeOriginMapBuilder):
1759         (JSC::PCToCodeOriginMapBuilder::appendItem):
1760         (JSC::PCToCodeOriginMap::PCToCodeOriginMap):
1761         (JSC::PCToCodeOriginMap::~PCToCodeOriginMap):
1762         (JSC::PCToCodeOriginMap::memorySize):
1763         (JSC::PCToCodeOriginMap::findPC):
1764         * jit/PCToCodeOriginMap.h: Added.
1765         (JSC::PCToCodeOriginMapBuilder::defaultCodeOrigin):
1766         (JSC::PCToCodeOriginMapBuilder::didBuildMapping):
1767         * jsc.cpp:
1768         (functionSamplingProfilerStackTraces):
1769         * llint/LLIntPCRanges.h:
1770         (JSC::LLInt::isLLIntPC):
1771         * llint/LowLevelInterpreter.asm:
1772         * runtime/Options.h:
1773         * runtime/SamplingProfiler.cpp:
1774         (JSC::reportStats):
1775         (JSC::FrameWalker::FrameWalker):
1776         (JSC::FrameWalker::walk):
1777         (JSC::FrameWalker::resetAtMachineFrame):
1778         (JSC::FrameWalker::isValidFramePointer):
1779         (JSC::SamplingProfiler::SamplingProfiler):
1780         (JSC::SamplingProfiler::~SamplingProfiler):
1781         (JSC::tryGetBytecodeIndex):
1782         (JSC::SamplingProfiler::processUnverifiedStackTraces):
1783         (JSC::SamplingProfiler::visit):
1784         (JSC::SamplingProfiler::noticeVMEntry):
1785         (JSC::SamplingProfiler::clearData):
1786         (JSC::SamplingProfiler::StackFrame::displayName):
1787         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
1788         (JSC::SamplingProfiler::StackFrame::functionStartLine):
1789         (JSC::SamplingProfiler::StackFrame::functionStartColumn):
1790         (JSC::SamplingProfiler::StackFrame::sourceID):
1791         (JSC::SamplingProfiler::StackFrame::url):
1792         (JSC::SamplingProfiler::releaseStackTraces):
1793         (JSC::SamplingProfiler::stackTracesAsJSON):
1794         (WTF::printInternal):
1795         (JSC::SamplingProfiler::StackFrame::startLine): Deleted.
1796         (JSC::SamplingProfiler::StackFrame::startColumn): Deleted.
1797         (JSC::SamplingProfiler::stackTraces): Deleted.
1798         * runtime/SamplingProfiler.h:
1799         (JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame):
1800         (JSC::SamplingProfiler::StackFrame::StackFrame):
1801         (JSC::SamplingProfiler::StackTrace::StackTrace):
1802         (JSC::SamplingProfiler::totalTime):
1803         (JSC::SamplingProfiler::setStopWatch):
1804         * runtime/VM.cpp:
1805         (JSC::VM::VM):
1806         * runtime/VM.h:
1807         (JSC::VM::setShouldBuildPCToCodeOriginMapping):
1808         (JSC::VM::shouldBuilderPCToCodeOriginMapping):
1809         * tests/stress/sampling-profiler-basic.js:
1810         (platformSupportsSamplingProfiler.top):
1811         (platformSupportsSamplingProfiler.jaz):
1812         (platformSupportsSamplingProfiler.kaz):
1813
1814 2016-01-29  Saam barati  <sbarati@apple.com>
1815
1816         Remove our notion of having a single activation register
1817         https://bugs.webkit.org/show_bug.cgi?id=153673
1818
1819         Reviewed by Filip Pizlo.
1820
1821         We have many functions lurking around where we think a function 
1822         might only have one activation register. This is clearly wrong
1823         now that ES6 has block scoping. This patch removes this false notion.
1824
1825         * bytecode/CodeBlock.cpp:
1826         (JSC::CodeBlock::dumpBytecode):
1827         (JSC::CodeBlock::CodeBlock):
1828         * bytecode/CodeBlock.h:
1829         (JSC::CodeBlock::scopeRegister):
1830         (JSC::CodeBlock::codeType):
1831         (JSC::CodeBlock::setActivationRegister): Deleted.
1832         (JSC::CodeBlock::activationRegister): Deleted.
1833         (JSC::CodeBlock::uncheckedActivationRegister): Deleted.
1834         (JSC::CodeBlock::needsActivation): Deleted.
1835         * bytecode/ExecutableInfo.h:
1836         (JSC::ExecutableInfo::ExecutableInfo):
1837         (JSC::ExecutableInfo::usesEval):
1838         (JSC::ExecutableInfo::isStrictMode):
1839         (JSC::ExecutableInfo::isConstructor):
1840         (JSC::ExecutableInfo::isClassContext):
1841         (JSC::ExecutableInfo::needsActivation): Deleted.
1842         * bytecode/UnlinkedCodeBlock.cpp:
1843         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
1844         * bytecode/UnlinkedCodeBlock.h:
1845         (JSC::UnlinkedCodeBlock::isArrowFunctionContext):
1846         (JSC::UnlinkedCodeBlock::isClassContext):
1847         (JSC::UnlinkedCodeBlock::setThisRegister):
1848         (JSC::UnlinkedCodeBlock::setScopeRegister):
1849         (JSC::UnlinkedCodeBlock::usesGlobalObject):
1850         (JSC::UnlinkedCodeBlock::setGlobalObjectRegister):
1851         (JSC::UnlinkedCodeBlock::thisRegister):
1852         (JSC::UnlinkedCodeBlock::scopeRegister):
1853         (JSC::UnlinkedCodeBlock::addPropertyAccessInstruction):
1854         (JSC::UnlinkedCodeBlock::needsFullScopeChain): Deleted.
1855         (JSC::UnlinkedCodeBlock::setActivationRegister): Deleted.
1856         (JSC::UnlinkedCodeBlock::activationRegister): Deleted.
1857         (JSC::UnlinkedCodeBlock::hasActivationRegister): Deleted.
1858         * bytecode/UnlinkedFunctionExecutable.cpp:
1859         (JSC::generateUnlinkedFunctionCodeBlock):
1860         * bytecompiler/BytecodeGenerator.cpp:
1861         (JSC::BytecodeGenerator::BytecodeGenerator):
1862         (JSC::BytecodeGenerator::initializeVarLexicalEnvironment):
1863         * bytecompiler/BytecodeGenerator.h:
1864         (JSC::BytecodeGenerator::destinationForAssignResult):
1865         (JSC::BytecodeGenerator::leftHandSideNeedsCopy):
1866         (JSC::BytecodeGenerator::emitNodeForLeftHandSide):
1867         * dfg/DFGByteCodeParser.cpp:
1868         (JSC::DFG::ByteCodeParser::inliningCost):
1869         (JSC::DFG::ByteCodeParser::parseCodeBlock):
1870         * dfg/DFGGraph.h:
1871         (JSC::DFG::Graph::hasExitSite):
1872         (JSC::DFG::Graph::activationRegister): Deleted.
1873         (JSC::DFG::Graph::uncheckedActivationRegister): Deleted.
1874         (JSC::DFG::Graph::machineActivationRegister): Deleted.
1875         (JSC::DFG::Graph::uncheckedMachineActivationRegister): Deleted.
1876         * dfg/DFGStackLayoutPhase.cpp:
1877         (JSC::DFG::StackLayoutPhase::run):
1878         * interpreter/CallFrame.cpp:
1879         (JSC::CallFrame::callSiteIndex):
1880         (JSC::CallFrame::stack):
1881         (JSC::CallFrame::callerFrame):
1882         (JSC::CallFrame::friendlyFunctionName):
1883         (JSC::CallFrame::hasActivation): Deleted.
1884         (JSC::CallFrame::uncheckedActivation): Deleted.
1885         (JSC::CallFrame::lexicalEnvironment): Deleted.
1886         (JSC::CallFrame::lexicalEnvironmentOrNullptr): Deleted.
1887         (JSC::CallFrame::setActivation): Deleted.
1888         * interpreter/CallFrame.h:
1889         (JSC::ExecState::scope):
1890         (JSC::ExecState::setCallerFrame):
1891         (JSC::ExecState::setScope):
1892         (JSC::ExecState::init):
1893         * interpreter/Register.h:
1894         * llint/LLIntSlowPaths.cpp:
1895         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1896         * runtime/Executable.h:
1897         (JSC::ScriptExecutable::usesEval):
1898         (JSC::ScriptExecutable::usesArguments):
1899         (JSC::ScriptExecutable::isArrowFunctionContext):
1900         (JSC::ScriptExecutable::isStrictMode):
1901         (JSC::ScriptExecutable::derivedContextType):
1902         (JSC::ScriptExecutable::needsActivation): Deleted.
1903         * runtime/JSLexicalEnvironment.h:
1904         (JSC::asActivation):
1905         (JSC::Register::lexicalEnvironment): Deleted.
1906
1907 2016-01-29  Filip Pizlo  <fpizlo@apple.com>
1908
1909         Air:fixObviousSpills should handle floats and doubles
1910         https://bugs.webkit.org/show_bug.cgi?id=153197
1911
1912         Reviewed by Saam Barati.
1913
1914         This adds the most obvious handling of float spills, where we just enable load elimination on
1915         float spill code.
1916
1917         * b3/air/AirFixObviousSpills.cpp:
1918
1919 2016-01-29  Andreas Kling  <akling@apple.com>
1920
1921         Shrink CodeBlock!
1922         <https://webkit.org/b/153640>
1923
1924         Reviewed by Saam Barati.
1925
1926         Shrink CodeBlock by 112 bytes (from 640 to 528) by employing
1927         these sophisticated tricks:
1928
1929             - Remove members that are not used by anyone.
1930             - Don't cache both VM* and Heap* in members.
1931             - Reorder members to minimize struct padding.
1932             - Use RefCountedArray instead of Vector for arrays that never resize.
1933             - Put a not-always-present HashMap in a std::unique_ptr.
1934
1935         This increases CodeBlock space efficiency by 20%, as we can now
1936         fit 30 of them in a MarkedBlock, up from 25.)
1937
1938         * bytecode/CodeBlock.cpp:
1939         (JSC::CodeBlock::CodeBlock):
1940         (JSC::CodeBlock::finishCreation):
1941         (JSC::CodeBlock::setNumParameters):
1942         (JSC::CodeBlock::jettison):
1943         (JSC::CodeBlock::noticeIncomingCall):
1944         (JSC::CodeBlock::resultProfileForBytecodeOffset):
1945         * bytecode/CodeBlock.h:
1946         (JSC::CodeBlock::setJITCode):
1947         (JSC::CodeBlock::capabilityLevelState):
1948         (JSC::CodeBlock::codeType):
1949         (JSC::CodeBlock::ensureResultProfile):
1950         (JSC::CodeBlock::heap):
1951
1952 2016-01-29  Saam barati  <sbarati@apple.com>
1953
1954         Exits from exceptions shouldn't jettison code
1955         https://bugs.webkit.org/show_bug.cgi?id=153564
1956
1957         Reviewed by Geoffrey Garen.
1958
1959         We create two new exit kinds for exception-handling
1960         OSRExits:
1961         - ExceptionCheck: an exception check after a C call.
1962         - GenericUnwind: an OSR exit executes because it's jumped to from genericUnwind machinery.
1963
1964         Having these two new exit kinds allows us to remove fields from
1965         various OSRExit variants that store booleans indicating
1966         if the exit is an exception handler, and if so, what kind
1967         of exception handler. Most of this patch is just removing
1968         those old fields and adding new equivalent functions.
1969
1970         This patch also implements the policy that we should never consider jettisoning
1971         code from exits that happen from an exception check to an op_catch (it might be worth
1972         considering a similar policy for 'throw'). We're choosing this policy because
1973         it will almost never be more expensive, in total, to execute the OSR exit than
1974         to execute the baseline variant of the code. When an exception is thrown, we do
1975         really expensive work, like call through to genericUnwind, and also create an error
1976         object with a stack trace. The cost of OSR exiting here is small in comparison to
1977         those other operations. And penalizing a CodeBlock for OSR exiting from an exception
1978         is silly because the basis of our implementation of exception handling in the
1979         upper tiers is to OSR exit on a caught exception. So we used to penalize
1980         ourselves for having an implementation that is correct w.r.t our design goals.
1981
1982         I've verified this hypothesis with on v8-raytrace by adding a new 
1983         benchmark that throws with very high frequency. Implementing
1984         this policy on that benchmark results in about a 4-5% speed up.
1985
1986         * bytecode/ExitKind.cpp:
1987         (JSC::exitKindToString):
1988         (JSC::exitKindMayJettison):
1989         (JSC::exitKindIsCountable): Deleted.
1990         * bytecode/ExitKind.h:
1991         * dfg/DFGJITCode.cpp:
1992         (JSC::DFG::JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite):
1993         * dfg/DFGJITCompiler.cpp:
1994         (JSC::DFG::JITCompiler::noticeOSREntry):
1995         (JSC::DFG::JITCompiler::appendExceptionHandlingOSRExit):
1996         (JSC::DFG::JITCompiler::exceptionCheck):
1997         (JSC::DFG::JITCompiler::recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded):
1998         * dfg/DFGJITCompiler.h:
1999         * dfg/DFGOSRExit.cpp:
2000         (JSC::DFG::OSRExit::OSRExit):
2001         * dfg/DFGOSRExit.h:
2002         (JSC::DFG::OSRExit::considerAddingAsFrequentExitSite):
2003         * dfg/DFGOSRExitBase.h:
2004         (JSC::DFG::OSRExitBase::OSRExitBase):
2005         (JSC::DFG::OSRExitBase::isExceptionHandler):
2006         (JSC::DFG::OSRExitBase::isGenericUnwindHandler):
2007         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSite):
2008         * dfg/DFGOSRExitCompiler.cpp:
2009         * dfg/DFGOSRExitCompiler32_64.cpp:
2010         (JSC::DFG::OSRExitCompiler::compileExit):
2011         * dfg/DFGOSRExitCompiler64.cpp:
2012         (JSC::DFG::OSRExitCompiler::compileExit):
2013         * dfg/DFGOSRExitCompilerCommon.cpp:
2014         (JSC::DFG::handleExitCounts):
2015         (JSC::DFG::osrWriteBarrier):
2016         (JSC::DFG::adjustAndJumpToTarget):
2017         * dfg/DFGOSRExitCompilerCommon.h:
2018         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
2019         * ftl/FTLCompile.cpp:
2020         (JSC::FTL::mmAllocateDataSection):
2021         * ftl/FTLExitThunkGenerator.cpp:
2022         (JSC::FTL::ExitThunkGenerator::emitThunk):
2023         * ftl/FTLJITCode.cpp:
2024         (JSC::FTL::JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite):
2025         * ftl/FTLLowerDFGToLLVM.cpp:
2026         (JSC::FTL::DFG::LowerDFGToLLVM::callCheck):
2027         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExitArgumentsForPatchpointIfWillCatchException):
2028         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExit):
2029         (JSC::FTL::DFG::LowerDFGToLLVM::blessSpeculation):
2030         * ftl/FTLOSRExit.cpp:
2031         (JSC::FTL::OSRExitDescriptor::emitOSRExit):
2032         (JSC::FTL::OSRExitDescriptor::emitOSRExitLater):
2033         (JSC::FTL::OSRExitDescriptor::prepareOSRExitHandle):
2034         (JSC::FTL::OSRExit::OSRExit):
2035         (JSC::FTL::OSRExit::spillRegistersToSpillSlot):
2036         (JSC::FTL::OSRExit::recoverRegistersFromSpillSlot):
2037         (JSC::FTL::OSRExit::willArriveAtExitFromIndirectExceptionCheck):
2038         (JSC::FTL::OSRExit::willArriveAtOSRExitFromCallOperation):
2039         (JSC::FTL::exceptionTypeWillArriveAtOSRExitFromGenericUnwind): Deleted.
2040         (JSC::FTL::OSRExit::willArriveAtOSRExitFromGenericUnwind): Deleted.
2041         * ftl/FTLOSRExit.h:
2042         * ftl/FTLOSRExitCompiler.cpp:
2043         (JSC::FTL::compileStub):
2044         (JSC::FTL::compileFTLOSRExit):
2045         * ftl/FTLPatchpointExceptionHandle.cpp:
2046         (JSC::FTL::PatchpointExceptionHandle::scheduleExitCreation):
2047         (JSC::FTL::PatchpointExceptionHandle::scheduleExitCreationForUnwind):
2048         (JSC::FTL::PatchpointExceptionHandle::PatchpointExceptionHandle):
2049         (JSC::FTL::PatchpointExceptionHandle::createHandle):
2050         * ftl/FTLPatchpointExceptionHandle.h:
2051
2052 2016-01-28  Yusuke Suzuki  <utatane.tea@gmail.com>
2053
2054         [B3] REGRESSION(r195395): testComplex(64, 128) asserts on Linux with GCC
2055         https://bugs.webkit.org/show_bug.cgi?id=153422
2056
2057         Reviewed by Filip Pizlo.
2058
2059         Previously proc.values() returns ValuesCollection (Not reference!).
2060         values.values takes const ValueCollection&.
2061         And later it produces IndexSet<Value>::Iterable<Procedure::ValuesCollection>,
2062         it holds const ValueCollection& as its member.
2063         But IndexSet<Value>::Iterable<Procedure::ValuesCollection> is just an instance.
2064         So after creating this, the lifetime of the ValueCollection const reference finished.
2065
2066         To fix that, we hold ValuesCollection as a member of Procedure.
2067         And change the signature to const ValuesCollection& Procedure::values().
2068
2069         * b3/B3Procedure.cpp:
2070         (JSC::B3::Procedure::Procedure):
2071         * b3/B3Procedure.h:
2072         (JSC::B3::Procedure::values):
2073
2074 2016-01-28  Joseph Pecoraro  <pecoraro@apple.com>
2075
2076         Web Inspector: InspectorTimelineAgent doesn't need to recompile functions because it now uses the sampling profiler
2077         https://bugs.webkit.org/show_bug.cgi?id=153500
2078         <rdar://problem/24352458>
2079
2080         Reviewed by Timothy Hatcher.
2081
2082         Be more explicit about enabling legacy profiling.
2083
2084         * jsc.cpp:
2085         * runtime/Executable.cpp:
2086         (JSC::ScriptExecutable::newCodeBlockFor):
2087         * runtime/JSGlobalObject.cpp:
2088         (JSC::JSGlobalObject::hasLegacyProfiler):
2089         (JSC::JSGlobalObject::createProgramCodeBlock):
2090         (JSC::JSGlobalObject::createEvalCodeBlock):
2091         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
2092         (JSC::JSGlobalObject::hasProfiler): Deleted.
2093         * runtime/JSGlobalObject.h:
2094         (JSC::JSGlobalObject::supportsLegacyProfiling):
2095         (JSC::JSGlobalObject::supportsProfiling): Deleted.
2096
2097 2016-01-28  Yusuke Suzuki  <utatane.tea@gmail.com>
2098
2099         Fix the B3 build with GCC 4.9.3
2100         https://bugs.webkit.org/show_bug.cgi?id=151624
2101
2102         Reviewed by Filip Pizlo.
2103
2104         Due to GCC 4.9's compiler issue[1], method calls inside (2 or so) nested lambdas need to use `this` to avoid internal compiler errors.
2105         [1]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62272
2106
2107         * b3/air/AirIteratedRegisterCoalescing.cpp:
2108
2109 2016-01-28  Filip Pizlo  <fpizlo@apple.com>
2110
2111         LowerToAir::preferRightForResult() should resolve use count ties by selecting the child that is closest in an idom walk
2112         https://bugs.webkit.org/show_bug.cgi?id=153583
2113
2114         Reviewed by Benjamin Poulain.
2115
2116         This undoes the AsmBench/n-body regression in r195654 while preserving that revision's
2117         Kraken progression.
2118
2119         * b3/B3LowerToAir.cpp:
2120         (JSC::B3::Air::LowerToAir::LowerToAir):
2121         (JSC::B3::Air::LowerToAir::preferRightForResult):
2122
2123 2016-01-28  Benjamin Poulain  <bpoulain@apple.com>
2124
2125         [JSC] B3 Tail Call with Varargs do not restore callee saved registers
2126         https://bugs.webkit.org/show_bug.cgi?id=153579
2127
2128         Reviewed by Michael Saboff.
2129
2130         We were trashing the callee saved registers in Tail Calls.
2131
2132         I just copied the code from DFG to fix this :)
2133
2134         * ftl/FTLLowerDFGToLLVM.cpp:
2135         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstructVarargs):
2136
2137 2016-01-27  Filip Pizlo  <fpizlo@apple.com>
2138
2139         B3 IntRange analysis should know more about shifting
2140         https://bugs.webkit.org/show_bug.cgi?id=153568
2141
2142         Reviewed by Benjamin Poulain.
2143
2144         This teaches the IntRange analysis that the result of a right shift is usually better than
2145         the worst-case mask based on the shift amount. In fact, you can reach useful conclusions
2146         from looking at the IntRange of the input. This helps because Octane/crypto does something
2147         like:
2148
2149             CheckMul((@x & $268435455) >> 14, @y >> 14, ...)
2150
2151         If you consider just the shifts, then this may overflow. But if you consider that @x is
2152         first masked, then the IntRange coming out of the first shift is tight enough to prove that
2153         the CheckMul cannot overflow.
2154
2155         * b3/B3ReduceStrength.cpp:
2156         * b3/testb3.cpp:
2157
2158 2016-01-27  Benjamin Poulain  <bpoulain@apple.com>
2159
2160         [JSC] adjustFrameAndStackInOSRExitCompilerThunk() can trash values in FTL
2161         https://bugs.webkit.org/show_bug.cgi?id=153536
2162
2163         Reviewed by Saam Barati.
2164
2165         Workaround to get B3 working on ARM.
2166
2167         * dfg/DFGOSRExitCompilerCommon.h:
2168         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
2169         The code was using the scratch registers in a few places.
2170
2171         I initially tried to make is not use scratch registers anywhere
2172         but that looked super fragile.
2173
2174         Instead, I just preserve the scratch registers. That's easy and
2175         it should be relatively cheap compared to everything done on OSR Exits.
2176
2177 2016-01-27  Konstantin Tokarev  <annulen@yandex.ru>
2178
2179         [mips] Use reinterpret_cast_ptr to suppress alignment warnings.
2180         https://bugs.webkit.org/show_bug.cgi?id=153424
2181
2182         Reviewed by Darin Adler.
2183
2184         * runtime/JSGenericTypedArrayView.h:
2185         (JSC::JSGenericTypedArrayView::sortFloat):
2186
2187 2016-01-27  Per Arne Vollan  <peavo@outlook.com>
2188
2189         [FTL][Win64] Compile fix.
2190         https://bugs.webkit.org/show_bug.cgi?id=153555
2191
2192         Reviewed by Alex Christensen.
2193
2194         MSVC does not accept preprocessor conditionals in macros.
2195
2196         * ftl/FTLOSRExitCompiler.cpp:
2197         (JSC::FTL::compileStub):
2198
2199 2016-01-27  Filip Pizlo  <fpizlo@apple.com>
2200
2201         Air::TmpWidth uses a stale pointer into its HashMap after it calls add()
2202         https://bugs.webkit.org/show_bug.cgi?id=153546
2203
2204         Reviewed by Saam Barati.
2205
2206         * b3/air/AirTmpWidth.cpp:
2207         (JSC::B3::Air::TmpWidth::recompute):
2208
2209 2016-01-27  Alexey Proskuryakov  <ap@apple.com>
2210
2211         Remove ENABLE_CURRENTSRC
2212         https://bugs.webkit.org/show_bug.cgi?id=153545
2213
2214         Reviewed by Simon Fraser.
2215
2216         * Configurations/FeatureDefines.xcconfig:
2217
2218 2016-01-26  Benjamin Poulain  <benjamin@webkit.org>
2219
2220         [JSC] When lowering B3 to Air, preferRightForResult() should prefer values from the same block
2221         https://bugs.webkit.org/show_bug.cgi?id=153477
2222
2223         Reviewed by Filip Pizlo.
2224
2225         In cases like this:
2226
2227         Block #0
2228             @1 = something
2229             @2 = Jump #1
2230         Block #1
2231             @3 = something else
2232             @4 = Add(@3, @1)
2233             ...
2234             @42 = Branch(@x, #1, #2)
2235
2236         B3LowerToAir would pick @1 for the argument copied
2237         for what goes into the UseDef side of Add.
2238
2239         This created a bunch of moves that could never be coalesced.
2240         In Kraken's imaging-desaturate, there were enough Moves to slow
2241         down the hot loop.
2242
2243         Ideally, we should not use UseCount for lowering. We should use
2244         the real liveness for preferRightForResult(), and a loop-weighted
2245         use-count for effective addresses. The problem is keeping the cost
2246         low for those simple helpers.
2247
2248         In this patch, I went with a simple heuristic: prioritize the value
2249         defined in the same block for UseDef.
2250
2251         There is one other way that would be cheap but a bit invasive:
2252         -Get rid of UseDef.
2253         -Make every ops, 3 operands.
2254         -Tell the register allocator to attempt aliasing of the 2 uses
2255          with the def.
2256         -If the allocator fails, just add a move as needed.
2257
2258         For now, the simple heuristic seems okay for the cases have.
2259
2260         * b3/B3LowerToAir.cpp:
2261         (JSC::B3::Air::LowerToAir::preferRightForResult):
2262
2263 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
2264
2265         Tail duplication should break critical edges first
2266         https://bugs.webkit.org/show_bug.cgi?id=153530
2267
2268         Reviewed by Benjamin Poulain.
2269
2270         This speeds up Octane/boyer.
2271
2272         * b3/B3DuplicateTails.cpp:
2273
2274 2016-01-26  Joseph Pecoraro  <pecoraro@apple.com>
2275
2276         Generalize ResourceUsageData gathering to be used outside of ResourceUsageOverlay
2277         https://bugs.webkit.org/show_bug.cgi?id=153509
2278         <rdar://problem/24354291>
2279
2280         Reviewed by Andreas Kling.
2281
2282         * heap/Heap.h:
2283         * heap/HeapInlines.h:
2284         (JSC::Heap::didAllocateBlock):
2285         (JSC::Heap::didFreeBlock):
2286         Rename the ENABLE flag.
2287
2288 2016-01-26  Csaba Osztrogonác  <ossy@webkit.org>
2289
2290         [B3] Fix control reaches end of non-void function GCC warning after r195139
2291         https://bugs.webkit.org/show_bug.cgi?id=153426
2292
2293         Reviewed by Michael Catanzaro.
2294
2295         * b3/air/AirArg.h:
2296         (JSC::B3::Air::Arg::cooled):
2297
2298 2016-01-26  Saam barati  <sbarati@apple.com>
2299
2300         testb3 and testAir should be compiled under -O0
2301         https://bugs.webkit.org/show_bug.cgi?id=153520
2302
2303         Reviewed by Benjamin Poulain.
2304
2305         * JavaScriptCore.xcodeproj/project.pbxproj:
2306
2307 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
2308
2309         B3's integer range analysis should know that Mul'ing two sufficiently small numbers will yield a number that still has a meaningful range
2310         https://bugs.webkit.org/show_bug.cgi?id=153518
2311
2312         Reviewed by Benjamin Poulain.
2313
2314         Octane/encrypt had an addition overflow check that can be proved away by being sufficiently
2315         sneaky about the analysis of adds, multiplies, and shifts.
2316
2317         I almost added these optimizations to the DFG integer range optimization phase. That phase is
2318         very complicated. B3's integer range analysis is trivial. So I added it to B3. Eventually
2319         we'll want this same machinery in the DFG also.
2320
2321         8% speed-up on Octane/encrypt.
2322
2323         * b3/B3ReduceStrength.cpp:
2324         * b3/B3Value.cpp:
2325         (JSC::B3::Value::dump): Dumping a constant value's name now dumps its value. This makes a huge difference for reading IR.
2326         (JSC::B3::Value::cloneImpl):
2327         (JSC::B3::Value::deepDump):
2328
2329 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
2330
2331         It should be possible to disable FTL for a range like we disable DFG for a range
2332         https://bugs.webkit.org/show_bug.cgi?id=153511
2333
2334         Reviewed by Geoffrey Garen.
2335
2336         * dfg/DFGTierUpCheckInjectionPhase.cpp:
2337         (JSC::DFG::TierUpCheckInjectionPhase::run):
2338         * runtime/Options.h:
2339
2340 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
2341
2342         Shifts by an amount computed using BitAnd with a mask that subsumes the shift's own mask should be rewired around the BitAnd
2343         https://bugs.webkit.org/show_bug.cgi?id=153505
2344
2345         Reviewed by Saam Barati.
2346
2347         Turn this: Shl(@x, BitAnd(@y, 63))
2348         Into this: Shl(@x, @y)
2349
2350         It matters for Octane/crypto.
2351
2352         We should also stop FTL from generating such code, but even if we did that, we'd still want
2353         this optimization in case user code did the BitAnd.
2354
2355         Also we can't stop the FTL from generating such code yet, because when targetting LLVM, you
2356         must mask your shifts this way.
2357
2358         * b3/B3ReduceStrength.cpp:
2359
2360 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
2361
2362         The thing that B3 uses to describe a stack slot should not be a Value
2363         https://bugs.webkit.org/show_bug.cgi?id=153491
2364         rdar://problem/24349446
2365
2366         Reviewed by Geoffrey Garen and Saam Barati.
2367
2368         Prior to this change, B3 represented stack slots by having a StackSlotValue that carried
2369         two meanings:
2370
2371         - It represented a stack slot.
2372
2373         - It was a kind of Value for getting the base of the stack slot.
2374
2375         This seems like a good idea until you consider the following issues.
2376
2377         1) A Value can be killed if it is on an unreachable path, or if it has no effects and
2378            nobody refers to it. But the FTL uses StackSlotValue to allocate space on the stack.
2379            When it does this, it doesn't want it to be killed. It will dereference the object, so
2380            killing it is a bug.
2381
2382         2) A premise of B3 is that it should be always legal to perform the following
2383            transformation on a value:
2384
2385            value->replaceWithIdentity(insertionSet.insertValue(index, proc.clone(value)));
2386
2387            This inserts a new value just before the old one. The new value is a clone of the old
2388            one. Then the old one is essentially deleted (anything that becomes an identity dies
2389            shortly thereafter). Problem (1) prevents this from being legal, which breaks a major
2390            premise of B3 IR.
2391
2392         3) A premise of B3 is that it should be always legal to perform the following
2393            transformation on a value:
2394
2395            Before:
2396                    @42 = Thing(...)
2397
2398            After:
2399                    Branch(@doesntMatter, #yes, #no)
2400                BB#yes:
2401                    @42_one = Thing(...)
2402                    Upsilon(@42_one, ^42)
2403                    Jump(#done)
2404                BB#no:
2405                    @42_two = Thing(...)
2406                    Upsilon(@42_two, ^42)
2407                    Jump(#done)
2408                BB#done:
2409                    @42 = Phi()
2410
2411            But prior to this change, such a transformation makes absolutely no sense for
2412            StackSlot. It will "work" in the sense that the compiler will proceed undaunted, but
2413            it will disable SSA fix-up for the cloned stack slot and we will end up allocating two
2414            stack slots instead of one, and then we will assume that they both escape, which will
2415            disable efficient stack allocation. Note that the moral equivalent of this
2416            transformation could already happen due to tail duplication, and the only reason why
2417            it's not a bug right now is that we happen to hoist stack slots to the root block. But
2418            the whole point of our stack slots was supposed to be that they do not have to be
2419            hoisted.
2420
2421         This change fixes this issue by splitting StackSlotValue into two things: SlotBaseValue,
2422         which is a pure operation for getting the base address of a StackSlot, and StackSlot,
2423         which is a representation of the actual stack slot. StackSlot cannot get duplicated and
2424         can only be killed if it's anonymous. SlotBaseValue can be killed, moved, cloned,
2425         hoisted, etc. Since it has no effects and it has a ValueKey, it's one of the most
2426         permissive Values in the IR, just as one would hope (after all, there is actually zero
2427         code that needs to execute to evaluate SlotBaseValue).
2428
2429         This fixes a crash that we saw with GuardMalloc and ASan. It also makes the IR a lot more
2430         easy to reason about.
2431
2432         * CMakeLists.txt:
2433         * JavaScriptCore.xcodeproj/project.pbxproj:
2434         * b3/B3EliminateCommonSubexpressions.cpp:
2435         * b3/B3FixSSA.cpp:
2436         (JSC::B3::demoteValues):
2437         (JSC::B3::fixSSA):
2438         * b3/B3LowerToAir.cpp:
2439         (JSC::B3::Air::LowerToAir::run):
2440         (JSC::B3::Air::LowerToAir::effectiveAddr):
2441         (JSC::B3::Air::LowerToAir::lower):
2442         * b3/B3Opcode.cpp:
2443         (WTF::printInternal):
2444         * b3/B3Opcode.h:
2445         * b3/B3Procedure.cpp:
2446         (JSC::B3::Procedure::setBlockOrderImpl):
2447         (JSC::B3::Procedure::addStackSlot):
2448         (JSC::B3::Procedure::addAnonymousStackSlot):
2449         (JSC::B3::Procedure::clone):
2450         (JSC::B3::Procedure::dump):
2451         (JSC::B3::Procedure::blocksInPostOrder):
2452         (JSC::B3::Procedure::deleteStackSlot):
2453         (JSC::B3::Procedure::deleteValue):
2454         (JSC::B3::Procedure::calleeSaveRegisters):
2455         (JSC::B3::Procedure::addStackSlotIndex):
2456         (JSC::B3::Procedure::addValueIndex):
2457         * b3/B3Procedure.h:
2458         (JSC::B3::Procedure::setBlockOrder):
2459         (JSC::B3::Procedure::StackSlotsCollection::StackSlotsCollection):
2460         (JSC::B3::Procedure::StackSlotsCollection::size):
2461         (JSC::B3::Procedure::StackSlotsCollection::at):
2462         (JSC::B3::Procedure::StackSlotsCollection::operator[]):
2463         (JSC::B3::Procedure::StackSlotsCollection::iterator::iterator):
2464         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator*):
2465         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator++):
2466         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator==):
2467         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator!=):
2468         (JSC::B3::Procedure::StackSlotsCollection::iterator::findNext):
2469         (JSC::B3::Procedure::StackSlotsCollection::begin):
2470         (JSC::B3::Procedure::StackSlotsCollection::end):
2471         (JSC::B3::Procedure::stackSlots):
2472         (JSC::B3::Procedure::ValuesCollection::ValuesCollection):
2473         * b3/B3ReduceStrength.cpp:
2474         * b3/B3SlotBaseValue.cpp: Copied from Source/JavaScriptCore/b3/B3StackSlotValue.cpp.
2475         (JSC::B3::SlotBaseValue::~SlotBaseValue):
2476         (JSC::B3::SlotBaseValue::dumpMeta):
2477         (JSC::B3::SlotBaseValue::cloneImpl):
2478         (JSC::B3::StackSlotValue::~StackSlotValue): Deleted.
2479         (JSC::B3::StackSlotValue::dumpMeta): Deleted.
2480         (JSC::B3::StackSlotValue::cloneImpl): Deleted.
2481         * b3/B3SlotBaseValue.h: Copied from Source/JavaScriptCore/b3/B3StackSlotValue.h.
2482         * b3/B3StackSlot.cpp: Added.
2483         (JSC::B3::StackSlot::~StackSlot):
2484         (JSC::B3::StackSlot::dump):
2485         (JSC::B3::StackSlot::deepDump):
2486         (JSC::B3::StackSlot::StackSlot):
2487         * b3/B3StackSlot.h: Added.
2488         (JSC::B3::StackSlot::byteSize):
2489         (JSC::B3::StackSlot::kind):
2490         (JSC::B3::StackSlot::isLocked):
2491         (JSC::B3::StackSlot::index):
2492         (JSC::B3::StackSlot::offsetFromFP):
2493         (JSC::B3::StackSlot::setOffsetFromFP):
2494         (JSC::B3::DeepStackSlotDump::DeepStackSlotDump):
2495         (JSC::B3::DeepStackSlotDump::dump):
2496         (JSC::B3::deepDump):
2497         * b3/B3StackSlotValue.cpp: Removed.
2498         * b3/B3StackSlotValue.h: Removed.
2499         * b3/B3Validate.cpp:
2500         * b3/B3Value.cpp:
2501         (JSC::B3::Value::effects):
2502         (JSC::B3::Value::key):
2503         (JSC::B3::Value::checkOpcode):
2504         * b3/B3ValueKey.cpp:
2505         (JSC::B3::ValueKey::materialize):
2506         * b3/air/AirCode.cpp:
2507         (JSC::B3::Air::Code::addBlock):
2508         (JSC::B3::Air::Code::addStackSlot):
2509         (JSC::B3::Air::Code::addSpecial):
2510         * b3/air/AirCode.h:
2511         * b3/air/AirStackSlot.cpp:
2512         (JSC::B3::Air::StackSlot::setOffsetFromFP):
2513         (JSC::B3::Air::StackSlot::dump):
2514         (JSC::B3::Air::StackSlot::deepDump):
2515         (JSC::B3::Air::StackSlot::StackSlot):
2516         * b3/air/AirStackSlot.h:
2517         (JSC::B3::Air::StackSlot::alignment):
2518         (JSC::B3::Air::StackSlot::b3Slot):
2519         (JSC::B3::Air::StackSlot::offsetFromFP):
2520         (WTF::printInternal):
2521         (JSC::B3::Air::StackSlot::value): Deleted.
2522         * b3/testb3.cpp:
2523         (JSC::B3::testStackSlot):
2524         (JSC::B3::testStoreLoadStackSlot):
2525         * ftl/FTLB3Compile.cpp:
2526         * ftl/FTLB3Output.cpp:
2527         (JSC::FTL::Output::appendTo):
2528         (JSC::FTL::Output::lockedStackSlot):
2529         (JSC::FTL::Output::neg):
2530         * ftl/FTLB3Output.h:
2531         (JSC::FTL::Output::framePointer):
2532         (JSC::FTL::Output::constBool):
2533         (JSC::FTL::Output::constInt32):
2534         * ftl/FTLLowerDFGToLLVM.cpp:
2535         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
2536         * ftl/FTLState.h:
2537
2538 2016-01-26  Benjamin Poulain  <benjamin@webkit.org>
2539
2540         Remove a useless #include
2541         https://bugs.webkit.org/show_bug.cgi?id=153474
2542
2543         Reviewed by Alexey Proskuryakov.
2544
2545         * b3/B3ReduceStrength.cpp:
2546
2547 2016-01-26  Alex Christensen  <achristensen@webkit.org>
2548
2549         [Win] Fix clean build after r195545.
2550         ​https://bugs.webkit.org/show_bug.cgi?id=153434
2551
2552         * CMakeLists.txt:
2553         * PlatformWin.cmake:
2554         Derived sources need to be copied after the build, but everything else should be copied before.
2555         This should fix ews issues like the one seen in bug 153473.
2556
2557 2016-01-25  Filip Pizlo  <fpizlo@apple.com>
2558
2559         FTLB3Output should maintain good block order like the LLVM one does
2560         https://bugs.webkit.org/show_bug.cgi?id=152222
2561
2562         Reviewed by Geoffrey Garen.
2563
2564         This fixes FTLB3Output to emit an ordered B3 IR. This makes inspecting IR *a lot* easier.
2565         It will also be a performance win whenever we use range-based data structures for
2566         liveness.
2567
2568         Also two small other changes:
2569         - Added some more dumping in integer range optimization phase.
2570         - Refined the disassembler's printing of instruction width suffixes so that "jzl" is not
2571           a thing. It was using "l" as the suffix because jumps take a 32-bit immediate.
2572
2573         * b3/B3Procedure.cpp:
2574         (JSC::B3::Procedure::addBlock):
2575         (JSC::B3::Procedure::setBlockOrderImpl):
2576         (JSC::B3::Procedure::clone):
2577         * b3/B3Procedure.h:
2578         (JSC::B3::Procedure::frontendData):
2579         (JSC::B3::Procedure::setBlockOrder):
2580         * dfg/DFGIntegerRangeOptimizationPhase.cpp:
2581         * disassembler/udis86/udis86_syn-att.c:
2582         (ud_translate_att):
2583         * ftl/FTLB3Output.cpp:
2584         (JSC::FTL::Output::initialize):
2585         (JSC::FTL::Output::newBlock):
2586         (JSC::FTL::Output::applyBlockOrder):
2587         (JSC::FTL::Output::appendTo):
2588         * ftl/FTLB3Output.h:
2589         (JSC::FTL::Output::setFrequency):
2590         (JSC::FTL::Output::insertNewBlocksBefore):
2591         (JSC::FTL::Output::callWithoutSideEffects):
2592         (JSC::FTL::Output::newBlock): Deleted.
2593         * ftl/FTLLowerDFGToLLVM.cpp:
2594         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
2595
2596 2016-01-25  Skachkov Oleksandr  <gskachkov@gmail.com>
2597
2598         [ES6] Arrow function syntax. Arrow function specific features. Lexical bind "arguments"
2599         https://bugs.webkit.org/show_bug.cgi?id=145132
2600
2601         Reviewed by Saam Barati.
2602         
2603         Added support of ES6 arrow function specific feature, lexical bind of arguments. 
2604         http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions-runtime-semantics-evaluation
2605         'arguments' variable in arrow function must resolve to a binding in a lexically enclosing environment.
2606         In srict mode it points to arguments object, and in non-stric mode it points to arguments object or varible 
2607         with name 'arguments' if it was declared. 
2608
2609         * bytecompiler/BytecodeGenerator.cpp:
2610         (JSC::BytecodeGenerator::BytecodeGenerator):
2611         * parser/Parser.h:
2612         (JSC::Scope::Scope):
2613         (JSC::Scope::setSourceParseMode):
2614         (JSC::Scope::isArrowFunction):
2615         (JSC::Scope::collectFreeVariables):
2616         (JSC::Scope::setIsArrowFunction):
2617         * tests/es6.yaml:
2618         * tests/stress/arrowfunction-lexical-bind-arguments-non-strict-1.js: Added.
2619         * tests/stress/arrowfunction-lexical-bind-arguments-non-strict-2.js: Added.
2620         * tests/stress/arrowfunction-lexical-bind-arguments-strict.js: Added.
2621
2622 2016-01-25  Benjamin Poulain  <bpoulain@apple.com>
2623
2624         [JSC] We should never use x18 on iOS ARM64
2625         https://bugs.webkit.org/show_bug.cgi?id=153461
2626
2627         Reviewed by Filip Pizlo.
2628
2629         The register x18 is reserved in the iOS variant of the ARM64 ABI.
2630
2631         The weird thing is: if you use it, its value will change completely
2632         randomly. It looks like it is changed by the system on interrupts.
2633
2634         This patch adds x18 to the reserved register and add assertions
2635         to the assembler to prevent similar problems in the future.
2636
2637         * assembler/ARM64Assembler.h:
2638         (JSC::ARM64Assembler::xOrSp):
2639         (JSC::ARM64Assembler::xOrZr):
2640         * assembler/AbstractMacroAssembler.h:
2641         (JSC::isIOS): Deleted.
2642         * assembler/AssemblerCommon.h:
2643         (JSC::isIOS):
2644         * jit/RegisterSet.cpp:
2645         (JSC::RegisterSet::reservedHardwareRegisters):
2646
2647 2016-01-25  Commit Queue  <commit-queue@webkit.org>
2648
2649         Unreviewed, rolling out r195550.
2650         https://bugs.webkit.org/show_bug.cgi?id=153471
2651
2652         broke animometer bot (and now we have crash logs!) (Requested
2653         by kling on #webkit).
2654
2655         Reverted changeset:
2656
2657         "Restore CodeBlock jettison code Geoff accidentally removed"
2658         https://bugs.webkit.org/show_bug.cgi?id=151241
2659         http://trac.webkit.org/changeset/195550
2660
2661 2016-01-25  Andreas Kling  <akling@apple.com>
2662
2663         MarkedSpace should have more precise allocators.
2664         <https://webkit.org/b/153448>
2665         <rdar://problem/23897477>
2666
2667         Reviewed by Geoffrey Garen.
2668
2669         The four classes responsible for the bulk of MarkedBlock allocations today are:
2670
2671             - FunctionCodeBlock (640 bytes)
2672             - UnlinkedFunctionCodeBlock (304 bytes)
2673             - FunctionExecutable (168 bytes)
2674             - UnlinkedFunctionExecutable (144 bytes)
2675
2676         Due to the size class distribution in MarkedSpace, we've been wasting quite a lot
2677         of heap space on these objects. Our "precise" allocators allowed allocation sizes
2678         in 16-byte increments up to 128 bytes, but after that point, we'd only allocate
2679         in 256-byte size increments.
2680
2681         Thus each instance of those classes would waste space as follows:
2682
2683             - FunctionCodeBlock (768-byte cell, 128 bytes wasted)
2684             - UnlinkedFunctionCodeBlock (512-byte cell, 208 bytes wasted)
2685             - FunctionExecutable(256-byte cell, 88 bytes wasted)
2686             - UnlinkedFunctionExecutable(256-byte cell, 112 bytes wasted)
2687
2688         This patch raises the limit for precise allocations from 128 to 768, allowing us
2689         to allocate these objects with far better space efficiency.
2690
2691         The cost of this is 7kB worth of MarkedAllocators and 70 (~2x) more allocators to
2692         iterate whenever we iterate all the allocators.
2693
2694         * heap/MarkedSpace.h:
2695         * heap/MarkedSpace.cpp:
2696         (JSC::MarkedSpace::MarkedSpace):
2697         (JSC::MarkedSpace::resetAllocators):
2698         (JSC::MarkedSpace::forEachAllocator):
2699         (JSC::MarkedSpace::isPagedOut):
2700
2701 2016-01-25  Filip Pizlo  <fpizlo@apple.com>
2702
2703         Fix the comment about FTL_USES_B3.
2704
2705         * dfg/DFGCommon.h:
2706
2707 2016-01-25  Filip Pizlo  <fpizlo@apple.com>
2708
2709         Switch FTL to B3 on X86_64/Mac
2710         https://bugs.webkit.org/show_bug.cgi?id=153445
2711
2712         Rubber stamped by Geoffrey Garen.
2713
2714         This finally switches from LLVM to B3 in the FTL on X86_64 on the Mac. We recommend that other
2715         X86_64 platforms make the switch as well. We will be focusing our performance work on B3 rather
2716         than LLVM in the future. ARM64 support is also coming soon, so we will be able to remove FTL
2717         LLVM code once that lands.
2718
2719         Right now this mostly appears as perf-neutral on the major tests. However, it does have the
2720         following immediate benefits:
2721
2722         - Dramatic reduction in FTL compile times, on the order of 5x-10x. This means huge speed-ups in
2723           shorter-running tests like V8Spider (21%) and JSRegress (8%).
2724
2725         - It makes the FTL simpler and more robust because we don't have to do stackmap section
2726           parsing. This makes it easier to add new FTL features. We are already working on features,
2727           like the sampling profiler, which will only have a FTL B3 implementation.
2728
2729         - Speed-ups on some throughput benchmarks like mandreel, richards, imaging-gaussian-blur. It's
2730           still a slow down on other throughput benchmarks, though.
2731
2732         We started writing B3 in October, so it's pretty awesome that the throughput of the code it
2733         generates is already on par with LLVM.
2734         
2735         This does not fundamentally change how the FTL works. FTL was built to lower DFG IR to a C-like
2736         SSA IR, and then rely on powerful SSA optimizations and comprehensive instruction selection and
2737         register allocation to turn that code into something that runs fast. B3 also has a C-like SSA
2738         IR, has an instruction selector that is in some ways more powerful than LLVM's (B3 does global
2739         instruction selection rather than block-local like LLVM), and it has a register allocator that
2740         is in some ways more powerful also (B3 uses IRC, a mature graph coloring allocator, while LLVM
2741         does not do graph coloring). We expect FTL B3's performance to improve a lot after we turn it
2742         on and can focus our efforts on tuning it.
2743
2744         I didn't find any test regressions after running both JSC tests and layout tests. Basic
2745         browsing still works. JetStream performance difference is within the margin of error. EWS is
2746         happy.
2747
2748         * dfg/DFGCommon.h:
2749
2750 2016-01-25  Andreas Kling  <akling@apple.com>
2751
2752         Restore CodeBlock jettison code Geoff accidentally removed
2753         https://bugs.webkit.org/show_bug.cgi?id=151241
2754
2755         Rubber-stamped by Geoffrey Garen.
2756
2757         Geoff meant to add this back in <http://trac.webkit.org/changeset/190827>
2758         but missed.
2759
2760         Then he added it back in, but it was rolled out due to a crash on Animometer.
2761         I can no longer produce a crash on Animometer, either with today's version of
2762         the benchmark, or the one that existed at the time of the rollout.
2763
2764         Given this, let's roll it back in and see how it goes.
2765
2766         * bytecode/CodeBlock.cpp:
2767         (JSC::timeToLive):
2768         (JSC::CodeBlock::shouldJettisonDueToOldAge):
2769
2770 2016-01-22  Filip Pizlo  <fpizlo@apple.com>
2771
2772         mandreel should run just as fast in FTL B3 as FTL LLVM
2773         https://bugs.webkit.org/show_bug.cgi?id=153394
2774
2775         Reviewed by Gavin Barraclough.
2776
2777         This fixes two performance bugs and one disassembler bug.
2778
2779         - B3 now turns Branches into Jumps when they are dominated by a Check on the same
2780           condition. This is like the opposite of foldPathConstants() was doing.
2781
2782         - Air now supports adding to 8-bit or 16-bit memory locations on x86. B3 now knows how to
2783           lower Store8(Add(Load8Z(...))) and various other things to these new instructions.
2784
2785         - Disassembler now knows to print out the instruction's width, whenever it has one.
2786           Previously, we'd print movb, movw, movl, and movq as "mov", which is unhelpful if
2787           you're storing an immediate, for example.
2788
2789         This adds a bunch of tests for the new instruction forms. This is a big speed-up on
2790         mandreel. It makes us just as fast as LLVM on that benchmark.
2791
2792         * assembler/MacroAssemblerX86Common.h:
2793         (JSC::MacroAssemblerX86Common::add32):
2794         (JSC::MacroAssemblerX86Common::add8):
2795         (JSC::MacroAssemblerX86Common::add16):
2796         (JSC::MacroAssemblerX86Common::add32AndSetFlags):
2797         (JSC::MacroAssemblerX86Common::clz32AfterBsr):
2798         * assembler/X86Assembler.h:
2799         (JSC::X86Assembler::addl_rm):
2800         (JSC::X86Assembler::addb_rm):
2801         (JSC::X86Assembler::addw_rm):
2802         (JSC::X86Assembler::addl_ir):
2803         (JSC::X86Assembler::addl_im):
2804         (JSC::X86Assembler::addb_im):
2805         (JSC::X86Assembler::addw_im):
2806         (JSC::X86Assembler::addq_rr):
2807         * b3/B3LowerToAir.cpp:
2808         (JSC::B3::Air::LowerToAir::addr):
2809         (JSC::B3::Air::LowerToAir::loadPromiseAnyOpcode):
2810         (JSC::B3::Air::LowerToAir::loadPromise):
2811         (JSC::B3::Air::LowerToAir::tryAppendStoreBinOp):
2812         (JSC::B3::Air::LowerToAir::lower):
2813         * b3/B3PureCSE.cpp:
2814         (JSC::B3::PureCSE::clear):
2815         (JSC::B3::PureCSE::findMatch):
2816         (JSC::B3::PureCSE::process):
2817         * b3/B3PureCSE.h:
2818         * b3/B3ReduceStrength.cpp:
2819         * b3/air/AirOpcode.opcodes:
2820         * b3/testb3.cpp:
2821         (JSC::B3::testNegPtr):
2822         (JSC::B3::testStoreAddLoad32):
2823         (JSC::B3::testStoreAddLoadImm32):
2824         (JSC::B3::testStoreAddLoad8):
2825         (JSC::B3::testStoreAddLoadImm8):
2826         (JSC::B3::testStoreAddLoad16):
2827         (JSC::B3::testStoreAddLoadImm16):
2828         (JSC::B3::testStoreAddLoad64):
2829         (JSC::B3::testStoreAddLoadImm64):
2830         (JSC::B3::testStoreAddLoad32Index):
2831         (JSC::B3::testStoreAddLoadImm32Index):
2832         (JSC::B3::testStoreAddLoad8Index):
2833         (JSC::B3::testStoreAddLoadImm8Index):
2834         (JSC::B3::testStoreAddLoad16Index):
2835         (JSC::B3::testStoreAddLoadImm16Index):
2836         (JSC::B3::testStoreAddLoad64Index):
2837         (JSC::B3::testStoreAddLoadImm64Index):
2838         (JSC::B3::testStoreSubLoad):
2839         (JSC::B3::run):
2840         (JSC::B3::testStoreAddLoad): Deleted.
2841         * disassembler/udis86/udis86_syn-att.c:
2842         (ud_translate_att):
2843
2844 2016-01-25  Alex Christensen  <achristensen@webkit.org>
2845
2846         [Win] Copy forwarding headers before building a project
2847         https://bugs.webkit.org/show_bug.cgi?id=153434
2848
2849         Reviewed by Brent Fulgham.
2850
2851         * CMakeLists.txt:
2852         * PlatformWin.cmake:
2853
2854 2016-01-25  Andreas Kling  <akling@apple.com>
2855
2856         Reduce number of Structures created at startup.
2857         <https://webkit.org/b/153399>
2858
2859         Reviewed by Darin Adler.
2860
2861         For *Constructor and *Prototype objects that are only created once per JSGlobalObject,
2862         build up the Structures using addPropertyWithoutTransition() helpers to avoid creating
2863         tons of transitions that would just end up floating around and never getting used.
2864
2865         * inspector/JSInjectedScriptHostPrototype.cpp:
2866         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
2867         * inspector/JSJavaScriptCallFramePrototype.cpp:
2868         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
2869         * runtime/ArrayPrototype.cpp:
2870         (JSC::ArrayPrototype::finishCreation):
2871         * runtime/ConsolePrototype.cpp:
2872         (JSC::ConsolePrototype::finishCreation):
2873         * runtime/DatePrototype.cpp:
2874         (JSC::DatePrototype::finishCreation):
2875         * runtime/JSArrayBufferConstructor.cpp:
2876         (JSC::JSArrayBufferConstructor::finishCreation):
2877         * runtime/JSArrayBufferPrototype.cpp:
2878         (JSC::JSArrayBufferPrototype::finishCreation):
2879         * runtime/JSObject.cpp:
2880         (JSC::JSObject::putDirectNativeFunctionWithoutTransition):
2881         (JSC::JSObject::putDirectBuiltinFunctionWithoutTransition): Deleted.
2882         * runtime/JSObject.h:
2883         * runtime/JSPromiseConstructor.cpp:
2884         (JSC::JSPromiseConstructor::addOwnInternalSlots):
2885         * runtime/JSPromisePrototype.cpp:
2886         (JSC::JSPromisePrototype::addOwnInternalSlots):
2887         * runtime/JSTypedArrayViewConstructor.cpp:
2888         (JSC::JSTypedArrayViewConstructor::finishCreation):
2889         * runtime/JSTypedArrayViewPrototype.cpp:
2890         (JSC::JSTypedArrayViewPrototype::finishCreation):
2891         * runtime/MapIteratorPrototype.cpp:
2892         (JSC::MapIteratorPrototype::finishCreation):
2893         * runtime/MapPrototype.cpp:
2894         (JSC::MapPrototype::finishCreation):
2895         * runtime/NumberPrototype.cpp:
2896         (JSC::NumberPrototype::finishCreation):
2897         * runtime/ObjectConstructor.cpp:
2898         (JSC::ObjectConstructor::finishCreation):
2899         * runtime/ObjectPrototype.cpp:
2900         (JSC::ObjectPrototype::finishCreation):
2901         * runtime/SetIteratorPrototype.cpp:
2902         (JSC::SetIteratorPrototype::finishCreation):
2903         * runtime/SetPrototype.cpp:
2904         (JSC::SetPrototype::finishCreation):
2905         * runtime/StringPrototype.cpp:
2906         (JSC::StringPrototype::finishCreation):
2907         * runtime/WeakMapPrototype.cpp:
2908         (JSC::WeakMapPrototype::finishCreation):
2909         * runtime/WeakSetPrototype.cpp:
2910         (JSC::WeakSetPrototype::finishCreation):
2911
2912 2016-01-22  Filip Pizlo  <fpizlo@apple.com>
2913
2914         B3 should strength-reduce division by a constant
2915         https://bugs.webkit.org/show_bug.cgi?id=153386
2916
2917         Reviewed by Benjamin Poulain.
2918
2919         You can turn a 32-bit division by a constant into a 64-bit multiplication by a constant
2920         plus some shifts. A book called "Hacker's Delight" has a bunch of math about this. The
2921         hard part is finding the constant by which to multiply, and the amount by which to shift.
2922         The book tells you some theroems, but you still have to turn that into code by thinking
2923         deep thoughts. Luckily I was able to avoid that because it turns out that LLVM already
2924         has code for this. It's called APInt::magic(), where APInt is their class for reasoning
2925         about integers.
2926
2927         The code has a compatible license to ours and we have already in the past taken code from
2928         LLVM. So, that's what this patch does. The LLVM code is localized in
2929         B3ComputeDivisionMagic.h. Then reduceStrength() uses that to construct the multiply+shift
2930         sequence.
2931
2932         This is an enormous speed-up on AsmBench-0.9/bigfib.cpp.js. It makes us as fast on that
2933         test as LLVM. It reduces our deficit on AsmBench to 1.5%. Previously it was 4.5%.
2934
2935         * JavaScriptCore.xcodeproj/project.pbxproj:
2936         * b3/B3ComputeDivisionMagic.h: Added.
2937         (JSC::B3::computeDivisionMagic):
2938         * b3/B3ReduceStrength.cpp:
2939
2940 2016-01-22  Saam barati  <sbarati@apple.com>
2941
2942         genericUnwind might overflow the instructions() vector when catching an FTL exception
2943         https://bugs.webkit.org/show_bug.cgi?id=153383
2944
2945         Reviewed by Benjamin Poulain.
2946
2947         * jit/JITExceptions.cpp:
2948         (JSC::genericUnwind):
2949
2950 2016-01-22  Mark Lam  <mark.lam@apple.com>
2951
2952         We should OSR exit with Int52Overflow when we fail to make an Int52 where we expect one.
2953         https://bugs.webkit.org/show_bug.cgi?id=153379
2954
2955         Reviewed by Filip Pizlo.
2956
2957         In DFG::Graph::addShouldSpeculateMachineInt(), we check
2958         !hasExitSite(add, Int52Overflow) when determining whether it's ok to speculate
2959         that an operand is of type Int52 or not.  However, the Int52Rep code that
2960         converts a double to Int52 will OSR exit with exit kind BadType instead.
2961         This renders the hasExitSite() check in addShouldSpeculateMachineInt() useless.
2962         This patch fixes this by changing Int52Rep to OSR exit with exit kind
2963         Int52Overflow instead when it fails to convert a double to an Int52.
2964
2965         * dfg/DFGSpeculativeJIT.cpp:
2966         (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution):
2967         (JSC::DFG::SpeculativeJIT::typeCheck):
2968         (JSC::DFG::SpeculativeJIT::usedRegisters):
2969         * dfg/DFGSpeculativeJIT.h:
2970         (JSC::DFG::SpeculativeJIT::needsTypeCheck):
2971         (JSC::DFG::SpeculativeJIT::speculateStringObjectForStructure):
2972         * dfg/DFGSpeculativeJIT64.cpp:
2973         (JSC::DFG::SpeculativeJIT::compile):
2974         * ftl/FTLLowerDFGToLLVM.cpp:
2975         (JSC::FTL::DFG::LowerDFGToLLVM::typeCheck):
2976         (JSC::FTL::DFG::LowerDFGToLLVM::appendTypeCheck):
2977         (JSC::FTL::DFG::LowerDFGToLLVM::doubleToStrictInt52):
2978
2979 2016-01-22  Saam barati  <sbarati@apple.com>
2980
2981         Current implementation of Parser::createSavePoint is a foot gun
2982         https://bugs.webkit.org/show_bug.cgi?id=153293
2983
2984         Reviewed by Oliver Hunt.
2985
2986         The previous use of SavePoint (up until this patch)
2987         really meant that we're saving the LexerState. This
2988         was so poorly named that it was being misused all over
2989         our parser. For example, anything that parsed an
2990         AssignmentExpression between saving/restoring really
2991         wanted to save both Lexer state and Parser state.
2992
2993         This patch changes SavePoint to mean save all the
2994         state. The old SavePoint is renamed to LexerState with
2995         corresponding internal<Save/Restore>LexerState functions.
2996         The old <save/restore>State() function is renamed to
2997         internal<Save/Restore>ParserState().
2998
2999         * parser/Parser.cpp:
3000         (JSC::Parser<LexerType>::Parser):
3001         (JSC::Parser<LexerType>::parseInner):
3002         (JSC::Parser<LexerType>::isArrowFunctionParameters):
3003         (JSC::Parser<LexerType>::parseSourceElements):
3004         (JSC::Parser<LexerType>::declareRestOrNormalParameter):
3005         (JSC::Parser<LexerType>::parseAssignmentElement):
3006         (JSC::Parser<LexerType>::parseDestructuringPattern):
3007         (JSC::Parser<LexerType>::parseForStatement):
3008         (JSC::Parser<LexerType>::parseStatement):
3009         (JSC::Parser<LexerType>::parseFunctionParameters):
3010         (JSC::Parser<LexerType>::parseFunctionInfo):
3011         (JSC::Parser<LexerType>::parseClass):
3012         (JSC::Parser<LexerType>::parseExpression):
3013         (JSC::Parser<LexerType>::parseAssignmentExpression):
3014         (JSC::Parser<LexerType>::parseYieldExpression):
3015         (JSC::Parser<LexerType>::parseConditionalExpression):
3016         (JSC::Parser<LexerType>::parseBinaryExpression):
3017         (JSC::Parser<LexerType>::parseObjectLiteral):
3018         (JSC::Parser<LexerType>::parseStrictObjectLiteral):
3019         (JSC::Parser<LexerType>::parseArrayLiteral):
3020         (JSC::Parser<LexerType>::parsePrimaryExpression):
3021         (JSC::Parser<LexerType>::parseMemberExpression):
3022         (JSC::Parser<LexerType>::parseUnaryExpression):
3023         * parser/Parser.h:
3024         (JSC::Parser::hasError):
3025         (JSC::Parser::internalSaveParserState):
3026         (JSC::Parser::restoreParserState):
3027         (JSC::Parser::internalSaveLexerState):
3028         (JSC::Parser::restoreLexerState):
3029         (JSC::Parser::createSavePointForError):
3030         (JSC::Parser::createSavePoint):
3031         (JSC::Parser::restoreSavePointWithError):
3032         (JSC::Parser::restoreSavePoint):
3033         (JSC::Parser::saveState): Deleted.
3034         (JSC::Parser::restoreState): Deleted.
3035
3036 2016-01-22  Keith Miller  <keith_miller@apple.com>
3037
3038         Unreviewed. fnormal => normal.
3039
3040         * tests/es6.yaml:
3041
3042 2016-01-22  Keith Miller  <keith_miller@apple.com>
3043
3044         Unreviewed. Forgot to git stash pop some of the changes.
3045         This should mark the rest of the es6 tests as passing.
3046
3047         * tests/es6.yaml:
3048
3049 2016-01-22  Keith Miller  <keith_miller@apple.com>
3050
3051         Unreviewed. Mark es6 tests as passing.
3052
3053         * tests/es6.yaml:
3054
3055 2016-01-22  Saam barati  <sbarati@apple.com>
3056
3057         op_profile_type 32-bit LLInt implementation has a bug
3058         https://bugs.webkit.org/show_bug.cgi?id=153368
3059
3060         Reviewed by Michael Saboff.
3061
3062         r189293 changed which registers were used, specifically
3063         using t5 instead of t4. That change forgot to replace
3064         t4 with t5 in one specific instance.
3065
3066         * llint/LowLevelInterpreter32_64.asm:
3067
3068 2016-01-22  Filip Pizlo  <fpizlo@apple.com>
3069
3070         B3 should reduce obvious forms of Shl(SShr)
3071         https://bugs.webkit.org/show_bug.cgi?id=153362
3072
3073         Reviewed by Mark Lam and Saam Barati.
3074
3075         This is a 40% speed-up in AsmBench-0.9/dry.c.js.
3076
3077         * b3/B3ReduceStrength.cpp:
3078         * b3/testb3.cpp:
3079         (JSC::B3::testStore16Load16Z):
3080         (JSC::B3::testSShrShl32):
3081         (JSC::B3::testSShrShl64):
3082         (JSC::B3::zero):
3083         (JSC::B3::run):
3084
3085 2016-01-22  Alex Christensen  <achristensen@webkit.org>
3086
3087         Fix internal Windows build
3088         https://bugs.webkit.org/show_bug.cgi?id=153364
3089         <rdar://problem/24296328>
3090
3091         Reviewed by Brent Fulgham.
3092
3093         * PlatformWin.cmake:
3094         The internal build does not build JavaScriptCore with WTF, so it does not automatically link to winmm.lib
3095         like it does when everything is built together.
3096
3097 2016-01-22  Keith Miller  <keith_miller@apple.com>
3098
3099         Equivalence PropertyCondition needs to check the offset it uses to load the value from is not invalidOffset
3100         https://bugs.webkit.org/show_bug.cgi?id=152912
3101
3102         Reviewed by Mark Lam.
3103
3104         When checking the validity of an Equivalence PropertyCondition we do not check that the offset returned by
3105         the structure of the object in the equivalence condition is valid. The offset might be wrong for many reasons.
3106         The one we now test for is when the GlobalObject has a property that becomes a variable the property is deleted
3107         thus the offset is now invalid.
3108
3109         * bytecode/PropertyCondition.cpp:
3110         (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint):
3111         * tests/stress/global-property-into-variable-get-from-scope.js: Added.
3112
3113 2016-01-22  Keith Miller  <keith_miller@apple.com>
3114
3115         [ES6] Add Symbol.species properties to the relevant constructors
3116         https://bugs.webkit.org/show_bug.cgi?id=153339
3117
3118         Reviewed by Michael Saboff.
3119
3120         This patch adds Symbol.species to the RegExp, Array, TypedArray, Map, Set, ArrayBuffer, and
3121         Promise constructors.  The functions that use these properties will be added in a later
3122         patch.
3123
3124         * builtins/GlobalObject.js:
3125         (speciesGetter):
3126         * runtime/ArrayConstructor.cpp:
3127         (JSC::ArrayConstructor::finishCreation):
3128         * runtime/ArrayConstructor.h:
3129         (JSC::ArrayConstructor::create):
3130         * runtime/BooleanConstructor.h:
3131         (JSC::BooleanConstructor::create):
3132         * runtime/CommonIdentifiers.h:
3133         * runtime/DateConstructor.h:
3134         (JSC::DateConstructor::create):
3135         * runtime/ErrorConstructor.h:
3136         (JSC::ErrorConstructor::create):
3137         * runtime/JSArrayBufferConstructor.cpp:
3138         (JSC::JSArrayBufferConstructor::finishCreation):
3139         (JSC::JSArrayBufferConstructor::create):
3140         * runtime/JSArrayBufferConstructor.h:
3141         * runtime/JSGlobalObject.cpp:
3142         (JSC::JSGlobalObject::init):
3143         * runtime/JSInternalPromiseConstructor.cpp:
3144         (JSC::JSInternalPromiseConstructor::create):
3145         * runtime/JSInternalPromiseConstructor.h:
3146         * runtime/JSPromiseConstructor.cpp:
3147         (JSC::JSPromiseConstructor::create):
3148         (JSC::JSPromiseConstructor::finishCreation):
3149         * runtime/JSPromiseConstructor.h:
3150         * runtime/JSTypedArrayViewConstructor.cpp:
3151         (JSC::JSTypedArrayViewConstructor::finishCreation):
3152         (JSC::JSTypedArrayViewConstructor::create): Deleted.
3153         * runtime/JSTypedArrayViewConstructor.h:
3154         (JSC::JSTypedArrayViewConstructor::create):
3155         * runtime/MapConstructor.cpp:
3156         (JSC::MapConstructor::finishCreation):
3157         * runtime/MapConstructor.h:
3158         (JSC::MapConstructor::create):
3159         * runtime/NumberConstructor.h:
3160         (JSC::NumberConstructor::create):
3161         * runtime/RegExpConstructor.cpp:
3162         (JSC::RegExpConstructor::finishCreation):
3163         * runtime/RegExpConstructor.h:
3164         (JSC::RegExpConstructor::create):
3165         * runtime/SetConstructor.cpp:
3166         (JSC::SetConstructor::finishCreation):
3167         * runtime/SetConstructor.h:
3168         (JSC::SetConstructor::create):
3169         * runtime/StringConstructor.h:
3170         (JSC::StringConstructor::create):
3171         * runtime/SymbolConstructor.h:
3172         (JSC::SymbolConstructor::create):
3173         * runtime/WeakMapConstructor.h:
3174         (JSC::WeakMapConstructor::create):
3175         * runtime/WeakSetConstructor.h:
3176         (JSC::WeakSetConstructor::create):
3177         * tests/stress/symbol-species.js: Added.
3178         (testSymbolSpeciesOnConstructor):
3179
3180 2016-01-21  Benjamin Poulain  <benjamin@webkit.org>
3181
3182         [JSC] The IRC allocator can mess up the degree of Tmps interfering with move-related Tmps
3183         https://bugs.webkit.org/show_bug.cgi?id=153340
3184
3185         Reviewed by Filip Pizlo.
3186
3187         The JavaScriptCore tests uncovered an interested bug in the iterated register
3188         coalescing allocator. When coalescing a move under the right conditions, it is
3189         possible to mess-up the graph for the Tmps interfering with the coalesced Tmps.
3190
3191         Some context first:
3192         -When coalescing a move, we alias one Tmp to another. Let say that we had
3193              Move X, Y
3194          the coalescing may alias Y to X: Y->X.
3195         -Since X and Y are equivalent after coalescing, any interference
3196          edge with Y is "moved" to X.
3197          The way this was done was to add an edge to X for every edge there was with Y.
3198          Say we had an edge R--Y, we add an edge R--X.
3199          Adding an edge increases the degree of R and Y. The degree of R was then
3200          fixed by calling decrementDegree() on it.
3201         -decrementDegree() is non trivial. It will move the Tmp to the right list
3202          for further processing if the Tmp's degree becomes lower than the number
3203          of available registers.
3204
3205         The bug appear in a particular case. Say we have 3 Tmp, A, B, and C.
3206         -A and B are move related, they can be coalesced.
3207         -A has an interference edge with C.
3208         -B does not have and interfence edge with C.
3209         -C's degree is exactly the number of avaialble registers/colors minus one (k - 1).
3210          -> This implies C is already in its list.
3211
3212         We coalesce A and B into B (A->B).
3213         -The first step, addEdgeDistinct() adds an edge between B and C. The degrees of
3214          B and C are increased by one. The degree of C becomes k.
3215         -Next, decrementDegree() is called on C. Its degree decreases to k-1.
3216          Because of the change from k to k-1, decrementDegree() adds C to a list again.
3217
3218         We have two kinds of bugs depending on the test:
3219         -A Tmp can be added to the simplifyWorklist several time.
3220         -A Tmp can be in both simplifyWorklist and freezeWorklist (because its move-related
3221          status changed since the last decrementDegree()).
3222         In both cases, the Tmps interfering with the duplicated Tmp will end up with
3223         a degree lower than their real value.
3224
3225         * b3/air/AirIteratedRegisterCoalescing.cpp:
3226
3227 2016-01-21  Andreas Kling  <akling@apple.com>
3228
3229         Add some missing WTF_MAKE_FAST_ALLOCATED in JavaScriptCore.
3230         <https://webkit.org/b/153335>
3231
3232         Reviewed by Alex Christensen.
3233
3234         Saw these things getting system malloc()'ed in an Instruments trace.
3235
3236         * inspector/InspectorAgentBase.h:
3237         * jit/CallFrameShuffleData.h:
3238         * jit/CallFrameShuffler.h:
3239         * jit/RegisterAtOffsetList.h:
3240         * runtime/GenericOffset.h:
3241
3242 2016-01-21  Yusuke Suzuki  <utatane.tea@gmail.com>
3243
3244         [ES6] Catch parameter should accept BindingPattern
3245         https://bugs.webkit.org/show_bug.cgi?id=152385
3246
3247         Reviewed by Saam Barati.
3248
3249         This patch implements destructuring in catch parameter.
3250         Catch parameter accepts binding pattern and binding identifier.
3251         It creates lexical bindings. And "yield" and "let" are specially
3252         handled as is the same to function parameters.
3253
3254         In addition to that, we make destructuring parsing errors more descriptive.
3255
3256         * bytecompiler/BytecodeGenerator.cpp:
3257         (JSC::BytecodeGenerator::emitPushCatchScope):
3258         * bytecompiler/BytecodeGenerator.h:
3259         * bytecompiler/NodesCodegen.cpp:
3260         (JSC::TryNode::emitBytecode):
3261         * parser/ASTBuilder.h:
3262         (JSC::ASTBuilder::createTryStatement):
3263         * parser/NodeConstructors.h:
3264         (JSC::TryNode::TryNode):
3265         * parser/Nodes.h:
3266         * parser/Parser.cpp:
3267         (JSC::Parser<LexerType>::createBindingPattern):
3268         (JSC::Parser<LexerType>::tryParseDestructuringPatternExpression):
3269         (JSC::Parser<LexerType>::parseBindingOrAssignmentElement):
3270         (JSC::destructuringKindToVariableKindName):
3271         (JSC::Parser<LexerType>::parseDestructuringPattern):
3272         (JSC::Parser<LexerType>::parseTryStatement):
3273         (JSC::Parser<LexerType>::parseFormalParameters):
3274         (JSC::Parser<LexerType>::parseFunctionParameters):
3275         * parser/Parser.h:
3276         (JSC::Parser::destructuringKindFromDeclarationType):
3277         * parser/SyntaxChecker.h:
3278         (JSC::SyntaxChecker::createTryStatement):
3279         * tests/es6.yaml:
3280         * tests/es6/destructuring_in_catch_heads.js: Added.
3281         (test):
3282         * tests/stress/catch-parameter-destructuring.js: Added.
3283         (shouldBe):
3284         (shouldThrow):
3285         (prototype.call):
3286         (catch):
3287         (shouldThrow.try.throw.get error):
3288         (initialize):
3289         (array):
3290         (generator.gen):
3291         (generator):
3292         * tests/stress/catch-parameter-syntax.js: Added.
3293         (testSyntax):
3294         (testSyntaxError):
3295         * tests/stress/reserved-word-with-escape.js:
3296         (testSyntaxError.String.raw.a):
3297         (String.raw.SyntaxError.Cannot.use.the.keyword.string_appeared_here.as.a.name):
3298         * tests/stress/yield-named-variable.js:
3299
3300 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
3301
3302         Unreviewed, fix build.
3303
3304         * b3/B3EliminateCommonSubexpressions.cpp:
3305
3306 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
3307
3308         B3 CSE should be able to match a full redundancy even if none of the matches dominate the value in question
3309         https://bugs.webkit.org/show_bug.cgi?id=153321
3310
3311         Reviewed by Benjamin Poulain.
3312
3313         I once learned that LLVM's GVN can manufacture Phi functions. I don't know the details
3314         but I'm presuming that it involves:
3315
3316             if (p)
3317                 tmp1 = *ptr
3318             else
3319                 tmp2 = *ptr
3320             tmp3 = *ptr // Replace this with Phi(tmp1, tmp2).
3321
3322         This adds such an optimization to our CSE. The idea is that we search through basic
3323         blocks until we find the value we want, a side effect, or the start of the procedure. If
3324         we find a value that matches our search criteria, we record it and ignore the
3325         predecessors. If we find a side effect or the start of the procedure, we give up the
3326         whole search. This ensures that if we come out of the search without giving up, we'll
3327         have a set of matches that are fully redundant.
3328
3329         CSE could then create a Phi graph by using SSACalculator. But the recent work on FixSSA
3330         revealed a much more exciting option: create a stack slot! In case there is more than one
3331         match, CSE now creates a stack slot that each match stores to, and replaces the redundant
3332         instruction with a loadfrom the stack slot. The stack slot is anonymous, which ensures
3333         that FixSSA will turn it into an optimal Phi graph or whatever.
3334
3335         This is a significant speed-up on Octane/richards.
3336
3337         * b3/B3DuplicateTails.cpp:
3338         * b3/B3EliminateCommonSubexpressions.cpp:
3339         * b3/B3FixSSA.cpp:
3340         (JSC::B3::fixSSA):
3341         * b3/B3Generate.cpp:
3342         (JSC::B3::generateToAir):
3343         * b3/B3Procedure.h:
3344         (JSC::B3::Procedure::setFrontendData):
3345         (JSC::B3::Procedure::frontendData):
3346         * b3/testb3.cpp:
3347         * ftl/FTLState.cpp:
3348         (JSC::FTL::State::State):
3349
3350 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
3351
3352         Air should know that CeilDouble has the partial register stall issue