5ec31a9e60ac8fc4a58aafc791551c46747464d9
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2016-02-16  Filip Pizlo  <fpizlo@apple.com>
2
3         FTL_USES_B3 should be unconditionally true
4         https://bugs.webkit.org/show_bug.cgi?id=154324
5
6         Reviewed by Benjamin Poulain.
7
8         * dfg/DFGCommon.h:
9
10 2016-02-16  Filip Pizlo  <fpizlo@apple.com>
11
12         FTL should support CompareEq(String:, String:)
13         https://bugs.webkit.org/show_bug.cgi?id=154269
14         rdar://problem/24499921
15
16         Reviewed by Benjamin Poulain.
17
18         Looks like a slight pdfjs slow-down, probably because we're having some recompilations. I
19         think we should land the increased coverage first and fix the issues after, especially since
20         the regression is so small and doesn't have a statistically significant effect on the overall
21         score.
22
23         * ftl/FTLCapabilities.cpp:
24         (JSC::FTL::canCompile):
25         * ftl/FTLLowerDFGToLLVM.cpp:
26         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareEq):
27         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareStrictEq):
28         (JSC::FTL::DFG::LowerDFGToLLVM::nonSpeculativeCompare):
29         (JSC::FTL::DFG::LowerDFGToLLVM::stringsEqual):
30         * tests/stress/ftl-string-equality.js: Added.
31         * tests/stress/ftl-string-ident-equality.js: Added.
32         * tests/stress/ftl-string-strict-equality.js: Added.
33
34 2016-02-16  Filip Pizlo  <fpizlo@apple.com>
35
36         FTL should support NewTypedArray
37         https://bugs.webkit.org/show_bug.cgi?id=154268
38
39         Reviewed by Saam Barati.
40
41         3% speed-up on pdfjs. This was already covered by many different tests.
42
43         Rolling this back in after fixing the butterfly argument.
44
45         * ftl/FTLCapabilities.cpp:
46         (JSC::FTL::canCompile):
47         * ftl/FTLLowerDFGToLLVM.cpp:
48         (JSC::FTL::DFG::LowerDFGToLLVM::compileNode):
49         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewArrayWithSize):
50         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewTypedArray):
51         (JSC::FTL::DFG::LowerDFGToLLVM::compileAllocatePropertyStorage):
52         (JSC::FTL::DFG::LowerDFGToLLVM::allocateBasicStorageAndGetEnd):
53         (JSC::FTL::DFG::LowerDFGToLLVM::allocateBasicStorage):
54         (JSC::FTL::DFG::LowerDFGToLLVM::allocateObject):
55
56 2016-02-16  Gavin Barraclough  <barraclough@apple.com>
57
58         JSDOMWindow::getOwnPropertySlot should just call getStaticPropertySlot
59         https://bugs.webkit.org/show_bug.cgi?id=154257
60
61         Reviewed by Chris Dumez.
62
63         * runtime/Lookup.h:
64         (JSC::getStaticPropertySlot):
65         (JSC::getStaticFunctionSlot):
66         (JSC::getStaticValueSlot):
67             - this could all do with a little more love.
68               But enforce the basic precedence:
69                 (1) regular storage properties always win over static table properties.
70                 (2) if properties have been reified, don't consult the static tables.
71                 (3) only if the property is not present on the object & not reified
72                     should the static hashtable be consulted.
73
74 2016-02-16  Gavin Barraclough  <barraclough@apple.com>
75
76         JSDOMWindow::getOwnPropertySlot should not search photo chain
77         https://bugs.webkit.org/show_bug.cgi?id=154102
78
79         Reviewed by Chris Dumez.
80
81         Should only return *own* properties.
82
83         * runtime/JSObject.cpp:
84         (JSC::JSObject::getOwnPropertyDescriptor):
85             - remove hack/special-case for DOMWindow; we no longer need this.
86
87 2016-02-16  Keith Miller  <keith_miller@apple.com>
88
89         Spread operator should be allowed when not the first argument of parameter list
90         https://bugs.webkit.org/show_bug.cgi?id=152721
91
92         Reviewed by Saam Barati.
93
94         Spread arguments to functions should now be ES6 compliant. Before we
95         would only take a spread operator if it was the sole argument to a
96         function. Additionally, we would not use the Symbol.iterator on the
97         object to generate the arguments. Instead we would do a loop up to the
98         length mapping indexed properties to the corresponding argument. We fix
99         both these issues by doing an AST transformation from foo(...a, b, ...c, d)
100         to foo(...[...a, b, ...c, d]) (where the spread on the rhs uses the
101         old spread semantics). This solution has the downside of requiring the
102         allocation of another object and copying each element twice but avoids a
103         large change to the vm calling convention.
104
105         * interpreter/Interpreter.cpp:
106         (JSC::loadVarargs):
107         * parser/ASTBuilder.h:
108         (JSC::ASTBuilder::createElementList):
109         * parser/Parser.cpp:
110         (JSC::Parser<LexerType>::parseArguments):
111         (JSC::Parser<LexerType>::parseArgument):
112         (JSC::Parser<LexerType>::parseMemberExpression):
113         * parser/Parser.h:
114         * parser/SyntaxChecker.h:
115         (JSC::SyntaxChecker::createElementList):
116         * tests/es6.yaml:
117         * tests/stress/spread-calling.js: Added.
118         (testFunction):
119         (testEmpty):
120         (makeObject):
121         (otherIterator.return.next):
122         (otherIterator):
123         (totalIter):
124         (throwingIter.return.next):
125         (throwingIter):
126         (i.catch):
127
128 2016-02-16  Benjamin Poulain  <bpoulain@apple.com>
129
130         [JSC] Enable B3 on ARM64
131         https://bugs.webkit.org/show_bug.cgi?id=154275
132
133         Reviewed by Mark Lam.
134
135         The port passes more tests than LLVM now, let's use it by default.
136
137         * dfg/DFGCommon.h:
138
139 2016-02-16  Commit Queue  <commit-queue@webkit.org>
140
141         Unreviewed, rolling out r196652.
142         https://bugs.webkit.org/show_bug.cgi?id=154315
143
144         This change caused LayoutTest crashes (Requested by ryanhaddad
145         on #webkit).
146
147         Reverted changeset:
148
149         "FTL should support NewTypedArray"
150         https://bugs.webkit.org/show_bug.cgi?id=154268
151         http://trac.webkit.org/changeset/196652
152
153 2016-02-16  Brian Burg  <bburg@apple.com>
154
155         RemoteInspector should forward new automation session requests to its client
156         https://bugs.webkit.org/show_bug.cgi?id=154260
157         <rdar://problem/24663313>
158
159         Reviewed by Timothy Hatcher.
160
161         * inspector/remote/RemoteInspector.h:
162         * inspector/remote/RemoteInspector.mm:
163         (Inspector::RemoteInspector::xpcConnectionReceivedMessage):
164         (Inspector::RemoteInspector::listingForAutomationTarget):
165         Use the correct key for the session identifier in the listing. The name()
166         override for RemoteAutomationTarget is actually the session identifier.
167
168         (Inspector::RemoteInspector::receivedAutomationSessionRequestMessage):
169         * inspector/remote/RemoteInspectorConstants.h: Add new constants.
170
171 2016-02-16  Saam barati  <sbarati@apple.com>
172
173         SamplingProfiler still fails with ASan enabled
174         https://bugs.webkit.org/show_bug.cgi?id=154301
175         <rdar://problem/24679502>
176
177         Reviewed by Filip Pizlo.
178
179         To fix this issue, I've come up with unsafe versions
180         of all operations that load memory from the thread's call
181         frame. All these new unsafe methods are marked with SUPPRESS_ASAN.
182
183         * interpreter/CallFrame.cpp:
184         (JSC::CallFrame::callSiteAsRawBits):
185         (JSC::CallFrame::unsafeCallSiteAsRawBits):
186         (JSC::CallFrame::callSiteIndex):
187         (JSC::CallFrame::unsafeCallSiteIndex):
188         (JSC::CallFrame::stack):
189         (JSC::CallFrame::callerFrame):
190         (JSC::CallFrame::unsafeCallerFrame):
191         (JSC::CallFrame::friendlyFunctionName):
192         * interpreter/CallFrame.h:
193         (JSC::ExecState::calleeAsValue):
194         (JSC::ExecState::callee):
195         (JSC::ExecState::unsafeCallee):
196         (JSC::ExecState::codeBlock):
197         (JSC::ExecState::unsafeCodeBlock):
198         (JSC::ExecState::scope):
199         (JSC::ExecState::callerFrame):
200         (JSC::ExecState::callerFrameOrVMEntryFrame):
201         (JSC::ExecState::unsafeCallerFrameOrVMEntryFrame):
202         (JSC::ExecState::callerFrameOffset):
203         (JSC::ExecState::callerFrameAndPC):
204         (JSC::ExecState::unsafeCallerFrameAndPC):
205         * interpreter/Register.h:
206         (JSC::Register::codeBlock):
207         (JSC::Register::asanUnsafeCodeBlock):
208         (JSC::Register::unboxedInt32):
209         (JSC::Register::tag):
210         (JSC::Register::unsafeTag):
211         (JSC::Register::payload):
212         * interpreter/VMEntryRecord.h:
213         (JSC::VMEntryRecord::prevTopCallFrame):
214         (JSC::VMEntryRecord::unsafePrevTopCallFrame):
215         (JSC::VMEntryRecord::prevTopVMEntryFrame):
216         (JSC::VMEntryRecord::unsafePrevTopVMEntryFrame):
217         * runtime/SamplingProfiler.cpp:
218         (JSC::FrameWalker::walk):
219         (JSC::FrameWalker::advanceToParentFrame):
220         (JSC::FrameWalker::isAtTop):
221         (JSC::FrameWalker::resetAtMachineFrame):
222
223 2016-02-16  Filip Pizlo  <fpizlo@apple.com>
224
225         FTL should support NewTypedArray
226         https://bugs.webkit.org/show_bug.cgi?id=154268
227
228         Reviewed by Saam Barati.
229
230         3% speed-up on pdfjs. This was already covered by many different tests.
231
232         * ftl/FTLCapabilities.cpp:
233         (JSC::FTL::canCompile):
234         * ftl/FTLLowerDFGToLLVM.cpp:
235         (JSC::FTL::DFG::LowerDFGToLLVM::compileNode):
236         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewArrayWithSize):
237         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewTypedArray):
238         (JSC::FTL::DFG::LowerDFGToLLVM::compileAllocatePropertyStorage):
239         (JSC::FTL::DFG::LowerDFGToLLVM::allocateBasicStorageAndGetEnd):
240         (JSC::FTL::DFG::LowerDFGToLLVM::allocateBasicStorage):
241         (JSC::FTL::DFG::LowerDFGToLLVM::allocateObject):
242
243 2016-02-16  Saam barati  <sbarati@apple.com>
244
245         stress/sampling-profiler-deep-stack.js fails on ARM 32bit
246         https://bugs.webkit.org/show_bug.cgi?id=154255
247         <rdar://problem/24662996>
248
249         Reviewed by Mark Lam.
250
251         The bug here wasn't in the implementation of the sampling profiler 
252         itself. Rather, it was a bug in the test. JSC wasn't spending a lot
253         of time in a function that the test assumed a lot of time was spent in.
254         That's because the DFG was doing a good job at optimizing the function
255         at the leaf of the recursion. Because of that, we often wouldn't sample it.
256         I fixed this by making the leaf function do more work.
257
258         * tests/stress/sampling-profiler-deep-stack.js:
259         (platformSupportsSamplingProfiler.foo):
260
261 2016-02-16  Chris Dumez  <cdumez@apple.com>
262
263         [Web IDL] Operations should be on the instance for global objects or if [Unforgeable]
264         https://bugs.webkit.org/show_bug.cgi?id=154120
265         <rdar://problem/24613231>
266
267         Reviewed by Gavin Barraclough.
268
269         Have putEntry() take a thisValue parameter in addition to the base,
270         instead of relying on PropertySlot::thisValue() because this did not
271         always do the right thing. In particular, when JSDOMWindow::put() was
272         called to set a function, it would end up setting the new value on the
273         JSDOMWindowShell instead of the actual JSDOMWindow.
274         JSDOMWindow::getOwnPropertySlot() would then not be able to find it.
275         Therefore the following would fail:
276         $ window.open = "test"
277         $ console.log(window.open) // prints the native function instead of "test"
278
279         * runtime/JSObject.cpp:
280         (JSC::JSObject::putInlineSlow):
281         * runtime/Lookup.h:
282         (JSC::putEntry):
283         (JSC::lookupPut):
284
285 2016-02-16  Keith Miller  <keith_miller@apple.com>
286
287         ClonedArguments should not materialize its special properties unless they are being changed or deleted
288         https://bugs.webkit.org/show_bug.cgi?id=154128
289
290         Reviewed by Filip Pizlo.
291
292         Before we would materialize ClonedArguments whenever they were being accessed.
293         However this would cause the IC to miss every time as the structure for
294         the arguments object would change as we went to IC it. Thus on the next
295         function call we would miss the cache since the new arguments object
296         would not have materialized the value.
297
298         * runtime/ClonedArguments.cpp:
299         (JSC::ClonedArguments::getOwnPropertySlot):
300         * tests/stress/cloned-arguments-modification.js: Added.
301         (foo):
302
303 2016-02-16  Filip Pizlo  <fpizlo@apple.com>
304
305         FTL should support StringFromCharCode
306         https://bugs.webkit.org/show_bug.cgi?id=154267
307         rdar://problem/24192536
308
309         Reviewed by Mark Lam.
310
311         * dfg/DFGFixupPhase.cpp:
312         (JSC::DFG::FixupPhase::fixupNode): Fix a bug preventing the UntypedUse from being effective.
313         * ftl/FTLCapabilities.cpp:
314         (JSC::FTL::canCompile):
315         * ftl/FTLLowerDFGToLLVM.cpp:
316         (JSC::FTL::DFG::LowerDFGToLLVM::compileNode):
317         (JSC::FTL::DFG::LowerDFGToLLVM::compileStringFromCharCode): Implement the opcode.
318         * tests/stress/string-from-char-code-slow.js: Added.
319
320 2016-02-15  Benjamin Poulain  <bpoulain@apple.com>
321
322         [JSC] BranchAdd can override arguments of its stackmap
323         https://bugs.webkit.org/show_bug.cgi?id=154274
324
325         Reviewed by Filip Pizlo.
326
327         With the 3 operands BranchAdd added in r196513, we can run into
328         a register allocation such that the destination register is also
329         used by a value in the stack map.
330
331         It use to be that BranchAdd was a 2 operand instruction.
332         In that form, the destination is also one of the source and
333         can be recovered through Sub. There is no conflict between
334         destination and the stackmap.
335
336         After r196513, the destination has its own value. It is uncommon
337         on x86 because of the aggressive aliasing but that can happen.
338         On ARM, that's a standard form since there is no need for aliasing.
339
340         Since the arguments of the stackmap are of type EarlyUse,
341         they appeared as not interfering with the destination. When the register
342         allocator gives the same register to the destination and something in
343         the stack map, the result of BranchAdd destroys the value kept alive
344         for the stackmap.
345
346         In this patch, I introduce a concept very similar to ForceLateUse
347         to keep the argument of the stackmap live in CheckAdd. The new
348         role is "ForceLateUseUnlessRecoverable".
349
350         In this mode, anything that is not also an input argument becomes
351         LateUse. As such, it interferes with the destination of CheckAdd.
352         The arguments are recovered by the slow patch of CheckAdd. They
353         remain Early use.
354
355         This new modes ensure that destination can be aliased to the source
356         when that's useful, while making sure it is not aliased with another
357         value that needs to be live on exit.
358
359         * b3/B3CheckSpecial.cpp:
360         (JSC::B3::CheckSpecial::forEachArg):
361         * b3/B3LowerToAir.cpp:
362         (JSC::B3::Air::LowerToAir::lower):
363         * b3/B3PatchpointSpecial.cpp:
364         (JSC::B3::PatchpointSpecial::forEachArg):
365         * b3/B3StackmapSpecial.cpp:
366         (JSC::B3::StackmapSpecial::forEachArgImpl):
367         (WTF::printInternal):
368         * b3/B3StackmapSpecial.h:
369         * b3/B3StackmapValue.h:
370
371 2016-02-15  Joseph Pecoraro  <pecoraro@apple.com>
372
373         Web Inspector: Web Workers have no access to console for debugging
374         https://bugs.webkit.org/show_bug.cgi?id=26237
375
376         Reviewed by Timothy Hatcher.
377
378         * inspector/ConsoleMessage.h:
379         Add accessor for MessageLevel.
380
381 2016-02-15  Mark Lam  <mark.lam@apple.com>
382
383         [ARMv7] stress/op_rshift.js and stress/op_urshift.js are failing.
384         https://bugs.webkit.org/show_bug.cgi?id=151514
385
386         Reviewed by Filip Pizlo.
387
388         The issue turns out to be trivial: on ARMv7 (and traditional ARM too), arithmetic
389         shift right (ASR) and logical shift right (LSR) takes an immediate shift amount
390         from 1-32.  See http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Cjacbgca.html.
391         An immediate shift amount of 0 is interpreted as a shift of 32 bits.
392
393         Meanwhile, our macro assembler is expecting the immediate shift value to be
394         between 0-31.  As a result, a shift amount of 0 is being wrongly encoded with 0
395         bits which means shift right by 32 bits.
396
397         The fix is to check if the shift amount is 0, and if so, emit a move.  Else,
398         emit the right shift as usual.
399
400         This issue does not affect left shifts, as the immediate shift amount for left
401         shifts is between 0-31 as our macro assembler expects.
402
403         * assembler/MacroAssemblerARM.h:
404         (JSC::MacroAssemblerARM::rshift32):
405         (JSC::MacroAssemblerARM::urshift32):
406         (JSC::MacroAssemblerARM::sub32):
407         * assembler/MacroAssemblerARMv7.h:
408         (JSC::MacroAssemblerARMv7::rshift32):
409         (JSC::MacroAssemblerARMv7::urshift32):
410
411         * tests/stress/op_rshift.js:
412         * tests/stress/op_urshift.js:
413         - Un-skip these tests.  They should always pass now.
414
415 2016-02-15  Filip Pizlo  <fpizlo@apple.com>
416
417         Parser::parseVariableDeclarationList should null check the node before attempting to create a new CommaExpr
418         https://bugs.webkit.org/show_bug.cgi?id=154244
419         rdar://problem/24290670
420
421         Reviewed by Michael Saboff.
422
423         * parser/ASTBuilder.h:
424         (JSC::ASTBuilder::appendToCommaExpr): Catch the bug sooner in debug.
425         * parser/Parser.cpp:
426         (JSC::Parser<LexerType>::parseVariableDeclarationList): Fix the bug.
427         * tests/stress/for-let-comma.js: Added. This used to crash in debug and release.
428
429 2016-02-15  Benjamin Poulain  <bpoulain@apple.com>
430
431         [JSC] Improve the interface of Inst::shouldTryAliasingDef()
432         https://bugs.webkit.org/show_bug.cgi?id=154227
433
434         Reviewed by Andreas Kling.
435
436         Using Optional<> instead of a bool+reference looks cleaner
437         at the call sites.
438
439         * b3/B3CheckSpecial.cpp:
440         (JSC::B3::CheckSpecial::shouldTryAliasingDef):
441         * b3/B3CheckSpecial.h:
442         * b3/air/AirCustom.h:
443         (JSC::B3::Air::PatchCustom::shouldTryAliasingDef):
444         * b3/air/AirInst.h:
445         * b3/air/AirInstInlines.h:
446         (JSC::B3::Air::Inst::shouldTryAliasingDef):
447         * b3/air/AirIteratedRegisterCoalescing.cpp:
448         * b3/air/AirSpecial.cpp:
449         (JSC::B3::Air::Special::shouldTryAliasingDef):
450         * b3/air/AirSpecial.h:
451
452 2016-02-14  Brian Burg  <bburg@apple.com>
453
454         WKAutomationDelegate's requestAutomationSession should take a suggested session identifier
455         https://bugs.webkit.org/show_bug.cgi?id=154012
456         <rdar://problem/24557697>
457
458         Reviewed by Darin Adler.
459
460         Add a string parameter to the client method for requesting a new session.
461
462         * inspector/remote/RemoteInspector.h:
463
464 2016-02-13  Timothy Hatcher  <timothy@apple.com>
465
466         Fix WebAssembly bug URL in the feature list.
467
468         * features.json:
469
470 2016-02-12  Sukolsak Sakshuwong  <sukolsak@gmail.com>
471
472         Change the last RefPtr::get() to release() in String.prototype.normalize
473         https://bugs.webkit.org/show_bug.cgi?id=154211
474
475         Reviewed by Ryosuke Niwa.
476
477         Change the last RefPtr::get() to release() in String.prototype.normalize.
478
479         * runtime/StringPrototype.cpp:
480         (JSC::normalize):
481
482 2016-02-12  Saam barati  <sbarati@apple.com>
483
484         [ES6] we have an incorrect syntax error when a callee of a function expression has the same name as a top-level lexical declaration
485         https://bugs.webkit.org/show_bug.cgi?id=154143
486
487         Reviewed by Benjamin Poulain.
488
489         We were raising syntax errors on the following type of programs when
490         we shouldn't have been.
491         ```
492         (function foo() { const foo = 20; });
493         ```
494
495         * parser/Parser.cpp:
496         (JSC::Parser<LexerType>::parseFunctionInfo):
497         * parser/Parser.h:
498         (JSC::Scope::computeLexicallyCapturedVariablesAndPurgeCandidates):
499         (JSC::Scope::declareCallee):
500         (JSC::Scope::declareVariable):
501         (JSC::Scope::hasDeclaredVariable):
502         (JSC::Scope::hasLexicallyDeclaredVariable):
503         (JSC::Scope::hasDeclaredParameter):
504         (JSC::Scope::declareWrite):
505         (JSC::Scope::getCapturedVars):
506
507 2016-02-12  Benjamin Poulain  <bpoulain@apple.com>
508
509         [JSC] ZeroExtend and SignExtend use incorrect addressing on ARM64
510         https://bugs.webkit.org/show_bug.cgi?id=154208
511
512         Reviewed by Filip Pizlo.
513
514         When lowering:
515             @1 = Load32(@x)
516             @2 = SExt8(@1)
517
518         LowerToAir would see there is a form of SignExtend8To32 (an alias for Load8S)
519         and use that.
520
521         There are two problems with that:
522         1) If we have an Addr, it went through legalizeMemoryOffsets() for a 32bits
523            load. If used on an other kind of load, there is no guarantee the addressing
524            is still valid.
525         2) If we have an Index, it is computed for the 32bits MemoryValue.
526            The computed index is not valid for the 8bits load.
527
528         (2) could be fixed by changing LowerToAir to use the current instruction width
529         instead of the B3ValueWidth but that's a bit tricky. We should just embrace
530         that one of our target is a Load-Store architecture.
531
532         In this patch, I just disabled the faulty forms on ARM64. We still need those operations
533         to be fast, this will be addressed in: https://bugs.webkit.org/show_bug.cgi?id=154207
534
535         I also strengthened the m_allowScratchRegister assertion. The instructions that do not
536         invalidate the temporary did not run the assertion, making this harder to debug.
537
538         * assembler/MacroAssemblerARM64.h:
539         (JSC::MacroAssemblerARM64::load8):
540         (JSC::MacroAssemblerARM64::store64):
541         (JSC::MacroAssemblerARM64::store32):
542         (JSC::MacroAssemblerARM64::loadDouble):
543         (JSC::MacroAssemblerARM64::storeDouble):
544         (JSC::MacroAssemblerARM64::branch32):
545         (JSC::MacroAssemblerARM64::branch64):
546         (JSC::MacroAssemblerARM64::getCachedDataTempRegisterIDAndInvalidate):
547         (JSC::MacroAssemblerARM64::getCachedMemoryTempRegisterIDAndInvalidate):
548         (JSC::MacroAssemblerARM64::dataMemoryTempRegister):
549         (JSC::MacroAssemblerARM64::cachedMemoryTempRegister):
550         (JSC::MacroAssemblerARM64::load):
551         (JSC::MacroAssemblerARM64::store):
552         * b3/air/AirOpcode.opcodes:
553
554 2016-02-12  Michael Saboff  <msaboff@apple.com>
555
556         offlineasm: Emit Dwarf2 file and location directives to allow for debugging .asm files
557         https://bugs.webkit.org/show_bug.cgi?id=152703
558
559         Reviewed by Mark Lam.
560
561         Added support to output Dwarf2 .file and .loc assembler directives to provide the debugging
562         information needed to correlate the offline assembler generated code with the source lines 
563         in the .asm files.
564
565         Changed the tracking of file data to include a file index that was provided to the .file
566         directive.  That index is used when emitting the .loc directives.
567
568         * offlineasm/arm.rb:
569         * offlineasm/arm64.rb:
570         * offlineasm/asm.rb:
571         * offlineasm/backends.rb:
572         * offlineasm/config.rb:
573         * offlineasm/parser.rb:
574         * offlineasm/x86.rb:
575
576 2016-02-12  Saam barati  <sbarati@apple.com>
577
578         The parser doesn't properly protect against global variable references in builtins
579         https://bugs.webkit.org/show_bug.cgi?id=154144
580
581         Reviewed by Geoffrey Garen.
582
583         This patch fixes our global variable reference detection
584         algorithm that was broken. After fixing the algorithm, I
585         detected many places where we were incorrectly using global
586         variables. I've fixed all those.
587
588         * builtins/BuiltinExecutables.cpp:
589         (JSC::createExecutableInternal):
590         * builtins/NumberPrototype.js:
591         (toLocaleString):
592         * builtins/PromiseConstructor.js:
593         (race):
594         (reject):
595         (resolve):
596         * parser/Nodes.cpp:
597         (JSC::ProgramNode::ProgramNode):
598         (JSC::ModuleProgramNode::ModuleProgramNode):
599         (JSC::ProgramNode::setClosedVariables): Deleted.
600         * parser/Nodes.h:
601         (JSC::ScopeNode::setClosedVariables): Deleted.
602         (JSC::ProgramNode::closedVariables): Deleted.
603         * parser/Parser.cpp:
604         (JSC::Parser<LexerType>::parseInner):
605         (JSC::Parser<LexerType>::didFinishParsing):
606         * parser/Parser.h:
607         (JSC::Scope::setIsLexicalScope):
608         (JSC::Scope::isLexicalScope):
609         (JSC::Scope::closedVariableCandidates):
610         (JSC::Scope::declaredVariables):
611         (JSC::Scope::lexicalVariables):
612         (JSC::Scope::finalizeLexicalEnvironment):
613         (JSC::Parser::positionBeforeLastNewline):
614         (JSC::Parser::locationBeforeLastToken):
615         (JSC::Parser::isFunctionMetadataNode):
616         (JSC::parse):
617         (JSC::Parser::closedVariables): Deleted.
618
619 2016-02-12  Filip Pizlo  <fpizlo@apple.com>
620
621         JSObject::putByIndexBeyondVectorLengthWithoutAttributes needs to go to the sparse map based on MAX_STORAGE_VECTOR_INDEX
622         https://bugs.webkit.org/show_bug.cgi?id=154201
623         rdar://problem/24291387
624
625         Reviewed by Saam Barati.
626
627         I decided against adding a test for this, because it runs for a very long time.
628
629         * runtime/JSObject.cpp:
630         (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes): Fix the bug.
631         * runtime/StringPrototype.cpp:
632         (JSC::stringProtoFuncSplit): Fix a related bug: if this code creates an array that would have
633             hit the above bug, then it would probably manifest as a spin or as swapping.
634
635 2016-02-12  Jonathan Davis  <jond@apple.com>
636
637         Add WebAssembly to the status page
638         https://bugs.webkit.org/show_bug.cgi?id=154199
639
640         Reviewed by Timothy Hatcher.
641
642         * features.json:
643
644 2016-02-12  Brian Burg  <bburg@apple.com>
645
646         Web Inspector: disambiguate the various identifier and connection types in RemoteInspector
647         https://bugs.webkit.org/show_bug.cgi?id=154130
648
649         Reviewed by Joseph Pecoraro.
650
651         There are multiple identifier types:
652             - connection identifier, a string UUID for a remote debugger process.
653             - session identifier, a string UUID for a remote driver/debugger instance.
654             - page/target identifier, a number unique within a single process.
655
656         There are multiple connection types:
657             - RemoteInspectorXPCConnection, a connection from RemoteInspectorXPCConnectionor to a relay.
658             - RemoteConnectionToTarget, a class that bridges to targets' dispatch queues.
659
660         Use consistent variable and getter names so that these don't get confused and
661         so that the code is easier to read. This is especially an improvement when working
662         with multiple target types or connection types within the same function.
663
664         * inspector/remote/RemoteConnectionToTarget.h:
665         * inspector/remote/RemoteConnectionToTarget.mm:
666         Remove the member for m_identifier since we can ask the target for its target identifier
667         or use a default value via WTF::Optional. There's no reason to cache the value.
668
669         (Inspector::RemoteTargetHandleRunSourceWithInfo):
670         (Inspector::RemoteConnectionToTarget::targetIdentifier):
671         (Inspector::RemoteConnectionToTarget::destination):
672         (Inspector::RemoteConnectionToTarget::setup):
673         (Inspector::RemoteConnectionToTarget::sendMessageToFrontend):
674         Bail out if the target pointer was somehow cleared and we can't get a useful target identifier.
675
676         (Inspector::RemoteConnectionToTarget::RemoteConnectionToTarget): Deleted.
677         * inspector/remote/RemoteControllableTarget.h:
678         * inspector/remote/RemoteInspectionTarget.cpp:
679         (Inspector::RemoteInspectionTarget::pauseWaitingForAutomaticInspection):
680         (Inspector::RemoteInspectionTarget::unpauseForInitializedInspector):
681         * inspector/remote/RemoteInspector.h:
682         * inspector/remote/RemoteInspector.mm:
683         (Inspector::RemoteInspector::nextAvailableTargetIdentifier):
684         (Inspector::RemoteInspector::registerTarget):
685         (Inspector::RemoteInspector::unregisterTarget):
686         (Inspector::RemoteInspector::updateTarget):
687         (Inspector::RemoteInspector::updateAutomaticInspectionCandidate):
688         (Inspector::RemoteInspector::sendAutomaticInspectionCandidateMessage):
689         (Inspector::RemoteInspector::sendMessageToRemote):
690         (Inspector::RemoteInspector::setupFailed):
691         (Inspector::RemoteInspector::setupCompleted):
692         (Inspector::RemoteInspector::stopInternal):
693         (Inspector::RemoteInspector::setupXPCConnectionIfNeeded):
694         (Inspector::RemoteInspector::xpcConnectionFailed):
695         (Inspector::RemoteInspector::listingForInspectionTarget):
696         (Inspector::RemoteInspector::listingForAutomationTarget):
697         (Inspector::RemoteInspector::pushListingsNow):
698         (Inspector::RemoteInspector::pushListingsSoon):
699         (Inspector::RemoteInspector::updateHasActiveDebugSession):
700         (Inspector::RemoteInspector::receivedSetupMessage):
701         (Inspector::RemoteInspector::receivedDataMessage):
702         (Inspector::RemoteInspector::receivedDidCloseMessage):
703         (Inspector::RemoteInspector::receivedIndicateMessage):
704         (Inspector::RemoteInspector::receivedProxyApplicationSetupMessage):
705         (Inspector::RemoteInspector::receivedConnectionDiedMessage):
706         (Inspector::RemoteInspector::receivedAutomaticInspectionRejectMessage):
707         (Inspector::RemoteInspector::nextAvailableIdentifier): Deleted.
708         * inspector/remote/RemoteInspectorConstants.h:
709
710 2016-02-12  Benjamin Poulain  <benjamin@webkit.org>
711
712         [JSC] On x86, improve the selection of which value are selected for the UseDef part of commutative operations
713         https://bugs.webkit.org/show_bug.cgi?id=154151
714
715         Reviewed by Filip Pizlo.
716
717         Previously, when an instruction destroy an argument with
718         a UseDef use, we would try to pick a good target for the UseDef
719         while doing instruction selection.
720
721         For example:
722             @x = Add(@1, @2)
723
724         can be lowered to:
725             Move @1 Tmp3
726             Add @2 Tmp3
727         or
728             Move @2 Tmp3
729             Add @1 Tmp3
730
731         The choice of which value ends up copied is done by preferRightForResult()
732         at lowering time.
733
734         There are two common problems with the code we generate:
735         1) It is based on UseCount. If a value is at its last use,
736            it is a good target for coalescing even with a use-count > 1.
737         2) When both values are at their last use, the best choice
738            depends on the register pressure of each. We don't have that information
739            until we do register allocation.
740
741         This patch implements a simple idea to minimize how many of those Moves are needed.
742         Each commutative operation gets a 3 op variant. The register allocator then attempts
743         to alias *both* of them to the destination.
744         Since our aliasing is conservative, it removes as many copy as possible without causing
745         spilling.
746
747         There was an unexpected cool impovement too. If you have:
748             Move Tmp1, Tmp2
749             BranchAdd32 Tmp3, Tmp2
750         we would previously restore Tmp2 by substracting Tmp3 from the result.
751         We can now just use Tmp1. That removes quite a few Sub from the slow paths.
752
753         The problem is that simple idea uncoverred a bunch of issues that had to be fixed too.
754         I detail them inline below.
755
756         * assembler/MacroAssemblerARM64.h:
757         (JSC::MacroAssemblerARM64::and64):
758         * assembler/MacroAssemblerX86Common.h:
759         Most addition are adding an Address version of the 3 operands opcodes.
760         The reason for this is allow the complex addressing forms of instructions
761         when spilling.
762
763         (JSC::MacroAssemblerX86Common::and32):
764         (JSC::MacroAssemblerX86Common::mul32):
765         (JSC::MacroAssemblerX86Common::or32):
766         (JSC::MacroAssemblerX86Common::xor32):
767         (JSC::MacroAssemblerX86Common::moveDouble):
768         This was an unexpected discovery: removing tons of Move32 made floating-point heavy
769         code much slower.
770
771         It turns out the MoveDouble we were using has partial register dependencies.
772
773         The x86 optimization manual, Chapter 3, section 3.4.1.13 lists the move instructions executed
774         directly on the frontend. That's what we use now.
775
776         (JSC::MacroAssemblerX86Common::addDouble):
777         (JSC::MacroAssemblerX86Common::addFloat):
778         (JSC::MacroAssemblerX86Common::mulDouble):
779         (JSC::MacroAssemblerX86Common::mulFloat):
780         (JSC::MacroAssemblerX86Common::andDouble):
781         (JSC::MacroAssemblerX86Common::andFloat):
782         (JSC::MacroAssemblerX86Common::xorDouble):
783         (JSC::MacroAssemblerX86Common::xorFloat):
784         If the destination is not aliased, the version taking an address
785         use LoadFloat/LoadDouble instead of direct addressing.
786
787         That is because this:
788             Move Tmp1, Tmp2
789             Op [Tmp3], Tmp2
790         is slower than
791             Move [Tmp3] Tmp2
792             Op Tmp1, Tmp2
793         (sometimes significantly).
794
795         I am not exactly sure why.
796
797         (JSC::MacroAssemblerX86Common::branchAdd32):
798         * assembler/MacroAssemblerX86_64.h:
799         (JSC::MacroAssemblerX86_64::and64):
800         * assembler/MacroAssemblerARM64.h:
801         (JSC::MacroAssemblerARM64::and64):
802         * assembler/MacroAssemblerX86Common.h:
803         (JSC::MacroAssemblerX86Common::and32):
804         (JSC::MacroAssemblerX86Common::mul32):
805         (JSC::MacroAssemblerX86Common::or32):
806         (JSC::MacroAssemblerX86Common::xor32):
807         (JSC::MacroAssemblerX86Common::moveDouble):
808         (JSC::MacroAssemblerX86Common::addDouble):
809         (JSC::MacroAssemblerX86Common::addFloat):
810         (JSC::MacroAssemblerX86Common::mulDouble):
811         (JSC::MacroAssemblerX86Common::mulFloat):
812         (JSC::MacroAssemblerX86Common::andDouble):
813         (JSC::MacroAssemblerX86Common::andFloat):
814         (JSC::MacroAssemblerX86Common::xorDouble):
815         (JSC::MacroAssemblerX86Common::xorFloat):
816         (JSC::MacroAssemblerX86Common::branchAdd32):
817         * assembler/MacroAssemblerX86_64.h:
818         (JSC::MacroAssemblerX86_64::and64):
819         (JSC::MacroAssemblerX86_64::mul64):
820         (JSC::MacroAssemblerX86_64::xor64):
821         (JSC::MacroAssemblerX86_64::branchAdd64):
822         * assembler/X86Assembler.h:
823         (JSC::X86Assembler::movapd_rr):
824         (JSC::X86Assembler::movaps_rr):
825         * b3/B3CheckSpecial.cpp:
826         (JSC::B3::CheckSpecial::shouldTryAliasingDef):
827         (JSC::B3::CheckSpecial::generate):
828         * b3/B3CheckSpecial.h:
829         * b3/B3LowerToAir.cpp:
830         (JSC::B3::Air::LowerToAir::lower):
831         * b3/air/AirCustom.h:
832         (JSC::B3::Air::PatchCustom::shouldTryAliasingDef):
833         * b3/air/AirInst.h:
834         * b3/air/AirInstInlines.h:
835         (JSC::B3::Air::Inst::shouldTryAliasingDef):
836         * b3/air/AirIteratedRegisterCoalescing.cpp:
837         Aliasing the operands is done the same way as any coalescing.
838
839         There were problem with considering all those coalescing
840         as equivalent for the result.
841
842         Moves are mostly generated for Upsilon-Phis. Getting rid of
843         those tends to give better loops.
844
845         Sometimes, blocks have only Phis and a Jump. Coalescing
846         those moves gets rids of the block entirely.
847
848         Where it go interesting was that something like:
849             Move Tmp1, Tmp2
850             Op Tmp3, Tmp2
851         was significantly better than:
852             Op Tmp1, Tmp3
853             Move Tmp1, Tmp4
854         even in the same basic block.
855
856         To get back to the same performance when, I had to prioritize
857         regular Moves operations over argument coalescing.
858
859         Another argument for doing this is that the alias has a shorter
860         life in the hardware because the operation itself gets a new
861         virtual register from the bank.
862
863         * b3/air/AirOpcode.opcodes:
864         * b3/air/AirSpecial.cpp:
865         (JSC::B3::Air::Special::shouldTryAliasingDef):
866         * b3/air/AirSpecial.h:
867         * b3/testb3.cpp:
868         (JSC::B3::testCheckAddArgumentAliasing64):
869         (JSC::B3::testCheckAddArgumentAliasing32):
870         (JSC::B3::testCheckAddSelfOverflow64):
871         (JSC::B3::testCheckAddSelfOverflow32):
872         (JSC::B3::testCheckMulArgumentAliasing64):
873         (JSC::B3::testCheckMulArgumentAliasing32):
874         (JSC::B3::run):
875
876         * dfg/DFGOSRExitCompilerCommon.cpp:
877         (JSC::DFG::reifyInlinedCallFrames):
878         * jit/AssemblyHelpers.h:
879         (JSC::AssemblyHelpers::emitSaveOrCopyCalleeSavesFor):
880         This ruined my week.
881
882         When regenerating the frame of an inlined function that
883         was called through a tail call, we were ignoring r13 for some reason.
884
885         Since this patch makes it more likely to increase the degree
886         of each Tmp, the number of register used increased and r13 was more
887         commonly used.
888
889         When getting out of OSRExit, we would have that value trashed :(
890
891         The fix is simply to restore it like the other two Baseline callee saved
892         register.
893
894 2016-02-12  Yusuke Suzuki  <utatane.tea@gmail.com>
895
896         [ES6] Implement @@search
897         https://bugs.webkit.org/show_bug.cgi?id=143889
898
899         Reviewed by Darin Adler.
900
901         Implement RegExp.prototype[@@search].
902         In ES6, String.prototype.search delegates the actual matching to it
903         instead of executing RegExp matching inside String.prototype.search method itself.
904         By customizing @@search method, we can change the behavior of String.prototype.search for
905         derived / customized RegExp object.
906
907         * CMakeLists.txt:
908         * DerivedSources.make:
909         * builtins/BuiltinNames.h:
910         (JSC::BuiltinNames::BuiltinNames): Deleted.
911         * builtins/BuiltinUtils.h:
912         * builtins/StringPrototype.js:
913         (search):
914         * bytecode/BytecodeIntrinsicRegistry.cpp:
915         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
916         * bytecode/BytecodeIntrinsicRegistry.h:
917         * runtime/CommonIdentifiers.h:
918         * runtime/JSGlobalObject.cpp:
919         (JSC::JSGlobalObject::init):
920         * runtime/RegExpPrototype.cpp:
921         (JSC::RegExpPrototype::finishCreation):
922         (JSC::regExpProtoFuncSearch):
923         * runtime/RegExpPrototype.h:
924         (JSC::RegExpPrototype::create):
925         * runtime/StringPrototype.cpp:
926         (JSC::StringPrototype::getOwnPropertySlot):
927         (JSC::StringPrototype::finishCreation): Deleted.
928         (JSC::stringProtoFuncSearch): Deleted.
929         * runtime/StringPrototype.h:
930         * tests/es6.yaml:
931         * tests/stress/regexp-search.js: Added.
932         (shouldBe):
933         (shouldThrow):
934         (errorKey.toString):
935         (primitive.of.primitives.shouldThrow):
936         (testRegExpSearch):
937         (testSearch):
938         (testBoth):
939         (alwaysUnmatch):
940
941 2016-02-12  Keith Miller  <keith_miller@apple.com>
942
943         AdaptiveInferredPropertyValueWatchpoint can trigger a GC that frees its CodeBlock and thus itself
944         https://bugs.webkit.org/show_bug.cgi?id=154146
945
946         Reviewed by Filip Pizlo.
947
948         Consider the following: there is some CodeBlock, C, that is watching some object, O, with a
949         structure, S, for replacements. Also, suppose that C has no references anymore and is due to
950         be GCed. Now, when some new property is added to O, S will create a new structure S' and
951         fire its transition watchpoints. Since C is watching S for replacements it will attempt to
952         have its AdaptiveInferredPropertyValueWatchpoint relocate itself to S'. To do so, it needs
953         it allocate RareData on S'. This allocation may cause a GC, which frees C while still
954         executing its watchpoint handler. The solution to this is to defer GC while running
955         AdaptiveInferredPropertyValueWatchpointBase handlers.
956
957         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
958         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
959
960 2016-02-12  Gavin Barraclough  <barraclough@apple.com>
961
962         Separate out !allowsAccess path in JSDOMWindowCustom getOwnPropertySlot
963         https://bugs.webkit.org/show_bug.cgi?id=154156
964
965         Reviewed by Chris Dumez.
966
967         * runtime/CommonIdentifiers.h:
968             - added new property names, needed by jsDOMWindowGetOwnPropertySlotDisallowAccess.
969
970 2016-02-12  Sukolsak Sakshuwong  <sukolsak@gmail.com>
971
972         Update ICU header files to version 52
973         https://bugs.webkit.org/show_bug.cgi?id=154160
974
975         Reviewed by Alex Christensen.
976
977         Update ICU header files to version 52 to allow the use of newer APIs.
978
979         * icu/unicode/localpointer.h:
980         * icu/unicode/platform.h:
981         * icu/unicode/ptypes.h:
982         * icu/unicode/putil.h:
983         * icu/unicode/ucal.h:
984         * icu/unicode/uchar.h:
985         * icu/unicode/ucnv.h:
986         * icu/unicode/ucol.h:
987         * icu/unicode/uconfig.h:
988         * icu/unicode/udat.h:
989         * icu/unicode/udatpg.h:
990         * icu/unicode/udisplaycontext.h: Added.
991         * icu/unicode/uenum.h:
992         * icu/unicode/uformattable.h: Added.
993         * icu/unicode/uiter.h:
994         * icu/unicode/uloc.h:
995         * icu/unicode/umachine.h:
996         * icu/unicode/unorm2.h:
997         * icu/unicode/unum.h:
998         * icu/unicode/urename.h:
999         * icu/unicode/uscript.h:
1000         * icu/unicode/uset.h:
1001         * icu/unicode/ustring.h:
1002         * icu/unicode/utf.h:
1003         * icu/unicode/utf16.h:
1004         * icu/unicode/utf8.h:
1005         * icu/unicode/utf_old.h:
1006         * icu/unicode/utypes.h:
1007         * icu/unicode/uvernum.h:
1008         * icu/unicode/uversion.h:
1009
1010 2016-02-12  Filip Pizlo  <fpizlo@apple.com>
1011
1012         Fast path in JSObject::defineOwnIndexedProperty() forgets to check for the posibility of a descriptor that doesn't have a value
1013         https://bugs.webkit.org/show_bug.cgi?id=154175
1014         rdar://problem/24291497
1015
1016         Reviewed by Geoffrey Garen.
1017
1018         * runtime/JSObject.cpp:
1019         (JSC::JSObject::defineOwnIndexedProperty): Fix the bug.
1020         * runtime/SparseArrayValueMap.cpp:
1021         (JSC::SparseArrayValueMap::putEntry): Catch the bug sooner in debug.
1022         (JSC::SparseArrayValueMap::putDirect):
1023         * tests/stress/sparse-define-empty-descriptor.js: Added. This used to crash in release.
1024
1025 2016-02-11  Brian Burg  <bburg@apple.com>
1026
1027         Web Inspector: RemoteInspector's listings should include whether an AutomationTarget is paired
1028         https://bugs.webkit.org/show_bug.cgi?id=154077
1029         <rdar://problem/24589133>
1030
1031         Reviewed by Joseph Pecoraro.
1032
1033         Instead of not generating a listing for the target when it is occupied,
1034         generate the listing with a 'paired' flag. The old flag was redundant
1035         because a _WKAutomationDelegate will not create a session if it doesn't
1036         support automation or it already has an active session.
1037
1038         * inspector/remote/RemoteAutomationTarget.cpp:
1039         (Inspector::RemoteAutomationTarget::setIsPaired):
1040         (Inspector::RemoteAutomationTarget::setAutomationAllowed): Deleted.
1041         * inspector/remote/RemoteAutomationTarget.h:
1042         Return false for remoteControlAllowed() if the target is already paired.
1043         This function is used by RemoteInspector to deny incoming connections.
1044
1045         * inspector/remote/RemoteInspector.mm:
1046         (Inspector::RemoteInspector::listingForAutomationTarget):
1047         * inspector/remote/RemoteInspectorConstants.h:
1048
1049 2016-02-11  Filip Pizlo  <fpizlo@apple.com>
1050
1051         DFG::ByteCodeParser needs to null check the result of presenceLike()
1052         https://bugs.webkit.org/show_bug.cgi?id=154135
1053         rdar://problem/24291586
1054
1055         Reviewed by Geoffrey Garen.
1056
1057         ByteCodeParser::presenceLike() could return a null object property condition if it detects a
1058         contradiction. That could happen due to bogus profiling. It's totally OK - we just need to
1059         bail from using a property condition when that happens.
1060
1061         * bytecode/ObjectPropertyCondition.h:
1062         (JSC::ObjectPropertyCondition::equivalence):
1063         (JSC::ObjectPropertyCondition::operator bool):
1064         (JSC::ObjectPropertyCondition::object):
1065         (JSC::ObjectPropertyCondition::condition):
1066         (JSC::ObjectPropertyCondition::operator!): Deleted.
1067         * bytecode/PropertyCondition.h:
1068         (JSC::PropertyCondition::equivalence):
1069         (JSC::PropertyCondition::operator bool):
1070         (JSC::PropertyCondition::kind):
1071         (JSC::PropertyCondition::uid):
1072         (JSC::PropertyCondition::operator!): Deleted.
1073         * dfg/DFGByteCodeParser.cpp:
1074         (JSC::DFG::ByteCodeParser::check):
1075         (JSC::DFG::ByteCodeParser::load):
1076
1077 2016-02-11  Benjamin Poulain  <benjamin@webkit.org>
1078
1079         [JSC] SqrtFloat and CeilFloat also suffer from partial register stalls
1080         https://bugs.webkit.org/show_bug.cgi?id=154131
1081
1082         Reviewed by Filip Pizlo.
1083
1084         Looks like I forgot to update this when adding Float support.
1085         Credit to Filip for finding this issue.
1086
1087         * b3/air/AirFixPartialRegisterStalls.cpp:
1088
1089 2016-02-11  Filip Pizlo  <fpizlo@apple.com>
1090
1091         Cannot call initializeIndex() if we didn't create the array using tryCreateUninitialized()
1092         https://bugs.webkit.org/show_bug.cgi?id=154126
1093
1094         Reviewed by Saam Barati.
1095
1096         * runtime/ArrayPrototype.cpp:
1097         (JSC::arrayProtoFuncSplice):
1098
1099 2016-02-11  Sukolsak Sakshuwong  <sukolsak@gmail.com>
1100
1101         [INTL] Implement Intl.NumberFormat.prototype.resolvedOptions ()
1102         https://bugs.webkit.org/show_bug.cgi?id=147602
1103
1104         Reviewed by Darin Adler.
1105
1106         This patch implements Intl.NumberFormat.prototype.resolvedOptions() according
1107         to the ECMAScript 2015 Internationalization API spec (ECMA-402 2nd edition.)
1108
1109         * runtime/IntlDateTimeFormat.cpp:
1110         (JSC::localeData):
1111         * runtime/IntlNumberFormat.cpp:
1112         (JSC::localeData):
1113         (JSC::computeCurrencySortKey):
1114         (JSC::extractCurrencySortKey):
1115         (JSC::computeCurrencyDigits):
1116         (JSC::IntlNumberFormat::initializeNumberFormat):
1117         (JSC::IntlNumberFormat::styleString):
1118         (JSC::IntlNumberFormat::currencyDisplayString):
1119         (JSC::IntlNumberFormat::resolvedOptions):
1120         (JSC::IntlNumberFormat::setBoundFormat):
1121         * runtime/IntlNumberFormat.h:
1122         * runtime/IntlNumberFormatConstructor.cpp:
1123         (JSC::constructIntlNumberFormat):
1124         (JSC::callIntlNumberFormat):
1125         * runtime/IntlNumberFormatPrototype.cpp:
1126         (JSC::IntlNumberFormatPrototypeFuncResolvedOptions):
1127         * runtime/IntlObject.cpp:
1128         (JSC::intlNumberOption):
1129         (JSC::numberingSystemsForLocale):
1130         (JSC::getNumberingSystemsForLocale): Deleted.
1131         * runtime/IntlObject.h:
1132
1133 2016-02-11  Filip Pizlo  <fpizlo@apple.com>
1134
1135         MacroAssemblerX86 should be happy with shift(cx, cx)
1136         https://bugs.webkit.org/show_bug.cgi?id=154124
1137
1138         Reviewed by Saam Barati.
1139
1140         Prior to this change the assembler asserted that shift_amount and dest cannot be the same.
1141         That's a good assertion for when shift_amount is not in cx. But if it's in cx already then
1142         it's OK for them to be the same. Air will sometimes do shift(cx, cx) if you do "x << x" and
1143         the coalescing got particularly clever.
1144
1145         * assembler/MacroAssemblerX86Common.h:
1146         (JSC::MacroAssemblerX86Common::lshift32):
1147         (JSC::MacroAssemblerX86Common::rshift32):
1148         (JSC::MacroAssemblerX86Common::urshift32):
1149         * assembler/MacroAssemblerX86_64.h:
1150         (JSC::MacroAssemblerX86_64::lshift64):
1151         (JSC::MacroAssemblerX86_64::rshift64):
1152         (JSC::MacroAssemblerX86_64::urshift64):
1153         * b3/testb3.cpp:
1154         (JSC::B3::testLShiftSelf32):
1155         (JSC::B3::testRShiftSelf32):
1156         (JSC::B3::testURShiftSelf32):
1157         (JSC::B3::testLShiftSelf64):
1158         (JSC::B3::testRShiftSelf64):
1159         (JSC::B3::testURShiftSelf64):
1160         (JSC::B3::run):
1161
1162 2016-02-11  Saam barati  <sbarati@apple.com>
1163
1164         The sampling profiler's stack walker methods should be marked with SUPPRESS_ASAN
1165         https://bugs.webkit.org/show_bug.cgi?id=154123
1166
1167         Reviewed by Mark Lam.
1168
1169         The entire premise of the sampling profiler is to load from
1170         another thread's memory. We should SUPPRESS_ASAN on the
1171         methods that do this.
1172
1173         * runtime/SamplingProfiler.cpp:
1174         (JSC::FrameWalker::FrameWalker):
1175         (JSC::FrameWalker::walk):
1176         (JSC::FrameWalker::advanceToParentFrame):
1177         (JSC::FrameWalker::isAtTop):
1178         (JSC::FrameWalker::resetAtMachineFrame):
1179
1180 2016-02-11  Csaba Osztrogonác  <ossy@webkit.org>
1181
1182         Unreviewed typo fix after r190063.
1183
1184         * dfg/DFGSpeculativeJIT.cpp: Removed property svn:executable.
1185         * dfg/DFGSpeculativeJIT.h: Removed property svn:executable.
1186         * jit/JIT.h: Removed property svn:executable.
1187         * jit/JITInlines.h: Removed property svn:executable.
1188         * jit/JITOpcodes.cpp: Removed property svn:executable.
1189
1190 2016-02-11  Csaba Osztrogonác  <ossy@webkit.org>
1191
1192         Unreviewed typo fix after r190063.
1193
1194         * dfg/DFGSpeculativeJIT.cpp: Removed property svn:executable.
1195         * dfg/DFGSpeculativeJIT.h: Removed property svn:executable.
1196         * jit/JIT.h: Removed property svn:executable.
1197         * jit/JITInlines.h: Removed property svn:executable.
1198         * jit/JITOpcodes.cpp: Removed property svn:executable.
1199
1200 2016-02-10  Keith Miller  <keith_miller@apple.com>
1201
1202         Symbol.species accessors on builtin constructors should be configurable
1203         https://bugs.webkit.org/show_bug.cgi?id=154097
1204
1205         Reviewed by Benjamin Poulain.
1206
1207         We did not have the Symbol.species accessors on our builtin constructors
1208         marked as configurable. This does not accurately follow the ES6 spec as
1209         the ES6 spec states that all default accessors on builtins should be
1210         configurable. This means that we need an additional watchpoint on
1211         ArrayConstructor to make sure that no users re-configures Symbol.species.
1212
1213         * runtime/ArrayConstructor.cpp:
1214         (JSC::ArrayConstructor::finishCreation):
1215         * runtime/ArrayPrototype.cpp:
1216         (JSC::speciesConstructArray):
1217         (JSC::ArrayPrototype::setConstructor):
1218         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire):
1219         * runtime/ArrayPrototype.h:
1220         (JSC::ArrayPrototype::didChangeConstructorOrSpeciesProperties):
1221         (JSC::ArrayPrototype::didChangeConstructorProperty): Deleted.
1222         * runtime/JSArrayBufferConstructor.cpp:
1223         (JSC::JSArrayBufferConstructor::finishCreation):
1224         * runtime/JSPromiseConstructor.cpp:
1225         (JSC::JSPromiseConstructor::finishCreation):
1226         * runtime/JSTypedArrayViewConstructor.cpp:
1227         (JSC::JSTypedArrayViewConstructor::finishCreation):
1228         * runtime/MapConstructor.cpp:
1229         (JSC::MapConstructor::finishCreation):
1230         * runtime/RegExpConstructor.cpp:
1231         (JSC::RegExpConstructor::finishCreation):
1232         * runtime/SetConstructor.cpp:
1233         (JSC::SetConstructor::finishCreation):
1234         * tests/stress/array-species-config-array-constructor.js: Added.
1235         (A):
1236         * tests/stress/symbol-species.js:
1237         (testSymbolSpeciesOnConstructor):
1238
1239 2016-02-10  Benjamin Poulain  <benjamin@webkit.org>
1240
1241         [JSC] The destination of Sqrt should be Def, not UseDef
1242         https://bugs.webkit.org/show_bug.cgi?id=154086
1243
1244         Reviewed by Geoffrey Garen.
1245
1246         An unfortunate copy-paste: the destination of SqrtDouble and SqrtFloat
1247         was defined as UseDef. As a result, the argument would be interfering
1248         with everything defined prior.
1249
1250         * b3/air/AirOpcode.opcodes:
1251
1252 2016-02-10  Chris Dumez  <cdumez@apple.com>
1253
1254         [Web IDL] interface objects should be Function objects
1255         https://bugs.webkit.org/show_bug.cgi?id=154038
1256         <rdar://problem/24569358>
1257
1258         Reviewed by Geoffrey Garen.
1259
1260         Update functionProtoFuncToString() to handle JSObjects that
1261         have the TypeOfShouldCallGetCallData flag and are callable,
1262         as these behave like functions and use ClassInfo::className()
1263         as function name in this case.
1264
1265         * runtime/FunctionPrototype.cpp:
1266         (JSC::functionProtoFuncToString):
1267
1268 2016-02-10  Chris Dumez  <cdumez@apple.com>
1269
1270         Attributes on the Window instance should be configurable unless [Unforgeable]
1271         https://bugs.webkit.org/show_bug.cgi?id=153920
1272         <rdar://problem/24563211>
1273
1274         Reviewed by Darin Adler.
1275
1276         Marking the Window instance attributes as configurable but cause
1277         getOwnPropertyDescriptor() to report them as configurable, as
1278         expected. However, trying to delete them would actually lead to
1279         unexpected behavior because:
1280         - We did not reify custom accessor properties (most of the Window
1281           properties are custom accessors) upon deletion.
1282         - For non-reified static properties marked as configurable,
1283           JSObject::deleteProperty() would attempt to call the property
1284           setter with undefined. As a result, calling delete window.name
1285           would cause window.name to become the string "undefined" instead
1286           of the undefined value.
1287
1288         * runtime/JSObject.cpp:
1289         (JSC::getClassPropertyNames):
1290         Now that we reify ALL properties, we only need to check the property table
1291         if we have not reified. As a result, I dropped the 'didReify' parameter for
1292         this function and instead only call this function if we have not yet reified.
1293
1294         (JSC::JSObject::putInlineSlow):
1295         Only call putEntry() if we have not reified: Drop the
1296         '|| !(entry->attributes() & BuiltinOrFunctionOrAccessor)'
1297         check as such properties now get reified as well.
1298
1299         (JSC::JSObject::deleteProperty):
1300         - Call reifyAllStaticProperties() instead of reifyStaticFunctionsForDelete()
1301           so that we now reify all properties upon deletion, including the custom
1302           accessors. reifyStaticFunctionsForDelete() is now removed and the same
1303           reification function is now used by: deletion, getOwnPropertyDescriptor()
1304           and eager reification of the prototype objects in the bindings.
1305         - Drop code that falls back to calling the static property setter with
1306           undefined if we cannot find the property in the property storage. As
1307           we now reify ALL properties, the code removing the property from the
1308           property storage should succeed, provided that the property actually
1309           exists.
1310
1311         (JSC::JSObject::getOwnNonIndexPropertyNames):
1312         Only call getClassPropertyNames() if we have not reified. We should no longer
1313         check the static property table after reifying now that we reify all
1314         properties.
1315
1316         (JSC::JSObject::reifyAllStaticProperties):
1317         Merge with reifyStaticFunctionsForDelete(). The only behavior change is the
1318         flattening to an uncacheable dictionary, like reifyStaticFunctionsForDelete()
1319         used to do.
1320
1321         * runtime/JSObject.h:
1322
1323 2016-02-10  Commit Queue  <commit-queue@webkit.org>
1324
1325         Unreviewed, rolling out r196251.
1326         https://bugs.webkit.org/show_bug.cgi?id=154078
1327
1328         Large regression on Dromaeo needs explanation (Requested by
1329         kling on #webkit).
1330
1331         Reverted changeset:
1332
1333         "Visiting a WeakBlock should report bytes visited, since we
1334         reported them allocated."
1335         https://bugs.webkit.org/show_bug.cgi?id=153978
1336         http://trac.webkit.org/changeset/196251
1337
1338 2016-02-10  Csaba Osztrogonác  <ossy@webkit.org>
1339
1340         REGRESSION(r196331): It made ~180 JSC tests crash on ARMv7 Linux
1341         https://bugs.webkit.org/show_bug.cgi?id=154064
1342
1343         Reviewed by Mark Lam.
1344
1345         * bytecode/PolymorphicAccess.cpp:
1346         (JSC::AccessCase::generate): Added EABI_32BIT_DUMMY_ARG where it is necessary.
1347         * dfg/DFGSpeculativeJIT.h: Fixed the comment.
1348         * jit/CCallHelpers.h:
1349         (JSC::CCallHelpers::setupArgumentsWithExecState): Added.
1350         * wasm/WASMFunctionCompiler.h: Fixed the comment.
1351
1352 2016-02-09  Keith Miller  <keith_miller@apple.com>
1353
1354         calling methods off super in a class constructor should check for TDZ
1355         https://bugs.webkit.org/show_bug.cgi?id=154060
1356
1357         Reviewed by Ryosuke Niwa.
1358
1359         In a class constructor we need to check for TDZ when calling a method
1360         off the super class. This is because, for super method calls, we use
1361         the derived class's newly constructed object as the super method's
1362         this value.
1363
1364         * bytecompiler/NodesCodegen.cpp:
1365         (JSC::FunctionCallDotNode::emitBytecode):
1366         * tests/stress/super-method-calls-check-tdz.js: Added.
1367         (Base):
1368         (Derived):
1369         (test):
1370
1371 2016-02-09  Filip Pizlo  <fpizlo@apple.com>
1372
1373         Don't crash if we fail to parse a builtin
1374         https://bugs.webkit.org/show_bug.cgi?id=154047
1375         rdar://problem/24300617
1376
1377         Reviewed by Mark Lam.
1378
1379         Crashing probably seemed like a good idea at the time, but we could get here in case of a
1380         near stack overflow, so that the parser bails because of recursion.
1381
1382         * parser/Parser.h:
1383         (JSC::parse):
1384
1385 2016-02-07  Gavin Barraclough  <barraclough@apple.com>
1386
1387         GetValueFunc/PutValueFunc should not take both slotBase and thisValue
1388         https://bugs.webkit.org/show_bug.cgi?id=154009
1389
1390         Reviewed by Geoff Garen.
1391
1392         In JavaScript there are two types of properties - regular value properties, and accessor properties.
1393         One difference between these is how they are reflected by getOwnPropertyDescriptor, and another is
1394         what object they operate on in the case of a prototype access. If you access a value property of a
1395         prototype object it return a value pertinent to the prototype, but in the case of a prototype object
1396         returning an accessor, then the accessor function is applied to the base object of the access.
1397
1398         JSC supports special 'custom' properties implemented as a c++ callback, and these custom properties
1399         can be used to implement either value- or accessor-like behavior. getOwnPropertyDescriptor behavior
1400         is selected via the CustomAccessor attribute. Value- or accessor-like object selection is current
1401         supported by passing both the slotBase and the thisValue to the callback,and hoping it uses the
1402         right one. This is probably inefficient, bug-prone, and leads to crazy like JSBoundSlotBaseFunction.
1403
1404         Instead, just pass one thisValue to the callback functions, consistent with CustomAccessor.
1405
1406         * API/JSCallbackObject.h:
1407         * API/JSCallbackObjectFunctions.h:
1408         (JSC::JSCallbackObject<Parent>::getStaticValue):
1409         (JSC::JSCallbackObject<Parent>::staticFunctionGetter):
1410         (JSC::JSCallbackObject<Parent>::callbackGetter):
1411             - Merged slotBase & thisValue to custom property callbacks.
1412         * bytecode/PolymorphicAccess.cpp:
1413         (JSC::AccessCase::generate):
1414             - Modified the call being JIT generated - GetValueFunc/PutValueFunc now only take 3,
1415               rather than 4 arguments. Selects which one to keep/drop based on access type.
1416         (WTF::printInternal):
1417         * bytecode/PolymorphicAccess.h:
1418         (JSC::AccessCase::isGet):
1419         (JSC::AccessCase::isPut):
1420         (JSC::AccessCase::isIn):
1421         (JSC::AccessCase::doesCalls):
1422         (JSC::AccessCase::isGetter):
1423         * bytecode/PutByIdStatus.cpp:
1424         (JSC::PutByIdStatus::computeForStubInfo):
1425         * jit/Repatch.cpp:
1426         (JSC::tryCacheGetByID):
1427         (JSC::tryCachePutByID):
1428             - Split the CustomGetter/Setter access types into Value/Accessor variants.
1429         * jsc.cpp:
1430         (WTF::CustomGetter::getOwnPropertySlot):
1431         (WTF::CustomGetter::customGetter):
1432         (WTF::RuntimeArray::RuntimeArray):
1433         (WTF::RuntimeArray::lengthGetter):
1434             - Merged slotBase & thisValue to custom property callbacks.
1435         * runtime/CustomGetterSetter.cpp:
1436         (JSC::callCustomSetter):
1437             - Pass 3 arguments when calling PutValueFunc.
1438         * runtime/CustomGetterSetter.h:
1439         * runtime/JSBoundSlotBaseFunction.cpp:
1440         (JSC::boundSlotBaseFunctionCall):
1441         (JSC::JSBoundSlotBaseFunction::JSBoundSlotBaseFunction):
1442         * runtime/JSCJSValue.cpp:
1443         (JSC::JSValue::putToPrimitive):
1444             - callCustomSetter currently takes a flag to distinguish value/accessor calls.
1445         * runtime/JSFunction.cpp:
1446         (JSC::retrieveArguments):
1447         (JSC::JSFunction::argumentsGetter):
1448         (JSC::retrieveCallerFunction):
1449         (JSC::JSFunction::callerGetter):
1450         (JSC::JSFunction::lengthGetter):
1451         (JSC::JSFunction::nameGetter):
1452         * runtime/JSFunction.h:
1453         * runtime/JSModuleNamespaceObject.cpp:
1454         (JSC::JSModuleNamespaceObject::visitChildren):
1455         (JSC::callbackGetter):
1456             - Merged slotBase & thisValue to custom property callbacks.
1457         * runtime/JSObject.cpp:
1458         (JSC::JSObject::putInlineSlow):
1459             - callCustomSetter currently takes a flag to distinguish value/accessor calls.
1460         * runtime/Lookup.h:
1461         (JSC::putEntry):
1462             - split PutPropertySlot setCustom into Value/Accessor variants.
1463         * runtime/PropertySlot.cpp:
1464         (JSC::PropertySlot::functionGetter):
1465         (JSC::PropertySlot::customGetter):
1466         * runtime/PropertySlot.h:
1467         (JSC::PropertySlot::PropertySlot):
1468         (JSC::PropertySlot::getValue):
1469             - added customGetter helper to call GetValueFunc.
1470         * runtime/PutPropertySlot.h:
1471         (JSC::PutPropertySlot::PutPropertySlot):
1472         (JSC::PutPropertySlot::setNewProperty):
1473         (JSC::PutPropertySlot::setCustomValue):
1474         (JSC::PutPropertySlot::setCustomAccessor):
1475         (JSC::PutPropertySlot::setThisValue):
1476         (JSC::PutPropertySlot::customSetter):
1477         (JSC::PutPropertySlot::context):
1478         (JSC::PutPropertySlot::isStrictMode):
1479         (JSC::PutPropertySlot::isCacheablePut):
1480         (JSC::PutPropertySlot::isCacheableSetter):
1481         (JSC::PutPropertySlot::isCacheableCustom):
1482         (JSC::PutPropertySlot::isCustomAccessor):
1483         (JSC::PutPropertySlot::isInitialization):
1484         (JSC::PutPropertySlot::cachedOffset):
1485         (JSC::PutPropertySlot::setCustomProperty): Deleted.
1486             - split PutPropertySlot setCustom into Value/Accessor variants.
1487         * runtime/RegExpConstructor.cpp:
1488         (JSC::RegExpConstructor::getOwnPropertySlot):
1489         (JSC::regExpConstructorDollar1):
1490         (JSC::regExpConstructorDollar2):
1491         (JSC::regExpConstructorDollar3):
1492         (JSC::regExpConstructorDollar4):
1493         (JSC::regExpConstructorDollar5):
1494         (JSC::regExpConstructorDollar6):
1495         (JSC::regExpConstructorDollar7):
1496         (JSC::regExpConstructorDollar8):
1497         (JSC::regExpConstructorDollar9):
1498         (JSC::regExpConstructorInput):
1499         (JSC::regExpConstructorMultiline):
1500         (JSC::regExpConstructorLastMatch):
1501         (JSC::regExpConstructorLastParen):
1502         (JSC::regExpConstructorLeftContext):
1503         (JSC::regExpConstructorRightContext):
1504         (JSC::setRegExpConstructorInput):
1505         (JSC::setRegExpConstructorMultiline):
1506         * runtime/RegExpObject.cpp:
1507         (JSC::RegExpObject::defineOwnProperty):
1508         (JSC::regExpObjectSetLastIndexStrict):
1509         (JSC::regExpObjectSetLastIndexNonStrict):
1510         (JSC::RegExpObject::put):
1511             - Merged slotBase & thisValue to custom property callbacks.
1512
1513 2016-02-09  Filip Pizlo  <fpizlo@apple.com>
1514
1515         Spread expressions are not fair game for direct binding
1516         https://bugs.webkit.org/show_bug.cgi?id=154042
1517         rdar://problem/24291413
1518
1519         Reviewed by Saam Barati.
1520
1521         Prior to this change we crashed on this:
1522
1523             var [x] = [...y];
1524
1525         Because NodesCodegen thinks that this is a direct binding.  It's not, because we cannot
1526         directly generate bytecode for "...y".  This is a unique property of spread expressions, so
1527         its sufficient to just bail out of direct binding if we see a spread expression. That's what
1528         this patch does.
1529
1530         * bytecompiler/NodesCodegen.cpp:
1531         (JSC::ArrayPatternNode::emitDirectBinding):
1532         * tests/stress/spread-in-tail.js: Added.
1533         (foo):
1534         (catch):
1535
1536 2016-02-09  Commit Queue  <commit-queue@webkit.org>
1537
1538         Unreviewed, rolling out r196286.
1539         https://bugs.webkit.org/show_bug.cgi?id=154026
1540
1541         Looks like 5% iOS PLT regression (Requested by kling on
1542         #webkit).
1543
1544         Reverted changeset:
1545
1546         "[iOS] Throw away some unlinked code when navigating to a new
1547         page."
1548         https://bugs.webkit.org/show_bug.cgi?id=154014
1549         http://trac.webkit.org/changeset/196286
1550
1551 2016-02-08  Keith Miller  <keith_miller@apple.com>
1552
1553         Error construction for inlined operations should not use the inliner's CodeBlock
1554         https://bugs.webkit.org/show_bug.cgi?id=154021
1555
1556         Reviewed by Mark Lam.
1557
1558         Previously, if one function, A, was inlined into another function, B, in the DFG/FTL
1559         we would use B's DFG/FTL CodeBlock to construct source information about the Error.
1560         We would correctly compute the bytecodeOffset in A for the an expression but we would
1561         not use one of A's CodeBlocks when looking up source. This caused crashes during
1562         operationIn as we expected to be able to find the text "in" in the source.
1563
1564         * runtime/ErrorInstance.cpp:
1565         (JSC::appendSourceToError):
1566         * tests/stress/inlined-error-gets-correct-codeblock-for-bytecodeoffset.js: Added.
1567         (map):
1568         (n):
1569         (one):
1570         (catch):
1571
1572 2016-02-08  Saam Barati  <sbarati@apple.com>
1573
1574         runtimeTypeForValue should protect against seeing TDZ value
1575         https://bugs.webkit.org/show_bug.cgi?id=154023
1576         rdar://problem/24291413
1577
1578         Reviewed by Michael Saboff.
1579
1580         There are a few back traces I've seen from crashes that bottom out
1581         inside runtimeTypeForValue. I haven't been able to reproduce
1582         any such crash, but it's likely that we're encountering the
1583         empty JSValue. It's better to just have this function protect
1584         against seeing the empty value instead of dereferencing a null
1585         pointer when it thinks the value is a cell.
1586
1587         * runtime/RuntimeType.cpp:
1588         (JSC::runtimeTypeForValue):
1589
1590 2016-02-08  Andreas Kling  <akling@apple.com>
1591
1592         [iOS] Throw away some unlinked code when navigating to a new page.
1593         <https://webkit.org/b/154014>
1594
1595         Reviewed by Gavin Barraclough.
1596
1597         * runtime/VM.cpp:
1598         (JSC::VM::deleteAllCodeExceptCaches):
1599         (JSC::VM::deleteAllLinkedCode): Deleted.
1600         * runtime/VM.h:
1601
1602 2016-02-08  Filip Pizlo  <fpizlo@apple.com>
1603
1604         B3::foldPathConstants() needs to execute its insertion set
1605         https://bugs.webkit.org/show_bug.cgi?id=154020
1606
1607         Reviewed by Saam Barati.
1608
1609         * b3/B3FoldPathConstants.cpp:
1610         * b3/testb3.cpp:
1611         (JSC::B3::testFoldPathEqual): Added this. It used to crash in validation.
1612         (JSC::B3::run):
1613
1614 2016-02-08  Yusuke Suzuki  <utatane.tea@gmail.com>
1615
1616         [JSC] Introduce @isObject bytecode intrinsic and use it instead of JS implemented one
1617         https://bugs.webkit.org/show_bug.cgi?id=153976
1618
1619         Reviewed by Darin Adler.
1620
1621         Use bytecode op_is_object directly.
1622
1623         * builtins/GlobalObject.js:
1624         (isObject): Deleted.
1625         * bytecode/BytecodeIntrinsicRegistry.h:
1626         * bytecompiler/NodesCodegen.cpp:
1627         (JSC::BytecodeIntrinsicNode::emit_intrinsic_toString):
1628         (JSC::BytecodeIntrinsicNode::emit_intrinsic_isObject):
1629         * runtime/JSGlobalObject.cpp:
1630         (JSC::JSGlobalObject::init): Deleted.
1631
1632 2016-02-08  Yusuke Suzuki  <utatane.tea@gmail.com>
1633
1634         {Map,Set}.prototype.forEach should be visible as own properties
1635         https://bugs.webkit.org/show_bug.cgi?id=153974
1636
1637         Reviewed by Darin Adler.
1638
1639         Now, Map and Set uses builtin tables. We should inlude it in class info.
1640
1641         * runtime/MapPrototype.cpp:
1642         * runtime/SetPrototype.cpp:
1643
1644 2016-02-08  Filip Pizlo  <fpizlo@apple.com>
1645
1646         Baseline JIT should not require its input to be constant-propagated
1647         https://bugs.webkit.org/show_bug.cgi?id=154011
1648         rdar://problem/24290933
1649
1650         Reviewed by Mark Lam.
1651
1652         * jit/JITArithmetic.cpp:
1653         (JSC::JIT::emitBitBinaryOpFastPath):
1654         (JSC::JIT::emitRightShiftFastPath):
1655         (JSC::JIT::emit_op_add):
1656         (JSC::JIT::emit_op_div):
1657         (JSC::JIT::emit_op_mul):
1658
1659 2016-02-08  Filip Pizlo  <fpizlo@apple.com>
1660
1661         CodeCache should give up on evals if there are variables under TDZ
1662         https://bugs.webkit.org/show_bug.cgi?id=154002
1663         rdar://problem/24300998
1664
1665         Reviewed by Mark Lam.
1666
1667         Disable the code cache optimization because our approach to TDZ for scoped variables - using
1668         a separate check_tdz opcode when logically it's the get_from_scope's job to do it - makes
1669         caching code impossible if there are any variables in TDZ.
1670
1671         We should do the right thing in the future, and fold the TDZ check into the get_from_scope.
1672         This is better not only because it will restore caching, but because our bytecode for heap
1673         accesses is usually at the highest practically doable level of abstraction, so that ICs,
1674         compilers and caches can see the intended meaning of the bytecode more easily.
1675
1676         This doesn't appear to slow anything down, but that's just because we don't have enough ES6
1677         benchmarks. I've filed: https://bugs.webkit.org/show_bug.cgi?id=154010
1678
1679         * runtime/CodeCache.cpp:
1680         (JSC::CodeCache::getGlobalCodeBlock):
1681
1682 2016-02-08  Skachkov Oleksandr  <gskachkov@gmail.com>
1683
1684         [ES6] Arrow function syntax. Using 'super' in arrow function that declared out of the class should lead to Syntax error
1685         https://bugs.webkit.org/show_bug.cgi?id=150893
1686
1687         Reviewed by Saam Barati.
1688
1689         'super' and 'super()' inside of the arrow function should lead to syntax error if they are used 
1690         out of the class context or they wrapped by ordinary function. Now JSC returns ReferenceError but 
1691         should return SyntaxError according to the following specs:
1692         http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions-static-semantics-early-errors
1693         and http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions-runtime-semantics-evaluation 
1694         Curren patch implemented only one case when super/super() are used inside of the arrow function
1695         Case when super/super() are used within the eval:
1696            class A {} 
1697            class B extends A { 
1698                costructor() { eval("super()");} 
1699            }
1700         is not part of this patch and will be implemented in this issue https://bugs.webkit.org/show_bug.cgi?id=153864. 
1701         The same for case when eval with super/super() is invoked in arrow function will be 
1702         implemented in issue https://bugs.webkit.org/show_bug.cgi?id=153977. 
1703  
1704         * parser/Parser.cpp:
1705         (JSC::Parser<LexerType>::parseFunctionInfo):
1706         * parser/Parser.h:
1707         (JSC::Scope::Scope):
1708         (JSC::Scope::setExpectedSuperBinding):
1709         (JSC::Scope::expectedSuperBinding):
1710         (JSC::Scope::setConstructorKind):
1711         (JSC::Scope::constructorKind):
1712         (JSC::Parser::closestParentNonArrowFunctionNonLexicalScope):
1713         * tests/stress/arrowfunction-lexical-bind-supercall-4.js:
1714         * tests/stress/arrowfunction-lexical-bind-superproperty.js:
1715
1716 2016-02-08  Filip Pizlo  <fpizlo@apple.com>
1717
1718         Parser should detect error before calls to parseAssignmentExpression()
1719         https://bugs.webkit.org/show_bug.cgi?id=153975
1720         rdar://problem/24291231
1721
1722         Reviewed by Saam Barati.
1723
1724         Fixes a very hard-to-create situation that an internal test picked up.
1725
1726         * parser/Parser.cpp:
1727         (JSC::Parser<LexerType>::parseVariableDeclarationList):
1728         (JSC::Parser<LexerType>::parseAssignmentExpression):
1729
1730 2016-02-08  Andreas Kling  <akling@apple.com>
1731
1732         Visiting a WeakBlock should report bytes visited, since we reported them allocated.
1733         <https://webkit.org/b/153978>
1734
1735         Reviewed by Darin Adler.
1736
1737         When creating a WeakBlock, we tell Heap that we've allocated 1 KB (WeakBlock::blockSize)
1738         of memory. Consequently, when visiting a WeakBlock, we should also report 1 KB of memory
1739         visited. Otherwise Heap will think that those 1 KB already went away.
1740
1741         This was causing us to underestimate heap size, which affects collection scheduling.
1742
1743         * heap/SlotVisitor.h:
1744         (JSC::SlotVisitor::reportMemoryVisited):
1745         * heap/WeakBlock.cpp:
1746         (JSC::WeakBlock::visit):
1747
1748 2016-02-07  Saam barati  <sbarati@apple.com>
1749
1750         Follow up patch to: [ES6] bound functions .name property should be "bound " + the target function's name 
1751         https://bugs.webkit.org/show_bug.cgi?id=153796
1752
1753         Reviewed by Darin Adler.
1754
1755         This follow-up patch addresses some comments/suggestions by
1756         Ryosuke, Darin, and Joe. It simplifies JSBoundFunction::toStringName
1757         and adds some tests for bound names.
1758
1759         * runtime/JSBoundFunction.cpp:
1760         (JSC::hasInstanceBoundFunction):
1761         (JSC::JSBoundFunction::create):
1762         (JSC::JSBoundFunction::toStringName):
1763
1764 2016-02-07  Filip Pizlo  <fpizlo@apple.com>
1765
1766         String.match should defend against matches that would crash the VM
1767         https://bugs.webkit.org/show_bug.cgi?id=153964
1768         rdar://problem/24301119
1769
1770         Reviewed by Saam Barati.
1771
1772         This fixes a crash in an internal test case.
1773
1774         * runtime/ArgList.cpp:
1775         (JSC::MarkedArgumentBuffer::slowAppend): Use best practices to ensure that the size we
1776             compute makes sense. Crash if it stops making sense, since most users of this API assume
1777             that they are creating something small enough to fit on the stack.
1778         * runtime/ArgList.h:
1779         (JSC::MarkedArgumentBuffer::~MarkedArgumentBuffer):
1780         (JSC::MarkedArgumentBuffer::size):
1781         (JSC::MarkedArgumentBuffer::operator new): Deleted. These were ineffective. According to the
1782             debugger, we were still calling system malloc. So, I changed the code to use fastMalloc()
1783             directly.
1784         (JSC::MarkedArgumentBuffer::operator delete): Deleted.
1785         * runtime/StringPrototype.cpp:
1786         (JSC::stringProtoFuncMatch): Explicitly defend against absurd sizes. Of course, it's still
1787             possible to crash the VM on OOME. That's sort of always been the philosophy of JSC - we
1788             don't guarantee that you'll get a nice-looking error whenever you run out of memory,
1789             since in a GC'd environment you can't really guarantee those things. But, if you have a
1790             match that obvious won't fit in memory, then reporting an error is useful in case this is
1791             a developer experimenting with a buggy regexp.
1792
1793 2016-02-07  Dan Bernstein  <mitz@apple.com>
1794
1795         [Cocoa] Replace __has_include guards around inclusion of Apple-internal-SDK headers with USE(APPLE_INTERNAL_SDK)
1796         https://bugs.webkit.org/show_bug.cgi?id=153963
1797
1798         Reviewed by Sam Weinig.
1799
1800         * inspector/remote/RemoteInspectorXPCConnection.mm:
1801
1802 2016-02-06  Filip Pizlo  <fpizlo@apple.com>
1803
1804         FTL must store the call site index before runtime calls, even if it's the tail call slow path
1805         https://bugs.webkit.org/show_bug.cgi?id=153955
1806         rdar://problem/24290970
1807
1808         Reviewed by Saam Barati.
1809
1810         This is necessary because you could throw an exception in a host call on the tail call's slow
1811         path. That'll route us to lookupExceptionHandler(), which unwinds starting with the call site
1812         index of our frame. Bad things happen if it's not set. Prior to this patch it was possible
1813         for the call site index field to be uninitialized, which meant that the throwing machinery
1814         was making a wild guess about where we are.
1815
1816         * ftl/FTLLowerDFGToLLVM.cpp:
1817         (JSC::FTL::DFG::LowerDFGToLLVM::compileTailCall):
1818         * tests/stress/tail-call-host-call-throw.js: Added.
1819
1820 2016-02-06  Darin Adler  <darin@apple.com>
1821
1822         Finish auditing call sites of upper() and lower(), eliminate many, and rename the functions
1823         https://bugs.webkit.org/show_bug.cgi?id=153905
1824
1825         Reviewed by Sam Weinig.
1826
1827         * runtime/IntlObject.cpp:
1828         (JSC::canonicalLangTag): Use converToASCIIUppercase on the language tag.
1829
1830         * runtime/StringPrototype.cpp:
1831         (JSC::stringProtoFuncToLowerCase): Tweak style and update for name change.
1832         (JSC::stringProtoFuncToUpperCase): Ditto.
1833
1834 2016-02-06  Chris Dumez  <cdumez@apple.com>
1835
1836         Object.getOwnPropertyDescriptor() does not work on sub-frame's window
1837         https://bugs.webkit.org/show_bug.cgi?id=153925
1838
1839         Reviewed by Darin Adler.
1840
1841         Calling Object.getOwnPropertyDescriptor() on a sub-frame's window was
1842         returning undefined for that window's own properties. The reason was
1843         that the check getOwnPropertySlot() is using to make sure the
1844         PropertySlot is not for a property coming from the prototype was wrong.
1845
1846         The check was checking that 'this != slotBase' which works fine unless
1847         this is a JSProxy (e.g. JSDOMWindowShell). To handle proxies, the code
1848         was also checking that 'slotBase.toThis() != this', attempting to
1849         get the slotBase/Window's proxy. However, due to the implementation of
1850         toThis(), we were getting the lexical global object's proxy instead of
1851         slotBase's proxy. To avoid this issue, the new code explicitly checks
1852         if 'this' is a JSProxy and makes sure 'JSProxy::target() != slotBase',
1853         instead of using toThis().
1854
1855         * runtime/JSObject.cpp:
1856         (JSC::JSObject::getOwnPropertyDescriptor):
1857
1858 2016-02-06  Andreas Kling  <akling@apple.com>
1859
1860         [iOS] Throw away linked code when navigating to a new page.
1861         <https://webkit.org/b/153851>
1862
1863         Reviewed by Gavin Barraclough.
1864
1865         Add a VM API for throwing away linked code only.
1866
1867         * runtime/VM.cpp:
1868         (JSC::VM::deleteAllLinkedCode):
1869         * runtime/VM.h:
1870
1871 2016-02-06  Commit Queue  <commit-queue@webkit.org>
1872
1873         Unreviewed, rolling out r196104.
1874         https://bugs.webkit.org/show_bug.cgi?id=153940
1875
1876         Regressed Speedometer on iOS (Requested by kling on #webkit).
1877
1878         Reverted changeset:
1879
1880         "[iOS] Throw away linked code when navigating to a new page."
1881         https://bugs.webkit.org/show_bug.cgi?id=153851
1882         http://trac.webkit.org/changeset/196104
1883
1884 2016-02-05  Alex Christensen  <achristensen@webkit.org>
1885
1886         Fix internal Windows build
1887         https://bugs.webkit.org/show_bug.cgi?id=153930
1888         <rdar://problem/24534864>
1889
1890         Reviewed by Mark Lam.
1891
1892         * JavaScriptCore.vcxproj/JavaScriptCore.proj:
1893         I made a typo in r196144.
1894
1895 2016-02-05  Saam barati  <sbarati@apple.com>
1896
1897         Web Inspector: Include SamplingProfiler's expression-level data for stack frames in the protocol
1898         https://bugs.webkit.org/show_bug.cgi?id=153455
1899         <rdar://problem/24335884>
1900
1901         Reviewed by Joseph Pecoraro.
1902
1903         We now send the sampling profiler's expression-level
1904         line/column info in the inspector protocol.
1905
1906         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1907         (Inspector::buildSamples):
1908         * inspector/protocol/ScriptProfiler.json:
1909         * runtime/SamplingProfiler.h:
1910         (JSC::SamplingProfiler::StackFrame::hasExpressionInfo):
1911
1912 2016-02-05  Saam barati  <sbarati@apple.com>
1913
1914         follow-up to: JSC Sampling Profiler: (host) is confusing in cases where I would expect to see JS name
1915         https://bugs.webkit.org/show_bug.cgi?id=153663
1916         <rdar://problem/24415092>
1917
1918         Rubber stamped by Joseph Pecoraro.
1919
1920         We were performing operations that required us to
1921         hold the VM lock even when we might not have been holding it.
1922         We now ensure we're holding it.
1923
1924         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1925         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
1926
1927 2016-02-05  Filip Pizlo  <fpizlo@apple.com>
1928
1929         Arrayify for a typed array shouldn't create a monster
1930         https://bugs.webkit.org/show_bug.cgi?id=153908
1931         rdar://problem/24290639
1932
1933         Reviewed by Mark Lam.
1934
1935         Previously if you convinced the DFG to emit an Arrayify to ArrayStorage and then gave it a
1936         typed array, you'd corrupt the object.
1937
1938         * runtime/JSArrayBufferView.cpp:
1939         (WTF::printInternal):
1940         * runtime/JSArrayBufferView.h:
1941         * runtime/JSGenericTypedArrayViewInlines.h:
1942         (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren):
1943         (JSC::JSGenericTypedArrayView<Adaptor>::slowDownAndWasteMemory):
1944         * runtime/JSObject.cpp:
1945         (JSC::JSObject::copyButterfly):
1946         (JSC::JSObject::enterDictionaryIndexingMode):
1947         (JSC::JSObject::ensureInt32Slow):
1948         (JSC::JSObject::ensureDoubleSlow):
1949         (JSC::JSObject::ensureContiguousSlow):
1950         (JSC::JSObject::ensureArrayStorageSlow):
1951         (JSC::JSObject::growOutOfLineStorage):
1952         (JSC::getBoundSlotBaseFunctionForGetterSetter):
1953         * runtime/Structure.h:
1954         * tests/stress/arrayify-array-storage-typed-array.js: Added. This test failed.
1955         * tests/stress/arrayify-int32-typed-array.js: Added. This test case already had other protections, but we beefed them up.
1956
1957 2016-02-04  Joseph Pecoraro  <pecoraro@apple.com>
1958
1959         Web Inspector: InspectorTimelineAgent doesn't need to recompile functions because it now uses the sampling profiler
1960         https://bugs.webkit.org/show_bug.cgi?id=153500
1961         <rdar://problem/24352458>
1962
1963         Reviewed by Timothy Hatcher.
1964
1965         Be more explicit about enabling legacy profiling.
1966
1967         * jsc.cpp:
1968         * runtime/Executable.cpp:
1969         (JSC::ScriptExecutable::newCodeBlockFor):
1970         * runtime/JSGlobalObject.cpp:
1971         (JSC::JSGlobalObject::hasLegacyProfiler):
1972         (JSC::JSGlobalObject::createProgramCodeBlock):
1973         (JSC::JSGlobalObject::createEvalCodeBlock):
1974         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
1975         (JSC::JSGlobalObject::hasProfiler): Deleted.
1976         * runtime/JSGlobalObject.h:
1977         (JSC::JSGlobalObject::supportsLegacyProfiling):
1978         (JSC::JSGlobalObject::supportsProfiling): Deleted.
1979
1980 2016-02-04  Keith Miller  <keith_miller@apple.com>
1981
1982         ArrayPrototype should have a destroy function
1983         https://bugs.webkit.org/show_bug.cgi?id=153847
1984
1985         Reviewed by Filip Pizlo.
1986
1987         ArrayPrototype should have an destroy function as it now has a unique_ptr member that
1988         needs to be freed at the end of the object's life cycle. Also, this patch adds an
1989         option, gcAtEnd, that will cause jsc.cpp to do a garbage collection before exiting.
1990
1991         * jsc.cpp:
1992         (runJSC):
1993         (jscmain):
1994         * runtime/ArrayPrototype.cpp:
1995         (JSC::ArrayPrototype::create):
1996         (JSC::ArrayPrototype::destroy):
1997         * runtime/ArrayPrototype.h:
1998         * runtime/Options.h:
1999
2000 2016-02-04  Filip Pizlo  <fpizlo@apple.com>
2001
2002         REGRESSION(192409): Cannot rely on add32() to zero-extend
2003         https://bugs.webkit.org/show_bug.cgi?id=153897
2004
2005         Unreviewed rollout of r192409.
2006
2007         * assembler/MacroAssemblerARM64.h:
2008         (JSC::MacroAssemblerARM64::add32):
2009         (JSC::MacroAssemblerARM64::add64):
2010         * assembler/MacroAssemblerARMv7.h:
2011         (JSC::MacroAssemblerARMv7::add32):
2012         * assembler/MacroAssemblerX86.h:
2013         (JSC::MacroAssemblerX86::add32):
2014         * assembler/MacroAssemblerX86Common.h:
2015         (JSC::MacroAssemblerX86Common::add32):
2016         (JSC::MacroAssemblerX86Common::add8):
2017         (JSC::MacroAssemblerX86Common::branchAdd32):
2018         (JSC::MacroAssemblerX86Common::generateTest32):
2019         (JSC::MacroAssemblerX86Common::clz32AfterBsr):
2020         (JSC::MacroAssemblerX86Common::add32AndSetFlags): Deleted.
2021         * assembler/MacroAssemblerX86_64.h:
2022         (JSC::MacroAssemblerX86_64::add32):
2023         (JSC::MacroAssemblerX86_64::add64):
2024         (JSC::MacroAssemblerX86_64::branchAdd64):
2025         (JSC::MacroAssemblerX86_64::repatchCall):
2026         (JSC::MacroAssemblerX86_64::clz64AfterBsr):
2027         (JSC::MacroAssemblerX86_64::add64AndSetFlags): Deleted.
2028
2029 2016-02-04  Andreas Kling  <akling@apple.com>
2030
2031         Remove dead ENABLE(BYTECODE_COMMENTS) cruft.
2032         <https://webkit.org/b/153888>
2033
2034         Reviewed by Antti Koivisto.
2035
2036         * bytecode/UnlinkedCodeBlock.cpp:
2037         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock): Deleted.
2038         * bytecode/UnlinkedCodeBlock.h:
2039         (JSC::UnlinkedCodeBlock::shrinkToFit): Deleted.
2040
2041 2016-02-04  Saam barati  <sbarati@apple.com>
2042
2043         JSC Sampling Profiler: (host) is confusing in cases where I would expect to see JS name
2044         https://bugs.webkit.org/show_bug.cgi?id=153663
2045         <rdar://problem/24415092>
2046
2047         Reviewed by Geoffrey Garen.
2048
2049         We now collect the Callee in the processed StackFrame
2050         when the Callee is a valid GC object. We later ask
2051         the Callee for it's .displayName or .name property.
2052         When we don't have a valid callee, we will still
2053         use the Executable for this information.
2054
2055         This helps us come up with good names for frames where 
2056         the Callee object is a bound function or an InternalFunction.
2057
2058         * inspector/agents/InspectorScriptProfilerAgent.cpp:
2059         (Inspector::InspectorScriptProfilerAgent::addEvent):
2060         (Inspector::buildSamples):
2061         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
2062         * runtime/SamplingProfiler.cpp:
2063         (JSC::reportStats):
2064         (JSC::FrameWalker::walk):
2065         (JSC::SamplingProfiler::processUnverifiedStackTraces):
2066         (JSC::SamplingProfiler::visit):
2067         (JSC::SamplingProfiler::shutdown):
2068         (JSC::SamplingProfiler::clearData):
2069         (JSC::SamplingProfiler::StackFrame::nameFromCallee):
2070         (JSC::SamplingProfiler::StackFrame::displayName):
2071         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
2072         (JSC::SamplingProfiler::stackTracesAsJSON):
2073         * runtime/SamplingProfiler.h:
2074         (JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame):
2075         (JSC::SamplingProfiler::StackFrame::StackFrame):
2076         * tests/stress/sampling-profiler-basic.js:
2077         (platformSupportsSamplingProfiler.nothing):
2078         (platformSupportsSamplingProfiler.top):
2079         * tests/stress/sampling-profiler-bound-function-name.js: Added.
2080         (platformSupportsSamplingProfiler.foo):
2081         (platformSupportsSamplingProfiler.bar):
2082         (platformSupportsSamplingProfiler.let.baz):
2083         (platformSupportsSamplingProfiler):
2084         * tests/stress/sampling-profiler-display-name.js: Added.
2085         (platformSupportsSamplingProfiler.foo):
2086         (platformSupportsSamplingProfiler.baz):
2087         (platformSupportsSamplingProfiler.):
2088         (platformSupportsSamplingProfiler.bar):
2089         (platformSupportsSamplingProfiler.jaz):
2090         (platformSupportsSamplingProfiler.makeFunction.let.result):
2091         (platformSupportsSamplingProfiler.makeFunction):
2092         * tests/stress/sampling-profiler-internal-function-name.js: Added.
2093         (platformSupportsSamplingProfiler.foo):
2094         (platformSupportsSamplingProfiler.bar):
2095         (platformSupportsSamplingProfiler):
2096
2097 2016-02-04  Chris Dumez  <cdumez@apple.com>
2098
2099         Object.getOwnPropertyDescriptor() returns incomplete descriptor for instance properties
2100         https://bugs.webkit.org/show_bug.cgi?id=153817
2101
2102         Reviewed by Geoffrey Garen.
2103
2104         Extend support for Object.getOwnPropertyDescriptor() on native bindings
2105         to instance properties (e.g. Unforgeable properties or Global object
2106         properties) so that the returned descriptor has getter / setter
2107         functions, as expected.
2108
2109         * runtime/JSObject.cpp:
2110         (JSC::JSObject::reifyAllStaticProperties):
2111         Add method that reifies all static properties, including the custom
2112         accessors. This is similar to what is done eagerly on the prototype
2113         objects in the bindings code.
2114
2115         (JSC::JSObject::getOwnPropertyDescriptor):
2116         getOwnPropertyDescriptor() would previously fails for custom accessors
2117         that are on the instance because getDirect() does not check the static
2118         property table and those custom accessors were not reified (We only
2119         reified all properties eagerly - including custom accessors - on
2120         prototype objects. To address this issue, we now call
2121         reifyAllStaticProperties() if the call to getDirect() fails and then
2122         call getDirect() again. This fix is however insufficient for Window
2123         properties because |this| is a JSDOMWindowShell / JSProxy in this case
2124         and getDirect() / reifyAllStaticProperties() would fail as the proxy
2125         does not actually have the properties. This issue was addressed by
2126         checking if |this| is a JSProxy and then using JSProxy::target() instead
2127         of |this| for the calls to getDirect() and for the reification.
2128
2129         * runtime/JSObject.h:
2130         * runtime/Lookup.h:
2131         (JSC::reifyStaticProperty):
2132         (JSC::reifyStaticProperties):
2133         Move most code in reifyStaticProperties() to a separate function so the
2134         code can be shared with JSObject::reifyAllStaticProperties().
2135         reifyStaticProperties() is currently called by the bindings on the
2136         prototype objects.
2137
2138 2016-02-04  Alex Christensen  <achristensen@webkit.org>
2139
2140         Fix internal Windows build
2141         https://bugs.webkit.org/show_bug.cgi?id=153886
2142         <rdar://problem/24499887>
2143
2144         Reviewed by Mark Lam.
2145
2146         * JavaScriptCore.vcxproj/JavaScriptCore.proj:
2147         In r190253 I changed the directory of the headers from AppleInternal/include/JavaScriptCore 
2148         to AppleInternal/include/private/JavaScriptCore.  This is ok for WebCore and WebKit, but not
2149         other projects, such as CFNetwork, which expect the public API headers to be in the old location.
2150         This used to be done by a combination of copy-files.cmd and the old JavaScriptCore.proj.
2151         This change copies all the API headers, which copies everything in copy-files.cmd except APIShims.h
2152         which does not exist any more.  It copies additional headers that were not copied before, but
2153         I think this is beneficial so we do not forget to add new public headers to a list of public headers
2154         to be copied in the internal build.  Having extra public headers in the internal Windows build is
2155         not a problem because only internal clients use the internal Windows build.
2156
2157 2016-02-03  Yusuke Suzuki  <utatane.tea@gmail.com>
2158
2159         [JSC] Make some classes non JSDestructibleObject
2160         https://bugs.webkit.org/show_bug.cgi?id=153838
2161
2162         Reviewed by Geoffrey Garen.
2163
2164         SymbolPrototype, JSMapIterator and JSSetIterator are trivially destructible.
2165         So there is no need to inherit JSDestructibleObject.
2166
2167         * runtime/JSMapIterator.cpp:
2168         (JSC::JSMapIterator::destroy): Deleted.
2169         * runtime/JSMapIterator.h:
2170         * runtime/JSSetIterator.cpp:
2171         (JSC::JSSetIterator::destroy): Deleted.
2172         * runtime/JSSetIterator.h:
2173         * runtime/MapData.h:
2174         * runtime/SymbolPrototype.h:
2175
2176 2016-02-03  Yusuke Suzuki  <utatane.tea@gmail.com>
2177
2178         [JSC] Symbol structure has unnecessary flags
2179         https://bugs.webkit.org/show_bug.cgi?id=153840
2180
2181         Reviewed by Saam Barati.
2182
2183         * runtime/Symbol.h:
2184         * tests/stress/symbol-get-own-property.js: Added.
2185         (shouldBe):
2186
2187 2016-02-03  Andreas Kling  <akling@apple.com>
2188
2189         [iOS] Throw away linked code when navigating to a new page.
2190         <https://webkit.org/b/153851>
2191
2192         Reviewed by Gavin Barraclough.
2193
2194         Add a VM API for throwing away linked code only.
2195
2196         * runtime/VM.cpp:
2197         (JSC::VM::deleteAllLinkedCode):
2198         * runtime/VM.h:
2199
2200 2016-02-03  Michael Catanzaro  <mcatanzaro@igalia.com>
2201
2202         [GTK][EFL] Switch FTL to B3
2203         https://bugs.webkit.org/show_bug.cgi?id=153478
2204
2205         Reviewed by Csaba Osztrogonác.
2206
2207         Conditionalize code to make it possible to build FTL completely without LLVM.
2208
2209         * CMakeLists.txt:
2210         * dfg/DFGCommon.h:
2211         * dfg/DFGPlan.cpp:
2212         (JSC::DFG::Plan::compileInThreadImpl):
2213         * ftl/FTLAbbreviatedTypes.h:
2214         * ftl/FTLFail.cpp:
2215         (JSC::FTL::fail):
2216         * ftl/FTLState.cpp:
2217         (JSC::FTL::State::State):
2218         (JSC::FTL::State::~State):
2219
2220 2016-02-03  Carlos Garcia Campos  <cgarcia@igalia.com>
2221
2222         Unreviewed. Fix JavaScriptCore build with B3 enabled.
2223
2224         Include <limits.h> for UINT_MAX.
2225
2226         * b3/B3StackSlot.h:
2227         * b3/air/AirStackSlot.h:
2228
2229 2016-02-02  Caitlin Potter  <caitp@igalia.com>
2230
2231         JSSymbolTableObject::deleteProperty() crashes deleting Symbols
2232         https://bugs.webkit.org/show_bug.cgi?id=153816
2233
2234         Reviewed by Darin Adler.
2235
2236         Changes JSSymbolTableObject::deleteProperty() to check if its
2237         symbolTable() contains the property's uid() rather than publicName().
2238         This ensures that it will not crash in the case of Symbols.
2239
2240         * runtime/JSSymbolTableObject.cpp:
2241         (JSC::JSSymbolTableObject::deleteProperty):
2242         * tests/es6/Object_static_methods_Object.getOwnPropertyDescriptors.js:
2243         (testGlobalProxy):
2244         * tests/stress/regress-153816.js: Added.
2245         (deleteSymbolFromJSSymbolTableObject):
2246
2247 2016-02-02  Benjamin Poulain  <benjamin@webkit.org>
2248
2249         [JSC] Do not copy FP when lowering FramePointer
2250         https://bugs.webkit.org/show_bug.cgi?id=153769
2251
2252         Reviewed by Michael Saboff.
2253
2254         That extra move is just wasted time. The fewer Moves we have,
2255         the happier IRC is.
2256
2257         * b3/B3LowerToAir.cpp:
2258         (JSC::B3::Air::LowerToAir::tmp):
2259         (JSC::B3::Air::LowerToAir::lower):
2260
2261 2016-02-02  Keith Miller  <keith_miller@apple.com>
2262
2263         DFG, FTL, B3, and Air should all have a unique option for printing their graphs
2264         https://bugs.webkit.org/show_bug.cgi?id=153815
2265
2266         Reviewed by Benjamin Poulain.
2267
2268         This patch adds a new printing option for each of the DFG/FTL compilation phases.
2269
2270         * b3/B3Common.cpp:
2271         (JSC::B3::shouldDumpIR):
2272         (JSC::B3::shouldDumpIRAtEachPhase):
2273         * b3/B3Common.h:
2274         * b3/B3Generate.cpp:
2275         (JSC::B3::generateToAir):
2276         * b3/B3PhaseScope.cpp:
2277         (JSC::B3::PhaseScope::PhaseScope):
2278         * b3/air/AirGenerate.cpp:
2279         (JSC::B3::Air::prepareForGeneration):
2280         * b3/air/AirPhaseScope.cpp:
2281         (JSC::B3::Air::PhaseScope::PhaseScope):
2282         * dfg/DFGCFAPhase.cpp:
2283         (JSC::DFG::CFAPhase::run):
2284         * dfg/DFGCommon.h:
2285         (JSC::DFG::shouldDumpGraphAtEachPhase):
2286         * dfg/DFGPhase.cpp:
2287         (JSC::DFG::Phase::beginPhase):
2288         * runtime/Options.cpp:
2289         (JSC::recomputeDependentOptions):
2290         * runtime/Options.h:
2291
2292 2016-02-02  Caitlin Potter  <caitp@igalia.com>
2293
2294         [JSC] make Object.getOwnPropertyDescriptors() work with non-JSObject types
2295         https://bugs.webkit.org/show_bug.cgi?id=153814
2296
2297         Reviewed by Yusuke Suzuki.
2298
2299         * runtime/ObjectConstructor.cpp:
2300         (JSC::objectConstructorGetOwnPropertyDescriptors):
2301         * tests/es6/Object_static_methods_Object.getOwnPropertyDescriptors.js:
2302         (testGlobalProxy):
2303
2304 2016-02-02  Aakash Jain  <aakash_jain@apple.com>
2305
2306         Remove references to CallFrameInlines.h
2307         https://bugs.webkit.org/show_bug.cgi?id=153810
2308
2309         Reviewed by Mark Lam.
2310
2311         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2312         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
2313
2314 2016-02-02  Caitlin Potter  <caitp@igalia.com>
2315
2316         [JSC] Implement Object.getOwnPropertyDescriptors() proposal
2317         https://bugs.webkit.org/show_bug.cgi?id=153799
2318
2319         Reviewed by Darin Adler.
2320
2321         Implements the Object.getOwnPropertyDescriptors() proposal, which
2322         reached Stage 3 in the TC39 process in January 2016.
2323         https://github.com/tc39/proposal-object-getownpropertydescriptors
2324
2325         The method extracts a set of property descriptor objects, which can
2326         be safely used via `Object.create()`.
2327
2328         * runtime/ObjectConstructor.cpp:
2329         (JSC::objectConstructorGetOwnPropertyDescriptors):
2330
2331 2016-02-02  Filip Pizlo  <fpizlo@apple.com>
2332
2333         B3 should be able to compile trivial self-loops
2334         https://bugs.webkit.org/show_bug.cgi?id=153802
2335         rdar://problem/24465632
2336
2337         Reviewed by Michael Saboff.
2338
2339         Tail-duplicating a self-loop would mean doing a kind of loop unrolling. It wouldn't be
2340         profitable even if it did work. It turns out that it doesn't work, because we edit the target
2341         block before reading the source block, which breaks if the target and source block are the
2342         same.
2343
2344         This disables tail duplication of self-loops, adds a test, and adds better validation for this
2345         issue.
2346
2347         * b3/B3DuplicateTails.cpp:
2348         * b3/B3Procedure.cpp:
2349         (JSC::B3::Procedure::resetReachability):
2350         * b3/testb3.cpp:
2351         (JSC::B3::testComputeDivisionMagic):
2352         (JSC::B3::testTrivialInfiniteLoop):
2353         (JSC::B3::zero):
2354         (JSC::B3::run):
2355
2356 2016-02-02  Saam barati  <sbarati@apple.com>
2357
2358         [ES6] bound functions .name property should be "bound " + the target function's name
2359         https://bugs.webkit.org/show_bug.cgi?id=153796
2360
2361         Reviewed by Mark Lam.
2362
2363         See http://tc39.github.io/ecma262/#sec-function.prototype.bind for details.
2364         What the spec says:
2365         ```
2366         function foo() { }
2367         foo.bind(null).name === "bound foo"
2368
2369         (function bar() { }).bind(null).name === "bound bar"
2370         ```
2371
2372         * runtime/FunctionPrototype.cpp:
2373         (JSC::functionProtoFuncToString):
2374         * runtime/JSBoundFunction.cpp:
2375         (JSC::hasInstanceBoundFunction):
2376         (JSC::JSBoundFunction::create):
2377         (JSC::JSBoundFunction::visitChildren):
2378         (JSC::JSBoundFunction::toStringName):
2379         * runtime/JSBoundFunction.h:
2380         (JSC::JSBoundFunction::boundThis):
2381         (JSC::JSBoundFunction::boundArgs):
2382         (JSC::JSBoundFunction::createStructure):
2383         * tests/es6.yaml:
2384
2385 2016-02-02  Filip Pizlo  <fpizlo@apple.com>
2386
2387         Get rid of anonymous stack slots
2388         https://bugs.webkit.org/show_bug.cgi?id=151128
2389
2390         Reviewed by Mark Lam.
2391
2392         When I first designed stack slots, the idea was that an "anonymous" stack slot was one that
2393         behaved exactly like a C variable: if it never escaped, it would not need to get stack space
2394         for the entire lifetime of the function - it could get any slab of stack so long as it
2395         didn't interfere with other stack slots that would be live at the same time. The reason I
2396         called them "anonymous" is that external code could not get its address. This felt like it
2397         gave the stack slot anonymity. But it was never a good name for this concept.
2398
2399         Then I had the register allocator lower temporaries to anonymous stack slots when it spilled
2400         them. Spilling became the sole client of anonymous stack slots.
2401
2402         Then I realized that there was an aspect of how spill slots work that make them want
2403         slightly different semantics than a normal C variable. A C variable is a proper memory
2404         location - you could do a store to only some bytes in the variable, and it's reasonable to
2405         expect that this will not destroy the other bytes in the variable. But that means that to
2406         compute their liveness, you have to do something like a per-byte liveness. That's overkill
2407         for spill slots. You want any store to the spill slot to kill the whole slot even if it
2408         writes to just part of the slot. This matches how temporaries work. So rather than implement
2409         per-byte liveness, I decided to change the semantics of anonymous stack slots to make them
2410         work like how I wanted spill slots to work. This was quite dirty, and put B3 in the awkward
2411         situation that B3's anonymous stack slots behaved like spill slots. But it was OK since
2412         nobody used anonymous stack slots in B3.
2413
2414         Then I added tail duplication, which required having a mechanism for introducing non-SSA
2415         variables in B3. I decided to use anonymous stack slots for this purpose. All of a sudden
2416         this all felt like it made sense: anonymous stack slots were just like variables! Hooray for
2417         the amazing foresight of anonymous stack slots!
2418
2419         But then I realized that this was all very bad. We want B3 to be able to optimize Store and
2420         Load operations by reasoning about how they affect bytes in memory. For example, if you do
2421         a Load of a 64-bit value, and then you modify just the low 32 bits of that value, and then
2422         you do a 64-bit store back to the same location, then it would be better to transform this
2423         into 32-bit operations. We don't do this optimization yet, but it's the kind of thing that
2424         we want B3 to be able to do. To do it, we need Store to mean that it only affects N bytes
2425         starting at the pointer, where N is the size of the thing being stored. But that's not what
2426         Store means for anonymous stack slots. For anonymous slots, storing to any byte in the slot
2427         clobbers all bytes in the slot. We were never clear if you need to store directly to an
2428         anonymous slot to get this behavior, or if any pointer that points to an anoymous slot must
2429         exhibit this behavior when stored to. Neither kinds of semantics make sense to me.
2430
2431         This change fixes the problem by eradicating anonymous stack slots. In B3, they are replaced
2432         with Variables. In Air, they are replaced with a different stack slot kind, called Spill.
2433         There is no such thing as stack slot kinds in B3 anymore, all B3 stack slots are locked. In
2434         Air, there is still the concept of stack slot kind - Locked or Spill.
2435
2436         B3 Variables are awesome. They are exactly what they seem to be. They have a type. They are
2437         declared at the top level in the Procedure. You can access them with new opcodes, Get and
2438         Set. This greatly simplifies demoting SSA values to variables and promoting them back to
2439         SSA. I even made the instruction selector do the right things for variables, which means
2440         that introducing variables won't hurt instruction selection (there will be extra moves, but
2441         IRC will kill them). It's great to have non-SSA variables as an explicit concept in IR
2442         because it means that you don't have to do any magic to use them - they Just Work.
2443
2444         Air spill slots behave almost like anonymous stack slots, with one exception: you cannot
2445         escape them. We validate this by making it illegal to UseAddr on a spill slot. This removes
2446         the need to answer awkward questions like: does a 32-bit Def on a pointer that may point to
2447         a 64-bit spill slot do anything to the 32 bits above the pointer?  Does it write zero to it?
2448         Does it write zero to it just when the pointer actually points to a spill slot or always?
2449         These are silly questions, and we don't have to answer them because the only way to refer to
2450         a spill slot is directly. No escaping means no aliasing.
2451
2452         This doesn't affect performance. It just makes the compiler more fun to work with by
2453         removing some cognitive dissonance.
2454
2455         * CMakeLists.txt:
2456         * JavaScriptCore.xcodeproj/project.pbxproj:
2457         * b3/B3ArgumentRegValue.h:
2458         * b3/B3CCallValue.h:
2459         * b3/B3CheckValue.cpp:
2460         (JSC::B3::CheckValue::cloneImpl):
2461         (JSC::B3::CheckValue::CheckValue):
2462         * b3/B3CheckValue.h:
2463         * b3/B3Const32Value.h:
2464         * b3/B3Const64Value.h:
2465         * b3/B3ConstDoubleValue.h:
2466         * b3/B3ConstFloatValue.h:
2467         * b3/B3ConstPtrValue.h:
2468         (JSC::B3::ConstPtrValue::ConstPtrValue):
2469         * b3/B3ControlValue.cpp:
2470         (JSC::B3::ControlValue::convertToJump):
2471         (JSC::B3::ControlValue::convertToOops):
2472         (JSC::B3::ControlValue::dumpMeta):
2473         * b3/B3ControlValue.h:
2474         * b3/B3Effects.cpp:
2475         (JSC::B3::Effects::interferes):
2476         (JSC::B3::Effects::dump):
2477         * b3/B3Effects.h:
2478         (JSC::B3::Effects::mustExecute):
2479         * b3/B3EliminateCommonSubexpressions.cpp:
2480         * b3/B3FixSSA.cpp:
2481         (JSC::B3::demoteValues):
2482         (JSC::B3::fixSSA):
2483         * b3/B3FixSSA.h:
2484         * b3/B3IndexMap.h:
2485         (JSC::B3::IndexMap::resize):
2486         (JSC::B3::IndexMap::clear):
2487         (JSC::B3::IndexMap::size):
2488         (JSC::B3::IndexMap::operator[]):
2489         * b3/B3IndexSet.h:
2490         (JSC::B3::IndexSet::contains):
2491         (JSC::B3::IndexSet::size):
2492         (JSC::B3::IndexSet::isEmpty):
2493         * b3/B3LowerToAir.cpp:
2494         (JSC::B3::Air::LowerToAir::run):
2495         (JSC::B3::Air::LowerToAir::lower):
2496         * b3/B3MemoryValue.h:
2497         * b3/B3Opcode.cpp:
2498         (WTF::printInternal):
2499         * b3/B3Opcode.h:
2500         * b3/B3PatchpointValue.cpp:
2501         (JSC::B3::PatchpointValue::cloneImpl):
2502         (JSC::B3::PatchpointValue::PatchpointValue):
2503         * b3/B3PatchpointValue.h:
2504         * b3/B3Procedure.cpp:
2505         (JSC::B3::Procedure::Procedure):
2506         (JSC::B3::Procedure::addBlock):
2507         (JSC::B3::Procedure::addStackSlot):
2508         (JSC::B3::Procedure::addVariable):
2509         (JSC::B3::Procedure::clone):
2510         (JSC::B3::Procedure::addIntConstant):
2511         (JSC::B3::Procedure::dump):
2512         (JSC::B3::Procedure::deleteStackSlot):
2513         (JSC::B3::Procedure::deleteVariable):
2514         (JSC::B3::Procedure::deleteValue):
2515         (JSC::B3::Procedure::deleteOrphans):
2516         (JSC::B3::Procedure::calleeSaveRegisters):
2517         (JSC::B3::Procedure::addValueImpl):
2518         (JSC::B3::Procedure::setBlockOrderImpl):
2519         (JSC::B3::Procedure::addAnonymousStackSlot): Deleted.
2520         (JSC::B3::Procedure::addStackSlotIndex): Deleted.
2521         (JSC::B3::Procedure::addValueIndex): Deleted.
2522         * b3/B3Procedure.h:
2523         (JSC::B3::Procedure::setBlockOrder):
2524         (JSC::B3::Procedure::stackSlots):
2525         (JSC::B3::Procedure::variables):
2526         (JSC::B3::Procedure::values):
2527         (JSC::B3::Procedure::StackSlotsCollection::StackSlotsCollection): Deleted.
2528         (JSC::B3::Procedure::StackSlotsCollection::size): Deleted.
2529         (JSC::B3::Procedure::StackSlotsCollection::at): Deleted.
2530         (JSC::B3::Procedure::StackSlotsCollection::operator[]): Deleted.
2531         (JSC::B3::Procedure::StackSlotsCollection::iterator::iterator): Deleted.
2532         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator*): Deleted.
2533         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator++): Deleted.
2534         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator==): Deleted.
2535         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator!=): Deleted.
2536         (JSC::B3::Procedure::StackSlotsCollection::iterator::findNext): Deleted.
2537         (JSC::B3::Procedure::StackSlotsCollection::begin): Deleted.
2538         (JSC::B3::Procedure::StackSlotsCollection::end): Deleted.
2539         (JSC::B3::Procedure::ValuesCollection::ValuesCollection): Deleted.
2540         (JSC::B3::Procedure::ValuesCollection::iterator::iterator): Deleted.
2541         (JSC::B3::Procedure::ValuesCollection::iterator::operator*): Deleted.
2542         (JSC::B3::Procedure::ValuesCollection::iterator::operator++): Deleted.
2543         (JSC::B3::Procedure::ValuesCollection::iterator::operator==): Deleted.
2544         (JSC::B3::Procedure::ValuesCollection::iterator::operator!=): Deleted.
2545         (JSC::B3::Procedure::ValuesCollection::iterator::findNext): Deleted.
2546         (JSC::B3::Procedure::ValuesCollection::begin): Deleted.
2547         (JSC::B3::Procedure::ValuesCollection::end): Deleted.
2548         (JSC::B3::Procedure::ValuesCollection::size): Deleted.
2549         (JSC::B3::Procedure::ValuesCollection::at): Deleted.
2550         (JSC::B3::Procedure::ValuesCollection::operator[]): Deleted.
2551         * b3/B3ProcedureInlines.h:
2552         (JSC::B3::Procedure::add):
2553         * b3/B3ReduceStrength.cpp:
2554         * b3/B3SlotBaseValue.h:
2555         * b3/B3SparseCollection.h: Added.
2556         (JSC::B3::SparseCollection::SparseCollection):
2557         (JSC::B3::SparseCollection::add):
2558         (JSC::B3::SparseCollection::addNew):
2559         (JSC::B3::SparseCollection::remove):
2560         (JSC::B3::SparseCollection::size):
2561         (JSC::B3::SparseCollection::isEmpty):
2562         (JSC::B3::SparseCollection::at):
2563         (JSC::B3::SparseCollection::operator[]):
2564         (JSC::B3::SparseCollection::iterator::iterator):
2565         (JSC::B3::SparseCollection::iterator::operator*):
2566         (JSC::B3::SparseCollection::iterator::operator++):
2567         (JSC::B3::SparseCollection::iterator::operator==):
2568         (JSC::B3::SparseCollection::iterator::operator!=):
2569         (JSC::B3::SparseCollection::iterator::findNext):
2570         (JSC::B3::SparseCollection::begin):
2571         (JSC::B3::SparseCollection::end):
2572         * b3/B3StackSlot.cpp:
2573         (JSC::B3::StackSlot::deepDump):
2574         (JSC::B3::StackSlot::StackSlot):
2575         * b3/B3StackSlot.h:
2576         (JSC::B3::StackSlot::byteSize):
2577         (JSC::B3::StackSlot::index):
2578         (JSC::B3::StackSlot::setOffsetFromFP):
2579         (JSC::B3::StackSlot::kind): Deleted.
2580         (JSC::B3::StackSlot::isLocked): Deleted.
2581         * b3/B3StackSlotKind.cpp: Removed.
2582         * b3/B3StackSlotKind.h: Removed.
2583         * b3/B3StackmapValue.cpp:
2584         (JSC::B3::StackmapValue::dumpMeta):
2585         (JSC::B3::StackmapValue::StackmapValue):
2586         * b3/B3StackmapValue.h:
2587         * b3/B3SwitchValue.cpp:
2588         (JSC::B3::SwitchValue::cloneImpl):
2589         (JSC::B3::SwitchValue::SwitchValue):
2590         * b3/B3SwitchValue.h:
2591         * b3/B3UpsilonValue.h:
2592         * b3/B3Validate.cpp:
2593         * b3/B3Value.cpp:
2594         (JSC::B3::Value::replaceWithIdentity):
2595         (JSC::B3::Value::replaceWithNop):
2596         (JSC::B3::Value::replaceWithPhi):
2597         (JSC::B3::Value::dump):
2598         (JSC::B3::Value::effects):
2599         (JSC::B3::Value::checkOpcode):
2600         * b3/B3Value.h:
2601         * b3/B3Variable.cpp: Added.
2602         (JSC::B3::Variable::~Variable):
2603         (JSC::B3::Variable::dump):
2604         (JSC::B3::Variable::deepDump):
2605         (JSC::B3::Variable::Variable):
2606         * b3/B3Variable.h: Added.
2607         (JSC::B3::Variable::type):
2608         (JSC::B3::Variable::index):
2609         (JSC::B3::DeepVariableDump::DeepVariableDump):
2610         (JSC::B3::DeepVariableDump::dump):
2611         (JSC::B3::deepDump):
2612         * b3/B3VariableValue.cpp: Added.
2613         (JSC::B3::VariableValue::~VariableValue):
2614         (JSC::B3::VariableValue::dumpMeta):
2615         (JSC::B3::VariableValue::cloneImpl):
2616         (JSC::B3::VariableValue::VariableValue):
2617         * b3/B3VariableValue.h: Added.
2618         * b3/air/AirAllocateStack.cpp:
2619         (JSC::B3::Air::allocateStack):
2620         * b3/air/AirCode.cpp:
2621         (JSC::B3::Air::Code::addStackSlot):
2622         (JSC::B3::Air::Code::addSpecial):
2623         (JSC::B3::Air::Code::cCallSpecial):
2624         * b3/air/AirCode.h:
2625         (JSC::B3::Air::Code::begin):
2626         (JSC::B3::Air::Code::end):
2627         (JSC::B3::Air::Code::stackSlots):
2628         (JSC::B3::Air::Code::specials):
2629         (JSC::B3::Air::Code::forAllTmps):
2630         (JSC::B3::Air::Code::StackSlotsCollection::StackSlotsCollection): Deleted.
2631         (JSC::B3::Air::Code::StackSlotsCollection::size): Deleted.
2632         (JSC::B3::Air::Code::StackSlotsCollection::at): Deleted.
2633         (JSC::B3::Air::Code::StackSlotsCollection::operator[]): Deleted.
2634         (JSC::B3::Air::Code::StackSlotsCollection::iterator::iterator): Deleted.
2635         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator*): Deleted.
2636         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator++): Deleted.
2637         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator==): Deleted.
2638         (JSC::B3::Air::Code::StackSlotsCollection::iterator::operator!=): Deleted.
2639         (JSC::B3::Air::Code::StackSlotsCollection::begin): Deleted.
2640         (JSC::B3::Air::Code::StackSlotsCollection::end): Deleted.
2641         (JSC::B3::Air::Code::SpecialsCollection::SpecialsCollection): Deleted.
2642         (JSC::B3::Air::Code::SpecialsCollection::size): Deleted.
2643         (JSC::B3::Air::Code::SpecialsCollection::at): Deleted.
2644         (JSC::B3::Air::Code::SpecialsCollection::operator[]): Deleted.
2645         (JSC::B3::Air::Code::SpecialsCollection::iterator::iterator): Deleted.
2646         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator*): Deleted.
2647         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator++): Deleted.
2648         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator==): Deleted.
2649         (JSC::B3::Air::Code::SpecialsCollection::iterator::operator!=): Deleted.
2650         (JSC::B3::Air::Code::SpecialsCollection::begin): Deleted.
2651         (JSC::B3::Air::Code::SpecialsCollection::end): Deleted.
2652         * b3/air/AirFixObviousSpills.cpp:
2653         * b3/air/AirInstInlines.h:
2654         * b3/air/AirIteratedRegisterCoalescing.cpp:
2655         * b3/air/AirLiveness.h:
2656         * b3/air/AirLowerAfterRegAlloc.cpp:
2657         (JSC::B3::Air::lowerAfterRegAlloc):
2658         * b3/air/AirSpecial.cpp:
2659         (JSC::B3::Air::Special::Special):
2660         * b3/air/AirSpecial.h:
2661         * b3/air/AirSpillEverything.cpp:
2662         (JSC::B3::Air::spillEverything):
2663         * b3/air/AirStackSlot.cpp:
2664         (JSC::B3::Air::StackSlot::dump):
2665         (JSC::B3::Air::StackSlot::deepDump):
2666         (JSC::B3::Air::StackSlot::StackSlot):
2667         * b3/air/AirStackSlot.h:
2668         (JSC::B3::Air::StackSlot::byteSize):
2669         (JSC::B3::Air::StackSlot::kind):
2670         (JSC::B3::Air::StackSlot::isLocked):
2671         (JSC::B3::Air::StackSlot::isSpill):
2672         (JSC::B3::Air::StackSlot::index):
2673         (JSC::B3::Air::StackSlot::ensureSize):
2674         * b3/air/AirStackSlotKind.cpp: Copied from Source/JavaScriptCore/b3/B3StackSlotKind.cpp.
2675         (WTF::printInternal):
2676         * b3/air/AirStackSlotKind.h: Copied from Source/JavaScriptCore/b3/B3StackSlotKind.h.
2677         * b3/air/opcode_generator.rb:
2678         * b3/air/testair.cpp:
2679         (JSC::B3::Air::testShuffleBroadcastAllRegs):
2680         (JSC::B3::Air::testShuffleShiftAllRegs):
2681         (JSC::B3::Air::testShuffleRotateAllRegs):
2682         * b3/testb3.cpp:
2683         (JSC::B3::testStackSlot):
2684         (JSC::B3::testStoreLoadStackSlot):
2685         * ftl/FTLB3Output.cpp:
2686         (JSC::FTL::Output::lockedStackSlot):
2687         (JSC::FTL::Output::neg):
2688         * ftl/FTLLowerDFGToLLVM.cpp:
2689         (JSC::FTL::DFG::LowerDFGToLLVM::compileInvalidationPoint):
2690
2691 2016-02-02  Yusuke Suzuki  <utatane.tea@gmail.com>
2692
2693         [JSC] Introduce BytecodeIntrinsic constant rep like @undefined
2694         https://bugs.webkit.org/show_bug.cgi?id=153737
2695
2696         Reviewed by Darin Adler.
2697
2698         This patch enhances existing BytecodeIntrinsic mechanism to accept `@xxx` form,
2699         that will be used to represent bytecode intrinsic constants.
2700         After this change, we can use 2 forms for bytecode intrinsics. (1) Function form (like, @toString(value))
2701         and (2) Constant form (like @undefined).
2702
2703         Bytecode intrinsic constants allow us to easily expose constant values from C++ world.
2704         For example, we can expose ArrayIterationKind flags to JS world without using private global variables.
2705         Exposed constant values are loaded from bytecodes directly through constant registers.
2706         While previously we expose them through private global variables, bytecode intrinsic constants
2707         can be loaded directly from CodeBlock. And later, it will become JSConstant in DFG.
2708
2709         And by using this mechanism, we implement several constants. @undefined, @arrayIterationKindKeyValue etc.
2710
2711         * builtins/ArrayConstructor.js:
2712         (from):
2713         * builtins/ArrayIteratorPrototype.js:
2714         (next):
2715         * builtins/ArrayPrototype.js:
2716         (reduce):
2717         (reduceRight):
2718         (every):
2719         (forEach):
2720         (filter):
2721         (map):
2722         (some):
2723         (fill):
2724         (find):
2725         (findIndex):
2726         (includes):
2727         (sort.compactSparse):
2728         (sort.compactSlow):
2729         (sort.compact):
2730         (sort):
2731         (copyWithin):
2732         * builtins/DatePrototype.js:
2733         (toLocaleString.toDateTimeOptionsAnyAll):
2734         (toLocaleString):
2735         (toLocaleDateString.toDateTimeOptionsDateDate):
2736         (toLocaleDateString):
2737         (toLocaleTimeString.toDateTimeOptionsTimeTime):
2738         (toLocaleTimeString):
2739         * builtins/GeneratorPrototype.js:
2740         (generatorResume):
2741         * builtins/GlobalObject.js:
2742         (isDictionary):
2743         * builtins/InternalPromiseConstructor.js:
2744         (internalAll.newResolveElement):
2745         (internalAll):
2746         * builtins/IteratorPrototype.js:
2747         (symbolIteratorGetter):
2748         (symbolIterator): Deleted.
2749         * builtins/MapPrototype.js:
2750         (forEach):
2751         * builtins/ModuleLoaderObject.js:
2752         (newRegistryEntry):
2753         (forceFulfillPromise):
2754         (commitInstantiated):
2755         (requestFetch):
2756         (requestTranslate):
2757         (requestInstantiate):
2758         (requestLink):
2759         (provide):
2760         * builtins/PromiseConstructor.js:
2761         (all.newResolveElement):
2762         (all):
2763         (race):
2764         (reject):
2765         (resolve):
2766         * builtins/PromiseOperations.js:
2767         (newPromiseCapability.executor):
2768         (newPromiseCapability):
2769         (rejectPromise):
2770         (fulfillPromise):
2771         (createResolvingFunctions.resolve):
2772         (createResolvingFunctions.reject):
2773         (createResolvingFunctions):
2774         (promiseReactionJob):
2775         (promiseResolveThenableJob):
2776         (initializePromise):
2777         * builtins/PromisePrototype.js:
2778         (catch):
2779         (then):
2780         * builtins/SetPrototype.js:
2781         (forEach):
2782         * builtins/StringConstructor.js:
2783         (raw):
2784         * builtins/StringIteratorPrototype.js:
2785         (next):
2786         * builtins/StringPrototype.js:
2787         (localeCompare):
2788         * builtins/TypedArrayConstructor.js:
2789         (of):
2790         (from):
2791         * builtins/TypedArrayPrototype.js:
2792         (every):
2793         (find):
2794         (findIndex):
2795         (forEach):
2796         (some):
2797         (reduce):
2798         (reduceRight):
2799         (map):
2800         (filter):
2801         * bytecode/BytecodeIntrinsicRegistry.cpp:
2802         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
2803         (JSC::BytecodeIntrinsicRegistry::lookup):
2804         * bytecode/BytecodeIntrinsicRegistry.h:
2805         * bytecompiler/NodesCodegen.cpp:
2806         * parser/ASTBuilder.h:
2807         (JSC::ASTBuilder::createResolve):
2808         (JSC::ASTBuilder::makeFunctionCallNode):
2809         * parser/NodeConstructors.h:
2810         (JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):
2811         * parser/Nodes.h:
2812         (JSC::ExpressionNode::isBytecodeIntrinsicNode):
2813         (JSC::BytecodeIntrinsicNode::type):
2814         (JSC::BytecodeIntrinsicNode::emitter):
2815         * parser/Parser.cpp:
2816         (JSC::Parser<LexerType>::parseProperty):
2817         (JSC::Parser<LexerType>::parsePrimaryExpression):
2818         * parser/SyntaxChecker.h:
2819         (JSC::SyntaxChecker::createResolve):
2820         * runtime/CommonIdentifiers.cpp:
2821         (JSC::CommonIdentifiers::CommonIdentifiers): Deleted.
2822         * runtime/CommonIdentifiers.h:
2823         (JSC::CommonIdentifiers::bytecodeIntrinsicRegistry): Deleted.
2824         * runtime/IteratorPrototype.cpp:
2825         (JSC::IteratorPrototype::finishCreation):
2826         * runtime/JSGlobalObject.cpp:
2827         (JSC::JSGlobalObject::init): Deleted.
2828         * runtime/VM.cpp:
2829         (JSC::VM::VM):
2830         * runtime/VM.h:
2831         (JSC::VM::bytecodeIntrinsicRegistry):
2832
2833 2016-02-02  Per Arne Vollan  <peavo@outlook.com>
2834
2835         [B3][Win64] Compile fixes.
2836         https://bugs.webkit.org/show_bug.cgi?id=153605
2837
2838         Reviewed by Filip Pizlo.
2839
2840         Fix remaining compile errors on Win64.
2841
2842         * CMakeLists.txt:
2843         * b3/B3CFG.h:
2844         (JSC::B3::CFG::newMap):
2845         * ftl/FTLJITCode.h:
2846
2847 2016-02-01  Chris Dumez  <cdumez@apple.com>
2848
2849         object.__lookupGetter__() / object.__lookupSetter__() does not work for native bindings
2850         https://bugs.webkit.org/show_bug.cgi?id=153765
2851         <rdar://problem/24439699>
2852
2853         Reviewed by Oliver Hunt.
2854
2855         Add support for CustomAccessor slots to objectProtoFuncLookupGetter() and
2856         objectProtoFuncLookupSetter() by return getOwnPropertyDescriptor().get / set.
2857         getOwnPropertyDescriptor() now correctly deals with CustomAccessors since
2858         r196001.
2859
2860         * runtime/ObjectPrototype.cpp:
2861         (JSC::objectProtoFuncLookupGetter):
2862         (JSC::objectProtoFuncLookupSetter):
2863
2864 2016-02-01  Chris Dumez  <cdumez@apple.com>
2865
2866         Native Bindings Descriptors are Incomplete
2867         https://bugs.webkit.org/show_bug.cgi?id=140575
2868         <rdar://problem/19506502>
2869
2870         Reviewed by Oliver Hunt.
2871
2872         This patch is based on initial work by Joe Pecoraro and Matthew Mirman.
2873
2874         This patch was initially rolled out for breaking chromeexperiments.com,
2875         presumably because our IDL attributes were not marked as [configurable]
2876         at the time. However, since r190104, our IDL attributes are now
2877         configurable. Based on local testing, chromeexperiments.com seems to be
2878         working fine now.
2879
2880         * JavaScriptCore.xcodeproj/project.pbxproj:
2881         * inspector/InjectedScriptSource.js:
2882         (endsWith):
2883         (InjectedScript.prototype.processProperties):
2884         * runtime/JSBoundSlotBaseFunction.cpp: Added.
2885         (JSC::boundSlotBaseFunctionCall):
2886         (JSC::JSBoundSlotBaseFunction::JSBoundSlotBaseFunction):
2887         (JSC::JSBoundSlotBaseFunction::create):
2888         (JSC::JSBoundSlotBaseFunction::visitChildren):
2889         (JSC::JSBoundSlotBaseFunction::finishCreation):
2890         * runtime/JSBoundSlotBaseFunction.h: Added.
2891         (JSC::JSBoundSlotBaseFunction::createStructure):
2892         (JSC::JSBoundSlotBaseFunction::boundSlotBase):
2893         (JSC::JSBoundSlotBaseFunction::customGetterSetter):
2894         (JSC::JSBoundSlotBaseFunction::isSetter):
2895         * runtime/JSGlobalObject.cpp:
2896         (JSC::JSGlobalObject::init):
2897         (JSC::JSGlobalObject::visitChildren):
2898         * runtime/JSGlobalObject.h:
2899         (JSC::JSGlobalObject::boundSlotBaseFunctionStructure):
2900         * runtime/JSObject.cpp:
2901         (JSC::getBoundSlotBaseFunctionForGetterSetter):
2902         (JSC::JSObject::getOwnPropertyDescriptor):
2903         * runtime/VM.cpp:
2904         (JSC::VM::VM):
2905         * runtime/VM.h:
2906
2907 2016-02-01  Joseph Pecoraro  <pecoraro@apple.com>
2908
2909         Web Inspector: High Level Memory Overview Instrument
2910         https://bugs.webkit.org/show_bug.cgi?id=153516
2911         <rdar://problem/24356378>
2912
2913         Reviewed by Brian Burg.
2914
2915         * CMakeLists.txt:
2916         * Configurations/FeatureDefines.xcconfig:
2917         * DerivedSources.make:
2918         * inspector/protocol/Memory.json: Added.
2919         * inspector/scripts/codegen/generator.py:
2920         New Memory domain guarded by ENABLE(RESOURCE_USAGE).
2921         This feature flag was already used in WebCore.
2922
2923 2016-02-01  Benjamin Poulain  <benjamin@webkit.org>
2924
2925         [JSC] IRC can coalesce the frame pointer with a Tmp that is modified
2926         https://bugs.webkit.org/show_bug.cgi?id=153694
2927
2928         Reviewed by Filip Pizlo.
2929
2930         Let's say we have:
2931             Move(FP, Tmp1)
2932             Add64(#1, Tmp1)
2933
2934         If we were to coalesce the Move, we would modify the frame pointer.
2935         Well, that's exactly what was happening with IRC.
2936
2937         Since the epilogue is not know to Air before IRC, the liveness analysis
2938         never discovers that FP is live when Tmp1 is UseDef by Add64. Adding
2939         FP would a be a problem anyway for a bunch of reasons.
2940
2941         I tried two ways to prevent IRC to override IRC:
2942         1) Add an interference edge with FP for all non-duplication Defs.
2943         2) Let coalesce() know about FP and constraint any coalescing with a re-Def.
2944
2945         The two are within margin of error for performance. The second one was considerably
2946         more complicated. This patch implements the first one.
2947
2948         Some extra note:
2949         -It is very important to not increment the degree of a Tmp when making it interfere
2950          with FP. FP is not a valid color, it is not counted in the "K" colors considered
2951          for coloring. Increasing the degree with the edge to FP would make every stage
2952          pessimistic since there is an extra degree that can never be removed.
2953         -I put "interferenceEdges" and "adjacencyList" in an inconsistent state.
2954          This is intentional, "interferenceEdges" is used to test the existence of an edge,
2955          "adjacencyList" is used to go over all the edges. In this case, we don't want
2956          the edge with FP to be considered when pruning the graph.
2957
2958         * b3/air/AirIteratedRegisterCoalescing.cpp:
2959         One branch could be transformed into an assertion: TmpLiveness is type specific now.
2960         * b3/testb3.cpp:
2961         (JSC::B3::testOverrideFramePointer):
2962         (JSC::B3::run):
2963
2964 2016-02-01  Csaba Osztrogonác  <ossy@webkit.org>
2965
2966         Unreviewed speculative buildfix.
2967
2968         * dfg/DFGCommon.h: FTL_USES_B3 should be false if FTL JIT is disabled.
2969
2970 2016-01-31  Dan Bernstein  <mitz@apple.com>
2971
2972         [Cocoa] Remove unused definition of HAVE_HEADER_DETECTION_H
2973         https://bugs.webkit.org/show_bug.cgi?id=153729
2974
2975         Reviewed by Sam Weinig.
2976
2977         After r141700, HAVE_HEADER_DETECTION_H is no longer used.
2978
2979         * Configurations/Base.xcconfig:
2980
2981 2016-01-30  Filip Pizlo  <fpizlo@apple.com>
2982
2983         B3->Air lowering should use MoveFloat more
2984         https://bugs.webkit.org/show_bug.cgi?id=153714
2985
2986         Reviewed by Sam Weinig.
2987
2988         This is a very minor and benign bug. It just means that we will use the more canonical
2989         MoveFloat instruction when moving floats, rather than using MoveDouble.
2990
2991         * b3/B3LowerToAir.cpp:
2992         (JSC::B3::Air::LowerToAir::relaxedMoveForType):
2993
2994 2016-01-31  Yusuke Suzuki  <utatane.tea@gmail.com>
2995
2996         Should not predict OtherObj for ToThis with primitive types under strict mode
2997         https://bugs.webkit.org/show_bug.cgi?id=153544
2998
2999         Reviewed by Filip Pizlo.
3000
3001         Currently, ToThis predicates OtherObj for primitive values.
3002         But it's not true in strict mode.
3003         In strict mode, ToThis does nothing on primitive values.
3004
3005         In this patch, we
3006
3007         1. fix prediction. Handles primitive types in strict mode. And we also handles StringObject.
3008         2. convert it to Identity if the argument should be predicted as primitive types.
3009
3010         This optimization is important to implement Primitive.prototype.methods[1].
3011         Otherwise, we always got BadType OSR exits.
3012
3013         [1]: https://bugs.webkit.org/show_bug.cgi?id=143889
3014
3015         * dfg/DFGAbstractInterpreterInlines.h:
3016         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3017         * dfg/DFGConstantFoldingPhase.cpp:
3018         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3019         * dfg/DFGFixupPhase.cpp:
3020         (JSC::DFG::FixupPhase::fixupNode):
3021         (JSC::DFG::FixupPhase::fixupToThis):
3022         * dfg/DFGPredictionPropagationPhase.cpp:
3023         (JSC::DFG::PredictionPropagationPhase::propagate):
3024         * tests/stress/to-this-boolean.js: Added.
3025         (Boolean.prototype.negate):
3026         (Boolean.prototype.negate2):
3027         * tests/stress/to-this-double.js: Added.
3028         (Number.prototype.negate):
3029         * tests/stress/to-this-int32.js: Added.
3030         (Number.prototype.negate):
3031         * tests/stress/to-this-int52.js: Added.
3032         (Number.prototype.negate):
3033         * tests/stress/to-this-number.js: Added.
3034         (Number.prototype.negate):
3035         * tests/stress/to-this-string.js: Added.
3036         (String.prototype.prefix):
3037         (String.prototype.first):
3038         (String.prototype.second):
3039         * tests/stress/to-this-symbol.js: Added.
3040         (Symbol.prototype.identity):
3041         (Symbol.prototype.identity2):
3042
3043 2016-01-31  Guillaume Emont  <guijemont@igalia.com>
3044
3045         [mips] don't save to a callee saved register too early
3046         https://bugs.webkit.org/show_bug.cgi?id=153463
3047
3048         If we save $gp to $s4 in pichdr, then in some cases, we were
3049         overwriting $s4 before LLInt's pushCalleeSaves() is called (as pichdr
3050         is at the very beginning of a function). Now we save $gp to $s4 at the
3051         end of pushCalleeSaves().
3052
3053         Reviewed by Michael Saboff.
3054
3055         * offlineasm/mips.rb:
3056         * llint/LowLevelInterpreter.asm:
3057         Move the saving of $gp to $s4 from pichdr to pushCalleeSaves(). Take
3058         the opportunity to only save $s4 as we never use the other callee
3059         saved registers.
3060
3061 2016-01-30  Commit Queue  <commit-queue@webkit.org>
3062
3063         Unreviewed, rolling out r195799 and r195828.
3064         https://bugs.webkit.org/show_bug.cgi?id=153722
3065
3066         Caused assertion failures, severely affecting EWS (Requested
3067         by ap on #webkit).
3068
3069         Reverted changesets:
3070
3071         "Web Inspector: InspectorTimelineAgent doesn't need to
3072         recompile functions because it now uses the sampling profiler"
3073         https://bugs.webkit.org/show_bug.cgi?id=153500
3074         http://trac.webkit.org/changeset/195799
3075
3076         "Attempt to fix the Windows build after r195799"
3077         http://trac.webkit.org/changeset/195828
3078
3079 2016-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
3080
3081         [B3] JetStream/quicksort.c fails/hangs on Linux with GCC
3082         https://bugs.webkit.org/show_bug.cgi?id=153647
3083
3084         Reviewed by Filip Pizlo.
3085
3086         In B3ComputeDivisionMagic, we accidentally perform sub, add operation onto signed integer. (In this case, int32_t)
3087         But integer overflow is undefined behavior in C![1][2]
3088         As a result, in GCC 4.9 release build, computeDivisionMagic(2) returns unexpected value.
3089         `divisor = 2`
3090         `d = 2`
3091         `signedMin = INT32_MIN = -2147483647 (-0x7fffffff)`
3092         `t = signedMin`
3093         `anc = t - 1 - (t % ad)` Oops, we performed overflow operation!
3094
3095         So, `anc` value becomes undefined.
3096         In this patch, we first cast all the operated values to unsigned one.
3097         Reading the code, there are no operations that depends on signedness. (For example, we used aboveEqual like unsigned operations for comparison.)
3098
3099         [1]: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
3100         [2]: http://dl.acm.org/citation.cfm?id=2522728
3101
3102         * b3/B3ComputeDivisionMagic.h:
3103         (JSC::B3::computeDivisionMagic):
3104         * b3/testb3.cpp:
3105         (JSC::B3::testComputeDivisionMagic):
3106         (JSC::B3::run):
3107
3108 2016-01-30  Andreas Kling  <akling@apple.com>
3109
3110         Shrink Heap::m_executables after cleaning it.
3111         <https://webkit.org/b/153682>
3112
3113         Reviewed by Darin Adler.
3114
3115         The Heap::m_executables Vector was never shrunk down, despite sometimes
3116         getting pretty huge (~500kB in my longest-running WebContent process.)
3117
3118         After GC has finished pruning unmarked Executables, shrink the Vector.
3119
3120         * heap/Heap.cpp:
3121         (JSC::Heap::clearUnmarkedExecutables):
3122
3123 2016-01-29  Ada Chan  <adachan@apple.com>
3124
3125         Enable VIDEO_PRESENTATION_MODE only in Debug and Release builds on Mac
3126         https://bugs.webkit.org/show_bug.cgi?id=153665
3127
3128         Reviewed by Dan Bernstein.
3129
3130         * Configurations/FeatureDefines.xcconfig:
3131
3132 2016-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
3133
3134         [B3] REGRESSION(r195882): Should break early after modConstant replaceWithNewValue succeeds
3135         https://bugs.webkit.org/show_bug.cgi?id=153711
3136
3137         Reviewed by Filip Pizlo.
3138
3139         Should break after modConstant replaceWithNewValue succeeds. m_value is already replaced with Identity
3140         if modConstant succeeds. So it does not have any children. m_value->child(1) breaks testb3.
3141
3142         * b3/B3ReduceStrength.cpp:
3143
3144 2016-01-30  Yusuke Suzuki  <utatane.tea@gmail.com>
3145
3146         Enable SamplingProfiler on POSIX environment
3147         https://bugs.webkit.org/show_bug.cgi?id=153584
3148
3149         Reviewed by Michael Saboff.
3150
3151         In this patch, we implement suspend and resume mechanizm for POSIX threads.
3152         And with GLIBC, we can retrieve registers from it.
3153
3154         We take the following strategy.
3155
3156         Suspend side.
3157         1. install sigaction to the threads.
3158         2. in the profiler (suspend / resume callers), emit signal with pthread_kill and wait with POSIX semaphore.
3159         3. in the signal handler, up the POSIX semaphore. Use sem_post because it is the async-signal-safe function in POSIX.
3160         4. in the signal handler, perform sigsuspend to stop the thread until being resumed.
3161         5. in the profiler, we can be waken up from the semaphore because (3) ups.
3162
3163         Resume side.
3164         1. in the profiler, emit signal and wait on the semaphore.
3165         2. in the signal handler, it is waken up from the sigsuspend.
3166         3. in the signal handler, up the semaphore.
3167         4. in the profiler, the profiler is waken up from the semaphore. It is ensured that the given thread is resumed by the signal.
3168
3169         * heap/MachineStackMarker.cpp:
3170         (pthreadSignalHandlerSuspendResume):
3171         (JSC::MachineThreads::Thread::Thread):
3172         (JSC::MachineThreads::Thread::~Thread):
3173         (JSC::MachineThreads::Thread::suspend):
3174         (JSC::MachineThreads::Thread::resume):
3175         (JSC::MachineThreads::Thread::getRegisters):
3176         (JSC::MachineThreads::Thread::Registers::stackPointer):
3177         (JSC::MachineThreads::Thread::Registers::framePointer):
3178         (JSC::MachineThreads::Thread::Registers::instructionPointer):
3179         (JSC::MachineThreads::Thread::Registers::llintPC):
3180         (JSC::MachineThreads::Thread::freeRegisters):
3181         * heap/MachineStackMarker.h:
3182         * runtime/SamplingProfiler.cpp:
3183         (JSC::reportStats):
3184         * tests/stress/call-varargs-from-inlined-code-with-odd-number-of-arguments.js:
3185         * tests/stress/call-varargs-from-inlined-code.js:
3186         * tests/stress/v8-earley-boyer-strict.js:
3187
3188 2016-01-29  Filip Pizlo  <fpizlo@apple.com>
3189
3190         B3 should reduce Mod(value, constant) to Div and Mul so that our Div optimizations can do things
3191         https://bugs.webkit.org/show_bug.cgi?id=153693
3192
3193         Reviewed by Saam Barati.
3194
3195         The most efficient way to handle Mod(value, constant) is to reduce it to
3196         Sub(value, Mul(Div(value, constant), constant)) and then let the Div optimizations do their
3197         thing.
3198
3199         In the future we could add special handling of Mod(value, 1 << constant), but it's not
3200         obvious that this would produce better code than reducing through Div, if we also make sure
3201         that we have great optimizations for Mul and Div.
3202
3203         * b3/B3ReduceStrength.cpp:
3204
3205 2016-01-29  Keith Miller  <keith_miller@apple.com>
3206
3207         Array.prototype native functions should use Symbol.species to construct the result
3208         https://bugs.webkit.org/show_bug.cgi?id=153660
3209
3210         Reviewed by Saam Barati.
3211
3212         This patch adds support for Symbol.species in the Array.prototype native functions.
3213         We make an optimization to avoid regressions on some benchmarks by using an
3214         adaptive watchpoint to check if Array.prototype.constructor is ever changed.
3215
3216         * runtime/ArrayPrototype.cpp:
3217         (JSC::putLength):
3218         (JSC::setLength):
3219         (JSC::speciesConstructArray):
3220         (JSC::arrayProtoFuncConcat):
3221         (JSC::arrayProtoFuncSlice):
3222         (JSC::arrayProtoFuncSplice):
3223         (JSC::ArrayPrototype::setConstructor):
3224         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::ArrayPrototypeAdaptiveInferredPropertyWatchpoint):
3225         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire):
3226         * runtime/ArrayPrototype.h:
3227         (JSC::ArrayPrototype::didChangeConstructorProperty):
3228         * runtime/ConstructData.cpp:
3229         (JSC::construct):
3230         * runtime/ConstructData.h:
3231         * runtime/JSGlobalObject.cpp:
3232         (JSC::JSGlobalObject::init):
3233         * tests/es6.yaml:
3234         * tests/stress/array-species-functions.js: Added.
3235         (Symbol.species):
3236         (funcThrows):
3237         (test.species):
3238         (test):
3239
3240 2016-01-29  Filip Pizlo  <fpizlo@apple.com>
3241
3242         CallLinkStatus should trust BadCell exit sites whenever there is no stub
3243         https://bugs.webkit.org/show_bug.cgi?id=153691
3244
3245         Reviewed by Benjamin Poulain.
3246
3247         This fixes a regression in our treatment of inlining failure exit sites when deciding if we
3248         should inline a call.
3249
3250         A long time ago, a BadCell exit site would ensure that a CallLinkStatus returned
3251         takesSlowPath.
3252
3253         But then we added closure calls. A BadCell exit site might just mean that we should do
3254         closure call inlining. We added a BadExecutable exit site to indicate that even closure call
3255         inlining had failed. BadCell would no longer force CallLinkStatus to return takesSlowPath,
3256         but BadExecutable would stuff do so.
3257
3258         But then we unified the IR for checking functions and executables, and the DFG stopped using
3259         the BadExecutable exit kind. Probably this change disabled our ability to use exit site
3260         counting for deciding when to takesSlowPath. But this isn't necessarily a disaster, since
3261         any time you exited in this way, you'd be taken to a baseline call inline cache, and that
3262         inline cache would record the slow path.
3263
3264         But then we introduced polymorphic call inlining. Polymorphic call inlining means that call
3265         unlinking, like when one of the callees is optimized, will reset the stub. We also made it
3266         so that the stub is like a gate for the slow path count. A clear inline cache must first
3267         cause the creation of a stub and then cause it to overflow before the slow path is counted.
3268
3269         So, if the DFG or FTL exits on a cell check associated with a particular callsite being
3270         speculatively inlined, then it's possible that nobody will know about the exit because:
3271
3272         - The exit kind is BadCell but CallLinkStatus needs BadExecutable to disable inlining.
3273
3274         - Between when we tiered up to the DFG (or FTL) and when the exit happened, one of the
3275           callees was tiered up, causing the baseline CallLinkInfo to be unlinked. Therefore, after
3276           the exit, the inline cache is in a reset state and will not count the call as taking slow
3277           path.
3278
3279         The challenge when dealing with this is that often, we will have an super early compilation
3280         of a minimorphic call site before we have seen all of its small set of callees. For example
3281         we may have seen only one of two possible callees. That early compilation will OSR exit, and
3282         in trunk, will be recompiled with bimorphic speculative inlining. That's a pretty good
3283         outcome. Basically, we are trusting that if during the time that the function has been
3284         running prior to a given compilation, a callsite has only seen a small number of callees,
3285         then it's safe to assume that it won't see another one anytime soon.
3286
3287         So, simply forcing the CallLinkStatus to set takesSlowPath any time there was a BadCell exit
3288         would hurt our performance in some cases, because trunk prior to this change would have their
3289         final compilation use speculative inlining, and this change would make guarded inlining
3290         instead.
3291
3292         The compromise that I came up with relies on the fact that a CallLinkInfo must be reset quite
3293         frequently for it to routinely happen in between tier-up to DFG (or FTL) and an exit. So,
3294         most likely, such a CallLinkInfo will also show up as being clear when the CallLinkStatus
3295         is built during DFG profiling. The CallLinkStatus will then fall back on the CallLinkInfo's
3296         lastSeenCallee field, which is persistent across resets. This change just makes it so that
3297         CallLinkStatus sets takesSlowPath if there is a BadCell exit and the status had to be
3298         inferred from the lastSeenCallee.
3299
3300         This change reduces pointless recompilations in gbemu. It's an 11% speed-up on gbemu. It
3301         doesn't seem to hurt any benchmarks.
3302
3303         * bytecode/CallLinkStatus.cpp:
3304         (JSC::CallLinkStatus::computeFor):
3305         (JSC::CallLinkStatus::computeExitSiteData):
3306         (JSC::CallLinkStatus::computeFromCallLinkInfo):
3307         * bytecode/CallLinkStatus.h:
3308         (JSC::CallLinkStatus::CallLinkStatus):
3309         (JSC::CallLinkStatus::at):
3310         (JSC::CallLinkStatus::operator[]):
3311         (JSC::CallLinkStatus::isProved):
3312         (JSC::CallLinkStatus::isBasedOnStub):
3313         (JSC::CallLinkStatus::canOptimize):
3314         (JSC::CallLinkStatus::maxNumArguments):
3315         (JSC::CallLinkStatus::ExitSiteData::ExitSiteData): Deleted.
3316
3317 2016-01-29  Saam barati  <sbarati@apple.com>
3318
3319         Pack FunctionExecutable and UnlinkedFunctionExecutable harder
3320         https://bugs.webkit.org/show_bug.cgi?id=153687
3321
3322         Reviewed by Andreas Kling.
3323
3324         This patch reduces FunctionExecutable from 120 to 104 bytes.
3325         This patch reduces UnlinkedFunctionExecutable from 144 to 136 bytes.
3326
3327         * bytecode/ExecutableInfo.h:
3328         * bytecode/UnlinkedFunctionExecutable.cpp:
3329         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
3330         * bytecode/UnlinkedFunctionExecutable.h:
3331         * parser/ParserModes.h:
3332         (JSC::functionNameScopeIsDynamic):
3333         * runtime/Executable.cpp:
3334         (JSC::ScriptExecutable::ScriptExecutable):
3335         * runtime/Executable.h:
3336         (JSC::ScriptExecutable::needsActivation):
3337         (JSC::ScriptExecutable::isArrowFunctionContext):
3338         (JSC::ScriptExecutable::isStrictMode):
3339         (JSC::ScriptExecutable::derivedContextType):
3340         (JSC::ScriptExecutable::ecmaMode):
3341         (JSC::ScriptExecutable::finishCreation):
3342
3343 2016-01-29  Saam barati  <sbarati@apple.com>
3344
3345         JSC Sampling Profiler: Come up with a (program counter => CodeOrigin) mapping
3346         https://bugs.webkit.org/show_bug.cgi?id=152629
3347
3348         Reviewed by Filip Pizlo.
3349
3350         This patch implements a mapping from PC to CodeOrigin
3351         that lives off of JITed CodeBlocks. We build this mapping
3352         while JITing code, and then we compress it and store
3353         it on the CodeBlock. We only build the mapping if a debugger
3354         has ever been attached to any global object.
3355
3356         CodeBlock consults this mapping when searching for a CodeOrigin
3357         for a given PC, but it also consults other code ranges
3358         off the main path that may own the PC. Specifically, it searches
3359         through inline caches, OSRExits, and LazySlowPaths.
3360
3361         To find PC info for the LLInt, we also save the LLInt pc when
3362         taking a stack trace where the top frame is in LLInt code.
3363
3364         This patch also cleans up code inside the SamplingProfier.
3365         I realized a bug in the SamplingProfiler's implementation.
3366         We used to walk the inline stack while gathering a stack
3367         trace. This is wrong. It's super dangerous to do this because
3368         we might pause the JSC process while it's modifying its
3369         CodeOrigin table. We used to walk the inline stack while
3370         taking a stack trace because doing so could save us from
3371         having to verify a particular stack trace. This patch changes that.
3372         We now have to verify all stack traces taken. This verification step
3373         includes walking the inline stack.
3374
3375         Because we have a PC=>CodeOrigin map, we can now gather more
3376         detailed information about the top-frame we pause. This allows
3377         us to correctly observe inlining. It also allows us to observe
3378         expression-level line/column information for the top frame.
3379         The reason we don't consult this mapping for parent frames is 
3380         that all parent frames should set the CallSiteIndex on the call
3381         frame header, which means we can consult that value to get inlining 
3382         and expression-level line/column information.
3383
3384         * CMakeLists.txt:
3385         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
3386         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
3387         * JavaScriptCore.xcodeproj/project.pbxproj:
3388         * assembler/AbstractMacroAssembler.h:
3389         (JSC::AbstractMacroAssembler::Label::Label):
3390         (JSC::AbstractMacroAssembler::Label::operator==):
3391         (JSC::AbstractMacroAssembler::Label::isSet):
3392         * assembler/AssemblerBuffer.h:
3393         (JSC::AssemblerLabel::labelAtOffset):
3394         (JSC::AssemblerLabel::operator==):
3395         * b3/B3Generate.cpp:
3396         * b3/B3Origin.h:
3397         (JSC::B3::Origin::data):
3398         (JSC::B3::Origin::operator==):
3399         * b3/B3PCToOriginMap.h: Added.
3400         (JSC::B3::PCToOriginMap::PCToOriginMap):
3401         (JSC::B3::PCToOriginMap::appendItem):
3402         (JSC::B3::PCToOriginMap::ranges):
3403         * b3/B3Procedure.h:
3404         (JSC::B3::Procedure::pcToOriginMap):
3405         (JSC::B3::Procedure::releasePCToOriginMap):
3406         * b3/air/AirGenerate.cpp:
3407         (JSC::B3::Air::generate):
3408         * bytecode/CodeBlock.cpp:
3409         (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
3410         (JSC::CodeBlock::setPCToCodeOriginMap):
3411         (JSC::CodeBlock::findPC):
3412         * bytecode/CodeBlock.h:
3413         (JSC::CodeBlock::jitCodeMap):
3414         (JSC::CodeBlock::bytecodeOffset):
3415         * bytecode/CodeOrigin.h:
3416         (JSC::CodeOrigin::operator==):
3417         (JSC::CodeOriginHash::hash):
3418         (JSC::CodeOriginHash::equal):
3419         * bytecode/InlineCallFrame.h:
3420         (JSC::baselineCodeBlockForOriginAndBaselineCodeBlock):
3421         (JSC::CodeOrigin::walkUpInlineStack):
3422         * bytecode/PolymorphicAccess.h:
3423         (JSC::PolymorphicAccess::containsPC):
3424         * bytecode/StructureStubInfo.cpp:
3425         (JSC::StructureStubInfo::visitWeakReferences):
3426         (JSC::StructureStubInfo::containsPC):
3427         * bytecode/StructureStubInfo.h:
3428         * bytecode/UnlinkedCodeBlock.h:
3429         (JSC::UnlinkedCodeBlock::hasExpressionInfo):
3430         (JSC::UnlinkedCodeBlock::expressionInfo):
3431         (JSC::UnlinkedCodeBlock::setThisRegister):
3432         * debugger/Debugger.cpp:
3433         (JSC::Debugger::attach):
3434         * dfg/DFGJITCode.cpp:
3435         (JSC::DFG::JITCode::validateReferences):
3436         (JSC::DFG::JITCode::findPC):
3437         * dfg/DFGJITCode.h:
3438         (JSC::DFG::JITCode::commonDataOffset):
3439         * dfg/DFGJITCompiler.cpp:
3440         (JSC::DFG::JITCompiler::JITCompiler):
3441         (JSC::DFG::JITCompiler::link):
3442         (JSC::DFG::JITCompiler::compile):
3443         (JSC::DFG::JITCompiler::compileFunction):
3444         (JSC::DFG::JITCompiler::recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded):
3445         (JSC::DFG::JITCompiler::setEndOfMainPath):
3446         (JSC::DFG::JITCompiler::setEndOfCode):
3447         * dfg/DFGJITCompiler.h:
3448         (JSC::DFG::JITCompiler::setStartOfCode):
3449         (JSC::DFG::JITCompiler::setForNode):
3450         (JSC::DFG::JITCompiler::addCallSite):
3451         (JSC::DFG::JITCompiler::pcToCodeOriginMapBuilder):
3452         (JSC::DFG::JITCompiler::setEndOfMainPath): Deleted.
3453         (JSC::DFG::JITCompiler::setEndOfCode): Deleted.
3454         * dfg/DFGSlowPathGenerator.h:
3455         (JSC::DFG::SlowPathGenerator::call):
3456         (JSC::DFG::SlowPathGenerator::origin):
3457         * dfg/DFGSpeculativeJIT.cpp:
3458         (JSC::DFG::SpeculativeJIT::addSlowPathGenerator):
3459         (JSC::DFG::SpeculativeJIT::runSlowPathGenerators):
3460         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
3461         * dfg/DFGSpeculativeJIT.h:
3462         * ftl/FTLB3Compile.cpp:
3463         (JSC::FTL::compile):
3464         * ftl/FTLJITCode.cpp:
3465         (JSC::FTL::JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite):
3466         (JSC::FTL::JITCode::findPC):
3467         * ftl/FTLJITCode.h:
3468         (JSC::FTL::JITCode::b3Code):
3469         * heap/MachineStackMarker.cpp:
3470         (JSC::MachineThreads::Thread::Registers::instructionPointer):
3471         (JSC::MachineThreads::Thread::Registers::llintPC):
3472         (JSC::MachineThreads::Thread::freeRegisters):
3473         * heap/MachineStackMarker.h:
3474         * inspector/agents/InspectorScriptProfilerAgent.cpp:
3475         (Inspector::InspectorScriptProfilerAgent::addEvent):
3476         (Inspector::buildSamples):
3477         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
3478         * jit/JIT.cpp:
3479         (JSC::JIT::JIT):
3480         (JSC::JIT::privateCompileMainPass):
3481         (JSC::JIT::privateCompileSlowCases):
3482         (JSC::JIT::privateCompile):
3483         * jit/JIT.h:
3484         * jit/JITCode.h:
3485         (JSC::JITCode::findPC):
3486         * jit/PCToCodeOriginMap.cpp: Added.
3487         (JSC::PCToCodeOriginMapBuilder::PCToCodeOriginMapBuilder):
3488         (JSC::PCToCodeOriginMapBuilder::appendItem):
3489         (JSC::PCToCodeOriginMap::PCToCodeOriginMap):
3490         (JSC::PCToCodeOriginMap::~PCToCodeOriginMap):
3491         (JSC::PCToCodeOriginMap::memorySize):
3492         (JSC::PCToCodeOriginMap::findPC):
3493         * jit/PCToCodeOriginMap.h: Added.
3494         (JSC::PCToCodeOriginMapBuilder::defaultCodeOrigin):
3495         (JSC::PCToCodeOriginMapBuilder::didBuildMapping):
3496         * jsc.cpp:
3497         (functionSamplingProfilerStackTraces):
3498         * llint/LLIntPCRanges.h:
3499         (JSC::LLInt::isLLIntPC):
3500         * llint/LowLevelInterpreter.asm:
3501         * runtime/Options.h:
3502         * runtime/SamplingProfiler.cpp:
3503         (JSC::reportStats):
3504         (JSC::FrameWalker::FrameWalker):
3505         (JSC::FrameWalker::walk):
3506         (JSC::FrameWalker::resetAtMachineFrame):
3507         (JSC::FrameWalker::isValidFramePointer):
3508         (JSC::SamplingProfiler::SamplingProfiler):
3509         (JSC::SamplingProfiler::~SamplingProfiler):
3510         (JSC::tryGetBytecodeIndex):
3511         (JSC::SamplingProfiler::processUnverifiedStackTraces):
3512         (JSC::SamplingProfiler::visit):
3513         (JSC::SamplingProfiler::noticeVMEntry):
3514         (JSC::SamplingProfiler::clearData):
3515         (JSC::SamplingProfiler::StackFrame::displayName):
3516         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
3517         (JSC::SamplingProfiler::StackFrame::functionStartLine):
3518         (JSC::SamplingProfiler::StackFrame::functionStartColumn):
3519         (JSC::SamplingProfiler::StackFrame::sourceID):
3520         (JSC::SamplingProfiler::StackFrame::url):
3521         (JSC::SamplingProfiler::releaseStackTraces):
3522         (JSC::SamplingProfiler::stackTracesAsJSON):
3523         (WTF::printInternal):
3524         (JSC::SamplingProfiler::StackFrame::startLine): Deleted.
3525         (JSC::SamplingProfiler::StackFrame::startColumn): Deleted.
3526         (JSC::SamplingProfiler::stackTraces): Deleted.
3527         * runtime/SamplingProfiler.h:
3528         (JSC::SamplingProfiler::UnprocessedStackFrame::UnprocessedStackFrame):
3529         (JSC::SamplingProfiler::StackFrame::StackFrame):
3530         (JSC::SamplingProfiler::StackTrace::StackTrace):
3531         (JSC::SamplingProfiler::totalTime):
3532         (JSC::SamplingProfiler::setStopWatch):
3533         * runtime/VM.cpp:
3534         (JSC::VM::VM):
3535         * runtime/VM.h:
3536         (JSC::VM::setShouldBuildPCToCodeOriginMapping):
3537         (JSC::VM::shouldBuilderPCToCodeOriginMapping):
3538         * tests/stress/sampling-profiler-basic.js:
3539         (platformSupportsSamplingProfiler.top):
3540         (platformSupportsSamplingProfiler.jaz):
3541         (platformSupportsSamplingProfiler.kaz):
3542
3543 2016-01-29  Saam barati  <sbarati@apple.com>
3544
3545         Remove our notion of having a single activation register
3546         https://bugs.webkit.org/show_bug.cgi?id=153673
3547
3548         Reviewed by Filip Pizlo.
3549
3550         We have many functions lurking around where we think a function 
3551         might only have one activation register. This is clearly wrong
3552         now that ES6 has block scoping. This patch removes this false notion.
3553
3554         * bytecode/CodeBlock.cpp:
3555         (JSC::CodeBlock::dumpBytecode):
3556         (JSC::CodeBlock::CodeBlock):
3557         * bytecode/CodeBlock.h:
3558         (JSC::CodeBlock::scopeRegister):
3559         (JSC::CodeBlock::codeType):
3560         (JSC::CodeBlock::setActivationRegister): Deleted.
3561         (JSC::CodeBlock::activationRegister): Deleted.
3562         (JSC::CodeBlock::uncheckedActivationRegister): Deleted.
3563         (JSC::CodeBlock::needsActivation): Deleted.
3564         * bytecode/ExecutableInfo.h:
3565         (JSC::ExecutableInfo::ExecutableInfo):
3566         (JSC::ExecutableInfo::usesEval):
3567         (JSC::ExecutableInfo::isStrictMode):
3568         (JSC::ExecutableInfo::isConstructor):
3569         (JSC::ExecutableInfo::isClassContext):
3570         (JSC::ExecutableInfo::needsActivation): Deleted.
3571         * bytecode/UnlinkedCodeBlock.cpp:
3572         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
3573         * bytecode/UnlinkedCodeBlock.h:
3574         (JSC::UnlinkedCodeBlock::isArrowFunctionContext):
3575         (JSC::UnlinkedCodeBlock::isClassContext):
3576         (JSC::UnlinkedCodeBlock::setThisRegister):
3577         (JSC::UnlinkedCodeBlock::setScopeRegister):
3578         (JSC::UnlinkedCodeBlock::usesGlobalObject):
3579         (JSC::UnlinkedCodeBlock::setGlobalObjectRegister):
3580         (JSC::UnlinkedCodeBlock::thisRegister):
3581         (JSC::UnlinkedCodeBlock::scopeRegister):
3582         (JSC::UnlinkedCodeBlock::addPropertyAccessInstruction):
3583         (JSC::UnlinkedCodeBlock::needsFullScopeChain): Deleted.
3584         (JSC::UnlinkedCodeBlock::setActivationRegister): Deleted.
3585         (JSC::UnlinkedCodeBlock::activationRegister): Deleted.
3586         (JSC::UnlinkedCodeBlock::hasActivationRegister): Deleted.
3587         * bytecode/UnlinkedFunctionExecutable.cpp:
3588         (JSC::generateUnlinkedFunctionCodeBlock):
3589         * bytecompiler/BytecodeGenerator.cpp:
3590         (JSC::BytecodeGenerator::BytecodeGenerator):
3591         (JSC::BytecodeGenerator::initializeVarLexicalEnvironment):
3592         * bytecompiler/BytecodeGenerator.h:
3593         (JSC::BytecodeGenerator::destinationForAssignResult):
3594         (JSC::BytecodeGenerator::leftHandSideNeedsCopy):
3595         (JSC::BytecodeGenerator::emitNodeForLeftHandSide):
3596         * dfg/DFGByteCodeParser.cpp:
3597         (JSC::DFG::ByteCodeParser::inliningCost):
3598         (JSC::DFG::ByteCodeParser::parseCodeBlock):
3599         * dfg/DFGGraph.h:
3600         (JSC::DFG::Graph::hasExitSite):
3601         (JSC::DFG::Graph::activationRegister): Deleted.
3602         (JSC::DFG::Graph::uncheckedActivationRegister): Deleted.
3603         (JSC::DFG::Graph::machineActivationRegister): Deleted.
3604         (JSC::DFG::Graph::uncheckedMachineActivationRegister): Deleted.
3605         * dfg/DFGStackLayoutPhase.cpp:
3606         (JSC::DFG::StackLayoutPhase::run):
3607         * interpreter/CallFrame.cpp:
3608         (JSC::CallFrame::callSiteIndex):
3609         (JSC::CallFrame::stack):
3610         (JSC::CallFrame::callerFrame):
3611         (JSC::CallFrame::friendlyFunctionName):
3612         (JSC::CallFrame::hasActivation): Deleted.
3613         (JSC::CallFrame::uncheckedActivation): Deleted.
3614         (JSC::CallFrame::lexicalEnvironment): Deleted.
3615         (JSC::CallFrame::lexicalEnvironmentOrNullptr): Deleted.
3616         (JSC::CallFrame::setActivation): Deleted.
3617         * interpreter/CallFrame.h:
3618         (JSC::ExecState::scope):
3619         (JSC::ExecState::setCallerFrame):
3620         (JSC::ExecState::setScope):
3621         (JSC::ExecState::init):
3622         * interpreter/Register.h:
3623         * llint/LLIntSlowPaths.cpp:
3624         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
3625         * runtime/Executable.h:
3626         (JSC::ScriptExecutable::usesEval):
3627         (JSC::ScriptExecutable::usesArguments):
3628         (JSC::ScriptExecutable::isArrowFunctionContext):
3629         (JSC::ScriptExecutable::isStrictMode):
3630         (JSC::ScriptExecutable::derivedContextType):
3631         (JSC::ScriptExecutable::needsActivation): Deleted.
3632         * runtime/JSLexicalEnvironment.h:
3633         (JSC::asActivation):
3634         (JSC::Register::lexicalEnvironment): Deleted.
3635
3636 2016-01-29  Filip Pizlo  <fpizlo@apple.com>
3637
3638         Air:fixObviousSpills should handle floats and doubles
3639         https://bugs.webkit.org/show_bug.cgi?id=153197
3640
3641         Reviewed by Saam Barati.
3642
3643         This adds the most obvious handling of float spills, where we just enable load elimination on
3644         float spill code.
3645
3646         * b3/air/AirFixObviousSpills.cpp:
3647
3648 2016-01-29  Andreas Kling  <akling@apple.com>
3649
3650         Shrink CodeBlock!
3651         <https://webkit.org/b/153640>
3652
3653         Reviewed by Saam Barati.
3654
3655         Shrink CodeBlock by 112 bytes (from 640 to 528) by employing
3656         these sophisticated tricks:
3657
3658             - Remove members that are not used by anyone.
3659             - Don't cache both VM* and Heap* in members.
3660             - Reorder members to minimize struct padding.
3661             - Use RefCountedArray instead of Vector for arrays that never resize.
3662             - Put a not-always-present HashMap in a std::unique_ptr.
3663
3664         This increases CodeBlock space efficiency by 20%, as we can now
3665         fit 30 of them in a MarkedBlock, up from 25.)
3666
3667         * bytecode/CodeBlock.cpp:
3668         (JSC::CodeBlock::CodeBlock):
3669         (JSC::CodeBlock::finishCreation):
3670         (JSC::CodeBlock::setNumParameters):
3671         (JSC::CodeBlock::jettison):
3672         (JSC::CodeBlock::noticeIncomingCall):
3673         (JSC::CodeBlock::resultProfileForBytecodeOffset):
3674         * bytecode/CodeBlock.h:
3675         (JSC::CodeBlock::setJITCode):
3676         (JSC::CodeBlock::capabilityLevelState):
3677         (JSC::CodeBlock::codeType):
3678         (JSC::CodeBlock::ensureResultProfile):
3679         (JSC::CodeBlock::heap):
3680
3681 2016-01-29  Saam barati  <sbarati@apple.com>
3682
3683         Exits from exceptions shouldn't jettison code
3684         https://bugs.webkit.org/show_bug.cgi?id=153564
3685
3686         Reviewed by Geoffrey Garen.
3687
3688         We create two new exit kinds for exception-handling
3689         OSRExits:
3690         - ExceptionCheck: an exception check after a C call.
3691         - GenericUnwind: an OSR exit executes because it's jumped to from genericUnwind machinery.
3692
3693         Having these two new exit kinds allows us to remove fields from
3694         various OSRExit variants that store booleans indicating
3695         if the exit is an exception handler, and if so, what kind
3696         of exception handler. Most of this patch is just removing
3697         those old fields and adding new equivalent functions.
3698
3699         This patch also implements the policy that we should never consider jettisoning
3700         code from exits that happen from an exception check to an op_catch (it might be worth
3701         considering a similar policy for 'throw'). We're choosing this policy because
3702         it will almost never be more expensive, in total, to execute the OSR exit than
3703         to execute the baseline variant of the code. When an exception is thrown, we do
3704         really expensive work, like call through to genericUnwind, and also create an error
3705         object with a stack trace. The cost of OSR exiting here is small in comparison to
3706         those other operations. And penalizing a CodeBlock for OSR exiting from an exception
3707         is silly because the basis of our implementation of exception handling in the
3708         upper tiers is to OSR exit on a caught exception. So we used to penalize
3709         ourselves for having an implementation that is correct w.r.t our design goals.
3710
3711         I've verified this hypothesis with on v8-raytrace by adding a new 
3712         benchmark that throws with very high frequency. Implementing
3713         this policy on that benchmark results in about a 4-5% speed up.
3714
3715         * bytecode/ExitKind.cpp:
3716         (JSC::exitKindToString):
3717         (JSC::exitKindMayJettison):
3718         (JSC::exitKindIsCountable): Deleted.
3719         * bytecode/ExitKind.h:
3720         * dfg/DFGJITCode.cpp:
3721         (JSC::DFG::JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite):
3722         * dfg/DFGJITCompiler.cpp:
3723         (JSC::DFG::JITCompiler::noticeOSREntry):
3724         (JSC::DFG::JITCompiler::appendExceptionHandlingOSRExit):
3725         (JSC::DFG::JITCompiler::exceptionCheck):
3726         (JSC::DFG::JITCompiler::recordCallSiteAndGenerateExceptionHandlingOSRExitIfNeeded):
3727         * dfg/DFGJITCompiler.h:
3728         * dfg/DFGOSRExit.cpp:
3729         (JSC::DFG::OSRExit::OSRExit):
3730         * dfg/DFGOSRExit.h:
3731         (JSC::DFG::OSRExit::considerAddingAsFrequentExitSite):
3732         * dfg/DFGOSRExitBase.h:
3733         (JSC::DFG::OSRExitBase::OSRExitBase):
3734         (JSC::DFG::OSRExitBase::isExceptionHandler):
3735         (JSC::DFG::OSRExitBase::isGenericUnwindHandler):
3736         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSite):
3737         * dfg/DFGOSRExitCompiler.cpp:
3738         * dfg/DFGOSRExitCompiler32_64.cpp:
3739         (JSC::DFG::OSRExitCompiler::compileExit):
3740         * dfg/DFGOSRExitCompiler64.cpp:
3741         (JSC::DFG::OSRExitCompiler::compileExit):
3742         * dfg/DFGOSRExitCompilerCommon.cpp:
3743         (JSC::DFG::handleExitCounts):
3744         (JSC::DFG::osrWriteBarrier):
3745         (JSC::DFG::adjustAndJumpToTarget):
3746         * dfg/DFGOSRExitCompilerCommon.h:
3747         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
3748         * ftl/FTLCompile.cpp:
3749         (JSC::FTL::mmAllocateDataSection):
3750         * ftl/FTLExitThunkGenerator.cpp:
3751         (JSC::FTL::ExitThunkGenerator::emitThunk):
3752         * ftl/FTLJITCode.cpp:
3753         (JSC::FTL::JITCode::liveRegistersToPreserveAtExceptionHandlingCallSite):
3754         * ftl/FTLLowerDFGToLLVM.cpp:
3755         (JSC::FTL::DFG::LowerDFGToLLVM::callCheck):
3756         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExitArgumentsForPatchpointIfWillCatchException):
3757         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExit):
3758         (JSC::FTL::DFG::LowerDFGToLLVM::blessSpeculation):
3759         * ftl/FTLOSRExit.cpp:
3760         (JSC::FTL::OSRExitDescriptor::emitOSRExit):
3761         (JSC::FTL::OSRExitDescriptor::emitOSRExitLater):
3762         (JSC::FTL::OSRExitDescriptor::prepareOSRExitHandle):
3763         (JSC::FTL::OSRExit::OSRExit):
3764         (JSC::FTL::OSRExit::spillRegistersToSpillSlot):
3765         (JSC::FTL::OSRExit::recoverRegistersFromSpillSlot):
3766         (JSC::FTL::OSRExit::willArriveAtExitFromIndirectExceptionCheck):
3767         (JSC::FTL::OSRExit::willArriveAtOSRExitFromCallOperation):
3768         (JSC::FTL::exceptionTypeWillArriveAtOSRExitFromGenericUnwind): Deleted.
3769         (JSC::FTL::OSRExit::willArriveAtOSRExitFromGenericUnwind): Deleted.
3770         * ftl/FTLOSRExit.h:
3771         * ftl/FTLOSRExitCompiler.cpp:
3772         (JSC::FTL::compileStub):
3773         (JSC::FTL::compileFTLOSRExit):
3774         * ftl/FTLPatchpointExceptionHandle.cpp:
3775         (JSC::FTL::PatchpointExceptionHandle::scheduleExitCreation):
3776         (JSC::FTL::PatchpointExceptionHandle::scheduleExitCreationForUnwind):
3777         (JSC::FTL::PatchpointExceptionHandle::PatchpointExceptionHandle):
3778         (JSC::FTL::PatchpointExceptionHandle::createHandle):
3779         * ftl/FTLPatchpointExceptionHandle.h:
3780
3781 2016-01-28  Yusuke Suzuki  <utatane.tea@gmail.com>
3782
3783         [B3] REGRESSION(r195395): testComplex(64, 128) asserts on Linux with GCC
3784         https://bugs.webkit.org/show_bug.cgi?id=153422
3785
3786         Reviewed by Filip Pizlo.
3787
3788         Previously proc.values() returns ValuesCollection (Not reference!).
3789         values.values takes const ValueCollection&.
3790         And later it produces IndexSet<Value>::Iterable<Procedure::ValuesCollection>,
3791         it holds const ValueCollection& as its member.
3792         But IndexSet<Value>::Iterable<Procedure::ValuesCollection> is just an instance.
3793         So after creating this, the lifetime of the ValueCollection const reference finished.
3794
3795         To fix that, we hold ValuesCollection as a member of Procedure.
3796         And change the signature to const ValuesCollection& Procedure::values().
3797
3798         * b3/B3Procedure.cpp:
3799         (JSC::B3::Procedure::Procedure):
3800         * b3/B3Procedure.h:
3801         (JSC::B3::Procedure::values):
3802
3803 2016-01-28  Joseph Pecoraro  <pecoraro@apple.com>
3804
3805         Web Inspector: InspectorTimelineAgent doesn't need to recompile functions because it now uses the sampling profiler
3806         https://bugs.webkit.org/show_bug.cgi?id=153500
3807         <rdar://problem/24352458>
3808
3809         Reviewed by Timothy Hatcher.
3810
3811         Be more explicit about enabling legacy profiling.
3812
3813         * jsc.cpp:
3814         * runtime/Executable.cpp:
3815         (JSC::ScriptExecutable::newCodeBlockFor):
3816         * runtime/JSGlobalObject.cpp:
3817         (JSC::JSGlobalObject::hasLegacyProfiler):
3818         (JSC::JSGlobalObject::createProgramCodeBlock):
3819         (JSC::JSGlobalObject::createEvalCodeBlock):
3820         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
3821         (JSC::JSGlobalObject::hasProfiler): Deleted.
3822         * runtime/JSGlobalObject.h:
3823         (JSC::JSGlobalObject::supportsLegacyProfiling):
3824         (JSC::JSGlobalObject::supportsProfiling): Deleted.
3825
3826 2016-01-28  Yusuke Suzuki  <utatane.tea@gmail.com>
3827
3828         Fix the B3 build with GCC 4.9.3
3829         https://bugs.webkit.org/show_bug.cgi?id=151624
3830
3831         Reviewed by Filip Pizlo.
3832
3833         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.
3834         [1]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62272
3835
3836         * b3/air/AirIteratedRegisterCoalescing.cpp:
3837
3838 2016-01-28  Filip Pizlo  <fpizlo@apple.com>
3839
3840         LowerToAir::preferRightForResult() should resolve use count ties by selecting the child that is closest in an idom walk
3841         https://bugs.webkit.org/show_bug.cgi?id=153583
3842
3843         Reviewed by Benjamin Poulain.
3844
3845         This undoes the AsmBench/n-body regression in r195654 while preserving that revision's
3846         Kraken progression.
3847
3848         * b3/B3LowerToAir.cpp:
3849         (JSC::B3::Air::LowerToAir::LowerToAir):
3850         (JSC::B3::Air::LowerToAir::preferRightForResult):
3851
3852 2016-01-28  Benjamin Poulain  <bpoulain@apple.com>
3853
3854         [JSC] B3 Tail Call with Varargs do not restore callee saved registers
3855         https://bugs.webkit.org/show_bug.cgi?id=153579
3856
3857         Reviewed by Michael Saboff.
3858
3859         We were trashing the callee saved registers in Tail Calls.
3860
3861         I just copied the code from DFG to fix this :)
3862
3863         * ftl/FTLLowerDFGToLLVM.cpp:
3864         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstructVarargs):
3865
3866 2016-01-27  Filip Pizlo  <fpizlo@apple.com>
3867
3868         B3 IntRange analysis should know more about shifting
3869         https://bugs.webkit.org/show_bug.cgi?id=153568
3870
3871         Reviewed by Benjamin Poulain.
3872
3873         This teaches the IntRange analysis that the result of a right shift is usually better than
3874         the worst-case mask based on the shift amount. In fact, you can reach useful conclusions
3875         from looking at the IntRange of the input. This helps because Octane/crypto does something
3876         like:
3877
3878             CheckMul((@x & $268435455) >> 14, @y >> 14, ...)
3879
3880         If you consider just the shifts, then this may overflow. But if you consider that @x is
3881         first masked, then the IntRange coming out of the first shift is tight enough to prove that
3882         the CheckMul cannot overflow.
3883
3884         * b3/B3ReduceStrength.cpp:
3885         * b3/testb3.cpp:
3886
3887 2016-01-27  Benjamin Poulain  <bpoulain@apple.com>
3888
3889         [JSC] adjustFrameAndStackInOSRExitCompilerThunk() can trash values in FTL
3890         https://bugs.webkit.org/show_bug.cgi?id=153536
3891
3892         Reviewed by Saam Barati.
3893
3894         Workaround to get B3 working on ARM.
3895
3896         * dfg/DFGOSRExitCompilerCommon.h:
3897         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
3898         The code was using the scratch registers in a few places.
3899
3900         I initially tried to make is not use scratch registers anywhere
3901         but that looked super fragile.
3902
3903         Instead, I just preserve the scratch registers. That's easy and
3904         it should be relatively cheap compared to everything done on OSR Exits.
3905
3906 2016-01-27  Konstantin Tokarev  <annulen@yandex.ru>
3907
3908         [mips] Use reinterpret_cast_ptr to suppress alignment warnings.
3909         https://bugs.webkit.org/show_bug.cgi?id=153424
3910
3911         Reviewed by Darin Adler.
3912
3913         * runtime/JSGenericTypedArrayView.h:
3914         (JSC::JSGenericTypedArrayView::sortFloat):
3915
3916 2016-01-27  Per Arne Vollan  <peavo@outlook.com>
3917
3918         [FTL][Win64] Compile fix.
3919         https://bugs.webkit.org/show_bug.cgi?id=153555
3920
3921         Reviewed by Alex Christensen.
3922
3923         MSVC does not accept preprocessor conditionals in macros.
3924