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