125782db57b3f0d73910f2d1be2bf7b52ec489b9
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2016-04-20  Saam barati  <sbarati@apple.com>
2
3         Improve sampling profiler CLI JSC tool
4         https://bugs.webkit.org/show_bug.cgi?id=156824
5
6         Reviewed by Mark Lam.
7
8         This patch enhances the Sampling Profiler CLI tool from the JSC shell
9         to display the JITType of a particular CodeBlock. Because this happens
10         once we process a log of stack frames, the data for a particular frame
11         being in LLInt vs. Baseline could be wrong. For example, we may have taken 
12         a stack trace of a CodeBlock while it was executing in the LLInt, then 
13         it tiers up to the baseline, then we process the log. We will show such CodeBlocks
14         as being in the baseline JIT. We could be smarter about this in the future if
15         it turns out to truly be a problem.
16
17         This patch also adds a 'samplingProfilerTimingInterval' JSC option to allow
18         CLI users to control the sleep time between stack traces.
19
20         * jsc.cpp:
21         (jscmain):
22         * runtime/Options.h:
23         * runtime/SamplingProfiler.cpp:
24         (JSC::SamplingProfiler::SamplingProfiler):
25         (JSC::SamplingProfiler::processUnverifiedStackTraces):
26         (JSC::SamplingProfiler::reportTopBytecodes):
27         * runtime/SamplingProfiler.h:
28         (JSC::SamplingProfiler::StackFrame::hasExpressionInfo):
29
30 2016-04-20  Benjamin Poulain  <bpoulain@apple.com>
31
32         [JSC] DFG should not generate two jumps when the target of DoubleBranch is the next block  
33         https://bugs.webkit.org/show_bug.cgi?id=156815
34
35         Reviewed by Mark Lam.
36
37         * dfg/DFGSpeculativeJIT.cpp:
38         (JSC::DFG::SpeculativeJIT::compilePeepHoleDoubleBranch):
39
40 2016-04-20  Benjamin Poulain  <bpoulain@apple.com>
41
42         [JSC] Add register reuse for ArithAdd of an Int32 and constant in DFG
43         https://bugs.webkit.org/show_bug.cgi?id=155164
44
45         Reviewed by Mark Lam.
46
47         Every "inc" in loop was looking like this:
48             move rX, rY
49             inc rY
50             jo 0x230f4a200580
51
52         This patch add register Reuse to that case to remove
53         the extra "move".
54
55         * dfg/DFGOSRExit.h:
56         (JSC::DFG::SpeculationRecovery::SpeculationRecovery):
57         (JSC::DFG::SpeculationRecovery::immediate):
58         * dfg/DFGOSRExitCompiler32_64.cpp:
59         (JSC::DFG::OSRExitCompiler::compileExit):
60         * dfg/DFGOSRExitCompiler64.cpp:
61         (JSC::DFG::OSRExitCompiler::compileExit):
62         * dfg/DFGSpeculativeJIT.cpp:
63         (JSC::DFG::SpeculativeJIT::compileArithAdd):
64         * tests/stress/arith-add-with-constant-overflow.js: Added.
65         (opaqueAdd):
66
67 2016-04-20  Saam barati  <sbarati@apple.com>
68
69         We don't need a manual stack for an RAII object when the machine's stack will do just fine
70         https://bugs.webkit.org/show_bug.cgi?id=156807
71
72         Reviewed by Mark Lam.
73
74         We kept around a vector for an RAII object to maintain
75         the recursive nature of having these RAII objects on
76         the stack as the parser recursed. Instead, the RAII object
77         can just have a field with the value it wants to restore
78         and use the machine's stack.
79
80         This is a 1% octane code-load progression.
81
82         * parser/SyntaxChecker.h:
83         (JSC::SyntaxChecker::BinaryExprContext::BinaryExprContext):
84         (JSC::SyntaxChecker::BinaryExprContext::~BinaryExprContext):
85         (JSC::SyntaxChecker::UnaryExprContext::UnaryExprContext):
86         (JSC::SyntaxChecker::UnaryExprContext::~UnaryExprContext):
87         (JSC::SyntaxChecker::operatorStackPop):
88
89 2016-04-20  Michael Saboff  <msaboff@apple.com>
90
91         REGRESSION(r190289): Spin trying to view/sign in to hbogo.com
92         https://bugs.webkit.org/show_bug.cgi?id=156765
93
94         Reviewed by Saam Barati.
95
96         In the op_get_by_val case, we were holding the lock on a profiled CodeBlock
97         when we call into handleGetById(). Changed to drop the lock before calling
98         handleGetById().
99
100         The bug here was that the call to handleGetById() may end up calling in to
101         getPredictionWithoutOSRExit() for a tail call opcode. As part of that
102         processing, we walk back up the stack to find the effective caller and when
103         found, we lock the corresponding CodeBlock to get the predicition.
104         That CodeBLock may be the same one locked above. There is no need anyway
105         to hold the CodeBlock lock when calling handleGetById().
106
107         Added a new stress test.
108
109         * dfg/DFGByteCodeParser.cpp:
110         (JSC::DFG::ByteCodeParser::parseBlock):
111         * tests/stress/regress-156765.js: Added.
112         (realValue):
113         (object.get hello):
114         (ok):
115
116 2016-04-20  Mark Lam  <mark.lam@apple.com>
117
118         Unindent an unnecessary block in stringProtoFuncSplitFast().
119         https://bugs.webkit.org/show_bug.cgi?id=156802
120
121         Reviewed by Filip Pizlo.
122
123         In webkit.org/b/156013, I refactored stringProtoFuncSplit into
124         stringProtoFuncSplitFast.  In that patch, I left an unnecessary block of code in
125         its original block (with FIXMEs) to keep the diff for that patch minimal.  Now
126         that the patch for webkit.org/b/156013 has landed, I will unindent that block and
127         remove the FIXMEs.
128
129         * runtime/StringPrototype.cpp:
130         (JSC::stringProtoFuncSplitFast):
131
132 2016-04-20  Brady Eidson  <beidson@apple.com>
133
134         Modern IDB (Workers): Enable INDEXED_DATABASE_IN_WORKERS compile time flag, but disabled in RuntimeEnabledFeatures.
135         https://bugs.webkit.org/show_bug.cgi?id=156782
136
137         Reviewed by Alex Christensen.
138
139         * Configurations/FeatureDefines.xcconfig:
140
141 2016-04-20  Saam barati  <sbarati@apple.com>
142
143         Remove unused m_writtenVariables from the parser and related bits
144         https://bugs.webkit.org/show_bug.cgi?id=156784
145
146         Reviewed by Yusuke Suzuki.
147
148         This isn't a octane/codeload speedup even though we're doing less work in
149         collectFreeVariables. But it's good to get rid of things that are not used.
150
151         * parser/Nodes.h:
152         (JSC::ScopeNode::usesEval):
153         (JSC::ScopeNode::usesArguments):
154         (JSC::ScopeNode::usesArrowFunction):
155         (JSC::ScopeNode::isStrictMode):
156         (JSC::ScopeNode::setUsesArguments):
157         (JSC::ScopeNode::usesThis):
158         (JSC::ScopeNode::modifiesParameter): Deleted.
159         (JSC::ScopeNode::modifiesArguments): Deleted.
160         * parser/Parser.cpp:
161         (JSC::Parser<LexerType>::parseInner):
162         (JSC::Parser<LexerType>::parseAssignmentExpression):
163         * parser/Parser.h:
164         (JSC::Scope::Scope):
165         (JSC::Scope::hasDeclaredParameter):
166         (JSC::Scope::preventAllVariableDeclarations):
167         (JSC::Scope::collectFreeVariables):
168         (JSC::Scope::mergeInnerArrowFunctionFeatures):
169         (JSC::Scope::getSloppyModeHoistedFunctions):
170         (JSC::Scope::getCapturedVars):
171         (JSC::Scope::setStrictMode):
172         (JSC::Scope::strictMode):
173         (JSC::Scope::fillParametersForSourceProviderCache):
174         (JSC::Scope::restoreFromSourceProviderCache):
175         (JSC::Parser::hasDeclaredParameter):
176         (JSC::Parser::exportName):
177         (JSC::Scope::declareWrite): Deleted.
178         (JSC::Parser::declareWrite): Deleted.
179         * parser/ParserModes.h:
180
181 2016-04-19  Saam barati  <sbarati@apple.com>
182
183         Unreviewed, fix cloop build after r199754.
184
185         * jsc.cpp:
186         (jscmain):
187
188 2016-04-19  Michael Saboff  <msaboff@apple.com>
189
190         iTunes crashing JavaScriptCore.dll
191         https://bugs.webkit.org/show_bug.cgi?id=156647
192
193         Reviewed by Filip Pizlo.
194
195         Given that there there are only 128 FLS indices compared to over a 1000 for TLS,
196         I eliminated the thread specific m_threadSpecificForThread and instead we look
197         for the current thread in m_registeredThreads list when we need it.
198         In most cases there will only be one thread.
199
200         Added THREAD_SPECIFIC_CALL to signature of ThreadSpecific remove callbacks
201         to set the calling convention correctly for Windows 32 bit.
202
203         * heap/MachineStackMarker.cpp:
204         (JSC::ActiveMachineThreadsManager::remove):
205         (JSC::MachineThreads::MachineThreads):
206         (JSC::MachineThreads::~MachineThreads):
207         (JSC::MachineThreads::addCurrentThread):
208         (JSC::MachineThreads::machineThreadForCurrentThread):
209         (JSC::MachineThreads::removeThread):
210         * heap/MachineStackMarker.h:
211
212 2016-04-19  Benjamin Poulain  <bpoulain@webkit.org>
213
214         [JSC] Small cleanup of RegisterAtOffsetList
215         https://bugs.webkit.org/show_bug.cgi?id=156779
216
217         Reviewed by Mark Lam.
218
219         I was wondering why RegisterAtOffsetList always cache-miss.
220         It looks like it is doing more than it needs to.
221
222         We do not need to sort the values. The total order of
223         RegisterAtOffset is:
224         1) Order of Reg.
225         2) Order of offsets.
226         We already generate the list in order.
227
228         Also allocate the right array size ahead of filling the array.
229
230         * jit/RegisterAtOffsetList.cpp:
231         (JSC::RegisterAtOffsetList::RegisterAtOffsetList):
232         (JSC::RegisterAtOffsetList::sort): Deleted.
233         * jit/RegisterAtOffsetList.h:
234         (JSC::RegisterAtOffsetList::append): Deleted.
235
236 2016-04-19  Saam barati  <sbarati@apple.com>
237
238         Add a couple UNLIKELY macros in parseMemberExpression
239         https://bugs.webkit.org/show_bug.cgi?id=156775
240
241         Reviewed by Filip Pizlo.
242
243         These UNLIKELY macros have to do with the base of the
244         member expression being 'super'. I think it's safe to
245         argue that this is truly UNLIKELY. I am seeing speedups
246         sometimes on Octane codeload. Usually around 0.5%. Sometimes 1%.
247
248         * parser/Parser.cpp:
249         (JSC::Parser<LexerType>::parseMemberExpression):
250
251 2016-04-19  Saam barati  <sbarati@apple.com>
252
253         allow jsc shell to dump sampling profiler data
254         https://bugs.webkit.org/show_bug.cgi?id=156725
255
256         Reviewed by Benjamin Poulain.
257
258         This patch adds a '--reportSamplingProfilerData' option to the
259         JSC shell which will enable the sampling profiler and dump
260         its data at the end of execution. The dump will include the
261         40 hottest functions and the 80 hottest bytecode locations.
262         If you're using this option to debug, it's easy to just hack
263         on the code to make it dump more or less information.
264
265         * jsc.cpp:
266         (CommandLine::parseArguments):
267         (jscmain):
268         * runtime/Options.h:
269         * runtime/SamplingProfiler.cpp:
270         (JSC::SamplingProfiler::processUnverifiedStackTraces):
271         (JSC::SamplingProfiler::stackTracesAsJSON):
272         (JSC::SamplingProfiler::reportTopFunctions):
273         (JSC::SamplingProfiler::reportTopBytecodes):
274         * runtime/SamplingProfiler.h:
275         (JSC::SamplingProfiler::StackFrame::hasExpressionInfo):
276         (JSC::SamplingProfiler::StackFrame::hasBytecodeIndex):
277         (JSC::SamplingProfiler::StackFrame::hasCodeBlockHash):
278         (JSC::SamplingProfiler::setStopWatch):
279
280 2016-04-19  Mark Lam  <mark.lam@apple.com>
281
282         Re-landing: ES6: Implement RegExp.prototype[@@search].
283         https://bugs.webkit.org/show_bug.cgi?id=156331
284
285         Reviewed by Keith Miller.
286
287         What changed?
288         1. Implemented search builtin in RegExpPrototype.js.
289            The native path is now used as a fast path.
290         2. Added DFG support for an IsRegExpObjectIntrinsic (modelled after the
291            IsJSArrayIntrinsic).
292         3. Renamed @isRegExp to @isRegExpObject to match the new IsRegExpObjectIntrinsic.
293         4. Change the esSpecIsRegExpObject() implementation to check if the object's
294            JSType is RegExpObjectType instead of walking the classinfo chain.
295
296         * builtins/RegExpPrototype.js:
297         (search):
298         * builtins/StringPrototype.js:
299         (search):
300         - fixed some indentation.
301
302         * dfg/DFGAbstractInterpreterInlines.h:
303         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
304         * dfg/DFGByteCodeParser.cpp:
305         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
306         * dfg/DFGClobberize.h:
307         (JSC::DFG::clobberize):
308         * dfg/DFGDoesGC.cpp:
309         (JSC::DFG::doesGC):
310         * dfg/DFGFixupPhase.cpp:
311         (JSC::DFG::FixupPhase::fixupNode):
312         * dfg/DFGNodeType.h:
313         * dfg/DFGPredictionPropagationPhase.cpp:
314         (JSC::DFG::PredictionPropagationPhase::propagate):
315         * dfg/DFGSafeToExecute.h:
316         (JSC::DFG::safeToExecute):
317         * dfg/DFGSpeculativeJIT.cpp:
318         (JSC::DFG::SpeculativeJIT::compileIsArrayConstructor):
319         (JSC::DFG::SpeculativeJIT::compileIsRegExpObject):
320         (JSC::DFG::SpeculativeJIT::compileCallObjectConstructor):
321         * dfg/DFGSpeculativeJIT.h:
322         * dfg/DFGSpeculativeJIT32_64.cpp:
323         (JSC::DFG::SpeculativeJIT::compile):
324         * dfg/DFGSpeculativeJIT64.cpp:
325         (JSC::DFG::SpeculativeJIT::compile):
326         * ftl/FTLCapabilities.cpp:
327         (JSC::FTL::canCompile):
328         * ftl/FTLLowerDFGToB3.cpp:
329         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
330         (JSC::FTL::DFG::LowerDFGToB3::compileIsFunction):
331         (JSC::FTL::DFG::LowerDFGToB3::compileIsRegExpObject):
332         (JSC::FTL::DFG::LowerDFGToB3::compileTypeOf):
333         (JSC::FTL::DFG::LowerDFGToB3::isExoticForTypeof):
334         (JSC::FTL::DFG::LowerDFGToB3::isRegExpObject):
335         (JSC::FTL::DFG::LowerDFGToB3::isType):
336         * runtime/Intrinsic.h:
337         - Added IsRegExpObjectIntrinsic.
338
339         * runtime/CommonIdentifiers.h:
340
341         * runtime/ECMAScriptSpecInternalFunctions.cpp:
342         (JSC::esSpecIsConstructor):
343         - Changed to use uncheckedArgument since this is only called from internal code.
344         (JSC::esSpecIsRegExpObject):
345         (JSC::esSpecIsRegExp): Deleted.
346         * runtime/ECMAScriptSpecInternalFunctions.h:
347         - Changed to check the object for a JSType of RegExpObjectType.
348
349         * runtime/JSGlobalObject.cpp:
350         (JSC::JSGlobalObject::init):
351         - Added split fast path.
352
353         * runtime/RegExpPrototype.cpp:
354         (JSC::RegExpPrototype::finishCreation):
355         (JSC::regExpProtoFuncSearchFast):
356         (JSC::regExpProtoFuncSearch): Deleted.
357         * runtime/RegExpPrototype.h:
358
359         * tests/es6.yaml:
360         * tests/stress/regexp-search.js:
361         - Rebased test.
362
363 2016-04-19  Mark Lam  <mark.lam@apple.com>
364
365         Replace $vm.printValue() with $vm.value().
366         https://bugs.webkit.org/show_bug.cgi?id=156767
367
368         Reviewed by Saam Barati.
369
370         When debugging with $vm, this change allows us to do this:
371
372             $vm.print("myObj = " + $vm.value(myObj) + "\n");
373
374         ... instead of having to do this:
375
376             $vm.print("myObj = ");
377             $vm.printValue(myObj);
378             $vm.print("\n");
379
380         * tools/JSDollarVMPrototype.cpp:
381         (JSC::JSDollarVMPrototype::printValue):
382         (JSC::functionValue):
383         (JSC::JSDollarVMPrototype::finishCreation):
384         (JSC::functionPrintValue): Deleted.
385
386 2016-04-18  Oliver Hunt  <oliver@apple.com>
387
388         Enable separated heap by default on ios
389         https://bugs.webkit.org/show_bug.cgi?id=156720
390
391         Reviewed by ggaren.
392
393         * runtime/Options.cpp:
394         (JSC::recomputeDependentOptions):
395
396 2016-04-19  Mark Lam  <mark.lam@apple.com>
397
398         Re-landing: ES6: Implement String.prototype.split and RegExp.prototype[@@split].
399         https://bugs.webkit.org/show_bug.cgi?id=156013
400
401         Reviewed by Keith Miller.
402
403         * CMakeLists.txt:
404         * JavaScriptCore.xcodeproj/project.pbxproj:
405         * builtins/GlobalObject.js:
406         (speciesConstructor):
407         * builtins/PromisePrototype.js:
408         - refactored to use the @speciesConstructor internal function.
409
410         * builtins/RegExpPrototype.js:
411         (advanceStringIndex):
412         - refactored from @advanceStringIndexUnicode() to be match the spec.
413           Benchmarks show that there's no advantage in doing the unicode check outside
414           of the advanceStringIndexUnicode part.  So, I simplified the code to match the
415           spec (especially since @@split needs to call advanceStringIndex from more than
416           1 location).
417         (match):
418         - Removed an unnecessary call to @Object because it was already proven above.
419         - Changed to use advanceStringIndex instead of advanceStringIndexUnicode.
420           Again, there's no perf regression for this.
421         (regExpExec):
422         (hasObservableSideEffectsForRegExpSplit):
423         (split):
424         (advanceStringIndexUnicode): Deleted.
425
426         * builtins/StringPrototype.js:
427         (split):
428         - Modified to use RegExp.prototype[@@split].
429
430         * bytecode/BytecodeIntrinsicRegistry.cpp:
431         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
432         (JSC::BytecodeIntrinsicRegistry::lookup):
433         * bytecode/BytecodeIntrinsicRegistry.h:
434         - Added the @@split symbol.
435
436         * runtime/CommonIdentifiers.h:
437         * runtime/ECMAScriptSpecInternalFunctions.cpp: Added.
438         (JSC::esSpecIsConstructor):
439         (JSC::esSpecIsRegExp):
440         * runtime/ECMAScriptSpecInternalFunctions.h: Added.
441
442         * runtime/JSGlobalObject.cpp:
443         (JSC::getGetterById):
444         (JSC::JSGlobalObject::init):
445
446         * runtime/PropertyDescriptor.cpp:
447         (JSC::PropertyDescriptor::setDescriptor):
448         - Removed an assert that is no longer valid.
449
450         * runtime/RegExpObject.h:
451         - Made advanceStringUnicode() public so that it can be re-used by the regexp split
452           fast path.
453
454         * runtime/RegExpPrototype.cpp:
455         (JSC::RegExpPrototype::finishCreation):
456         (JSC::regExpProtoFuncExec):
457         (JSC::regExpProtoFuncSearch):
458         (JSC::advanceStringIndex):
459         (JSC::regExpProtoFuncSplitFast):
460         * runtime/RegExpPrototype.h:
461
462         * runtime/StringObject.h:
463         (JSC::jsStringWithReuse):
464         (JSC::jsSubstring):
465         - Hoisted some utility functions from StringPrototype.cpp so that they can be
466           reused by the regexp split fast path.
467
468         * runtime/StringPrototype.cpp:
469         (JSC::StringPrototype::finishCreation):
470         (JSC::stringProtoFuncSplitFast):
471         (JSC::stringProtoFuncSubstr):
472         (JSC::builtinStringSubstrInternal):
473         (JSC::stringProtoFuncSubstring):
474         (JSC::stringIncludesImpl):
475         (JSC::stringProtoFuncIncludes):
476         (JSC::builtinStringIncludesInternal):
477         (JSC::jsStringWithReuse): Deleted.
478         (JSC::jsSubstring): Deleted.
479         (JSC::stringProtoFuncSplit): Deleted.
480         * runtime/StringPrototype.h:
481
482         * tests/es6.yaml:
483
484 2016-04-19  Commit Queue  <commit-queue@webkit.org>
485
486         Unreviewed, rolling out r199726.
487         https://bugs.webkit.org/show_bug.cgi?id=156748
488
489         WebKit tests crash on Windows 32 (Requested by msaboff on
490         #webkit).
491
492         Reverted changeset:
493
494         "iTunes crashing JavaScriptCore.dll"
495         https://bugs.webkit.org/show_bug.cgi?id=156647
496         http://trac.webkit.org/changeset/199726
497
498 2016-04-19  Michael Saboff  <msaboff@apple.com>
499
500         iTunes crashing JavaScriptCore.dll
501         https://bugs.webkit.org/show_bug.cgi?id=156647
502
503         Reviewed by Saam Barati.
504
505         Given that there there are only 128 FLS indices compared to over a 1000 for TLS, I
506         eliminated the thread specific m_threadSpecificForThread and instead we look for the
507         current thread in m_registeredThreads list when we need it.  In most cases there
508         will only be one thread.
509
510         * heap/MachineStackMarker.cpp:
511         (JSC::MachineThreads::MachineThreads):
512         (JSC::MachineThreads::~MachineThreads):
513         (JSC::MachineThreads::addCurrentThread):
514         (JSC::MachineThreads::machineThreadForCurrentThread):
515         (JSC::MachineThreads::removeThread):
516         * heap/MachineStackMarker.h:
517
518 2016-04-19  Yusuke Suzuki  <utatane.tea@gmail.com>
519
520         [INTL] Use @thisNumberValue instead of `instanceof @Number`
521         https://bugs.webkit.org/show_bug.cgi?id=156680
522
523         Reviewed by Saam Barati.
524
525         Use @thisNumberValue instead of `instanceof @Number`.
526         `instanceof @Number` is not enough;
527         For example, given 2 realms, the object created in one realm does not
528         inherit the Number of another realm.
529         Another example is that the object which does not inherit Number.
530
531         ```
532         var number = new Number(42);
533         number.__proto__ = null;
534         ```
535
536         * builtins/NumberPrototype.js:
537         (toLocaleString):
538         * runtime/CommonIdentifiers.h:
539         * runtime/JSGlobalObject.cpp:
540         (JSC::JSGlobalObject::init):
541         * runtime/NumberPrototype.cpp:
542         (JSC::numberProtoFuncValueOf):
543         * runtime/NumberPrototype.h:
544         * tests/stress/number-to-locale-string-should-accept-strange-number-objects.js: Added.
545         (shouldBe):
546
547 2016-04-19  Commit Queue  <commit-queue@webkit.org>
548
549         Unreviewed, rolling out r199712.
550         https://bugs.webkit.org/show_bug.cgi?id=156741
551
552         It caused a serious regression on 32 bit platform (Requested
553         by gskachkov on #webkit).
554
555         Reverted changeset:
556
557         "calling super() a second time in a constructor should throw"
558         https://bugs.webkit.org/show_bug.cgi?id=151113
559         http://trac.webkit.org/changeset/199712
560
561 2016-04-09  Skachkov Oleksandr  <gskachkov@gmail.com>
562
563         calling super() a second time in a constructor should throw
564         https://bugs.webkit.org/show_bug.cgi?id=151113
565
566         Reviewed by Saam Barati and Keith Miller.
567
568         Currently, our implementation checks if 'super()' was called in a constructor more 
569         than once and raises a RuntimeError before the second call. According to the spec 
570         we need to raise an error just after the second super() is finished and before 
571         the new 'this' is assigned https://esdiscuss.org/topic/duplicate-super-call-behaviour. 
572         To implement this behavior this patch adds a new op code, op_is_empty, that is used 
573         to check if 'this' is empty.
574
575         * bytecode/BytecodeList.json:
576         * bytecode/BytecodeUseDef.h:
577         (JSC::computeUsesForBytecodeOffset):
578         (JSC::computeDefsForBytecodeOffset):
579         * bytecode/CodeBlock.cpp:
580         (JSC::CodeBlock::dumpBytecode):
581         * bytecompiler/BytecodeGenerator.cpp:
582         (JSC::BytecodeGenerator::emitIsEmpty):
583         * bytecompiler/BytecodeGenerator.h:
584         * bytecompiler/NodesCodegen.cpp:
585         (JSC::FunctionCallValueNode::emitBytecode):
586         * dfg/DFGAbstractInterpreterInlines.h:
587         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
588         * dfg/DFGByteCodeParser.cpp:
589         (JSC::DFG::ByteCodeParser::parseBlock):
590         * dfg/DFGCapabilities.cpp:
591         (JSC::DFG::capabilityLevel):
592         * dfg/DFGClobberize.h:
593         (JSC::DFG::clobberize):
594         * dfg/DFGDoesGC.cpp:
595         (JSC::DFG::doesGC):
596         * dfg/DFGFixupPhase.cpp:
597         (JSC::DFG::FixupPhase::fixupNode):
598         * dfg/DFGNodeType.h:
599         * dfg/DFGPredictionPropagationPhase.cpp:
600         (JSC::DFG::PredictionPropagationPhase::propagate):
601         * dfg/DFGSafeToExecute.h:
602         (JSC::DFG::safeToExecute):
603         * dfg/DFGSpeculativeJIT32_64.cpp:
604         (JSC::DFG::SpeculativeJIT::compile):
605         * dfg/DFGSpeculativeJIT64.cpp:
606         (JSC::DFG::SpeculativeJIT::compile):
607         * ftl/FTLCapabilities.cpp:
608         (JSC::FTL::canCompile):
609         * ftl/FTLLowerDFGToB3.cpp:
610         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
611         (JSC::FTL::DFG::LowerDFGToB3::compileIsEmpty):
612         * jit/JIT.cpp:
613         (JSC::JIT::privateCompileMainPass):
614         * jit/JIT.h:
615         * jit/JITOpcodes.cpp:
616         (JSC::JIT::emit_op_is_empty):
617         * jit/JITOpcodes32_64.cpp:
618         (JSC::JIT::emit_op_is_empty):
619         * llint/LowLevelInterpreter32_64.asm:
620         * llint/LowLevelInterpreter64.asm:
621         * tests/stress/class-syntax-double-constructor.js: Added.
622
623 2016-04-18  Benjamin Poulain  <bpoulain@apple.com>
624
625         [JSC] Fix some overhead affecting small codegen
626         https://bugs.webkit.org/show_bug.cgi?id=156728
627
628         Reviewed by Filip Pizlo.
629
630         * assembler/AbstractMacroAssembler.h:
631         (JSC::AbstractMacroAssembler::AbstractMacroAssembler):
632         (JSC::AbstractMacroAssembler::random):
633         cryptographicallyRandomNumber() is very costly.
634         We only need it in lowering some very particular cases
635         of non-trusted immediates. No inline cache needs that.
636
637         * assembler/LinkBuffer.h:
638         (JSC::LinkBuffer::link):
639         * jit/JIT.h:
640         * jit/JITInlines.h:
641         (JSC::JIT::addSlowCase):
642         Do not copy the JumpList to access its elements.
643
644 2016-04-18  Saam barati  <sbarati@apple.com>
645
646         implement dynamic scope accesses in the DFG/FTL
647         https://bugs.webkit.org/show_bug.cgi?id=156567
648
649         Reviewed by Geoffrey Garen.
650
651         This patch adds dynamic scope operations to the DFG/FTL.
652         This patch adds three new DFG nodes: ResolveScope, PutDynamicVar and GetDynamicVar.
653         When we encounter a Dynamic/UnresolvedProperty/UnresolvedPropertyWithVarInjectionChecks
654         resolve type, we will compile dynamic scope resolution nodes. When we encounter
655         a resolve type that needs var injection checks and the var injection
656         watchpoint has already been fired, we will compile dynamic scope resolution
657         nodes.
658
659         This patch also adds a new value to the InitializationMode enum: ConstInitialization.
660         There was a subtle bug where we used to never compile the var injection variant of the 
661         resolve type for an eval that injected a var where there was also a global lexical variable with the same name. 
662         For example, the store compiled in this eval("var foo = 20;") wouldn't be compiled 
663         with var injection checks if there was global let/const variable named "foo".
664         So there was the potential for the injected var to store to the GlobalLexicalObject.
665         I found this bug because my initial implementation in the DFG/FTL ran into it.
666         The reason this bug existed is because when we compile a const initialization,
667         we never need a var injections check. The const initialization always
668         knows where to store its value. This same logic leaked into the above eval's 
669         "var foo = 20" store. This new enum value allows us to distinguish const
670         initialization stores from non-const initialization stores.
671
672         (I also changed InitializationMode to be an enum class instead of an enum).
673
674         * bytecode/CodeBlock.cpp:
675         (JSC::CodeBlock::finishCreation):
676         * bytecompiler/BytecodeGenerator.cpp:
677         (JSC::BytecodeGenerator::generate):
678         (JSC::BytecodeGenerator::BytecodeGenerator):
679         (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
680         (JSC::BytecodeGenerator::initializeBlockScopedFunctions):
681         (JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary):
682         (JSC::BytecodeGenerator::prepareLexicalScopeForNextForLoopIteration):
683         (JSC::BytecodeGenerator::emitGetFromScope):
684         (JSC::BytecodeGenerator::initializeVariable):
685         (JSC::BytecodeGenerator::emitInstanceOf):
686         (JSC::BytecodeGenerator::emitPushFunctionNameScope):
687         (JSC::BytecodeGenerator::pushScopedControlFlowContext):
688         (JSC::BytecodeGenerator::emitPutNewTargetToArrowFunctionContextScope):
689         (JSC::BytecodeGenerator::emitPutDerivedConstructorToArrowFunctionContextScope):
690         (JSC::BytecodeGenerator::emitPutThisToArrowFunctionContextScope):
691         * bytecompiler/NodesCodegen.cpp:
692         (JSC::PostfixNode::emitResolve):
693         (JSC::PrefixNode::emitResolve):
694         (JSC::ReadModifyResolveNode::emitBytecode):
695         (JSC::initializationModeForAssignmentContext):
696         (JSC::AssignResolveNode::emitBytecode):
697         (JSC::EmptyLetExpression::emitBytecode):
698         (JSC::ForInNode::emitLoopHeader):
699         (JSC::ForOfNode::emitBytecode):
700         (JSC::ClassExprNode::emitBytecode):
701         (JSC::BindingNode::bindValue):
702         (JSC::AssignmentElementNode::bindValue):
703         (JSC::RestParameterNode::emit):
704         * dfg/DFGAbstractInterpreterInlines.h:
705         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
706         * dfg/DFGByteCodeParser.cpp:
707         (JSC::DFG::ByteCodeParser::noticeArgumentsUse):
708         (JSC::DFG::ByteCodeParser::promoteToConstant):
709         (JSC::DFG::ByteCodeParser::needsDynamicLookup):
710         (JSC::DFG::ByteCodeParser::planLoad):
711         (JSC::DFG::ByteCodeParser::parseBlock):
712         * dfg/DFGCapabilities.cpp:
713         (JSC::DFG::capabilityLevel):
714         * dfg/DFGClobberize.h:
715         (JSC::DFG::clobberize):
716         * dfg/DFGDoesGC.cpp:
717         (JSC::DFG::doesGC):
718         * dfg/DFGFixupPhase.cpp:
719         (JSC::DFG::FixupPhase::fixupNode):
720         * dfg/DFGNode.h:
721         (JSC::DFG::Node::hasIdentifier):
722         (JSC::DFG::Node::identifierNumber):
723         (JSC::DFG::Node::hasGetPutInfo):
724         (JSC::DFG::Node::getPutInfo):
725         (JSC::DFG::Node::hasAccessorAttributes):
726         * dfg/DFGNodeType.h:
727         * dfg/DFGOperations.cpp:
728         * dfg/DFGOperations.h:
729         * dfg/DFGPredictionPropagationPhase.cpp:
730         (JSC::DFG::PredictionPropagationPhase::propagate):
731         * dfg/DFGSafeToExecute.h:
732         (JSC::DFG::safeToExecute):
733         * dfg/DFGSpeculativeJIT.cpp:
734         (JSC::DFG::SpeculativeJIT::compilePutGetterSetterById):
735         (JSC::DFG::SpeculativeJIT::compileResolveScope):
736         (JSC::DFG::SpeculativeJIT::compileGetDynamicVar):
737         (JSC::DFG::SpeculativeJIT::compilePutDynamicVar):
738         (JSC::DFG::SpeculativeJIT::compilePutAccessorByVal):
739         * dfg/DFGSpeculativeJIT.h:
740         (JSC::DFG::SpeculativeJIT::callOperation):
741         * dfg/DFGSpeculativeJIT32_64.cpp:
742         (JSC::DFG::SpeculativeJIT::compile):
743         * dfg/DFGSpeculativeJIT64.cpp:
744         (JSC::DFG::SpeculativeJIT::compile):
745         * ftl/FTLCapabilities.cpp:
746         (JSC::FTL::canCompile):
747         * ftl/FTLLowerDFGToB3.cpp:
748         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
749         (JSC::FTL::DFG::LowerDFGToB3::compare):
750         (JSC::FTL::DFG::LowerDFGToB3::compileResolveScope):
751         (JSC::FTL::DFG::LowerDFGToB3::compileGetDynamicVar):
752         (JSC::FTL::DFG::LowerDFGToB3::compilePutDynamicVar):
753         (JSC::FTL::DFG::LowerDFGToB3::compareEqObjectOrOtherToObject):
754         * jit/CCallHelpers.h:
755         (JSC::CCallHelpers::setupArgumentsWithExecState):
756         * jit/JITOperations.cpp:
757         * jit/JITOperations.h:
758         * jit/JITPropertyAccess.cpp:
759         (JSC::JIT::emit_op_put_to_scope):
760         (JSC::JIT::emitSlow_op_put_to_scope):
761         * jit/JITPropertyAccess32_64.cpp:
762         (JSC::JIT::emit_op_put_to_scope):
763         (JSC::JIT::emitSlow_op_put_to_scope):
764         * llint/LLIntData.cpp:
765         (JSC::LLInt::Data::performAssertions):
766         * llint/LLIntSlowPaths.cpp:
767         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
768         * llint/LowLevelInterpreter.asm:
769         * llint/LowLevelInterpreter64.asm:
770         * runtime/GetPutInfo.h:
771         (JSC::resolveModeName):
772         (JSC::initializationModeName):
773         (JSC::isInitialization):
774         (JSC::makeType):
775         (JSC::GetPutInfo::GetPutInfo):
776         * runtime/JSScope.cpp:
777         (JSC::abstractAccess):
778
779 2016-04-18  Filip Pizlo  <fpizlo@apple.com>
780
781         Disable AVX.
782
783         Rubber stampted by Benjamin Poulain.
784
785         AVX is silly. If you use it and some of your other code isn't careful with float register bits, you
786         will run 10x slower. We could fix the underlying issue, but it's better to stay away from this odd
787         instruction subset.
788
789         This fixes a massive regression on some real code.
790
791         * assembler/MacroAssemblerX86Common.h:
792         (JSC::MacroAssemblerX86Common::supportsAVX):
793         (JSC::MacroAssemblerX86Common::updateEax1EcxFlags):
794
795 2016-04-18  Filip Pizlo  <fpizlo@apple.com>
796
797         ToThis should have a fast path based on type info flags
798         https://bugs.webkit.org/show_bug.cgi?id=156712
799
800         Reviewed by Geoffrey Garen.
801
802         Prior to this change, if we couldn't nail down the type of ToThis to something easy, we'd emit code
803         that would take slow path if the argument was not a final object. We'd end up taking that slow path
804         a lot.
805
806         This adds a type info flag for ToThis having non-obvious behavior and changes the DFG and FTL paths
807         to test this flag. This is a sub-1% speed-up on SunSpider and Octane.
808
809         * dfg/DFGSpeculativeJIT32_64.cpp:
810         (JSC::DFG::SpeculativeJIT::compile):
811         * dfg/DFGSpeculativeJIT64.cpp:
812         (JSC::DFG::SpeculativeJIT::compile):
813         * ftl/FTLLowerDFGToB3.cpp:
814         (JSC::FTL::DFG::LowerDFGToB3::compileToThis):
815         * runtime/JSGlobalObject.h:
816         (JSC::JSGlobalObject::create):
817         * runtime/JSLexicalEnvironment.h:
818         (JSC::JSLexicalEnvironment::create):
819         * runtime/JSString.h:
820         * runtime/JSTypeInfo.h:
821         (JSC::TypeInfo::overridesGetOwnPropertySlot):
822         (JSC::TypeInfo::interceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero):
823         (JSC::TypeInfo::structureIsImmortal):
824         (JSC::TypeInfo::overridesToThis):
825         (JSC::TypeInfo::overridesGetPropertyNames):
826         (JSC::TypeInfo::prohibitsPropertyCaching):
827         (JSC::TypeInfo::getOwnPropertySlotIsImpure):
828         * runtime/StrictEvalActivation.h:
829         (JSC::StrictEvalActivation::create):
830         * runtime/Symbol.h:
831
832 2016-04-18  Filip Pizlo  <fpizlo@apple.com>
833
834         Check to see how the perf bots react to megamorphic load being disabled.
835
836         Rubber stamped by Chris Dumez.
837
838         * runtime/Options.h:
839
840 2016-04-18  Keith Miller  <keith_miller@apple.com>
841
842         We should support delete in the DFG
843         https://bugs.webkit.org/show_bug.cgi?id=156607
844
845         Reviewed by Benjamin Poulain.
846
847         This patch adds support for the delete in the DFG as it appears that
848         some major frameworks use the operation in particularly hot functions.
849         As a result, even if the function rarely ever calls delete we would never
850         tier up to the DFG. This patch also changes operationDeleteById to take a
851         UniquedStringImpl and return a size_t.
852
853         * dfg/DFGAbstractInterpreterInlines.h:
854         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
855         * dfg/DFGByteCodeParser.cpp:
856         (JSC::DFG::ByteCodeParser::parseBlock):
857         * dfg/DFGCapabilities.cpp:
858         (JSC::DFG::capabilityLevel):
859         * dfg/DFGClobberize.h:
860         (JSC::DFG::clobberize):
861         * dfg/DFGDoesGC.cpp:
862         (JSC::DFG::doesGC):
863         * dfg/DFGFixupPhase.cpp:
864         (JSC::DFG::FixupPhase::fixupNode):
865         * dfg/DFGNode.h:
866         (JSC::DFG::Node::hasIdentifier):
867         * dfg/DFGNodeType.h:
868         * dfg/DFGPredictionPropagationPhase.cpp:
869         (JSC::DFG::PredictionPropagationPhase::propagate):
870         * dfg/DFGSafeToExecute.h:
871         (JSC::DFG::safeToExecute):
872         * dfg/DFGSpeculativeJIT.cpp:
873         (JSC::DFG::SpeculativeJIT::compileDeleteById):
874         * dfg/DFGSpeculativeJIT.h:
875         (JSC::DFG::SpeculativeJIT::callOperation):
876         * dfg/DFGSpeculativeJIT32_64.cpp:
877         (JSC::DFG::SpeculativeJIT::compile):
878         * dfg/DFGSpeculativeJIT64.cpp:
879         (JSC::DFG::SpeculativeJIT::compile):
880         * jit/JIT.h:
881         * jit/JITInlines.h:
882         (JSC::JIT::callOperation):
883         * jit/JITOperations.cpp:
884         * jit/JITOperations.h:
885         * jit/JITPropertyAccess.cpp:
886         (JSC::JIT::emit_op_del_by_id):
887         * jit/JITPropertyAccess32_64.cpp:
888         (JSC::JIT::emit_op_del_by_id):
889
890 2016-04-17  Filip Pizlo  <fpizlo@apple.com>
891
892         FTL should pin the tag registers at inline caches
893         https://bugs.webkit.org/show_bug.cgi?id=156678
894
895         Reviewed by Saam Barati.
896
897         This is a long-overdue fix to our inline caches. Back when we had LLVM, we couldn't rely on the tags
898         being pinned to any registers. So, if the inline caches needed tags, they'd have to materialize them.
899         
900         This removes those materializations. This should reduce the amount of code generated in inline caches
901         and it should make inline caches faster. The effect appears to be small.
902
903         It may be that after this change, we'll even be able to kill the
904         HaveTagRegisters/DoNotHaveTagRegisters logic.
905
906         * bytecode/PolymorphicAccess.cpp:
907         (JSC::AccessCase::generateWithGuard):
908         (JSC::AccessCase::generateImpl):
909         * ftl/FTLLowerDFGToB3.cpp:
910         (JSC::FTL::DFG::LowerDFGToB3::compilePutById):
911         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct):
912         (JSC::FTL::DFG::LowerDFGToB3::compileTailCall):
913         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs):
914         (JSC::FTL::DFG::LowerDFGToB3::compileIn):
915         (JSC::FTL::DFG::LowerDFGToB3::getById):
916         * jit/Repatch.cpp:
917         (JSC::readCallTarget):
918         (JSC::linkPolymorphicCall):
919         * jit/ThunkGenerators.cpp:
920         (JSC::virtualThunkFor):
921
922 2016-04-18  Yusuke Suzuki  <utatane.tea@gmail.com>
923
924         [ES7] yield star should not return if the inner iterator.throw returns { done: true }
925         https://bugs.webkit.org/show_bug.cgi?id=156576
926
927         Reviewed by Saam Barati.
928
929         This is slight generator fix in ES7. When calling generator.throw(),
930         the yield-star should call the throw() of the inner generator. At that
931         time, when the result of throw() is { done: true}, the generator should
932         not stop itself.
933
934             function * gen()
935             {
936                 yield * (function * () {
937                     try {
938                         yield 42;
939                     } catch (error) { }
940                 }());
941                 // Continue executing.
942                 yield 42;
943             }
944
945             let g = gen();
946             g.next();
947             shouldBe(g.throw().value, 42);
948
949
950         * builtins/GeneratorPrototype.js:
951         (generatorResume):
952         (next):
953         (return):
954         (throw):
955         * bytecode/BytecodeIntrinsicRegistry.cpp:
956         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
957         * bytecode/BytecodeIntrinsicRegistry.h:
958         * bytecompiler/BytecodeGenerator.cpp:
959         (JSC::BytecodeGenerator::emitDelegateYield):
960         * runtime/JSGeneratorFunction.h:
961         * tests/stress/generator-yield-star.js:
962         (gen):
963         * tests/stress/yield-star-throw-continue.js: Added.
964         (shouldBe):
965         (generator):
966         (shouldThrow):
967
968 2016-04-17  Jeremy Huddleston Sequoia  <jeremyhu@apple.com>
969
970         Fix incorrect assumption that APPLE implies Mac.
971         https://bugs.webkit.org/show_bug.cgi?id=156683
972     
973         Addresses build failure introduced in r199094
974
975         Reviewed by Alex Christensen.
976
977         * CMakeLists.txt:
978
979 2016-04-17  Benjamin Poulain  <bpoulain@apple.com>
980
981         [JSC] ReduceDoubleToFloat should work accross Phis
982         https://bugs.webkit.org/show_bug.cgi?id=156603
983         <rdar://problem/25736205>
984
985         Reviewed by Saam Barati and Filip Pizlo.
986
987         This patch extends B3's ReduceDoubleToFloat phase to work accross
988         Upsilon-Phis. This is important to optimize loops and some crazy cases.
989
990         In its simplest form, we can have conversion propagated from something
991         like this:
992             Double @1 = Phi()
993             Float @2 = DoubleToFloat(@1)
994
995         When that happens, we just need to propagate that the result only
996         need float precision accross all values coming to this Phi.
997
998
999         There are more complicated cases when the value produced is effectively Float
1000         but the user of the value does not do DoubleToFloat.
1001
1002         Typically, we have something like:
1003             #1
1004                 @1 = ConstDouble(1)
1005                 @2 = Upsilon(@1, ^5)
1006             #2
1007                 @3 = FloatToDouble(@x)
1008                 @4 = Upsilon(@3, ^5)
1009             #3
1010                 @5 = Phi()
1011                 @6 = Add(@5, @somethingFloat)
1012                 @7 = DoubleToFloat(@6)
1013
1014         Here with a Phi-Upsilon that is a Double but can be represented
1015         as Float without loss of precision.
1016
1017         It is valuable to convert such Phis to float if and only if the value
1018         is used as float. Otherwise, you may be just adding useless conversions
1019         (for example, two double constants that flow into a double Add should not
1020         turn into two float constant flowing into a FloatToDouble then Add).
1021
1022
1023         ReduceDoubleToFloat do two analysis passes to gather the necessary
1024         meta information. Then we have a simplify() phase to actually reduce
1025         operation. Finally, the cleanup() pass put the graph into a valid
1026         state again.
1027
1028         The two analysis passes work by disproving that something is float.
1029         -findCandidates() accumulates anything used as Double.
1030         -findPhisContainingFloat() accumulates phis that would lose precision
1031          by converting the input to float.
1032
1033         With this change, Unity3D improves by ~1.5%, box2d-f32 improves
1034         by ~2.8% (on Haswell).
1035
1036         * b3/B3ReduceDoubleToFloat.cpp:
1037         (JSC::B3::reduceDoubleToFloat):
1038         * b3/testb3.cpp:
1039         (JSC::B3::testCompareTwoFloatToDouble):
1040         (JSC::B3::testCompareOneFloatToDouble):
1041         (JSC::B3::testCompareFloatToDoubleThroughPhi):
1042         (JSC::B3::testDoubleToFloatThroughPhi):
1043         (JSC::B3::testDoubleProducerPhiToFloatConversion):
1044         (JSC::B3::testDoubleProducerPhiToFloatConversionWithDoubleConsumer):
1045         (JSC::B3::testDoubleProducerPhiWithNonFloatConst):
1046         (JSC::B3::testStoreDoubleConstantAsFloat):
1047         (JSC::B3::run):
1048         * tests/stress/double-compare-to-float.js: Added.
1049         (canSimplifyToFloat):
1050         (canSimplifyToFloatWithConstant):
1051         (cannotSimplifyA):
1052         (cannotSimplifyB):
1053         * tests/stress/double-to-float.js: Added.
1054         (upsilonReferencingItsPhi):
1055         (upsilonReferencingItsPhiAllFloat):
1056         (upsilonReferencingItsPhiWithoutConversion):
1057         (conversionPropagages):
1058         (chainedUpsilonBothConvert):
1059         (chainedUpsilonFirstConvert):
1060
1061 2016-04-17  Yusuke Suzuki  <utatane.tea@gmail.com>
1062
1063         [ES6] Use @isObject to check Object Type instead of using instanceof
1064         https://bugs.webkit.org/show_bug.cgi?id=156676
1065
1066         Reviewed by Darin Adler.
1067
1068         Use @isObject instead of `instanceof @Object`.
1069         The `instanceof` check is not enough to check Object Type.
1070         For example, given 2 realms, the object created in one realm does not inherit the Object of another realm.
1071         Another example is that the object which does not inherit Object.
1072         This object can be easily created by calling `Object.create(null)`.
1073
1074         * builtins/RegExpPrototype.js:
1075         (match):
1076         * jsc.cpp:
1077         (GlobalObject::finishCreation):
1078         (functionCreateGlobalObject):
1079         * tests/stress/regexp-match-in-other-realm-should-work.js: Added.
1080         (shouldBe):
1081         * tests/stress/regexp-match-should-work-with-objects-not-inheriting-object-prototype.js: Added.
1082         (shouldBe):
1083         (regexp.exec):
1084
1085 2016-04-17  Darin Adler  <darin@apple.com>
1086
1087         Remove more uses of Deprecated::ScriptXXX
1088         https://bugs.webkit.org/show_bug.cgi?id=156660
1089
1090         Reviewed by Antti Koivisto.
1091
1092         * bindings/ScriptFunctionCall.cpp:
1093         (Deprecated::ScriptCallArgumentHandler::appendArgument): Deleted
1094         unneeded overloads that take a ScriptObject and ScriptValue.
1095         * bindings/ScriptFunctionCall.h: Ditto.
1096
1097         * bindings/ScriptObject.h: Added operator so this can change
1098         itself into a JSObject*. Helps while phasing this class out.
1099
1100         * bindings/ScriptValue.h: Export toInspectorValue so it can be
1101         used in WebCore.
1102
1103         * inspector/InjectedScriptManager.cpp:
1104         (Inspector::InjectedScriptManager::createInjectedScript): Changed
1105         return value from Deprecated::ScriptObject to JSObject*.
1106         (Inspector::InjectedScriptManager::injectedScriptFor): Updated for
1107         the return value change above.
1108         * inspector/InjectedScriptManager.h: Ditto.
1109
1110 2016-04-16  Benjamin Poulain  <bpoulain@webkit.org>
1111
1112         [JSC] DFG should support relational comparisons of Number and Other
1113         https://bugs.webkit.org/show_bug.cgi?id=156669
1114
1115         Reviewed by Darin Adler.
1116
1117         In Sunspider/3d-raytrace, DFG falls back to JSValue in some important
1118         relational compare because profiling sees "undefined" from time to time.
1119
1120         This case is fairly common outside Sunspider too because of out-of-bounds array access.
1121         Unfortunately for us, our fallback for compare is really inefficient.
1122
1123         Fortunately, relational comparison with null/undefined/true/false are trival.
1124         We can just convert both side to Double. That's what this patch adds.
1125
1126         I also extended constant folding for those cases because I noticed
1127         a bunch of "undefined" constant going through DoubleRep at runtime.
1128
1129         * dfg/DFGAbstractInterpreterInlines.h:
1130         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1131         * dfg/DFGFixupPhase.cpp:
1132         (JSC::DFG::FixupPhase::fixupNode):
1133         * tests/stress/compare-number-and-other.js: Added.
1134         (opaqueSideEffect):
1135         (let.operator.of.operators.eval.testPolymorphic):
1136         (let.operator.of.operators.let.left.of.typeCases.let.right.of.typeCases.eval.testMonomorphic):
1137         (let.operator.of.operators.let.left.of.typeCases.let.right.of.typeCases.testMonomorphicLeftConstant):
1138         (let.operator.of.operators.let.left.of.typeCases.let.right.of.typeCases.testMonomorphicRightConstant):
1139         (let.operator.of.operators.let.left.of.typeCases.let.right.of.typeCases.i.testPolymorphic):
1140
1141 2016-04-16  Benjamin Poulain  <bpoulain@apple.com>
1142
1143         [JSC] FRound/Negate can produce an impure NaN out of a pure NaN
1144         https://bugs.webkit.org/show_bug.cgi?id=156528
1145
1146         Reviewed by Filip Pizlo.
1147
1148         If you fround a double with the bits 0xfff7000000000000
1149         you get 0xfffe000000000000. The first is a pure NaN, the second isn't.
1150
1151         This is without test because I could not find a way to create a 0xfff7000000000000
1152         while convincing DFG that its pure.
1153         When we purify NaNs from typed array, we use a specific value of NaN if the input
1154         is any NaN, making testing tricky.
1155
1156         * bytecode/SpeculatedType.cpp:
1157         (JSC::typeOfDoubleNegation):
1158
1159 2016-04-16  Konstantin Tokarev  <annulen@yandex.ru>
1160
1161         JS::DFG::nodeValuePairListDump does not compile with libstdc++ 4.8
1162         https://bugs.webkit.org/show_bug.cgi?id=156670
1163
1164         Reviewed by Darin Adler.
1165
1166         * dfg/DFGNode.h:
1167         (JSC::DFG::nodeValuePairListDump): Modified to use lambda as comparator.
1168
1169 2016-04-16  Konstantin Tokarev  <annulen@yandex.ru>
1170
1171         [mips] Implemented moveZeroToDouble.
1172         https://bugs.webkit.org/show_bug.cgi?id=155429
1173
1174         Reviewed by Darin Adler.
1175
1176         This function is required to fix compilation after r197687.
1177
1178         * assembler/MacroAssemblerMIPS.h:
1179         (JSC::MacroAssemblerMIPS::moveZeroToDouble):
1180
1181 2016-04-15  Darin Adler  <darin@apple.com>
1182
1183         Reduce use of Deprecated::ScriptXXX classes
1184         https://bugs.webkit.org/show_bug.cgi?id=156632
1185
1186         Reviewed by Alex Christensen.
1187
1188         * bindings/ScriptFunctionCall.cpp:
1189         (Deprecated::ScriptCallArgumentHandler::appendArgument): Deleted version that takes a Deprecated::ScriptValue.
1190         (Deprecated::ScriptFunctionCall::call): Changed to return a JSValue.
1191         * bindings/ScriptFunctionCall.h: Updated for the above.
1192
1193         * bindings/ScriptValue.cpp:
1194         (Inspector::jsToInspectorValue): Moved from Deprecated namespace to Inspector namespace. Later, we should
1195         move this to another source file in the inspector directory.
1196         (Inspector::toInspectorValue): Added.
1197         (Deprecated::ScriptValue::toInspectorValue): Updated for change to underlying function.
1198         * bindings/ScriptValue.h: Update for the above.
1199
1200         * inspector/InjectedScript.cpp:
1201         (Inspector::InjectedScript::evaluateOnCallFrame): Changed arguments and return values from
1202         Deprecated::ScriptValue to JSC::JSValue.
1203         (Inspector::InjectedScript::functionDetails): Ditto.
1204         (Inspector::InjectedScript::wrapCallFrames): Ditto.
1205         (Inspector::InjectedScript::wrapObject): Ditto.
1206         (Inspector::InjectedScript::wrapTable): Ditto.
1207         (Inspector::InjectedScript::previewValue): Ditto.
1208         (Inspector::InjectedScript::setExceptionValue): Ditto.
1209         (Inspector::InjectedScript::findObjectById): Ditto.
1210         (Inspector::InjectedScript::inspectObject): Ditto.
1211         * inspector/InjectedScript.h: Ditto.
1212         * inspector/InjectedScriptBase.cpp:
1213         (Inspector::InjectedScriptBase::callFunctionWithEvalEnabled): Ditto.
1214         (Inspector::InjectedScriptBase::makeCall): Ditto.
1215         * inspector/InjectedScriptBase.h: Ditto.
1216         * inspector/InjectedScriptModule.cpp:
1217         (Inspector::InjectedScriptModule::ensureInjected): Ditto.
1218         * inspector/ScriptDebugListener.h: Ditto.
1219         * inspector/ScriptDebugServer.cpp:
1220         (Inspector::ScriptDebugServer::evaluateBreakpointAction): Ditto.
1221         (Inspector::ScriptDebugServer::dispatchDidPause): Ditto.
1222         (Inspector::ScriptDebugServer::dispatchBreakpointActionProbe): Ditto.
1223         (Inspector::ScriptDebugServer::exceptionOrCaughtValue): Ditto.
1224         * inspector/ScriptDebugServer.h: Ditto.
1225         * inspector/agents/InspectorDebuggerAgent.cpp:
1226         (Inspector::InspectorDebuggerAgent::buildExceptionPauseReason): Ditto.
1227         (Inspector::InspectorDebuggerAgent::didPause): Ditto.
1228         (Inspector::InspectorDebuggerAgent::breakpointActionProbe): Ditto.
1229         (Inspector::InspectorDebuggerAgent::didContinue): Ditto.
1230         (Inspector::InspectorDebuggerAgent::clearDebuggerBreakpointState): Ditto.
1231         * inspector/agents/InspectorDebuggerAgent.h: Ditto.
1232         * inspector/agents/InspectorHeapAgent.cpp:
1233         (Inspector::InspectorHeapAgent::getPreview): Ditto.
1234         (Inspector::InspectorHeapAgent::getRemoteObject): Ditto.
1235
1236 2016-04-15  Keith Miller  <keith_miller@apple.com>
1237
1238         Some JIT/DFG operations need NativeCallFrameTracers
1239         https://bugs.webkit.org/show_bug.cgi?id=156650
1240
1241         Reviewed by Michael Saboff.
1242
1243         Some of our operation functions did not have native call frame
1244         tracers. This meant that we would crash occasionally on some
1245         of our tests when they triggered a GC in one of the functions
1246         without a tracer. In particular, this was exemplified by another
1247         upcoming patch when calling operationSetFunctionName.
1248
1249         This patch does not add tests since this happens consistently in
1250         the patch adding delete_by_id to the DFG.
1251
1252         * dfg/DFGOperations.cpp:
1253         * jit/JITOperations.cpp:
1254
1255 2016-04-15  Joseph Pecoraro  <pecoraro@apple.com>
1256
1257         Web Inspector: sourceMappingURL not used when sourceURL is set
1258         https://bugs.webkit.org/show_bug.cgi?id=156021
1259         <rdar://problem/25438417>
1260
1261         Reviewed by Timothy Hatcher.
1262
1263         Clean up Debugger.sourceParsed to separately include:
1264
1265             - url ("resource URL", "source url" in JSC APIs)
1266             - sourceURL - //# sourceURL directive
1267
1268         By always having the resource URL the Web Inspector frontend
1269         can better match this Script to a Resource of the same URL,
1270         and decide to use the sourceURL if it is available when
1271         appropriate.
1272
1273         * inspector/protocol/Debugger.json:
1274         * inspector/agents/InspectorDebuggerAgent.cpp:
1275         (Inspector::InspectorDebuggerAgent::setBreakpointByUrl):
1276         (Inspector::InspectorDebuggerAgent::didParseSource):
1277         Send the new sourceParsed parameters.
1278
1279 2016-04-14  Joseph Pecoraro  <pecoraro@apple.com>
1280
1281         Web Inspector: Cleanup inspector/debugger tests
1282         https://bugs.webkit.org/show_bug.cgi?id=156619
1283
1284         Reviewed by Brian Burg.
1285
1286         While cleaning up the tests it exposed the fact that breakpoints
1287         were not getting disabled when the inspector closes. This means
1288         that opening the inspector, with breakpoints, and closing the
1289         inspector, would leave the JSC::Debugger thinking breakpoints
1290         are active. The JSC::Debugger should be reset.
1291
1292         * inspector/agents/InspectorDebuggerAgent.cpp:
1293         (Inspector::InspectorDebuggerAgent::disable):
1294
1295 2016-04-14  Geoffrey Garen  <ggaren@apple.com>
1296
1297         CopiedBlock should be 64kB
1298
1299         Reviewed by Benjamin Poulain.
1300
1301         Let's try another value.
1302
1303         This is 25% faster on kraken-audio-beat-detection on Mac Pro.
1304
1305         * heap/CopiedBlock.h:
1306
1307 2016-04-15  Zan Dobersek  <zdobersek@igalia.com>
1308
1309         Tail call optimizations lead to crashes on ARM Thumb + Linux
1310         https://bugs.webkit.org/show_bug.cgi?id=150083
1311
1312         Reviewed by Csaba Osztrogon√°c.
1313
1314         * assembler/AbstractMacroAssembler.h:
1315         (JSC::AbstractMacroAssembler::repatchNearCall): In case of a tail call relink to the
1316         data location of the destination, and not the executable address. This is needed for
1317         the ARM Thumb2 platform where both the source and destination addresses of a jump relink
1318         must not have the bottom bit decorated, as asserted in ARMv7Assembler::relinkJump().
1319         * jit/Repatch.cpp:
1320         (JSC::linkPolymorphicCall): Similarly, when linking a tail call we must link to the
1321         address that has a non-decorated bottom bit, as asserted in ARMv7Assembler::linkJumpAbsolute().
1322
1323 2016-04-14  Geoffrey Garen  <ggaren@apple.com>
1324
1325         Unreviewed, rolling out r199567.
1326
1327         performance regression on kraken on macbook*
1328
1329         Reverted changeset:
1330
1331         "CopiedBlock should be 8kB"
1332         https://bugs.webkit.org/show_bug.cgi?id=156610
1333         http://trac.webkit.org/changeset/199567
1334
1335 2016-04-14  Geoffrey Garen  <ggaren@apple.com>
1336
1337         CopiedBlock should be 8kB
1338         https://bugs.webkit.org/show_bug.cgi?id=156610
1339
1340         Reviewed by Michael Saboff.
1341
1342         On Mac Pro, this is:
1343
1344             15% faster on kraken-audio-beat-detection
1345
1346             5% faster on v8-splay
1347
1348         Hopefully, this will be OK on MacBook* bots as well.
1349
1350         32kB is the full size of L1 cache on x86. So, allocating and zero-filling
1351         a 32kB CopiedBlock would basically flush the L1 cache. We can ameliorate
1352         this problem by using smaller blocks -- or, if that doesn't work, we can
1353         use larger blocks to amortize the cost.
1354
1355         * heap/CopiedBlock.h:
1356
1357 2016-04-14  Filip Pizlo  <fpizlo@apple.com>
1358
1359         PolymorphicAccess should try to generate a stub only once
1360         https://bugs.webkit.org/show_bug.cgi?id=156555
1361
1362         Reviewed by Geoffrey Garen.
1363         
1364         This changes the PolymorphicAccess heuristics to reduce the amount of code generation even
1365         more than before. We used to always generate a monomorphic stub for the first case we saw.
1366         This change disables that. This change also increases the buffering countdown to match the
1367         cool-down repatch count. This means that we will allow for ten slow paths for adding cases,
1368         then we will generate a stub, and then we will go into cool-down and the repatching slow
1369         paths will not even attempt repatching for a while. After we emerge from cool-down - which
1370         requires a bunch of slow path calls - we will again wait for ten slow paths to get new
1371         cases. Note that it only takes 13 cases to cause the stub to give up on future repatching
1372         entirely. Also, most stubs don't ever get to 10 cases. Therefore, for most stubs this change
1373         means that each IC will repatch once. If they make it to two repatching, then the likelihood
1374         of a third becomes infinitesimal because of all of the rules that come into play at that
1375         point (the size limit being 13, the fact that we go into exponential cool-down every time we
1376         generate code, and the fact that if we have lots of self cases then we will create a
1377         catch-all megamorphic load case).
1378
1379         This also undoes a change to the megamorphic optimization that I think was unintentional.
1380         As in the change that originally introduced megamorphic loads, we want to do this only if we
1381         would otherwise exhaust the max size of the IC. This is because megamorphic loads are pretty
1382         expensive and it's best to use them only if we know that the alternative is giving up on
1383         caching.
1384
1385         This is neutral on JS benchmarks, but looks like it's another speed-up for page loading.
1386
1387         * bytecode/PolymorphicAccess.cpp:
1388         (JSC::AccessCase::canBeReplacedByMegamorphicLoad):
1389         (JSC::AccessCase::canReplace):
1390         (JSC::AccessCase::dump):
1391         (JSC::PolymorphicAccess::regenerate):
1392         * bytecode/StructureStubInfo.cpp:
1393         (JSC::StructureStubInfo::StructureStubInfo):
1394         * runtime/Options.h:
1395
1396 2016-04-14  Mark Lam  <mark.lam@apple.com>
1397
1398         Update treatment of invoking RegExp.prototype methods on RegExp.prototype.
1399         https://bugs.webkit.org/show_bug.cgi?id=155922
1400
1401         Reviewed by Keith Miller.
1402
1403         According to the TC39 committee, when invoking the following RegExp.prototype
1404         methods on the RegExp.prototype:
1405         1. RegExp.prototype.flags yields ""
1406         2. RegExp.prototype.global yields undefined
1407         3. RegExp.prototype.ignoreCase yields undefined
1408         4. RegExp.prototype.multiline yields undefined
1409         5. RegExp.prototype.unicode yields undefined
1410         6. RegExp.prototype.source yields "(?:)"
1411         7. RegExp.prototype.sticky yields undefined
1412         8. RegExp.prototype.toString() yields "/(?:)/"
1413
1414         and RegExp.prototype is still NOT an instance of RegExp.  The above behavior
1415         changes is a special dispensation applicable only to RegExp.prototype.  The ES6
1416         spec of throwing errors still applies if those methods are applied to anything =
1417         else that is not a RegExp object.
1418
1419         * runtime/RegExpPrototype.cpp:
1420         (JSC::regExpProtoGetterGlobal):
1421         (JSC::regExpProtoGetterIgnoreCase):
1422         (JSC::regExpProtoGetterMultiline):
1423         (JSC::regExpProtoGetterSticky):
1424         (JSC::regExpProtoGetterUnicode):
1425         (JSC::regExpProtoGetterFlags):
1426         (JSC::regExpProtoGetterSource):
1427         - Implemented new behavior.
1428
1429         * tests/es6/miscellaneous_built-in_prototypes_are_not_instances.js:
1430         (test):
1431         - Updated to match current kangax test.
1432
1433 2016-04-14  Geoffrey Garen  <ggaren@apple.com>
1434
1435         Some imported ES6 tests are missing __createIterableObject
1436         https://bugs.webkit.org/show_bug.cgi?id=156584
1437
1438         Reviewed by Keith Miller.
1439
1440         These tests were failing because I neglected to include __createIterableObject
1441         when I first imported them. Now they pass.
1442
1443         * tests/es6.yaml:
1444         * tests/es6/Array_static_methods_Array.from_generic_iterables.js:
1445         (iterator.next):
1446         (iterable.Symbol.iterator):
1447         (__createIterableObject):
1448         (test):
1449         * tests/es6/Array_static_methods_Array.from_instances_of_generic_iterables.js:
1450         (iterator.next):
1451         (iterable.Symbol.iterator):
1452         (__createIterableObject):
1453         (test):
1454         * tests/es6/Array_static_methods_Array.from_iterator_closing.js:
1455         (iterator.next):
1456         (iterable.Symbol.iterator):
1457         (__createIterableObject):
1458         * tests/es6/Array_static_methods_Array.from_map_function_generic_iterables.js:
1459         (iterator.next):
1460         (iterable.Symbol.iterator):
1461         (__createIterableObject):
1462         (test):
1463         * tests/es6/Array_static_methods_Array.from_map_function_instances_of_iterables.js:
1464         (iterator.next):
1465         (iterable.Symbol.iterator):
1466         (__createIterableObject):
1467         (test):
1468         * tests/es6/Map_iterator_closing.js:
1469         (iterator.next):
1470         (iterable.Symbol.iterator):
1471         (__createIterableObject):
1472         * tests/es6/Promise_Promise.all_generic_iterables.js:
1473         (iterator.next):
1474         (iterable.Symbol.iterator):
1475         (__createIterableObject):
1476         (test.asyncTestPassed):
1477         * tests/es6/Promise_Promise.race_generic_iterables.js:
1478         (iterator.next):
1479         (iterable.Symbol.iterator):
1480         (__createIterableObject):
1481         (test.asyncTestPassed):
1482         * tests/es6/Set_iterator_closing.js:
1483         (iterator.next):
1484         (iterable.Symbol.iterator):
1485         (__createIterableObject):
1486         * tests/es6/WeakMap_iterator_closing.js:
1487         (iterator.next):
1488         (iterable.Symbol.iterator):
1489         (__createIterableObject):
1490         * tests/es6/WeakSet_iterator_closing.js:
1491         (iterator.next):
1492         (iterable.Symbol.iterator):
1493         (__createIterableObject):
1494         * tests/es6/destructuring_iterator_closing.js:
1495         (iterator.next):
1496         (iterable.Symbol.iterator):
1497         (__createIterableObject):
1498         * tests/es6/destructuring_with_generic_iterables.js:
1499         (iterator.next):
1500         (iterable.Symbol.iterator):
1501         (__createIterableObject):
1502         (test):
1503         * tests/es6/destructuring_with_instances_of_generic_iterables.js:
1504         (iterator.next):
1505         (iterable.Symbol.iterator):
1506         (__createIterableObject):
1507         (test):
1508         * tests/es6/for..of_loops_iterator_closing_break.js:
1509         (iterator.next):
1510         (iterable.Symbol.iterator):
1511         (__createIterableObject):
1512         * tests/es6/for..of_loops_iterator_closing_throw.js:
1513         (iterator.next):
1514         (iterable.Symbol.iterator):
1515         (__createIterableObject):
1516         * tests/es6/for..of_loops_with_generic_iterables.js:
1517         (iterator.next):
1518         (iterable.Symbol.iterator):
1519         (__createIterableObject):
1520         (test):
1521         * tests/es6/for..of_loops_with_instances_of_generic_iterables.js:
1522         (iterator.next):
1523         (iterable.Symbol.iterator):
1524         (__createIterableObject):
1525         (test):
1526         * tests/es6/generators_yield_star_generic_iterables.js:
1527         (iterator.next):
1528         (iterable.Symbol.iterator):
1529         (__createIterableObject):
1530         * tests/es6/generators_yield_star_iterator_closing_via_throw.js:
1531         (iterator.next):
1532         (iterable.Symbol.iterator):
1533         (__createIterableObject):
1534         * tests/es6/spread_..._operator_with_generic_iterables_in_arrays.js:
1535         (iterator.next):
1536         (iterable.Symbol.iterator):
1537         (__createIterableObject):
1538         (test):
1539         * tests/es6/spread_..._operator_with_generic_iterables_in_calls.js:
1540         (iterator.next):
1541         (iterable.Symbol.iterator):
1542         (__createIterableObject):
1543         (test):
1544         * tests/es6/spread_..._operator_with_instances_of_iterables_in_arrays.js:
1545         (iterator.next):
1546         (iterable.Symbol.iterator):
1547         (__createIterableObject):
1548         (test):
1549         * tests/es6/spread_..._operator_with_instances_of_iterables_in_calls.js:
1550         (iterator.next):
1551         (iterable.Symbol.iterator):
1552         (__createIterableObject):
1553         (test):
1554
1555 2016-04-13  Alex Christensen  <achristensen@webkit.org>
1556
1557         CMake MiniBrowser should be an app bundle
1558         https://bugs.webkit.org/show_bug.cgi?id=156521
1559
1560         Reviewed by Brent Fulgham.
1561
1562         * PlatformMac.cmake:
1563         Unreviewed build fix.  Define __STDC_WANT_LIB_EXT1__ so we can find memset_s.
1564
1565 2016-04-13  Joseph Pecoraro  <pecoraro@apple.com>
1566
1567         JSContext Inspector: Improve Class instances and JSC API Exported Values view in Console / ObjectTree
1568         https://bugs.webkit.org/show_bug.cgi?id=156566
1569         <rdar://problem/16392365>
1570
1571         Reviewed by Timothy Hatcher.
1572
1573         * inspector/InjectedScriptSource.js:
1574         (InjectedScript.RemoteObject.prototype._appendPropertyPreviews):
1575         Treat non-basic object types as not lossless so they can be expanded.
1576         Show non-enumerable native getters in Object previews.
1577
1578 2016-04-13  Michael Saboff  <msaboff@apple.com>
1579
1580         Some tests fail with ES6 `u` (Unicode) flag for regular expressions
1581         https://bugs.webkit.org/show_bug.cgi?id=151597
1582
1583         Reviewed by Geoffrey Garen.
1584
1585         Added two new tables to handle the anomolies of \w and \W CharacterClassEscapes
1586         when specified in RegExp's with both the unicode and ignoreCase flags.  Given the
1587         case folding rules described in the standard vie the meta function Canonicalize(),
1588         which allow cross ASCII case folding when unicode is specified, the unicode characters
1589         \u017f (small sharp s) and \u212a (kelvin symbol) are part of the \w (word) characterClassEscape.
1590         This is true because they case fold to 's' and 'k' respectively.  Because they case fold
1591         to lower case letters, the corresponding letters, 'k', 'K', 's' and 'S', are also matched with
1592         \W with the unicode and ignoreCase flags.
1593
1594         * create_regex_tables:
1595         * yarr/YarrPattern.cpp:
1596         (JSC::Yarr::YarrPatternConstructor::atomBuiltInCharacterClass):
1597         (JSC::Yarr::YarrPatternConstructor::atomCharacterClassBuiltIn):
1598         (JSC::Yarr::YarrPattern::YarrPattern):
1599         * yarr/YarrPattern.h:
1600         (JSC::Yarr::YarrPattern::wordcharCharacterClass):
1601         (JSC::Yarr::YarrPattern::wordUnicodeIgnoreCaseCharCharacterClass):
1602         (JSC::Yarr::YarrPattern::nonwordcharCharacterClass):
1603         (JSC::Yarr::YarrPattern::nonwordUnicodeIgnoreCaseCharCharacterClass):
1604
1605 2016-04-13  Commit Queue  <commit-queue@webkit.org>
1606
1607         Unreviewed, rolling out r199502 and r199511.
1608         https://bugs.webkit.org/show_bug.cgi?id=156557
1609
1610         Appears to have in-browser perf regression (Requested by mlam
1611         on #webkit).
1612
1613         Reverted changesets:
1614
1615         "ES6: Implement String.prototype.split and
1616         RegExp.prototype[@@split]."
1617         https://bugs.webkit.org/show_bug.cgi?id=156013
1618         http://trac.webkit.org/changeset/199502
1619
1620         "ES6: Implement RegExp.prototype[@@search]."
1621         https://bugs.webkit.org/show_bug.cgi?id=156331
1622         http://trac.webkit.org/changeset/199511
1623
1624 2016-04-13  Keith Miller  <keith_miller@apple.com>
1625
1626         isJSArray should use ArrayType rather than the ClassInfo
1627         https://bugs.webkit.org/show_bug.cgi?id=156551
1628
1629         Reviewed by Filip Pizlo.
1630
1631         Using the JSType rather than the ClassInfo should be slightly faster
1632         since the type is inline on the cell whereas the ClassInfo is only
1633         on the structure.
1634
1635         * runtime/JSArray.h:
1636         (JSC::isJSArray):
1637
1638 2016-04-13  Mark Lam  <mark.lam@apple.com>
1639
1640         ES6: Implement RegExp.prototype[@@search].
1641         https://bugs.webkit.org/show_bug.cgi?id=156331
1642
1643         Reviewed by Keith Miller.
1644
1645         What changed?
1646         1. Implemented search builtin in RegExpPrototype.js.
1647            The native path is now used as a fast path.
1648         2. Added DFG support for an IsRegExpObjectIntrinsic (modelled after the
1649            IsJSArrayIntrinsic).
1650         3. Renamed @isRegExp to @isRegExpObject to match the new IsRegExpObjectIntrinsic.
1651         4. Change the esSpecIsRegExpObject() implementation to check if the object's
1652            JSType is RegExpObjectType instead of walking the classinfo chain.
1653
1654         * builtins/RegExpPrototype.js:
1655         (search):
1656         * builtins/StringPrototype.js:
1657         (search):
1658         - fixed some indentation.
1659
1660         * dfg/DFGAbstractInterpreterInlines.h:
1661         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1662         * dfg/DFGByteCodeParser.cpp:
1663         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1664         * dfg/DFGClobberize.h:
1665         (JSC::DFG::clobberize):
1666         * dfg/DFGDoesGC.cpp:
1667         (JSC::DFG::doesGC):
1668         * dfg/DFGFixupPhase.cpp:
1669         (JSC::DFG::FixupPhase::fixupNode):
1670         * dfg/DFGNodeType.h:
1671         * dfg/DFGPredictionPropagationPhase.cpp:
1672         (JSC::DFG::PredictionPropagationPhase::propagate):
1673         * dfg/DFGSafeToExecute.h:
1674         (JSC::DFG::safeToExecute):
1675         * dfg/DFGSpeculativeJIT.cpp:
1676         (JSC::DFG::SpeculativeJIT::compileIsArrayConstructor):
1677         (JSC::DFG::SpeculativeJIT::compileIsRegExpObject):
1678         (JSC::DFG::SpeculativeJIT::compileCallObjectConstructor):
1679         * dfg/DFGSpeculativeJIT.h:
1680         * dfg/DFGSpeculativeJIT32_64.cpp:
1681         (JSC::DFG::SpeculativeJIT::compile):
1682         * dfg/DFGSpeculativeJIT64.cpp:
1683         (JSC::DFG::SpeculativeJIT::compile):
1684         * ftl/FTLCapabilities.cpp:
1685         (JSC::FTL::canCompile):
1686         * ftl/FTLLowerDFGToB3.cpp:
1687         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1688         (JSC::FTL::DFG::LowerDFGToB3::compileIsFunction):
1689         (JSC::FTL::DFG::LowerDFGToB3::compileIsRegExpObject):
1690         (JSC::FTL::DFG::LowerDFGToB3::compileTypeOf):
1691         (JSC::FTL::DFG::LowerDFGToB3::isExoticForTypeof):
1692         (JSC::FTL::DFG::LowerDFGToB3::isRegExpObject):
1693         (JSC::FTL::DFG::LowerDFGToB3::isType):
1694         * runtime/Intrinsic.h:
1695         - Added IsRegExpObjectIntrinsic.
1696
1697         * runtime/CommonIdentifiers.h:
1698
1699         * runtime/ECMAScriptSpecInternalFunctions.cpp:
1700         (JSC::esSpecIsConstructor):
1701         - Changed to use uncheckedArgument since this is only called from internal code.
1702         (JSC::esSpecIsRegExpObject):
1703         (JSC::esSpecIsRegExp): Deleted.
1704         * runtime/ECMAScriptSpecInternalFunctions.h:
1705         - Changed to check the object for a JSType of RegExpObjectType.
1706
1707         * runtime/JSGlobalObject.cpp:
1708         (JSC::JSGlobalObject::init):
1709         - Added split fast path.
1710
1711         * runtime/RegExpPrototype.cpp:
1712         (JSC::RegExpPrototype::finishCreation):
1713         (JSC::regExpProtoFuncSearchFast):
1714         (JSC::regExpProtoFuncSearch): Deleted.
1715         * runtime/RegExpPrototype.h:
1716
1717         * tests/es6.yaml:
1718         * tests/stress/regexp-search.js:
1719         - Rebased test.
1720
1721 2016-04-12  Filip Pizlo  <fpizlo@apple.com>
1722
1723         PolymorphicAccess::regenerate() shouldn't have to clone non-generated AccessCases
1724         https://bugs.webkit.org/show_bug.cgi?id=156493
1725
1726         Reviewed by Geoffrey Garen.
1727
1728         Cloning AccessCases is only necessary if they hold some artifacts that are used by code that
1729         they already generated. So, if the state is not Generated, we don't have to bother with
1730         cloning them.
1731
1732         This should speed up PolymorphicAccess regeneration a bit more.
1733
1734         * bytecode/PolymorphicAccess.cpp:
1735         (JSC::AccessCase::commit):
1736         (JSC::PolymorphicAccess::regenerate):
1737
1738 2016-04-13  Mark Lam  <mark.lam@apple.com>
1739
1740         ES6: Implement String.prototype.split and RegExp.prototype[@@split].
1741         https://bugs.webkit.org/show_bug.cgi?id=156013
1742
1743         Reviewed by Keith Miller.
1744
1745         Re-landing r199393 now that the shadow chicken crash has been fixed.
1746
1747         * CMakeLists.txt:
1748         * JavaScriptCore.xcodeproj/project.pbxproj:
1749         * builtins/GlobalObject.js:
1750         (speciesConstructor):
1751         * builtins/PromisePrototype.js:
1752         - refactored to use the @speciesConstructor internal function.
1753
1754         * builtins/RegExpPrototype.js:
1755         (advanceStringIndex):
1756         - refactored from @advanceStringIndexUnicode() to be match the spec.
1757           Benchmarks show that there's no advantage in doing the unicode check outside
1758           of the advanceStringIndexUnicode part.  So, I simplified the code to match the
1759           spec (especially since @@split needs to call advanceStringIndex from more than
1760           1 location).
1761         (match):
1762         - Removed an unnecessary call to @Object because it was already proven above.
1763         - Changed to use advanceStringIndex instead of advanceStringIndexUnicode.
1764           Again, there's no perf regression for this.
1765         (regExpExec):
1766         (hasObservableSideEffectsForRegExpSplit):
1767         (split):
1768         (advanceStringIndexUnicode): Deleted.
1769
1770         * builtins/StringPrototype.js:
1771         (split):
1772         - Modified to use RegExp.prototype[@@split].
1773
1774         * bytecode/BytecodeIntrinsicRegistry.cpp:
1775         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
1776         (JSC::BytecodeIntrinsicRegistry::lookup):
1777         * bytecode/BytecodeIntrinsicRegistry.h:
1778         - Added the @@split symbol.
1779
1780         * runtime/CommonIdentifiers.h:
1781         * runtime/ECMAScriptSpecInternalFunctions.cpp: Added.
1782         (JSC::esSpecIsConstructor):
1783         (JSC::esSpecIsRegExp):
1784         * runtime/ECMAScriptSpecInternalFunctions.h: Added.
1785
1786         * runtime/JSGlobalObject.cpp:
1787         (JSC::getGetterById):
1788         (JSC::JSGlobalObject::init):
1789
1790         * runtime/PropertyDescriptor.cpp:
1791         (JSC::PropertyDescriptor::setDescriptor):
1792         - Removed an assert that is no longer valid.
1793
1794         * runtime/RegExpObject.h:
1795         - Made advanceStringUnicode() public so that it can be re-used by the regexp split
1796           fast path.
1797
1798         * runtime/RegExpPrototype.cpp:
1799         (JSC::RegExpPrototype::finishCreation):
1800         (JSC::regExpProtoFuncExec):
1801         (JSC::regExpProtoFuncSearch):
1802         (JSC::advanceStringIndex):
1803         (JSC::regExpProtoFuncSplitFast):
1804         * runtime/RegExpPrototype.h:
1805
1806         * runtime/StringObject.h:
1807         (JSC::jsStringWithReuse):
1808         (JSC::jsSubstring):
1809         - Hoisted some utility functions from StringPrototype.cpp so that they can be
1810           reused by the regexp split fast path.
1811
1812         * runtime/StringPrototype.cpp:
1813         (JSC::StringPrototype::finishCreation):
1814         (JSC::stringProtoFuncSplitFast):
1815         (JSC::stringProtoFuncSubstr):
1816         (JSC::builtinStringSubstrInternal):
1817         (JSC::stringProtoFuncSubstring):
1818         (JSC::stringIncludesImpl):
1819         (JSC::stringProtoFuncIncludes):
1820         (JSC::builtinStringIncludesInternal):
1821         (JSC::jsStringWithReuse): Deleted.
1822         (JSC::jsSubstring): Deleted.
1823         (JSC::stringProtoFuncSplit): Deleted.
1824         * runtime/StringPrototype.h:
1825
1826         * tests/es6.yaml:
1827
1828 2016-04-13  Mark Lam  <mark.lam@apple.com>
1829
1830         ShadowChicken::visitChildren() should not visit tailMarkers and throwMarkers.
1831         https://bugs.webkit.org/show_bug.cgi?id=156532
1832
1833         Reviewed by Saam Barati and Filip Pizlo.
1834
1835         ShadowChicken can store tailMarkers and throwMarkers in its log, specifically in
1836         the callee field of a log packet.  However, ShadowChicken::visitChildren()
1837         unconditionally visits the callee field of each packet as if they are real
1838         objects.  If visitChildren() encounters one of these markers in the log, we get a
1839         crash.
1840
1841         This crash was observed in the v8-v6/v8-regexp.js stress test running with shadow
1842         chicken when r199393 landed.  r199393 introduced tail calls to a RegExp split
1843         fast path, and the v8-regexp.js test exercised this fast path a lot.  Throw in
1844         some timely GCs, and we get a crash party.
1845
1846         The fix is to have ShadowChicken::visitChildren() filter out the tailMarker and
1847         throwMarker.
1848
1849         Alternatively, if perf is an issue, we can allocate 2 dedicated objects for
1850         these markers so that ShadowChicken can continue to visit them.  For now, I'm
1851         going with the filter.
1852
1853         * interpreter/ShadowChicken.cpp:
1854         (JSC::ShadowChicken::visitChildren):
1855
1856 2016-04-13  Yusuke Suzuki  <utatane.tea@gmail.com>
1857
1858         [ES6] Add @@toStringTag to GeneratorFunction
1859         https://bugs.webkit.org/show_bug.cgi?id=156499
1860
1861         Reviewed by Mark Lam.
1862
1863         GeneratorFunction.prototype has @@toStringTag property, "GeneratorFunction".
1864         https://tc39.github.io/ecma262/#sec-generatorfunction.prototype-@@tostringtag
1865
1866         * runtime/GeneratorFunctionPrototype.cpp:
1867         (JSC::GeneratorFunctionPrototype::finishCreation):
1868         * tests/es6.yaml:
1869         * tests/es6/well-known_symbols_Symbol.toStringTag_new_built-ins.js: Added.
1870         (test):
1871
1872 2016-04-13  Alberto Garcia  <berto@igalia.com>
1873
1874         Fix build in glibc-based BSD systems
1875         https://bugs.webkit.org/show_bug.cgi?id=156533
1876
1877         Reviewed by Carlos Garcia Campos.
1878
1879         Change the order of the #elif conditionals so glibc-based BSD
1880         systems (e.g. Debian GNU/kFreeBSD) use the code inside the
1881         OS(FREEBSD) blocks.
1882
1883         * heap/MachineStackMarker.cpp:
1884         (JSC::MachineThreads::Thread::Registers::stackPointer):
1885         (JSC::MachineThreads::Thread::Registers::framePointer):
1886         (JSC::MachineThreads::Thread::Registers::instructionPointer):
1887         (JSC::MachineThreads::Thread::Registers::llintPC):
1888
1889 2016-04-12  Keith Miller  <keith_miller@apple.com>
1890
1891         Unreviewed undo change from ArrayClass to ArrayWithUndecided, which
1892         was not intedend to land with r199397.
1893
1894         * runtime/ArrayPrototype.h:
1895         (JSC::ArrayPrototype::createStructure):
1896
1897 2016-04-12  Mark Lam  <mark.lam@apple.com>
1898
1899         Rollout: ES6: Implement String.prototype.split and RegExp.prototype[@@split].
1900         https://bugs.webkit.org/show_bug.cgi?id=156013
1901
1902         Speculative rollout to fix 32-bit shadow-chicken.yaml/tests/v8-v6/v8-regexp.js.shadow-chicken test failure.
1903
1904         Not reviewed.
1905
1906         * CMakeLists.txt:
1907         * JavaScriptCore.xcodeproj/project.pbxproj:
1908         * builtins/GlobalObject.js:
1909         (speciesGetter):
1910         (speciesConstructor): Deleted.
1911         * builtins/PromisePrototype.js:
1912         * builtins/RegExpPrototype.js:
1913         (advanceStringIndexUnicode):
1914         (match):
1915         (advanceStringIndex): Deleted.
1916         (regExpExec): Deleted.
1917         (hasObservableSideEffectsForRegExpSplit): Deleted.
1918         (split): Deleted.
1919         * builtins/StringPrototype.js:
1920         (repeat):
1921         (split): Deleted.
1922         * bytecode/BytecodeIntrinsicRegistry.cpp:
1923         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
1924         (JSC::BytecodeIntrinsicRegistry::lookup):
1925         * bytecode/BytecodeIntrinsicRegistry.h:
1926         * runtime/CommonIdentifiers.h:
1927         * runtime/ECMAScriptSpecInternalFunctions.cpp: Removed.
1928         * runtime/ECMAScriptSpecInternalFunctions.h: Removed.
1929         * runtime/JSGlobalObject.cpp:
1930         (JSC::JSGlobalObject::setGlobalThis):
1931         (JSC::JSGlobalObject::init):
1932         (JSC::getGetterById): Deleted.
1933         * runtime/PropertyDescriptor.cpp:
1934         (JSC::PropertyDescriptor::setDescriptor):
1935         * runtime/RegExpObject.h:
1936         (JSC::RegExpObject::offsetOfLastIndexIsWritable):
1937         * runtime/RegExpPrototype.cpp:
1938         (JSC::RegExpPrototype::finishCreation):
1939         (JSC::regExpProtoFuncExec):
1940         (JSC::regExpProtoFuncSearch):
1941         (JSC::advanceStringIndex): Deleted.
1942         (JSC::regExpProtoFuncSplitFast): Deleted.
1943         * runtime/RegExpPrototype.h:
1944         * runtime/StringObject.h:
1945         (JSC::jsStringWithReuse): Deleted.
1946         (JSC::jsSubstring): Deleted.
1947         * runtime/StringPrototype.cpp:
1948         (JSC::StringPrototype::finishCreation):
1949         (JSC::jsStringWithReuse):
1950         (JSC::jsSubstring):
1951         (JSC::substituteBackreferencesSlow):
1952         (JSC::splitStringByOneCharacterImpl):
1953         (JSC::stringProtoFuncSplit):
1954         (JSC::stringProtoFuncSubstr):
1955         (JSC::stringProtoFuncSubstring):
1956         (JSC::stringProtoFuncEndsWith):
1957         (JSC::stringProtoFuncIncludes):
1958         (JSC::stringProtoFuncIterator):
1959         (JSC::stringProtoFuncSplitFast): Deleted.
1960         (JSC::builtinStringSubstrInternal): Deleted.
1961         (JSC::stringIncludesImpl): Deleted.
1962         (JSC::builtinStringIncludesInternal): Deleted.
1963         * runtime/StringPrototype.h:
1964         * tests/es6.yaml:
1965
1966 2016-04-12  Mark Lam  <mark.lam@apple.com>
1967
1968         Remove 2 unused JSC options.
1969         https://bugs.webkit.org/show_bug.cgi?id=156526
1970
1971         Reviewed by Benjamin Poulain.
1972
1973         The options JSC_assertICSizing and JSC_dumpFailedICSizing are no longer in use
1974         now that we have B3.
1975
1976         * runtime/Options.h:
1977
1978 2016-04-12  Keith Miller  <keith_miller@apple.com>
1979
1980         [ES6] Add support for Symbol.isConcatSpreadable.
1981         https://bugs.webkit.org/show_bug.cgi?id=155351
1982
1983         Reviewed by Saam Barati.
1984
1985         This patch adds support for Symbol.isConcatSpreadable. In order to do so it was necessary to move the
1986         Array.prototype.concat function to JS. A number of different optimizations were needed to make such the move to
1987         a builtin performant. First, four new DFG intrinsics were added.
1988
1989         1) IsArrayObject (I would have called it IsArray but we use the same name for an IndexingType): an intrinsic of
1990            the Array.isArray function.
1991         2) IsJSArray: checks the first child is a JSArray object.
1992         3) IsArrayConstructor: checks the first child is an instance of ArrayConstructor.
1993         4) CallObjectConstructor: an intrinsic of the Object constructor.
1994
1995         IsActualObject, IsJSArray, and CallObjectConstructor can all be converted into constants in the abstract interpreter if
1996         we are able to prove that the first child is an Array or for ToObject an Object.
1997
1998         In order to further improve the perfomance we also now cover more indexing types in our fast path memcpy
1999         code. Before we would only memcpy Arrays if they had the same indexing type and did not have Array storage and
2000         were not undecided. Now the memcpy code covers the following additional two cases: One array is undecided and
2001         the other is a non-array storage and the case where one array is Int32 and the other is contiguous (we map this
2002         into a contiguous array).
2003
2004         This patch also adds a new fast path for concat with more than one array argument by using memcpy to append
2005         values onto the result array. This works roughly the same as the two array fast path using the same methodology
2006         to decide if we can memcpy the other butterfly into the result butterfly.
2007
2008         Two new debugging tools are also added to the jsc cli. One is a version of the print function with a private
2009         name so it can be used for debugging builtins. The other is dumpDataLog, which takes a JSValue and runs our
2010         dataLog function on it.
2011
2012         Finally, this patch add a new constructor to JSValueRegsTemporary that allows it to reuse the the registers of a
2013         JSValueOperand if the operand's use count is one.
2014
2015         * JavaScriptCore.xcodeproj/project.pbxproj:
2016         * builtins/ArrayPrototype.js:
2017         (concatSlowPath):
2018         (concat):
2019         * bytecode/BytecodeIntrinsicRegistry.cpp:
2020         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
2021         * bytecode/BytecodeIntrinsicRegistry.h:
2022         * dfg/DFGAbstractInterpreterInlines.h:
2023         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2024         * dfg/DFGByteCodeParser.cpp:
2025         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
2026         (JSC::DFG::ByteCodeParser::handleConstantInternalFunction):
2027         * dfg/DFGClobberize.h:
2028         (JSC::DFG::clobberize):
2029         * dfg/DFGDoesGC.cpp:
2030         (JSC::DFG::doesGC):
2031         * dfg/DFGFixupPhase.cpp:
2032         (JSC::DFG::FixupPhase::fixupNode):
2033         * dfg/DFGNodeType.h:
2034         * dfg/DFGOperations.cpp:
2035         * dfg/DFGOperations.h:
2036         * dfg/DFGPredictionPropagationPhase.cpp:
2037         (JSC::DFG::PredictionPropagationPhase::propagate):
2038         * dfg/DFGSafeToExecute.h:
2039         (JSC::DFG::safeToExecute):
2040         * dfg/DFGSpeculativeJIT.cpp:
2041         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
2042         (JSC::DFG::SpeculativeJIT::compileIsJSArray):
2043         (JSC::DFG::SpeculativeJIT::compileIsArrayObject):
2044         (JSC::DFG::SpeculativeJIT::compileIsArrayConstructor):
2045         (JSC::DFG::SpeculativeJIT::compileCallObjectConstructor):
2046         * dfg/DFGSpeculativeJIT.h:
2047         (JSC::DFG::SpeculativeJIT::callOperation):
2048         * dfg/DFGSpeculativeJIT32_64.cpp:
2049         (JSC::DFG::SpeculativeJIT::compile):
2050         * dfg/DFGSpeculativeJIT64.cpp:
2051         (JSC::DFG::SpeculativeJIT::compile):
2052         * ftl/FTLCapabilities.cpp:
2053         (JSC::FTL::canCompile):
2054         * ftl/FTLLowerDFGToB3.cpp:
2055         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2056         (JSC::FTL::DFG::LowerDFGToB3::compileCallObjectConstructor):
2057         (JSC::FTL::DFG::LowerDFGToB3::compileIsArrayObject):
2058         (JSC::FTL::DFG::LowerDFGToB3::compileIsJSArray):
2059         (JSC::FTL::DFG::LowerDFGToB3::compileIsArrayConstructor):
2060         (JSC::FTL::DFG::LowerDFGToB3::isArray):
2061         * jit/JITOperations.h:
2062         * jsc.cpp:
2063         (GlobalObject::finishCreation):
2064         (functionDataLogValue):
2065         * runtime/ArrayConstructor.cpp:
2066         (JSC::ArrayConstructor::finishCreation):
2067         (JSC::arrayConstructorPrivateFuncIsArrayConstructor):
2068         * runtime/ArrayConstructor.h:
2069         (JSC::isArrayConstructor):
2070         * runtime/ArrayPrototype.cpp:
2071         (JSC::ArrayPrototype::finishCreation):
2072         (JSC::arrayProtoPrivateFuncIsJSArray):
2073         (JSC::moveElements):
2074         (JSC::arrayProtoPrivateFuncConcatMemcpy):
2075         (JSC::arrayProtoPrivateFuncAppendMemcpy):
2076         (JSC::arrayProtoFuncConcat): Deleted.
2077         * runtime/ArrayPrototype.h:
2078         (JSC::ArrayPrototype::createStructure):
2079         * runtime/CommonIdentifiers.h:
2080         * runtime/Intrinsic.h:
2081         * runtime/JSArray.cpp:
2082         (JSC::JSArray::appendMemcpy):
2083         (JSC::JSArray::fastConcatWith): Deleted.
2084         * runtime/JSArray.h:
2085         (JSC::JSArray::createStructure):
2086         (JSC::JSArray::fastConcatType): Deleted.
2087         * runtime/JSArrayInlines.h: Added.
2088         (JSC::JSArray::memCopyWithIndexingType):
2089         (JSC::JSArray::canFastCopy):
2090         * runtime/JSGlobalObject.cpp:
2091         (JSC::JSGlobalObject::init):
2092         * runtime/JSType.h:
2093         * runtime/ObjectConstructor.h:
2094         (JSC::constructObject):
2095         * tests/es6.yaml:
2096         * tests/stress/array-concat-spread-object.js: Added.
2097         (arrayEq):
2098         * tests/stress/array-concat-spread-proxy-exception-check.js: Added.
2099         (arrayEq):
2100         * tests/stress/array-concat-spread-proxy.js: Added.
2101         (arrayEq):
2102         * tests/stress/array-concat-with-slow-indexingtypes.js: Added.
2103         (arrayEq):
2104         * tests/stress/array-species-config-array-constructor.js:
2105
2106 2016-04-12  Saam barati  <sbarati@apple.com>
2107
2108         Lets not iterate over the constant pool twice every time we link a code block
2109         https://bugs.webkit.org/show_bug.cgi?id=156517
2110
2111         Reviewed by Mark Lam.
2112
2113         I introduced a second iteration over the constant pool when I implemented
2114         block scoping. I did this because we must clone all the symbol tables when
2115         we link a CodeBlock. We can just do this cloning when setting the constant
2116         registers for the first time. There is no need to iterate over the constant
2117         pool a second time.
2118
2119         * bytecode/CodeBlock.cpp:
2120         (JSC::CodeBlock::finishCreation):
2121         (JSC::CodeBlock::~CodeBlock):
2122         (JSC::CodeBlock::setConstantRegisters):
2123         (JSC::CodeBlock::setAlternative):
2124         * bytecode/CodeBlock.h:
2125         (JSC::CodeBlock::replaceConstant):
2126         (JSC::CodeBlock::setConstantRegisters): Deleted.
2127
2128 2016-04-12  Mark Lam  <mark.lam@apple.com>
2129
2130         ES6: Implement String.prototype.split and RegExp.prototype[@@split].
2131         https://bugs.webkit.org/show_bug.cgi?id=156013
2132
2133         Reviewed by Keith Miller.
2134
2135         * CMakeLists.txt:
2136         * JavaScriptCore.xcodeproj/project.pbxproj:
2137         * builtins/GlobalObject.js:
2138         (speciesConstructor):
2139         * builtins/PromisePrototype.js:
2140         - refactored to use the @speciesConstructor internal function.
2141
2142         * builtins/RegExpPrototype.js:
2143         (advanceStringIndex):
2144         - refactored from @advanceStringIndexUnicode() to be match the spec.
2145           Benchmarks show that there's no advantage in doing the unicode check outside
2146           of the advanceStringIndexUnicode part.  So, I simplified the code to match the
2147           spec (especially since @@split needs to call advanceStringIndex from more than
2148           1 location).
2149         (match):
2150         - Removed an unnecessary call to @Object because it was already proven above.
2151         - Changed to use advanceStringIndex instead of advanceStringIndexUnicode.
2152           Again, there's no perf regression for this.
2153         (regExpExec):
2154         (hasObservableSideEffectsForRegExpSplit):
2155         (split):
2156         (advanceStringIndexUnicode): Deleted.
2157
2158         * builtins/StringPrototype.js:
2159         (split):
2160         - Modified to use RegExp.prototype[@@split].
2161
2162         * bytecode/BytecodeIntrinsicRegistry.cpp:
2163         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
2164         (JSC::BytecodeIntrinsicRegistry::lookup):
2165         * bytecode/BytecodeIntrinsicRegistry.h:
2166         - Added the @@split symbol.
2167
2168         * runtime/CommonIdentifiers.h:
2169         * runtime/ECMAScriptSpecInternalFunctions.cpp: Added.
2170         (JSC::esSpecIsConstructor):
2171         (JSC::esSpecIsRegExp):
2172         * runtime/ECMAScriptSpecInternalFunctions.h: Added.
2173
2174         * runtime/JSGlobalObject.cpp:
2175         (JSC::getGetterById):
2176         (JSC::JSGlobalObject::init):
2177
2178         * runtime/PropertyDescriptor.cpp:
2179         (JSC::PropertyDescriptor::setDescriptor):
2180         - Removed an assert that is no longer valid.
2181
2182         * runtime/RegExpObject.h:
2183         - Made advanceStringUnicode() public so that it can be re-used by the regexp split
2184           fast path.
2185
2186         * runtime/RegExpPrototype.cpp:
2187         (JSC::RegExpPrototype::finishCreation):
2188         (JSC::regExpProtoFuncExec):
2189         (JSC::regExpProtoFuncSearch):
2190         (JSC::advanceStringIndex):
2191         (JSC::regExpProtoFuncSplitFast):
2192         * runtime/RegExpPrototype.h:
2193
2194         * runtime/StringObject.h:
2195         (JSC::jsStringWithReuse):
2196         (JSC::jsSubstring):
2197         - Hoisted some utility functions from StringPrototype.cpp so that they can be
2198           reused by the regexp split fast path.
2199
2200         * runtime/StringPrototype.cpp:
2201         (JSC::StringPrototype::finishCreation):
2202         (JSC::stringProtoFuncSplitFast):
2203         (JSC::stringProtoFuncSubstr):
2204         (JSC::builtinStringSubstrInternal):
2205         (JSC::stringProtoFuncSubstring):
2206         (JSC::stringIncludesImpl):
2207         (JSC::stringProtoFuncIncludes):
2208         (JSC::builtinStringIncludesInternal):
2209         (JSC::jsStringWithReuse): Deleted.
2210         (JSC::jsSubstring): Deleted.
2211         (JSC::stringProtoFuncSplit): Deleted.
2212         * runtime/StringPrototype.h:
2213
2214         * tests/es6.yaml:
2215
2216 2016-04-12  Keith Miller  <keith_miller@apple.com>
2217
2218         AbstractValue should use the result type to filter structures
2219         https://bugs.webkit.org/show_bug.cgi?id=156516
2220
2221         Reviewed by Geoffrey Garen.
2222
2223         When filtering an AbstractValue with a SpeculatedType we would not use the merged type when
2224         filtering out the valid structures (despite what the comment directly above said). This
2225         would cause us to crash if our structure-set was Top and the two speculated types were
2226         different kinds of cells.
2227
2228         * dfg/DFGAbstractValue.cpp:
2229         (JSC::DFG::AbstractValue::filter):
2230         * tests/stress/ai-consistency-filter-cells.js: Added.
2231         (get value):
2232         (attribute.value.get record):
2233         (attribute.attrs.get this):
2234         (get foo):
2235         (let.thisValue.return.serialize):
2236         (let.thisValue.transformFor):
2237
2238 2016-04-12  Filip Pizlo  <fpizlo@apple.com>
2239
2240         Unreviewed, remove FIXME for https://bugs.webkit.org/show_bug.cgi?id=156457 and replace it
2241         with a comment that describes what we do now.
2242
2243         * bytecode/PolymorphicAccess.h:
2244
2245 2016-04-12  Saam barati  <sbarati@apple.com>
2246
2247         isLocked() assertion broke builds because ConcurrentJITLock isn't always a real lock.
2248
2249         Rubber-stamped by Filip Pizlo.
2250
2251         * bytecode/CodeBlock.cpp:
2252         (JSC::CodeBlock::resultProfileForBytecodeOffset):
2253         (JSC::CodeBlock::ensureResultProfile):
2254
2255 2016-04-11  Filip Pizlo  <fpizlo@apple.com>
2256
2257         PolymorphicAccess should buffer AccessCases before regenerating
2258         https://bugs.webkit.org/show_bug.cgi?id=156457
2259
2260         Reviewed by Benjamin Poulain.
2261
2262         Prior to this change, whenever we added an AccessCase to a PolymorphicAccess, we would
2263         regenerate the whole stub. That meant that we'd do O(N^2) work for N access cases.
2264
2265         One way to fix this is to have each AccessCase generate a stub just for itself, which
2266         cascades down to the already-generated cases. But that removes the binary switch
2267         optimization, which makes the IC perform great even when there are many cases.
2268
2269         This change fixes the issue by buffering access cases. When we take slow path and try to add
2270         a new case, the StructureStubInfo will usually just buffer the new case without generating
2271         new code. We simply guarantee that after we buffer a case, we will take at most
2272         Options::repatchBufferingCountdown() slow path calls before generating code for it. That
2273         option is currently 7. Taking 7 more slow paths means that we have 7 more opportunities to
2274         gather more access cases, or to realize that this IC is too crazy to bother with.
2275
2276         This change ensures that the DFG still gets the same kind of profiling. This is because the
2277         buffered AccessCases are still part of PolymorphicAccess and so are still scanned by
2278         GetByIdStatus and PutByIdStatus. The fact that the AccessCases hadn't been generated and so
2279         hadn't executed doesn't change much. Mainly, it increases the likelihood that the DFG will
2280         see an access case that !couldStillSucceed(). The DFG's existing profile parsing logic can
2281         handle this just fine.
2282         
2283         There are a bunch of algorithmic changes here. StructureStubInfo now caches the set of
2284         structures that it has seen as a guard to prevent adding lots of redundant cases, in case
2285         we see the same 7 cases after buffering the first one. This cache means we won't wastefully
2286         allocate 7 identical AccessCase instances. PolymorphicAccess is now restructured around
2287         having separate addCase() and regenerate() calls. That means a bit more moving data around.
2288         So far that seems OK for performance, probably since it's O(N) work rather than O(N^2) work.
2289         There is room for improvement for future patches, to be sure.
2290         
2291         This is benchmarking as slightly positive or neutral on JS benchmarks. It's meant to reduce
2292         pathologies I saw in page loads.
2293
2294         * bytecode/GetByIdStatus.cpp:
2295         (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
2296         * bytecode/PolymorphicAccess.cpp:
2297         (JSC::PolymorphicAccess::PolymorphicAccess):
2298         (JSC::PolymorphicAccess::~PolymorphicAccess):
2299         (JSC::PolymorphicAccess::addCases):
2300         (JSC::PolymorphicAccess::addCase):
2301         (JSC::PolymorphicAccess::visitWeak):
2302         (JSC::PolymorphicAccess::dump):
2303         (JSC::PolymorphicAccess::commit):
2304         (JSC::PolymorphicAccess::regenerate):
2305         (JSC::PolymorphicAccess::aboutToDie):
2306         (WTF::printInternal):
2307         (JSC::PolymorphicAccess::regenerateWithCases): Deleted.
2308         (JSC::PolymorphicAccess::regenerateWithCase): Deleted.
2309         * bytecode/PolymorphicAccess.h:
2310         (JSC::AccessCase::isGetter):
2311         (JSC::AccessCase::callLinkInfo):
2312         (JSC::AccessGenerationResult::AccessGenerationResult):
2313         (JSC::AccessGenerationResult::madeNoChanges):
2314         (JSC::AccessGenerationResult::gaveUp):
2315         (JSC::AccessGenerationResult::buffered):
2316         (JSC::AccessGenerationResult::generatedNewCode):
2317         (JSC::AccessGenerationResult::generatedFinalCode):
2318         (JSC::AccessGenerationResult::shouldGiveUpNow):
2319         (JSC::AccessGenerationResult::generatedSomeCode):
2320         (JSC::PolymorphicAccess::isEmpty):
2321         (JSC::PolymorphicAccess::size):
2322         (JSC::PolymorphicAccess::at):
2323         * bytecode/PutByIdStatus.cpp:
2324         (JSC::PutByIdStatus::computeForStubInfo):
2325         * bytecode/StructureStubInfo.cpp:
2326         (JSC::StructureStubInfo::StructureStubInfo):
2327         (JSC::StructureStubInfo::addAccessCase):
2328         (JSC::StructureStubInfo::reset):
2329         (JSC::StructureStubInfo::visitWeakReferences):
2330         * bytecode/StructureStubInfo.h:
2331         (JSC::StructureStubInfo::considerCaching):
2332         (JSC::StructureStubInfo::willRepatch): Deleted.
2333         (JSC::StructureStubInfo::willCoolDown): Deleted.
2334         * jit/JITOperations.cpp:
2335         * jit/Repatch.cpp:
2336         (JSC::tryCacheGetByID):
2337         (JSC::repatchGetByID):
2338         (JSC::tryCachePutByID):
2339         (JSC::repatchPutByID):
2340         (JSC::tryRepatchIn):
2341         (JSC::repatchIn):
2342         * runtime/JSCJSValue.h:
2343         * runtime/JSCJSValueInlines.h:
2344         (JSC::JSValue::putByIndex):
2345         (JSC::JSValue::structureOrNull):
2346         (JSC::JSValue::structureOrUndefined):
2347         * runtime/Options.h:
2348
2349 2016-04-12  Saam barati  <sbarati@apple.com>
2350
2351         There is a race with the compiler thread and the main thread with result profiles
2352         https://bugs.webkit.org/show_bug.cgi?id=156503
2353
2354         Reviewed by Filip Pizlo.
2355
2356         The compiler thread should not be asking for a result
2357         profile while the execution thread is creating one.
2358         We must guard against such races with a lock.
2359
2360         * bytecode/CodeBlock.cpp:
2361         (JSC::CodeBlock::resultProfileForBytecodeOffset):
2362         (JSC::CodeBlock::ensureResultProfile):
2363         (JSC::CodeBlock::capabilityLevel):
2364         * bytecode/CodeBlock.h:
2365         (JSC::CodeBlock::couldTakeSlowCase):
2366         (JSC::CodeBlock::numberOfResultProfiles):
2367         (JSC::CodeBlock::specialFastCaseProfileCountForBytecodeOffset):
2368         (JSC::CodeBlock::ensureResultProfile): Deleted.
2369
2370 2016-04-12  Commit Queue  <commit-queue@webkit.org>
2371
2372         Unreviewed, rolling out r199339.
2373         https://bugs.webkit.org/show_bug.cgi?id=156505
2374
2375         memset_s is indeed necessary (Requested by alexchristensen_ on
2376         #webkit).
2377
2378         Reverted changeset:
2379
2380         "Build fix after r199299."
2381         https://bugs.webkit.org/show_bug.cgi?id=155508
2382         http://trac.webkit.org/changeset/199339
2383
2384 2016-04-12  Guillaume Emont  <guijemont@igalia.com>
2385
2386         MIPS: add MacroAssemblerMIPS::store8(TrustedImm32,ImplicitAddress)
2387         https://bugs.webkit.org/show_bug.cgi?id=156481
2388
2389         This method with this signature is used by r199075, and therefore
2390         WebKit doesn't build on MIPS since then.
2391
2392         Reviewed by Mark Lam.
2393
2394         * assembler/MacroAssemblerMIPS.h:
2395         (JSC::MacroAssemblerMIPS::store8):
2396
2397 2016-04-12  Saam barati  <sbarati@apple.com>
2398
2399         We incorrectly parse arrow function expressions
2400         https://bugs.webkit.org/show_bug.cgi?id=156373
2401
2402         Reviewed by Mark Lam.
2403
2404         This patch removes the notion of "isEndOfArrowFunction".
2405         This was a very weird function and it was incorrect.
2406         It checked that the arrow functions with concise body
2407         grammar production "had a valid ending". "had a valid
2408         ending" is in quotes because concise body arrow functions
2409         have a valid ending as long as their body has a valid
2410         assignment expression. I've removed all notion of this
2411         function because it was wrong and was causing us
2412         to throw syntax errors on valid programs.
2413
2414         * parser/Lexer.cpp:
2415         (JSC::Lexer<T>::nextTokenIsColon):
2416         (JSC::Lexer<T>::lex):
2417         (JSC::Lexer<T>::setTokenPosition): Deleted.
2418         * parser/Lexer.h:
2419         (JSC::Lexer::setIsReparsingFunction):
2420         (JSC::Lexer::isReparsingFunction):
2421         (JSC::Lexer::lineNumber):
2422         * parser/Parser.cpp:
2423         (JSC::Parser<LexerType>::parseInner):
2424         (JSC::Parser<LexerType>::parseArrowFunctionSingleExpressionBodySourceElements):
2425         (JSC::Parser<LexerType>::parseFunctionInfo):
2426         * parser/Parser.h:
2427         (JSC::Parser::matchIdentifierOrKeyword):
2428         (JSC::Parser::tokenStart):
2429         (JSC::Parser::autoSemiColon):
2430         (JSC::Parser::canRecurse):
2431         (JSC::Parser::isEndOfArrowFunction): Deleted.
2432         (JSC::Parser::setEndOfStatement): Deleted.
2433         * tests/stress/arrowfunction-others.js:
2434         (testCase):
2435         (simpleArrowFunction):
2436         (truthy):
2437         (falsey):
2438
2439 2016-04-12  Yusuke Suzuki  <utatane.tea@gmail.com>
2440
2441         [JSC] addStaticGlobals should emit SymbolTableEntry watchpoints to encourage constant folding in DFG
2442         https://bugs.webkit.org/show_bug.cgi?id=155110
2443
2444         Reviewed by Saam Barati.
2445
2446         `addStaticGlobals` does not emit SymbolTableEntry watchpoints for the added entries.
2447         So, all the global variable lookups pointing to these static globals are not converted
2448         into constants in DFGBytecodeGenerator: this fact leaves these lookups as GetGlobalVar.
2449         Such thing avoids constant folding chance and emits CheckCell for @privateFunction inlining.
2450         This operation is pure overhead.
2451
2452         Static globals are not configurable, and they are typically non-writable.
2453         So they are constants in almost all the cases.
2454
2455         This patch initializes watchpoints for these static globals.
2456         These watchpoints allow DFG to convert these nodes into constants in DFG BytecodeParser.
2457         These watchpoints includes many builtin operations and `undefined`.
2458
2459         The microbenchmark, many-foreach-calls shows 5 - 7% improvement since it removes unnecessary CheckCell.
2460
2461         * bytecode/VariableWriteFireDetail.h:
2462         * runtime/JSGlobalObject.cpp:
2463         (JSC::JSGlobalObject::addGlobalVar):
2464         (JSC::JSGlobalObject::addStaticGlobals):
2465         * runtime/JSSymbolTableObject.h:
2466         (JSC::symbolTablePutTouchWatchpointSet):
2467         (JSC::symbolTablePutInvalidateWatchpointSet):
2468         (JSC::symbolTablePut):
2469         (JSC::symbolTablePutWithAttributesTouchWatchpointSet): Deleted.
2470         * runtime/SymbolTable.h:
2471         (JSC::SymbolTableEntry::SymbolTableEntry):
2472         (JSC::SymbolTableEntry::operator=):
2473         (JSC::SymbolTableEntry::swap):
2474
2475 2016-04-12  Alex Christensen  <achristensen@webkit.org>
2476
2477         Build fix after r199299.
2478         https://bugs.webkit.org/show_bug.cgi?id=155508
2479
2480         * jit/ExecutableAllocatorFixedVMPool.cpp:
2481         (JSC::FixedVMPoolExecutableAllocator::initializeSeparatedWXHeaps):
2482         memset_s is not defined.  __STDC_WANT_LIB_EXT1__ is not defined anywhere.
2483         Since the return value is unused and set_constraint_handler_s is never called
2484         I'm chaning it to memset.
2485
2486 2016-04-11  Benjamin Poulain  <bpoulain@apple.com>
2487
2488         [JSC] B3 can use undefined bits or not defined required bits when spilling
2489         https://bugs.webkit.org/show_bug.cgi?id=156486
2490
2491         Reviewed by Filip Pizlo.
2492
2493         Spilling had issues when replacing arguments in place.
2494
2495         The problems are:
2496         1) If we have a 32bit stackslot, a x86 instruction could still try to load 64bits from it.
2497         2) If we have a 64bit stackslot, Move32 would only set half the bits.
2498         3) We were reducing Move to Move32 even if the top bits are read from the stack slot.
2499
2500         The case 1 appear with something like this:
2501             Move32 %tmp0, %tmp1
2502             Op64 %tmp1, %tmp2, %tmp3
2503         When we spill %tmp1, the stack slot is 32bit, Move32 sets 32bits
2504         but Op64 supports addressing for %tmp1. When we substitute %tmp1 in Op64,
2505         we are creating a 64bit read for a 32bit stack slot.
2506
2507         The case 2 is an other common one. If we have:
2508             BB#1
2509                 Move32 %tmp0, %tmp1
2510                 Jump #3
2511             BB#2
2512                 Op64 %tmp0, %tmp1
2513                 Jump #3
2514             BB#3
2515                 Use64 %tmp1
2516
2517         We have a stack slot of 64bits. When spilling %tmp1 in #1, we are
2518         effectively doing a 32bit store on the stack slot, leaving the top bits undefined.
2519
2520         Case 3 is pretty much the same as 2 but we create the Move32 ourself
2521         because the source is a 32bit with ZDef.
2522
2523         Case (1) is solved by requiring that the stack slot is at least as large as the largest
2524         use/def of that tmp.
2525
2526         Case (2) and (3) are solved by not replacing a Tmp by an Address if the Def
2527         is smaller than the stack slot.
2528
2529         * b3/air/AirIteratedRegisterCoalescing.cpp:
2530         * b3/testb3.cpp:
2531         (JSC::B3::testSpillDefSmallerThanUse):
2532         (JSC::B3::testSpillUseLargerThanDef):
2533         (JSC::B3::run):
2534
2535 2016-04-11  Brian Burg  <bburg@apple.com>
2536
2537         Web Inspector: get rid of InspectorBasicValue and InspectorString subclasses
2538         https://bugs.webkit.org/show_bug.cgi?id=156407
2539         <rdar://problem/25627659>
2540
2541         Reviewed by Joseph Pecoraro.
2542
2543         There's no point having these subclasses as they don't save any space.
2544         Add a StringImpl to the union and merge some implementations of writeJSON.
2545
2546         Rename m_data to m_map and explicitly name the union as InspectorValue::m_value.
2547         If the value is a string and the string is not empty or null (i.e., it has a
2548         StringImpl), then we need to ref() and deref() the string as the InspectorValue
2549         is created or destroyed.
2550
2551         Move uses of the subclass to InspectorValue and delete redundant methods.
2552         Now, most InspectorValue methods are non-virtual so they can be templated.
2553
2554         * bindings/ScriptValue.cpp:
2555         (Deprecated::jsToInspectorValue):
2556         * inspector/InjectedScriptBase.cpp:
2557         (Inspector::InjectedScriptBase::makeCall):
2558         Don't used deleted subclasses.
2559
2560         * inspector/InspectorValues.cpp:
2561         (Inspector::InspectorValue::null):
2562         (Inspector::InspectorValue::create):
2563         (Inspector::InspectorValue::asValue):
2564         (Inspector::InspectorValue::asBoolean):
2565         (Inspector::InspectorValue::asDouble):
2566         (Inspector::InspectorValue::asInteger):
2567         (Inspector::InspectorValue::asString):
2568         These only need one implementation now.
2569
2570         (Inspector::InspectorValue::writeJSON):
2571         Still a virtual method since Object and Array need their members.
2572
2573         (Inspector::InspectorObjectBase::InspectorObjectBase):
2574         (Inspector::InspectorBasicValue::asBoolean): Deleted.
2575         (Inspector::InspectorBasicValue::asDouble): Deleted.
2576         (Inspector::InspectorBasicValue::asInteger): Deleted.
2577         (Inspector::InspectorBasicValue::writeJSON): Deleted.
2578         (Inspector::InspectorString::asString): Deleted.
2579         (Inspector::InspectorString::writeJSON): Deleted.
2580         (Inspector::InspectorString::create): Deleted.
2581         (Inspector::InspectorBasicValue::create): Deleted.
2582
2583         * inspector/InspectorValues.h:
2584         (Inspector::InspectorObjectBase::find):
2585         (Inspector::InspectorObjectBase::setBoolean):
2586         (Inspector::InspectorObjectBase::setInteger):
2587         (Inspector::InspectorObjectBase::setDouble):
2588         (Inspector::InspectorObjectBase::setString):
2589         (Inspector::InspectorObjectBase::setValue):
2590         (Inspector::InspectorObjectBase::setObject):
2591         (Inspector::InspectorObjectBase::setArray):
2592         (Inspector::InspectorArrayBase::pushBoolean):
2593         (Inspector::InspectorArrayBase::pushInteger):
2594         (Inspector::InspectorArrayBase::pushDouble):
2595         (Inspector::InspectorArrayBase::pushString):
2596         (Inspector::InspectorArrayBase::pushValue):
2597         (Inspector::InspectorArrayBase::pushObject):
2598         (Inspector::InspectorArrayBase::pushArray):
2599         Use new factory methods.
2600
2601         * replay/EncodedValue.cpp:
2602         (JSC::ScalarEncodingTraits<bool>::encodeValue):
2603         (JSC::ScalarEncodingTraits<double>::encodeValue):
2604         (JSC::ScalarEncodingTraits<float>::encodeValue):
2605         (JSC::ScalarEncodingTraits<int32_t>::encodeValue):
2606         (JSC::ScalarEncodingTraits<int64_t>::encodeValue):
2607         (JSC::ScalarEncodingTraits<uint32_t>::encodeValue):
2608         (JSC::ScalarEncodingTraits<uint64_t>::encodeValue):
2609         * replay/EncodedValue.h:
2610         Use new factory methods.
2611
2612 2016-04-11  Filip Pizlo  <fpizlo@apple.com>
2613
2614         It should be possible to edit StructureStubInfo without recompiling the world
2615         https://bugs.webkit.org/show_bug.cgi?id=156470
2616
2617         Reviewed by Keith Miller.
2618
2619         This change makes it less painful to make changes to the IC code. It used to be that any
2620         change to StructureStubInfo caused every JIT-related file to get recompiled. Now only a
2621         smaller set of files - ones that actually peek into StructureStubInfo - will recompile. This
2622         is mainly because CodeBlock.h no longer includes StructureStubInfo.h.
2623
2624         * bytecode/ByValInfo.h:
2625         * bytecode/CodeBlock.cpp:
2626         * bytecode/CodeBlock.h:
2627         * bytecode/GetByIdStatus.cpp:
2628         * bytecode/GetByIdStatus.h:
2629         * bytecode/PutByIdStatus.cpp:
2630         * bytecode/PutByIdStatus.h:
2631         * bytecode/StructureStubInfo.h:
2632         (JSC::getStructureStubInfoCodeOrigin):
2633         * dfg/DFGByteCodeParser.cpp:
2634         * dfg/DFGJITCompiler.cpp:
2635         * dfg/DFGOSRExitCompilerCommon.cpp:
2636         * dfg/DFGSpeculativeJIT.h:
2637         * ftl/FTLLowerDFGToB3.cpp:
2638         * ftl/FTLSlowPathCall.h:
2639         * jit/IntrinsicEmitter.cpp:
2640         * jit/JITInlineCacheGenerator.cpp:
2641         * jit/JITInlineCacheGenerator.h:
2642         * jit/JITOperations.cpp:
2643         * jit/JITPropertyAccess.cpp:
2644         * jit/JITPropertyAccess32_64.cpp:
2645
2646 2016-04-11  Skachkov Oleksandr  <gskachkov@gmail.com>
2647
2648         Remove NewArrowFunction from DFG IR
2649         https://bugs.webkit.org/show_bug.cgi?id=156439
2650
2651         Reviewed by Saam Barati.
2652
2653         It seems that NewArrowFunction was left in DFG IR during refactoring by mistake.
2654
2655         * dfg/DFGAbstractInterpreterInlines.h:
2656         * dfg/DFGClobberize.h:
2657         (JSC::DFG::clobberize):
2658         * dfg/DFGClobbersExitState.cpp:
2659         * dfg/DFGDoesGC.cpp:
2660         * dfg/DFGFixupPhase.cpp:
2661         * dfg/DFGMayExit.cpp:
2662         * dfg/DFGNode.h:
2663         (JSC::DFG::Node::convertToPhantomNewFunction):
2664         * dfg/DFGNodeType.h:
2665         * dfg/DFGObjectAllocationSinkingPhase.cpp:
2666         * dfg/DFGPredictionPropagationPhase.cpp:
2667         * dfg/DFGSafeToExecute.h:
2668         * dfg/DFGSpeculativeJIT.cpp:
2669         (JSC::DFG::SpeculativeJIT::compileNewFunction):
2670         * dfg/DFGSpeculativeJIT32_64.cpp:
2671         * dfg/DFGSpeculativeJIT64.cpp:
2672         * dfg/DFGStoreBarrierInsertionPhase.cpp:
2673         * dfg/DFGStructureRegistrationPhase.cpp:
2674         * ftl/FTLCapabilities.cpp:
2675         * ftl/FTLLowerDFGToB3.cpp:
2676         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
2677
2678 2016-04-05  Oliver Hunt  <oliver@apple.com>
2679
2680         Remove compile time define for SEPARATED_HEAP
2681         https://bugs.webkit.org/show_bug.cgi?id=155508
2682
2683         Reviewed by Mark Lam.
2684
2685         Remove the SEPARATED_HEAP compile time flag. The separated
2686         heap is available, but off by default, on x86_64, ARMv7, and
2687         ARM64.
2688
2689         Working through the issues that happened last time essentially
2690         required implementing the ARMv7 path for the separated heap
2691         just so I could find all the ways it was going wrong.
2692
2693         We fixed all the logic by making the branch and jump logic in
2694         the linker and assemblers take two parameters, the location to
2695         write to, and the location we'll actually be writing to. We 
2696         need to do this because it's no longer sufficient to compute
2697         jumps relative to region the linker is writing to.
2698
2699         The repatching jump, branch, and call functions only need the
2700         executable address as the patching is performed directly using
2701         performJITMemcpy function which works in terms of the executable
2702         address.
2703
2704         There is no performance impact on jsc-benchmarks with the separate
2705         heap either emabled or disabled.
2706
2707         * Configurations/FeatureDefines.xcconfig:
2708         * assembler/ARM64Assembler.h:
2709         (JSC::ARM64Assembler::linkJump):
2710         (JSC::ARM64Assembler::linkCall):
2711         (JSC::ARM64Assembler::relinkJump):
2712         (JSC::ARM64Assembler::relinkCall):
2713         (JSC::ARM64Assembler::link):
2714         (JSC::ARM64Assembler::linkJumpOrCall):
2715         (JSC::ARM64Assembler::linkCompareAndBranch):
2716         (JSC::ARM64Assembler::linkConditionalBranch):
2717         (JSC::ARM64Assembler::linkTestAndBranch):
2718         (JSC::ARM64Assembler::relinkJumpOrCall):
2719         * assembler/ARMv7Assembler.h:
2720         (JSC::ARMv7Assembler::revertJumpTo_movT3movtcmpT2):
2721         (JSC::ARMv7Assembler::revertJumpTo_movT3):
2722         (JSC::ARMv7Assembler::link):
2723         (JSC::ARMv7Assembler::linkJump):
2724         (JSC::ARMv7Assembler::relinkJump):
2725         (JSC::ARMv7Assembler::repatchCompact):
2726         (JSC::ARMv7Assembler::replaceWithJump):
2727         (JSC::ARMv7Assembler::replaceWithLoad):
2728         (JSC::ARMv7Assembler::replaceWithAddressComputation):
2729         (JSC::ARMv7Assembler::setInt32):
2730         (JSC::ARMv7Assembler::setUInt7ForLoad):
2731         (JSC::ARMv7Assembler::isB):
2732         (JSC::ARMv7Assembler::isBX):
2733         (JSC::ARMv7Assembler::isMOV_imm_T3):
2734         (JSC::ARMv7Assembler::isMOVT):
2735         (JSC::ARMv7Assembler::isNOP_T1):
2736         (JSC::ARMv7Assembler::isNOP_T2):
2737         (JSC::ARMv7Assembler::linkJumpT1):
2738         (JSC::ARMv7Assembler::linkJumpT2):
2739         (JSC::ARMv7Assembler::linkJumpT3):
2740         (JSC::ARMv7Assembler::linkJumpT4):
2741         (JSC::ARMv7Assembler::linkConditionalJumpT4):
2742         (JSC::ARMv7Assembler::linkBX):
2743         (JSC::ARMv7Assembler::linkConditionalBX):
2744         (JSC::ARMv7Assembler::linkJumpAbsolute):
2745         * assembler/LinkBuffer.cpp:
2746         (JSC::LinkBuffer::copyCompactAndLinkCode):
2747         * assembler/MacroAssemblerARM64.h:
2748         (JSC::MacroAssemblerARM64::link):
2749         * assembler/MacroAssemblerARMv7.h:
2750         (JSC::MacroAssemblerARMv7::link):
2751         * jit/ExecutableAllocator.h:
2752         (JSC::performJITMemcpy):
2753         * jit/ExecutableAllocatorFixedVMPool.cpp:
2754         (JSC::FixedVMPoolExecutableAllocator::initializeSeparatedWXHeaps):
2755         (JSC::FixedVMPoolExecutableAllocator::jitWriteThunkGenerator):
2756         (JSC::FixedVMPoolExecutableAllocator::genericWriteToJITRegion):
2757         (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): Deleted.
2758         * runtime/Options.cpp:
2759         (JSC::recomputeDependentOptions):
2760         * runtime/Options.h:
2761
2762 2016-04-10  Filip Pizlo  <fpizlo@apple.com>
2763
2764         Clean up how we reason about the states of AccessCases
2765         https://bugs.webkit.org/show_bug.cgi?id=156454
2766
2767         Reviewed by Mark Lam.
2768         
2769         Currently when we add an AccessCase to a PolymorphicAccess stub, we regenerate the stub.
2770         That means that as we grow a stub to have N cases, we will do O(N^2) generation work. I want
2771         to explore buffering AccessCases so that we can do O(N) generation work instead. But to
2772         before I go there, I want to make sure that the statefulness of AccessCase makes sense. So,
2773         I broke it down into three different states and added assertions about the transitions. I
2774         also broke out a separate operation called AccessCase::commit(), which is the work that
2775         cannot be buffered since there cannot be any JS effects between when the AccessCase was
2776         created and when we do the work in commit().
2777         
2778         This opens up a fairly obvious path to buffering AccessCases: add them to the list without
2779         regenerating. Then when we do eventually trigger regeneration, those cases will get cloned
2780         and generated automagically. This patch doesn't implement this technique yet, but gives us
2781         an opportunity to independently test the scaffolding necessary to do it.
2782
2783         This is perf-neutral on lots of tests.
2784
2785         * bytecode/PolymorphicAccess.cpp:
2786         (JSC::AccessGenerationResult::dump):
2787         (JSC::AccessCase::clone):
2788         (JSC::AccessCase::commit):
2789         (JSC::AccessCase::guardedByStructureCheck):
2790         (JSC::AccessCase::dump):
2791         (JSC::AccessCase::generateWithGuard):
2792         (JSC::AccessCase::generate):
2793         (JSC::AccessCase::generateImpl):
2794         (JSC::PolymorphicAccess::regenerateWithCases):
2795         (JSC::PolymorphicAccess::regenerate):
2796         (WTF::printInternal):
2797         * bytecode/PolymorphicAccess.h:
2798         (JSC::AccessCase::type):
2799         (JSC::AccessCase::state):
2800         (JSC::AccessCase::offset):
2801         (JSC::AccessCase::viaProxy):
2802         (JSC::AccessCase::callLinkInfo):
2803         * bytecode/StructureStubInfo.cpp:
2804         (JSC::StructureStubInfo::addAccessCase):
2805         * bytecode/Watchpoint.h:
2806         * dfg/DFGOperations.cpp:
2807         * jit/Repatch.cpp:
2808         (JSC::repatchGetByID):
2809         (JSC::repatchPutByID):
2810         (JSC::repatchIn):
2811         * runtime/VM.cpp:
2812         (JSC::VM::dumpRegExpTrace):
2813         (JSC::VM::ensureWatchpointSetForImpureProperty):
2814         (JSC::VM::registerWatchpointForImpureProperty):
2815         (JSC::VM::addImpureProperty):
2816         * runtime/VM.h:
2817
2818 2016-04-11  Fujii Hironori  <Hironori.Fujii@jp.sony.com>
2819
2820         [CMake] Make FOLDER property INHERITED
2821         https://bugs.webkit.org/show_bug.cgi?id=156460
2822
2823         Reviewed by Brent Fulgham.
2824
2825         * CMakeLists.txt:
2826         * shell/CMakeLists.txt:
2827         * shell/PlatformWin.cmake:
2828         Set FOLDER property as a directory property not a target property
2829
2830 2016-04-09  Keith Miller  <keith_miller@apple.com>
2831
2832         tryGetById should be supported by the DFG/FTL
2833         https://bugs.webkit.org/show_bug.cgi?id=156378
2834
2835         Reviewed by Filip Pizlo.
2836
2837         This patch adds support for tryGetById in the DFG/FTL. It adds a new DFG node
2838         TryGetById, which acts similarly to the normal GetById DFG node. One key
2839         difference between GetById and TryGetById is that in the LLInt and Baseline
2840         we do not profile the result type. This profiling is unnessary for the current
2841         use case of tryGetById, which is expected to be a strict equality comparision
2842         against a specific object or undefined. In either case other DFG optimizations
2843         will make this equally fast with or without the profiling information.
2844
2845         Additionally, this patch adds new reuse modes for JSValueRegsTemporary that take
2846         an operand and attempt to reuse the registers for that operand if they are free
2847         after the current DFG node.
2848
2849         * bytecode/GetByIdStatus.cpp:
2850         (JSC::GetByIdStatus::computeFromLLInt):
2851         (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
2852         * dfg/DFGAbstractInterpreterInlines.h:
2853         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2854         * dfg/DFGByteCodeParser.cpp:
2855         (JSC::DFG::ByteCodeParser::handleGetById):
2856         (JSC::DFG::ByteCodeParser::parseBlock):
2857         * dfg/DFGCapabilities.cpp:
2858         (JSC::DFG::capabilityLevel):
2859         * dfg/DFGClobberize.h:
2860         (JSC::DFG::clobberize):
2861         * dfg/DFGDoesGC.cpp:
2862         (JSC::DFG::doesGC):
2863         * dfg/DFGFixupPhase.cpp:
2864         (JSC::DFG::FixupPhase::fixupNode):
2865         * dfg/DFGNode.h:
2866         (JSC::DFG::Node::hasIdentifier):
2867         * dfg/DFGNodeType.h:
2868         * dfg/DFGPredictionPropagationPhase.cpp:
2869         (JSC::DFG::PredictionPropagationPhase::propagate):
2870         * dfg/DFGSafeToExecute.h:
2871         (JSC::DFG::safeToExecute):
2872         * dfg/DFGSpeculativeJIT.cpp:
2873         (JSC::DFG::SpeculativeJIT::compileTryGetById):
2874         (JSC::DFG::JSValueRegsTemporary::JSValueRegsTemporary):
2875         * dfg/DFGSpeculativeJIT.h:
2876         (JSC::DFG::GPRTemporary::operator=):
2877         * dfg/DFGSpeculativeJIT32_64.cpp:
2878         (JSC::DFG::SpeculativeJIT::cachedGetById):
2879         (JSC::DFG::SpeculativeJIT::compile):
2880         * dfg/DFGSpeculativeJIT64.cpp:
2881         (JSC::DFG::SpeculativeJIT::cachedGetById):
2882         (JSC::DFG::SpeculativeJIT::compile):
2883         * ftl/FTLCapabilities.cpp:
2884         (JSC::FTL::canCompile):
2885         * ftl/FTLLowerDFGToB3.cpp:
2886         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2887         (JSC::FTL::DFG::LowerDFGToB3::compileGetById):
2888         (JSC::FTL::DFG::LowerDFGToB3::getById):
2889         * jit/JITOperations.cpp:
2890         * jit/JITOperations.h:
2891         * tests/stress/try-get-by-id.js:
2892         (tryGetByIdTextStrict):
2893         (get let):
2894         (let.get createBuiltin):
2895         (get throw):
2896         (getCaller.obj.1.throw.new.Error): Deleted.
2897
2898 2016-04-09  Saam barati  <sbarati@apple.com>
2899
2900         Allocation sinking SSA Defs are allowed to have replacements
2901         https://bugs.webkit.org/show_bug.cgi?id=156444
2902
2903         Reviewed by Filip Pizlo.
2904
2905         Consider the following program and the annotations that explain why
2906         the SSA defs we create in allocation sinking can have replacements.
2907
2908         function foo(a1) {
2909             let o1 = {x: 20, y: 50};
2910             let o2 = {y: 40, o1: o1};
2911             let o3 = {};
2912         
2913             // We're Defing a new variable here, call it o3_field.
2914             // o3_field is defing the value that is the result of 
2915             // a GetByOffset that gets eliminated through allocation sinking.
2916             o3.field = o1.y;
2917         
2918             dontCSE();
2919         
2920             // This control flow is here to not allow the phase to consult
2921             // its local SSA mapping (which properly handles replacements)
2922             // for the value of o3_field.
2923             if (a1) {
2924                 a1 = true; 
2925             } else {
2926                 a1 = false;
2927             }
2928         
2929             // Here, we ask for the reaching def of o3_field, and assert
2930             // it doesn't have a replacement. It does have a replacement
2931             // though. The original Def was the GetByOffset. We replaced
2932             // that GetByOffset with the value of the o1_y variable.
2933             let value = o3.field;
2934             assert(value === 50);
2935         }
2936
2937         * dfg/DFGObjectAllocationSinkingPhase.cpp:
2938         * tests/stress/allocation-sinking-defs-may-have-replacements.js: Added.
2939         (dontCSE):
2940         (assert):
2941         (foo):
2942
2943 2016-04-09  Commit Queue  <commit-queue@webkit.org>
2944
2945         Unreviewed, rolling out r199242.
2946         https://bugs.webkit.org/show_bug.cgi?id=156442
2947
2948         Caused many many leaks (Requested by ap on #webkit).
2949
2950         Reverted changeset:
2951
2952         "Web Inspector: get rid of InspectorBasicValue and
2953         InspectorString subclasses"
2954         https://bugs.webkit.org/show_bug.cgi?id=156407
2955         http://trac.webkit.org/changeset/199242
2956
2957 2016-04-09  Filip Pizlo  <fpizlo@apple.com>
2958
2959         Debug JSC test failure: stress/multi-put-by-offset-reallocation-butterfly-cse.js.ftl-no-cjit-small-pool
2960         https://bugs.webkit.org/show_bug.cgi?id=156406
2961
2962         Reviewed by Saam Barati.
2963
2964         The failure was because the GC ran from within the butterfly allocation call in a put_by_id
2965         transition AccessCase that had to deal with indexing storage. When the GC runs in a call from a stub,
2966         then we need to be extra careful:
2967
2968         1) The GC may reset the IC and delete the stub. So, the stub needs to tell the GC that it might be on
2969            the stack during GC, so that the GC keeps it alive if it's currently running.
2970         
2971         2) If the stub uses (dereferences or stores) some object after the call, then we need to ensure that
2972            the stub routine knows about that object independently of the IC.
2973         
2974         In the case of put_by_id transitions that use a helper to allocate the butterfly, we have both
2975         issues. A long time ago, we had to deal with (2), and we still had code to handle that case, although
2976         it appears to be dead. This change revives that code and glues it together with PolymorphicAccess.
2977
2978         * bytecode/PolymorphicAccess.cpp:
2979         (JSC::AccessCase::alternateBase):
2980         (JSC::AccessCase::doesCalls):
2981         (JSC::AccessCase::couldStillSucceed):
2982         (JSC::AccessCase::generate):
2983         (JSC::PolymorphicAccess::regenerate):
2984         * bytecode/PolymorphicAccess.h:
2985         (JSC::AccessCase::customSlotBase):
2986         (JSC::AccessCase::isGetter):
2987         (JSC::AccessCase::doesCalls): Deleted.
2988         * jit/GCAwareJITStubRoutine.cpp:
2989         (JSC::GCAwareJITStubRoutine::markRequiredObjectsInternal):
2990         (JSC::MarkingGCAwareJITStubRoutine::MarkingGCAwareJITStubRoutine):
2991         (JSC::MarkingGCAwareJITStubRoutine::~MarkingGCAwareJITStubRoutine):
2992         (JSC::MarkingGCAwareJITStubRoutine::markRequiredObjectsInternal):
2993         (JSC::GCAwareJITStubRoutineWithExceptionHandler::GCAwareJITStubRoutineWithExceptionHandler):
2994         (JSC::createJITStubRoutine):
2995         (JSC::MarkingGCAwareJITStubRoutineWithOneObject::MarkingGCAwareJITStubRoutineWithOneObject): Deleted.
2996         (JSC::MarkingGCAwareJITStubRoutineWithOneObject::~MarkingGCAwareJITStubRoutineWithOneObject): Deleted.
2997         (JSC::MarkingGCAwareJITStubRoutineWithOneObject::markRequiredObjectsInternal): Deleted.
2998         * jit/GCAwareJITStubRoutine.h:
2999         (JSC::createJITStubRoutine):
3000
3001 2016-04-08  Joseph Pecoraro  <pecoraro@apple.com>
3002
3003         Web Inspector: XHRs and Web Worker scripts are not searchable
3004         https://bugs.webkit.org/show_bug.cgi?id=154214
3005         <rdar://problem/24643587>
3006
3007         Reviewed by Timothy Hatcher.
3008
3009         * inspector/protocol/Page.json:
3010         Add optional requestId to search results properties and search
3011         parameters for when the frameId and url are not enough. XHR
3012         resources, and "Other" resources will use this.
3013
3014 2016-04-08  Guillaume Emont  <guijemont@igalia.com>
3015
3016         MIPS: support Signed cond in branchTest32()
3017         https://bugs.webkit.org/show_bug.cgi?id=156260
3018
3019         This is needed since r197688 makes use of it.
3020
3021         Reviewed by Mark Lam.
3022
3023         * assembler/MacroAssemblerMIPS.h:
3024         (JSC::MacroAssemblerMIPS::branchTest32):
3025
3026 2016-04-08  Alex Christensen  <achristensen@webkit.org>
3027
3028         Progress towards running CMake WebKit2 on Mac
3029         https://bugs.webkit.org/show_bug.cgi?id=156426
3030
3031         Reviewed by Tim Horton.
3032
3033         * PlatformMac.cmake:
3034
3035 2016-04-08  Saam barati  <sbarati@apple.com>
3036
3037         Debugger may dereference m_currentCallFrame even after the VM has gone idle
3038         https://bugs.webkit.org/show_bug.cgi?id=156413
3039
3040         Reviewed by Mark Lam.
3041
3042         There is a bug where the debugger may dereference its m_currentCallFrame
3043         pointer after that pointer becomes invalid to read from. This happens like so:
3044
3045         We may step over an instruction which causes the end of execution for the
3046         current program. This causes the VM to exit. Then, we perform a GC which
3047         causes us to collect the global object. The global object being collected
3048         causes us to detach the debugger. In detaching, we think we still have a 
3049         valid m_currentCallFrame, we dereference it, and crash. The solution is to
3050         make sure we're paused when dereferencing this pointer inside ::detach().
3051
3052         * debugger/Debugger.cpp:
3053         (JSC::Debugger::detach):
3054
3055 2016-04-08  Brian Burg  <bburg@apple.com>
3056
3057         Web Inspector: get rid of InspectorBasicValue and InspectorString subclasses
3058         https://bugs.webkit.org/show_bug.cgi?id=156407
3059         <rdar://problem/25627659>
3060
3061         Reviewed by Timothy Hatcher.
3062
3063         There's no point having these subclasses as they don't save any space.
3064         Add m_stringValue to the union and merge some implementations of writeJSON.
3065         Move uses of the subclass to InspectorValue and delete redundant methods.
3066         Now, most InspectorValue methods are non-virtual so they can be templated.
3067
3068         * bindings/ScriptValue.cpp:
3069         (Deprecated::jsToInspectorValue):
3070         * inspector/InjectedScriptBase.cpp:
3071         (Inspector::InjectedScriptBase::makeCall):
3072         Don't used deleted subclasses.
3073
3074         * inspector/InspectorValues.cpp:
3075         (Inspector::InspectorValue::null):
3076         (Inspector::InspectorValue::create):
3077         (Inspector::InspectorValue::asValue):
3078         (Inspector::InspectorValue::asBoolean):
3079         (Inspector::InspectorValue::asDouble):
3080         (Inspector::InspectorValue::asInteger):
3081         (Inspector::InspectorValue::asString):
3082         These only need one implementation now.
3083
3084         (Inspector::InspectorValue::writeJSON):
3085         Still a virtual method since Object and Array need their members.
3086
3087         (Inspector::InspectorObjectBase::InspectorObjectBase):
3088         (Inspector::InspectorBasicValue::asBoolean): Deleted.
3089         (Inspector::InspectorBasicValue::asDouble): Deleted.
3090         (Inspector::InspectorBasicValue::asInteger): Deleted.
3091         (Inspector::InspectorBasicValue::writeJSON): Deleted.
3092         (Inspector::InspectorString::asString): Deleted.
3093         (Inspector::InspectorString::writeJSON): Deleted.
3094         (Inspector::InspectorString::create): Deleted.
3095         (Inspector::InspectorBasicValue::create): Deleted.
3096
3097         * inspector/InspectorValues.h:
3098         (Inspector::InspectorObjectBase::setBoolean):
3099         (Inspector::InspectorObjectBase::setInteger):
3100         (Inspector::InspectorObjectBase::setDouble):
3101         (Inspector::InspectorObjectBase::setString):
3102         (Inspector::InspectorArrayBase::pushBoolean):
3103         (Inspector::InspectorArrayBase::pushInteger):
3104         (Inspector::InspectorArrayBase::pushDouble):
3105         (Inspector::InspectorArrayBase::pushString):
3106         Use new factory methods.
3107
3108         * replay/EncodedValue.cpp:
3109         (JSC::ScalarEncodingTraits<bool>::encodeValue):
3110         (JSC::ScalarEncodingTraits<double>::encodeValue):
3111         (JSC::ScalarEncodingTraits<float>::encodeValue):
3112         (JSC::ScalarEncodingTraits<int32_t>::encodeValue):
3113         (JSC::ScalarEncodingTraits<int64_t>::encodeValue):
3114         (JSC::ScalarEncodingTraits<uint32_t>::encodeValue):
3115         (JSC::ScalarEncodingTraits<uint64_t>::encodeValue):
3116         * replay/EncodedValue.h:
3117         Use new factory methods.
3118
3119 2016-04-08  Filip Pizlo  <fpizlo@apple.com>
3120
3121         Add IC support for arguments.length
3122         https://bugs.webkit.org/show_bug.cgi?id=156389
3123
3124         Reviewed by Geoffrey Garen.
3125         
3126         This adds support for caching accesses to arguments.length for both DirectArguments and
3127         ScopedArguments. In strict mode, we already cached these accesses since they were just
3128         normal properties.
3129
3130         Amazingly, we also already supported caching of overridden arguments.length in both
3131         DirectArguments and ScopedArguments. This is because when you override, the property gets
3132         materialized as a normal JS property and the structure is changed.
3133         
3134         This patch painstakingly preserves our previous caching of overridden length while
3135         introducing caching of non-overridden length (i.e. the common case). In fact, we even cache
3136         the case where it could either be overridden or not, since we just end up with an AccessCase
3137         for each and they cascade to each other.
3138
3139         This is a >3x speed-up on microbenchmarks that do arguments.length in a polymorphic context.
3140         Entirely monomorphic accesses were already handled by the DFG.
3141
3142         * bytecode/PolymorphicAccess.cpp:
3143         (JSC::AccessGenerationState::calculateLiveRegistersForCallAndExceptionHandling):
3144         (JSC::AccessCase::guardedByStructureCheck):
3145         (JSC::AccessCase::generateWithGuard):
3146         (JSC::AccessCase::generate):
3147         (WTF::printInternal):
3148         * bytecode/PolymorphicAccess.h:
3149         * jit/ICStats.h:
3150         * jit/JITOperations.cpp:
3151         * jit/Repatch.cpp:
3152         (JSC::tryCacheGetByID):
3153         (JSC::tryCachePutByID):
3154         (JSC::tryRepatchIn):
3155         * tests/stress/direct-arguments-override-length-then-access-normal-length.js: Added.
3156         (args):
3157         (foo):
3158         (result.foo):
3159
3160 2016-04-08  Benjamin Poulain  <bpoulain@apple.com>
3161
3162         UInt32ToNumber should have an Int52 path
3163         https://bugs.webkit.org/show_bug.cgi?id=125704
3164
3165         Reviewed by Filip Pizlo.
3166
3167         When dealing with big numbers, fall back to Int52 instead
3168         of double when possible.
3169
3170         * dfg/DFGAbstractInterpreterInlines.h:
3171         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3172         * dfg/DFGFixupPhase.cpp:
3173         (JSC::DFG::FixupPhase::fixupNode):
3174         * dfg/DFGPredictionPropagationPhase.cpp:
3175         (JSC::DFG::PredictionPropagationPhase::propagate):
3176         * dfg/DFGSpeculativeJIT.cpp:
3177         (JSC::DFG::SpeculativeJIT::compileUInt32ToNumber):
3178         * ftl/FTLLowerDFGToB3.cpp:
3179         (JSC::FTL::DFG::LowerDFGToB3::compileUInt32ToNumber):
3180
3181 2016-04-08  Brian Burg  <bburg@apple.com>
3182
3183         Web Inspector: protocol generator should emit an error when 'type' is used instead of '$ref'
3184         https://bugs.webkit.org/show_bug.cgi?id=156275
3185         <rdar://problem/25569331>
3186
3187         Reviewed by Darin Adler.
3188
3189         * inspector/protocol/Heap.json: Fix a mistake that's now caught by the protocol generator.
3190
3191         * inspector/scripts/codegen/models.py:
3192         (TypeReference.__init__): Check here if type_kind is on a whitelist of primitive types.
3193         (TypeReference.referenced_name): Update comment.
3194
3195         Add a new test specifically for the case when the type would otherwise be resolved. Rebaseline.
3196
3197         * inspector/scripts/tests/expected/fail-on-type-reference-as-primitive-type.json-error: Added.
3198         * inspector/scripts/tests/expected/fail-on-unknown-type-reference-in-type-declaration.json-error:
3199         * inspector/scripts/tests/fail-on-type-reference-as-primitive-type.json: Added.
3200
3201 2016-04-07  Joseph Pecoraro  <pecoraro@apple.com>
3202
3203         Remove ENABLE(ENABLE_ES6_CLASS_SYNTAX) guards
3204         https://bugs.webkit.org/show_bug.cgi?id=156384
3205
3206         Reviewed by Ryosuke Niwa.
3207
3208         * Configurations/FeatureDefines.xcconfig:
3209         * features.json: Mark as Done.
3210         * parser/Parser.cpp:
3211         (JSC::Parser<LexerType>::parseExportDeclaration):
3212         (JSC::Parser<LexerType>::parseStatementListItem):
3213         (JSC::Parser<LexerType>::parsePrimaryExpression):
3214         (JSC::Parser<LexerType>::parseMemberExpression):
3215
3216 2016-04-07  Filip Pizlo  <fpizlo@apple.com>
3217
3218         Implementing caching transition puts that need to reallocate with indexing storage
3219         https://bugs.webkit.org/show_bug.cgi?id=130914
3220
3221         Reviewed by Saam Barati.
3222
3223         This enables the IC's put_by_id path to handle reallocating the out-of-line storage even if
3224         the butterfly has indexing storage. Like the DFG, we do this by calling operations that
3225         reallocate the butterfly. Those use JSObject API and do all of the nasty work for us, like
3226         triggering a barrier.
3227
3228         This does a bunch of refactoring to how PolymorphicAccess makes calls. It's a lot easier to
3229         do it now because the hard work is hidden under AccessGenerationState methods. This means
3230         that custom accessors now share logic with put_by_id transitions.
3231
3232         * bytecode/PolymorphicAccess.cpp:
3233         (JSC::AccessGenerationState::succeed):
3234         (JSC::AccessGenerationState::calculateLiveRegistersForCallAndExceptionHandling):
3235         (JSC::AccessGenerationState::preserveLiveRegistersToStackForCall):
3236         (JSC::AccessGenerationState::originalCallSiteIndex):
3237         (JSC::AccessGenerationState::emitExplicitExceptionHandler):
3238         (JSC::AccessCase::AccessCase):
3239         (JSC::AccessCase::transition):
3240         (JSC::AccessCase::generate):
3241         (JSC::PolymorphicAccess::regenerate):
3242         * bytecode/PolymorphicAccess.h:
3243         (JSC::AccessGenerationState::needsToRestoreRegistersIfException):
3244         (JSC::AccessGenerationState::liveRegistersToPreserveAtExceptionHandlingCallSite):
3245         * dfg/DFGOperations.cpp:
3246         * dfg/DFGOperations.h:
3247         * jit/JITOperations.cpp:
3248         * jit/JITOperations.h:
3249
3250 2016-04-07  Joseph Pecoraro  <pecoraro@apple.com>
3251
3252         Remote Inspector: When disallowing remote inspection on a debuggable, a listing is still sent to debuggers
3253         https://bugs.webkit.org/show_bug.cgi?id=156380
3254         <rdar://problem/25323727>
3255
3256         Reviewed by Timothy Hatcher.
3257
3258         * inspector/remote/RemoteInspector.mm:
3259         (Inspector::RemoteInspector::updateTarget):
3260         (Inspector::RemoteInspector::updateAutomaticInspectionCandidate):
3261         When a target has been updated and it no longer generates a listing,
3262         we should remove the old listing as that is now stale and should
3263         not be sent. Not generating a listing means this target is no
3264         longer allowed to be debugged.
3265
3266 2016-04-07  Joseph Pecoraro  <pecoraro@apple.com>
3267
3268         Web Inspector: Not necessary to validate webinspectord connection on iOS
3269         https://bugs.webkit.org/show_bug.cgi?id=156377
3270         <rdar://problem/25612460>
3271
3272         Reviewed by Simon Fraser.
3273
3274         * inspector/remote/RemoteInspectorXPCConnection.h:
3275         * inspector/remote/RemoteInspectorXPCConnection.mm:
3276         (Inspector::RemoteInspectorXPCConnection::handleEvent):
3277
3278 2016-04-07  Keith Miller  <keith_miller@apple.com>
3279
3280         Rename ArrayMode::supportsLength to supportsSelfLength
3281         https://bugs.webkit.org/show_bug.cgi?id=156374
3282
3283         Reviewed by Filip Pizlo.
3284
3285         The name supportsLength is confusing because TypedArray have a
3286         length function however it is on the prototype and not on the
3287         instance. supportsSelfLength makes more sense since we use the
3288         function during fixup to tell if we can intrinsic the length
3289         property lookup on self accesses.
3290
3291         * dfg/DFGArrayMode.h:
3292         (JSC::DFG::ArrayMode::supportsSelfLength):
3293         (JSC::DFG::ArrayMode::supportsLength): Deleted.
3294         * dfg/DFGFixupPhase.cpp:
3295         (JSC::DFG::FixupPhase::attemptToMakeGetArrayLength):
3296
3297 2016-04-07  Joseph Pecoraro  <pecoraro@apple.com>
3298
3299         Web Inspector: ProfileView source links are off by 1 line, worse in pretty printed code
3300         https://bugs.webkit.org/show_bug.cgi?id=156371
3301
3302         Reviewed by Timothy Hatcher.
3303
3304         * inspector/protocol/ScriptProfiler.json:
3305         Clarify that these locations are 1-based.
3306
3307 2016-04-07  Jon Davis  <jond@apple.com>
3308
3309         Add Web Animations API to Feature Status Page
3310         https://bugs.webkit.org/show_bug.cgi?id=156360
3311
3312         Reviewed by Timothy Hatcher.
3313
3314         * features.json:
3315
3316 2016-04-07  Saam barati  <sbarati@apple.com>
3317
3318         Invalid assertion inside DebuggerScope::getOwnPropertySlot
3319         https://bugs.webkit.org/show_bug.cgi?id=156357
3320
3321         Reviewed by Keith Miller.
3322
3323         The Type Profiler might profile JS code that uses DebuggerScope and accesses properties
3324         on it. Therefore, it may have a DebuggerScope object in its log. Objects in the log
3325         are subject to having their getOwnPropertySlot method called. Therefore, the DebuggerScope
3326         might not always be in a valid state when its getOwnPropertySlot method is called.
3327         Therefore, the assertion invalid.
3328
3329         * debugger/DebuggerScope.cpp:
3330         (JSC::DebuggerScope::getOwnPropertySlot):
3331
3332 2016-04-07  Saam barati  <sbarati@apple.com>
3333
3334         Initial implementation of annex b.3.3 behavior was incorrect
3335         https://bugs.webkit.org/show_bug.cgi?id=156276
3336
3337         Reviewed by Keith Miller.
3338
3339         I almost got annex B.3.3 correct in my first implementation.
3340         There is a subtlety here I got wrong. We always create a local binding for
3341         a function at the very beginning of execution of a block scope. So we
3342         hoist function declarations to their local binding within a given
3343         block scope. When we actually evaluate the function declaration statement
3344         itself, we must lookup the binding in the current scope, and bind the
3345         value to the binding in the "var" scope. We perform the following
3346         abstract operations when executing a function declaration statement.
3347
3348         f = lookupBindingInCurrentScope("func")
3349         store(varScope, "func", f)
3350
3351         I got this wrong by performing the store to the var binding at the beginning
3352         of the block scope instead of when we evaluate the function declaration statement.
3353         This behavior is observable. For example, a program could change the value
3354         of "func" before the actual function declaration statement executes.
3355         Consider the following two functions:
3356         ```
3357         function foo1() {
3358             // func === undefined
3359             {
3360                 // typeof func === "function"
3361                 function func() { } // Executing this statement binds the local "func" binding to the implicit "func" var binding.
3362                 func = 20 // This sets the local "func" binding to 20.
3363             }
3364             // typeof func === "function"
3365         }
3366
3367         function foo2() {
3368             // func === undefined
3369             {
3370                 // typeof func === "function"
3371                 func = 20 // This sets the local "func" binding to 20.
3372                 function func() { } // Executing this statement binds the local "func" binding to the implicit "func" var binding.
3373             }
3374             // func === 20
3375         }
3376         ```
3377
3378         * bytecompiler/BytecodeGenerator.cpp:
3379         (JSC::BytecodeGenerator::initializeBlockScopedFunctions):
3380         (JSC::BytecodeGenerator::hoistSloppyModeFunctionIfNecessary):
3381         * bytecompiler/BytecodeGenerator.h:
3382         (JSC::BytecodeGenerator::emitNodeForLeftHandSide):
3383         * bytecompiler/NodesCodegen.cpp:
3384         (JSC::FuncDeclNode::emitBytecode):
3385         * tests/stress/sloppy-mode-function-hoisting.js:
3386         (test.foo):
3387         (test):
3388         (test.):
3389         (test.bar):
3390         (test.switch.case.0):
3391         (test.capFoo1):
3392         (test.switch.capFoo2):
3393         (test.outer):
3394         (foo):
3395
3396 2016-04-07  Alex Christensen  <achristensen@webkit.org>
3397
3398         Build fix after r199170
3399
3400         * CMakeLists.txt:
3401
3402 2016-04-07  Keith Miller  <keith_miller@apple.com>
3403
3404         We should support the ability to do a non-effectful getById
3405         https://bugs.webkit.org/show_bug.cgi?id=156116
3406
3407         Reviewed by Benjamin Poulain.
3408
3409         Currently, there is no way in JS to do a non-effectful getById. A non-effectful getById is
3410         useful because it enables us to take different code paths based on values that we would
3411         otherwise not be able to have knowledge of. This patch adds this new feature called
3412         try_get_by_id that will attempt to do as much of a get_by_id as possible without performing
3413         an effectful behavior. Thus, try_get_by_id will return the value if the slot is a value, the
3414         GetterSetter object if the slot is a normal accessor (not a CustomGetterSetter) and
3415         undefined if the slot is unset.  If the slot is proxied or any other cases then the result
3416         is null. In theory, if we ever wanted to check for null we could add a sentinal object to
3417         the global object that indicates we could not get the result.
3418
3419         In order to implement this feature we add a new enum GetByIdKind that indicates what to do
3420         for accessor properties in PolymorphicAccess. If the GetByIdKind is pure then we treat the
3421         get_by_id the same way we would for load and return the value at the appropriate offset.
3422         Additionally, in order to make sure the we can properly compare the GetterSetter object
3423         with === GetterSetters are now JSObjects. This comes at the cost of eight extra bytes on the
3424         GetterSetter object but it vastly simplifies the patch. Additionally, the extra bytes are
3425         likely to have little to no impact on memory usage as normal accessors are generally rare.
3426
3427         * JavaScriptCore.xcodeproj/project.pbxproj:
3428         * builtins/BuiltinExecutableCreator.cpp: Added.
3429         (JSC::createBuiltinExecutable):
3430         * builtins/BuiltinExecutableCreator.h: Copied from Source/JavaScriptCore/builtins/BuiltinExecutables.h.
3431         * builtins/BuiltinExecutables.cpp:
3432         (JSC::BuiltinExecutables::createDefaultConstructor):
3433         (JSC::BuiltinExecutables::createBuiltinExecutable):
3434         (JSC::createBuiltinExecutable):
3435         (JSC::BuiltinExecutables::createExecutable):
3436         (JSC::createExecutableInternal): Deleted.
3437         * builtins/BuiltinExecutables.h:
3438         * bytecode/BytecodeIntrinsicRegistry.h:
3439         * bytecode/BytecodeList.json:
3440         * bytecode/BytecodeUseDef.h:
3441         (JSC::computeUsesForBytecodeOffset):
3442         (JSC::computeDefsForBytecodeOffset):
3443         * bytecode/CodeBlock.cpp:
3444         (JSC::CodeBlock::dumpBytecode):
3445         * bytecode/PolymorphicAccess.cpp:
3446         (JSC::AccessCase::tryGet):
3447         (JSC::AccessCase::generate):
3448         (WTF::printInternal):
3449         * bytecode/PolymorphicAccess.h:
3450         (JSC::AccessCase::isGet): Deleted.
3451         (JSC::AccessCase::isPut): Deleted.
3452         (JSC::AccessCase::isIn): Deleted.
3453         * bytecode/StructureStubInfo.cpp:
3454         (JSC::StructureStubInfo::reset):
3455         * bytecode/StructureStubInfo.h:
3456         * bytecompiler/BytecodeGenerator.cpp:
3457         (JSC::BytecodeGenerator::emitTryGetById):
3458         * bytecompiler/BytecodeGenerator.h:
3459         * bytecompiler/NodesCodegen.cpp:
3460         (JSC::BytecodeIntrinsicNode::emit_intrinsic_tryGetById):
3461         * dfg/DFGSpeculativeJIT32_64.cpp:
3462         (JSC::DFG::SpeculativeJIT::cachedGetById):
3463         * dfg/DFGSpeculativeJIT64.cpp:
3464         (JSC::DFG::SpeculativeJIT::cachedGetById):
3465         * ftl/FTLLowerDFGToB3.cpp:
3466         (JSC::FTL::DFG::LowerDFGToB3::getById):
3467         * jit/JIT.cpp:
3468         (JSC::JIT::privateCompileMainPass):
3469         (JSC::JIT::privateCompileSlowCases):
3470         * jit/JIT.h:
3471         * jit/JITInlineCacheGenerator.cpp:
3472         (JSC::JITGetByIdGenerator::JITGetByIdGenerator):
3473         * jit/JITInlineCacheGenerator.h:
3474         * jit/JITInlines.h:
3475         (JSC::JIT::callOperation):
3476         * jit/JITOperations.cpp:
3477         * jit/JITOperations.h:
3478         * jit/JITPropertyAccess.cpp:
3479         (JSC::JIT::emitGetByValWithCachedId):
3480         (JSC::JIT::emit_op_try_get_by_id):
3481         (JSC::JIT::emitSlow_op_try_get_by_id):
3482         (JSC::JIT::emit_op_get_by_id):
3483         * jit/JITPropertyAccess32_64.cpp:
3484         (JSC::JIT::emitGetByValWithCachedId):
3485         (JSC::JIT::emit_op_try_get_by_id):
3486         (JSC::JIT::emitSlow_op_try_get_by_id):
3487         (JSC::JIT::emit_op_get_by_id):
3488         * jit/Repatch.cpp:
3489         (JSC::repatchByIdSelfAccess):
3490         (JSC::appropriateOptimizingGetByIdFunction):
3491         (JSC::appropriateGenericGetByIdFunction):
3492         (JSC::tryCacheGetByID):
3493         (JSC::repatchGetByID):
3494         (JSC::resetGetByID):
3495         * jit/Repatch.h:
3496         * jsc.cpp:
3497         (GlobalObject::finishCreation):
3498         (functionGetGetterSetter):
3499         (functionCreateBuiltin):
3500         * llint/LLIntData.cpp:
3501         (JSC::LLInt::Data::performAssertions):
3502         * llint/LLIntSlowPaths.cpp:
3503         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
3504         * llint/LLIntSlowPaths.h:
3505         * llint/LowLevelInterpreter.asm:
3506         * runtime/GetterSetter.cpp:
3507         * runtime/GetterSetter.h:
3508         * runtime/JSType.h:
3509         * runtime/PropertySlot.cpp:
3510         (JSC::PropertySlot::getPureResult):
3511         * runtime/PropertySlot.h:
3512         * runtime/ProxyObject.cpp:
3513         (JSC::ProxyObject::getOwnPropertySlotCommon):
3514         * tests/stress/try-get-by-id.js: Added.
3515         (tryGetByIdText):
3516         (getCaller.obj.1.throw.new.Error.let.func):
3517         (getCaller.obj.1.throw.new.Error):
3518         (throw.new.Error.get let):
3519         (throw.new.Error.):
3520         (throw.new.Error.let.get createBuiltin):
3521         (get let):
3522         (let.get createBuiltin):
3523         (let.func):
3524         (get let.func):
3525         (get throw):
3526
3527 2016-04-07  Filip Pizlo  <fpizlo@apple.com>
3528
3529         Rationalize the makeSpaceForCCall stuff
3530         https://bugs.webkit.org/show_bug.cgi?id=156352
3531
3532         Reviewed by Mark Lam.
3533
3534         I want to add more code to PolymorphicAccess that makes C calls, so that I can finally fix
3535         https://bugs.webkit.org/show_bug.cgi?id=130914 (allow transition caches to handle indexing
3536         headers).
3537
3538         When trying to understand what it takes to make a C call, I came across code that was making
3539         room on the stack for spilled arguments. This logic was guarded with some complicated
3540         condition. At first, I tried to just refactor the code so that the same ugly condition
3541         wouldn't have to be copy-pasted everywhere that we made C calls. But then I started thinking
3542         about the condition, and realized that it was probably wrong: if the outer PolymorphicAccess
3543         harness decides to reuse a register for the scratchGPR then the top of the stack will store
3544         the old value of scratchGPR, but the condition wouldn't necessarily trigger. So if the call
3545         then overwrote something on the stack, we'd have a bad time.
3546
3547         Making room on the stack for a call is a cheap operation. It's orders of magnitude cheaper
3548         than the rest of the call. Therefore, I think that it's best to just unconditionally make
3549         room on the stack.
3550
3551         This patch makes us do just that. I also made the relevant helpers not inline, because I
3552         think that we have too many inline methods in our assemblers. Now it's much easier to make
3553         C calls from PolymorphicAccess because you just call the AssemblyHelper methods for making
3554         space. There are no special conditions or anything like that.
3555
3556         * bytecode/PolymorphicAccess.cpp:
3557         (JSC::AccessCase::generate):
3558         * jit/AssemblyHelpers.cpp:
3559         (JSC::AssemblyHelpers::emitLoadStructure):
3560         (JSC::AssemblyHelpers::makeSpaceOnStackForCCall):
3561         (JSC::AssemblyHelpers::reclaimSpaceOnStackForCCall):
3562         (JSC::emitRandomThunkImpl):
3563         * jit/AssemblyHelpers.h:
3564         (JSC::AssemblyHelpers::makeSpaceOnStackForCCall): Deleted.
3565         (JSC::AssemblyHelpers::reclaimSpaceOnStackForCCall): Deleted.
3566
3567 2016-04-07  Commit Queue  <commit-queue@webkit.org>
3568
3569         Unreviewed, rolling out r199128 and r199141.
3570         https://bugs.webkit.org/show_bug.cgi?id=156348
3571
3572         Causes crashes on multiple webpages (Requested by keith_mi_ on
3573         #webkit).
3574
3575         Reverted changesets:
3576
3577         "[ES6] Add support for Symbol.isConcatSpreadable."
3578         https://bugs.webkit.org/show_bug.cgi?id=155351
3579         http://trac.webkit.org/changeset/199128
3580
3581         "Unreviewed, uncomment accidentally commented line in test."
3582         http://trac.webkit.org/changeset/199141
3583
3584 2016-04-07  Filip Pizlo  <fpizlo@apple.com>
3585
3586         Rationalize the handling of PutById transitions a bit
3587         https://bugs.webkit.org/show_bug.cgi?id=156330
3588
3589         Reviewed by Mark Lam.
3590
3591         * bytecode/PolymorphicAccess.cpp:
3592         (JSC::AccessCase::generate): Get rid of the specialized slow calls. We can just use the failAndIgnore jump target. We just need to make sure that we don't make observable effects until we're done with all of the fast path checks.
3593         * bytecode/StructureStubInfo.cpp:
3594         (JSC::StructureStubInfo::addAccessCase): MadeNoChanges indicates that we should keep trying to repatch. Currently PutById transitions might trigger the case that addAccessCase() sees null, if the transition involves an indexing header. Doing repatching in that case is probably not good. But, we should just fix this the right way eventually.
3595
3596 2016-04-07  Per Arne Vollan  <peavo@outlook.com>
3597
3598         [Win] Fix for JSC stress test failures.
3599         https://bugs.webkit.org/show_bug.cgi?id=156343
3600
3601         Reviewed by Filip Pizlo.
3602
3603         We need to make it clear to MSVC that the method loadPtr(ImplicitAddress address, RegisterID dest)
3604         should be used, and not loadPtr(const void* address, RegisterID dest).
3605
3606         * jit/CCallHelpers.cpp:
3607         (JSC::CCallHelpers::setupShadowChickenPacket):
3608
3609 2016-04-06  Benjamin Poulain  <bpoulain@apple.com>
3610
3611         [JSC] UInt32ToNumber should be NodeMustGenerate
3612         https://bugs.webkit.org/show_bug.cgi?id=156329
3613
3614         Reviewed by Filip Pizlo.
3615
3616         It exits on negative numbers on the integer path.
3617
3618         * dfg/DFGFixupPhase.cpp:
3619         (JSC::DFG::FixupPhase::fixupNode):
3620         * dfg/DFGNodeType.h:
3621
3622 2016-04-04  Geoffrey Garen  <ggaren@apple.com>
3623
3624         Unreviewed, rolling out r199016.
3625         https://bugs.webkit.org/show_bug.cgi?id=156140
3626
3627         "Perf bots are down, so I can't re-land this right now."
3628
3629         Reverted changeset:
3630
3631         CopiedBlock should be 16kB
3632         https://bugs.webkit.org/show_bug.cgi?id=156168
3633         http://trac.webkit.org/changeset/199016
3634
3635 2016-04-06  Mark Lam  <mark.lam@apple.com>
3636
3637         String.prototype.match() should be calling internal function RegExpCreate.
3638         https://bugs.webkit.org/show_bug.cgi?id=156318
3639
3640         Reviewed by Filip Pizlo.
3641
3642         RegExpCreate is not the same as the RegExp constructor.  The current implementation
3643         invokes new @RegExp which calls the constructor.  This results in failures in
3644         es6/Proxy_internal_get_calls_String.prototype.match.js, and
3645         es6/Proxy_internal_get_calls_String.prototype.search.js due to observable side
3646         effects.
3647
3648         This patch fixes this by factoring out the part of the RegExp constructor that
3649         makes the RegExpCreate function, and changing String's match and search to call
3650         RegExpCreate instead in accordance with the ES6 spec. 
3651
3652         * builtins/StringPrototype.js:
3653         (match):
3654         (search):
3655         * runtime/CommonIdentifiers.h:
3656         * runtime/JSGlobalObject.cpp:
3657         (JSC::JSGlobalObject::init):
3658         * runtime/RegExpConstructor.cpp:
3659         (JSC::toFlags):
3660         (JSC::regExpCreate):
3661         (JSC::constructRegExp):
3662         (JSC::esSpecRegExpCreate):
3663         (JSC::constructWithRegExpConstructor):
3664         * runtime/RegExpConstructor.h:
3665         (JSC::isRegExp):
3666
3667 2016-04-06  Keith Miller  <keith_miller@apple.com>
3668
3669         Unreviewed, uncomment accidentally commented line in test.
3670
3671         * tests/stress/array-concat-spread-object.js:
3672
3673 2016-04-06  Filip Pizlo  <fpizlo@apple.com>
3674
3675         JSC should have a simple way of gathering IC statistics
3676         https://bugs.webkit.org/show_bug.cgi?id=156317
3677
3678         Reviewed by Benjamin Poulain.
3679
3680         This adds a cheap, runtime-enabled way of gathering statistics about why we take the slow
3681         paths for inline caches. This is complementary to our existing bytecode profiler. Eventually
3682         we may want to combine the two things.
3683         
3684         This is not a slow-down on anything because we only do extra work on IC slow paths and if
3685         it's disabled it's just a load-and-branch to skip the stats gathering code.
3686
3687         * CMakeLists.txt:
3688         * JavaScriptCore.xcodeproj/project.pbxproj:
3689         * jit/ICStats.cpp: Added.
3690         * jit/ICStats.h: Added.
3691         * jit/JITOperations.cpp:
3692         * runtime/JSCJSValue.h:
3693         * runtime/JSCJSValueInlines.h:
3694         (JSC::JSValue::inherits):
3695         (JSC::JSValue::classInfoOrNull):
3696         (JSC::JSValue::toThis):
3697         * runtime/Options.h:
3698
3699 2016-04-06  Filip Pizlo  <fpizlo@apple.com>
3700
3701         32-bit JSC stress/multi-put-by-offset-multiple-transitions.js failing
3702         https://bugs.webkit.org/show_bug.cgi?id=156292
3703
3704         Reviewed by Benjamin Poulain.
3705
3706         Make sure that we stash the callsite index before calling operationReallocateStorageAndFinishPut.
3707
3708         * bytecode/PolymorphicAccess.cpp:
3709         (JSC::AccessCase::generate):
3710
3711 2016-04-06  Filip Pizlo  <fpizlo@apple.com>
3712
3713         JSC test stress/arrowfunction-lexical-bind-superproperty.js failing
3714         https://bugs.webkit.org/show_bug.cgi?id=156309
3715
3716         Reviewed by Saam Barati.
3717
3718         Just be honest about the fact that the ArgumentCount and Callee parts of inline callframe runtime
3719         meta-data can be read at any time.
3720         
3721         We only have to say this for the inline callframe forms of ArgumentCount and Callee because we don't
3722         sink any part of the machine prologue. This change just prevents us from sinking the pseudoprologue
3723         of inlined varargs or closure calls.
3724
3725         Shockingly, this is not a regression on anything.
3726
3727         * dfg/DFGClobberize.h:
3728         (JSC::DFG::clobberize):
3729
3730 2016-03-29  Keith Miller  <keith_miller@apple.com>
3731
3732         [ES6] Add support for Symbol.isConcatSpreadable.
3733         https://bugs.webkit.org/show_bug.cgi?id=155351
3734
3735         Reviewed by Saam Barati.
3736
3737         This patch adds support for Symbol.isConcatSpreadable. In order to do so it was necessary to move the
3738         Array.prototype.concat function to JS. A number of different optimizations were needed to make such the move to
3739         a builtin performant. First, four new DFG intrinsics were added.
3740
3741         1) IsArrayObject (I would have called it IsArray but we use the same name for an IndexingType): an intrinsic of
3742            the Array.isArray function.
3743         2) IsJSArray: checks the first child is a JSArray object.
3744         3) IsArrayConstructor: checks the first child is an instance of ArrayConstructor.
3745         4) CallObjectConstructor: an intrinsic of the Object constructor.
3746
3747         IsActualObject, IsJSArray, and CallObjectConstructor can all be converted into constants in the abstract interpreter if
3748         we are able to prove that the first child is an Array or for ToObject an Object.
3749
3750         In order to further improve the perfomance we also now cover more indexing types in our fast path memcpy
3751         code. Before we would only memcpy Arrays if they had the same indexing type and did not have Array storage and
3752         were not undecided. Now the memcpy code covers the following additional two cases: One array is undecided and
3753         the other is a non-array storage and the case where one array is Int32 and the other is contiguous (we map this
3754         into a contiguous array).
3755
3756         This patch also adds a new fast path for concat with more than one array argument by using memcpy to append
3757         values onto the result array. This works roughly the same as the two array fast path using the same methodology
3758         to decide if we can memcpy the other butterfly into the result butterfly.
3759
3760         Two new debugging tools are also added to the jsc cli. One is a version of the print function with a private
3761         name so it can be used for debugging builtins. The other is dumpDataLog, which takes a JSValue and runs our
3762         dataLog function on it.
3763
3764         Finally, this patch add a new constructor to JSValueRegsTemporary that allows it to reuse the the registers of a
3765         JSValueOperand if the operand's use count is one.
3766
3767         * JavaScriptCore.xcodeproj/project.pbxproj:
3768         * builtins/ArrayPrototype.js:
3769         (concatSlowPath):
3770         (concat):
3771         * bytecode/BytecodeIntrinsicRegistry.cpp:
3772         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
3773         * bytecode/BytecodeIntrinsicRegistry.h:
3774         * dfg/DFGAbstractInterpreterInlines.h:
3775         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3776         * dfg/DFGByteCodeParser.cpp:
3777         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
3778         (JSC::DFG::ByteCodeParser::handleConstantInternalFunction):
3779         * dfg/DFGClobberize.h:
3780         (JSC::DFG::clobberize):
3781         * dfg/DFGDoesGC.cpp:
3782         (JSC::DFG::doesGC):
3783         * dfg/DFGFixupPhase.cpp:
3784         (JSC::DFG::FixupPhase::fixupNode):
3785         * dfg/DFGNodeType.h:
3786         * dfg/DFGOperations.cpp:
3787         * dfg/DFGOperations.h:
3788         * dfg/DFGPredictionPropagationPhase.cpp:
3789         (JSC::DFG::PredictionPropagationPhase::propagate):
3790         * dfg/DFGSafeToExecute.h:
3791         (JSC::DFG::safeToExecute):
3792         * dfg/DFGSpeculativeJIT.cpp:
3793         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
3794         (JSC::DFG::SpeculativeJIT::compileIsJSArray):
3795         (JSC::DFG::SpeculativeJIT::compileIsArrayObject):
3796         (JSC::DFG::SpeculativeJIT::compileIsArrayConstructor):
3797         (JSC::DFG::SpeculativeJIT::compileCallObjectConstructor):
3798         * dfg/DFGSpeculativeJIT.h:
3799         (JSC::DFG::SpeculativeJIT::callOperation):
3800         * dfg/DFGSpeculativeJIT32_64.cpp:
3801         (JSC::DFG::SpeculativeJIT::compile):
3802         * dfg/DFGSpeculativeJIT64.cpp:
3803         (JSC::DFG::SpeculativeJIT::compile):
3804         * ftl/FTLCapabilities.cpp:
3805         (JSC::FTL::canCompile):
3806         * ftl/FTLLowerDFGToB3.cpp:
3807         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
3808         (JSC::FTL::DFG::LowerDFGToB3::compileCallObjectConstructor):
3809         (JSC::FTL::DFG::LowerDFGToB3::compileIsArrayObject):
3810         (JSC::FTL::DFG::LowerDFGToB3::compileIsJSArray):
3811         (JSC::FTL::DFG::LowerDFGToB3::compileIsArrayConstructor):
3812         (JSC::FTL::DFG::LowerDFGToB3::isArray):
3813         * jit/JITOperations.h:
3814         * jsc.cpp:
3815         (WTF::RuntimeArray::createStructure):
3816         (GlobalObject::finishCreation):
3817         (functionDebug):
3818         (functionDataLogValue):
3819         * runtime/ArrayConstructor.cpp:
3820         (JSC::ArrayConstructor::finishCreation):
3821         (JSC::arrayConstructorPrivateFuncIsArrayConstructor):
3822         * runtime/ArrayConstructor.h:
3823         (JSC::isArrayConstructor):
3824         * runtime/ArrayPrototype.cpp:
3825         (JSC::ArrayPrototype::finishCreation):
3826         (JSC::arrayProtoPrivateFuncIsJSArray):
3827         (JSC::moveElements):
3828         (JSC::arrayProtoPrivateFuncConcatMemcpy):
3829         (JSC::arrayProtoPrivateFuncAppendMemcpy):
3830         (JSC::arrayProtoFuncConcat): Deleted.
3831         * runtime/ArrayPrototype.h:
3832         (JSC::ArrayPrototype::createStructure):
3833         * runtime/CommonIdentifiers.h:
3834         * runtime/Intrinsic.h:
3835         * runtime/JSArray.cpp:
3836         (JSC::JSArray::appendMemcpy):
3837         (JSC::JSArray::fastConcatWith): Deleted.
3838         * runtime/JSArray.h:
3839         (JSC::JSArray::createStructure):
3840         (JSC::JSArray::fastConcatType): Deleted.
3841         * runtime/JSArrayInlines.h: Added.
3842         (JSC::JSArray::memCopyWithIndexingType):
3843         (JSC::JSArray::canFastCopy):
3844         * runtime/JSGlobalObject.cpp:
3845         (JSC::JSGlobalObject::init):
3846         * runtime/JSType.h:
3847         * runtime/ObjectConstructor.h:
3848         (JSC::constructObject):
3849         * tests/es6.yaml:
3850         * tests/stress/array-concat-spread-object.js: Added.
3851         (arrayEq):
3852         * tests/stress/array-concat-spread-proxy-exception-check.js: Added.
3853         (arrayEq):
3854         * tests/stress/array-concat-spread-proxy.js: Added.
3855         (arrayEq):
3856         * tests/stress/array-concat-with-slow-indexingtypes.js: Added.
3857         (arrayEq):
3858         * tests/stress/array-species-config-array-constructor.js:
3859
3860 2016-04-06  Commit Queue  <commit-queue@webkit.org>
3861
3862         Unreviewed, rolling out r199070.
3863         https://bugs.webkit.org/show_bug.cgi?id=156324
3864
3865         "It didn't fix the timeout" (Requested by saamyjoon on
3866         #webkit).
3867
3868         Reverted changeset:
3869
3870         "jsc-layout-tests.yaml/js/script-tests/regress-141098.js
3871         failing on Yosemite Debug after r198989"
3872         https://bugs.webkit.org/show_bug.cgi?id=156187
3873         http://trac.webkit.org/changeset/199070
3874
3875 2016-04-06  Geoffrey Garen  <ggaren@apple.com>
3876
3877         Unreviewed, rolling in r199016.
3878         https://bugs.webkit.org/show_bug.cgi?id=156140
3879
3880         It might work this time without regression because 16kB aligned requests
3881         now take the allocation fast path.
3882
3883         Restored changeset:
3884
3885         CopiedBlock should be 16kB
3886         https://bugs.webkit.org/show_bug.cgi?id=156168
3887         http://trac.webkit.org/changeset/199016
3888
3889 2016-04-06  Mark Lam  <mark.lam@apple.com>
3890
3891         Update es6.yaml to expect es6/Proxy_internal_get_calls_RegExp_constructor.js to pass.
3892         https://bugs.webkit.org/show_bug.cgi?id=156314
3893
3894         Reviewed by Saam Barati.
3895
3896         * tests/es6.yaml:
3897
3898 2016-04-06  Commit Queue  <commit-queue@webkit.org>
3899
3900         Unreviewed, rolling out r199104.
3901         https://bugs.webkit.org/show_bug.cgi?id=156301
3902
3903         Still breaks internal builds (Requested by keith_miller on
3904         #webkit).
3905
3906         Reverted changeset:
3907
3908         "We should support the ability to do a non-effectful getById"
3909         https://bugs.webkit.org/show_bug.cgi?id=156116
3910         http://trac.webkit.org/changeset/199104
3911
3912 2016-04-06  Keith Miller  <keith_miller@apple.com>
3913
3914         RegExp constructor should use Symbol.match and other properties
3915         https://bugs.webkit.org/show_bug.cgi?id=155873
3916
3917         Reviewed by Michael Saboff.
3918
3919         This patch updates the behavior of the RegExp constructor. Now the constructor
3920         should get the Symbol.match property and check if it exists to decide if something
3921         should be constructed like a regexp object.
3922
3923         * runtime/RegExpConstructor.cpp:
3924         (JSC::toFlags):
3925         (JSC::constructRegExp):
3926         (JSC::constructWithRegExpConstructor):
3927         (JSC::callRegExpConstructor):
3928         * runtime/RegExpConstructor.h:
3929         * tests/stress/regexp-constructor.js: Added.
3930         (assert):
3931         (throw.new.Error.get let):
3932         (throw.new.Error.):
3933         (throw.new.Error.get re):
3934
3935 2016-04-06  Keith Miller  <keith_miller@apple.com>
3936
3937         We should support the ability to do a non-effectful getById
3938         https://bugs.webkit.org/show_bug.cgi?id=156116
3939