Rollout r200426 since it causes PLT regressions.
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2016-05-17  Keith Miller  <keith_miller@apple.com>
2
3         Rollout r200426 since it causes PLT regressions.
4         https://bugs.webkit.org/show_bug.cgi?id=157812
5
6         Unreviewed rollout of r200426 since the bots see a ~.6% PLT regression from the patch.
7
8 2016-05-17  Keith Miller  <keith_miller@apple.com>
9
10         Add test262 harness support code
11         https://bugs.webkit.org/show_bug.cgi?id=157797
12
13         Reviewed by Filip Pizlo.
14
15         This patch adds some new tooling needed to run Test262 with the jsc
16         CLI. There were three options that needed to be added for Test262:
17
18         1) "--test262-async" This option overrides the print function in the test runner to look for
19         'Test262:AsyncTestComplete' instead of printing the passed text. If test262-async mode is on
20         and that string is not passed then the test is marked as failing.
21
22         2) "--strict-file=<file>" This option appends `"use strict";\n` to the beginning of the
23         passed file before passing the source code to the VM. This option can, in theory, be passed
24         multiple times.
25
26         3) "--exception=<name>" This option asserts that at the end of the last script file passed
27         the VM has an uncaught exception with its name property equal to the passed name.
28
29         * jsc.cpp:
30         (Script::Script):
31         (fillBufferWithContentsOfFile):
32         (functionPrint):
33         (checkUncaughtException):
34         (runWithScripts):
35         (printUsageStatement):
36         (CommandLine::parseArguments):
37         (runJSC):
38
39 2016-05-17  Filip Pizlo  <fpizlo@apple.com>
40
41         WTF should know about Language
42         https://bugs.webkit.org/show_bug.cgi?id=157756
43
44         Reviewed by Geoffrey Garen.
45
46         Teach our scripts that a ObjC class beginning with WTF is totally cool.
47
48         * JavaScriptCore.xcodeproj/project.pbxproj:
49
50 2016-05-17  Joseph Pecoraro  <pecoraro@apple.com>
51
52         console namespace breaks putting properties on console.__proto__
53         https://bugs.webkit.org/show_bug.cgi?id=157782
54         <rdar://problem/26250526>
55
56         Reviewed by Geoffrey Garen.
57
58         Some websites currently depend on console.__proto__ existing and being
59         a separate object from Object.prototype. This patch adds back a basic
60         console.__proto__ object, but all the console functions are left on
61         the ConsoleObject itself.
62
63         * runtime/JSGlobalObject.cpp:
64         (JSC::createConsoleProperty):
65
66 2016-05-17  Yusuke Suzuki  <utatane.tea@gmail.com>
67
68         Unreviewed, dump more information when math-pow-stable-results.js failed
69         https://bugs.webkit.org/show_bug.cgi?id=157168
70
71         * tests/stress/math-pow-stable-results.js:
72
73 2016-05-16  Saam barati  <sbarati@apple.com>
74
75         ShadowChicken crashes when reading a scope from the frame during a stack overflow exception
76         https://bugs.webkit.org/show_bug.cgi?id=157770
77
78         Reviewed by Filip Pizlo.
79
80         ShadowChicken was reading the scope from a half formed
81         frame as it threw a stack overflow exception. The frame had
82         a valid CodeBlock pointer, but it did not have a valid scope.
83         The code in ShadowChicken's throw packet logging mechanism didn't
84         account for this. The fix is to respect whether genericUnwind wants
85         to unwind from the current frame or the caller's frame. For stack
86         overflow errors, we always unwind the caller's frame.
87
88         * jit/JITExceptions.cpp:
89         (JSC::genericUnwind):
90
91 2016-05-16  Yusuke Suzuki  <utatane.tea@gmail.com>
92
93         REGRESSION(r200208): It made 2 JSC stress tests fail on x86
94         https://bugs.webkit.org/show_bug.cgi?id=157168
95
96         Reviewed by Benjamin Poulain.
97
98         The fast path in operationMathPow produces different results between x87 and the other environments.
99         This is because x87 calculates the double value in 80bit precision.
100         The situation is the following: in x86 32bit environment, floating point operations are compiled to
101         x87 operations by default even if we can use SSE2. But in DFG environment, we aggressively use SSE2
102         if the cpuid reports SSE2 is available. As a result, the implementations differ between C runtime
103         and DFG JIT code. The C runtime uses x87 while DFG JIT code uses SSE2. This causes a precision
104         problem since x87 has 80bit precision while SSE2 has 64bit precision.
105
106         In this patch, in x86 32bit environment, we use `volatile double` if the `-mfpmath=sse and -msse2 (or later)`
107         is not specified. This will round the x87 value into 64bit per multiplying. Note that this problem does not
108         occur in OS X clang 32bit environment. This is because `-mfpmath=sse` is enabled by default in OS X clang 32bit.
109
110         * b3/B3MathExtras.cpp:
111         (JSC::B3::powDoubleInt32):
112         * runtime/MathCommon.cpp:
113         (JSC::operationMathPow):
114
115 2016-05-16  Benjamin Poulain  <bpoulain@apple.com>
116
117         [JSC] "return this" in a constructor does not need a branch on isObject(this)
118         https://bugs.webkit.org/show_bug.cgi?id=157775
119
120         Reviewed by Saam Barati and Ryosuke Niwa.
121
122         When returning "this" in a constructor, the bytecode generator was generating:
123             is_object         locX, this
124             jtrue             locX, 5(->second ret)
125             ret               this
126             ret               this
127
128         That code is eliminated in DFG but it is pretty costly lower tiers.
129
130         This patch changes bytecode generation to avoid the is_object test
131         when possible and not generate two ret if they encode the same thing.
132
133         * bytecompiler/BytecodeGenerator.cpp:
134         (JSC::BytecodeGenerator::emitReturn):
135
136 2016-05-16  Benjamin Poulain  <bpoulain@apple.com>
137
138         [JSC] Remove the index check from op_get_by_val/op_put_by_val when the index is constant
139         https://bugs.webkit.org/show_bug.cgi?id=157766
140
141         Reviewed by Geoffrey Garen.
142
143         If the index is an integer constant, do not generate the index check.
144
145         * jit/JITPropertyAccess.cpp:
146         (JSC::JIT::emit_op_get_by_val):
147         (JSC::JIT::emitSlow_op_get_by_val):
148         (JSC::JIT::emit_op_put_by_val):
149         (JSC::JIT::emitSlow_op_put_by_val):
150
151 2016-05-16  Benjamin Poulain  <bpoulain@apple.com>
152
153         [JSC][DFG] Fill spilled Int32 as Int32 instead of JSInt32
154         https://bugs.webkit.org/show_bug.cgi?id=157700
155
156         Reviewed by Michael Saboff.
157
158         In general, fillSpeculateInt32() originate from SpeculateInt32
159         and the user does not care about the tag.
160
161         This is particularily obvious on Sunspider's math-spectral-norm.js.
162         In that test, registers are frequently spilled because of x86's DIV.
163
164         When they are re-filled, they were always tagged.
165         Since the loops are small, all the tagging adds up.
166
167         * dfg/DFGSpeculativeJIT64.cpp:
168         (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
169
170 2016-05-16  Saam barati  <sbarati@apple.com>
171
172         Unreviewed Cloop build fix.
173
174         * bytecode/CodeBlock.cpp:
175         (JSC::CodeBlock::bytecodeOffsetFromCallSiteIndex):
176
177 2016-05-16  Saam barati  <sbarati@apple.com>
178
179         Hook up ShadowChicken to the debugger to show tail deleted frames
180         https://bugs.webkit.org/show_bug.cgi?id=156685
181         <rdar://problem/25770521>
182
183         Reviewed by Filip Pizlo and Mark Lam and Joseph Pecoraro.
184
185         The heart of this patch hooks up ShadowChicken to DebuggerCallFrame to
186         allow the Web Inspector to display the ShadowChicken's shadow stack.
187         This means the Web Inspector can now display tail deleted frames.
188         To make this work, I made the necessary changes to ShadowChicken and
189         DebuggerCallFrame to allow DebuggerCallFrame to keep the same API
190         when representing both machine frames and tail deleted frames.
191
192         - ShadowChicken prologue packets now log the current scope. Tail packets
193           log the current scope, the 'this' value, the CodeBlock, and the
194           CallSiteIndex. This allows the inspector to not only show the
195           tail deleted frame, but also show exactly where the tail call happened (line and column numbers),
196           with which scope it executed, and with which 'this' value. This
197           patch also allows DebuggerCallFrame to execute console statements
198           in a tail deleted frame.
199
200         - I changed ShadowChicken's stack resizing algorithm. ShadowChicken
201           now only keeps a maximum number of tail deleted frames in its shadow stack.
202           It will happily represent all machine frames without limit. Right now, the
203           maximum number of tail deleted frames I chose to keep alive is 128.
204           We will keep frames alive starting from the top of the stack. This
205           allows us to have a strong defense against runaway memory usage. We will only
206           keep around at most 128 "shadow" frames that wouldn't have naturally been kept
207           alive by the executing program. We can play around with this number
208           if we find that 128 is either too many or too few frames.
209
210         - DebuggerCallFrame is no longer a cheap class to create. When it is created,
211           we will eagerly create the entire virtual debugger stack. So I modified the
212           existing code to lazily create DebuggerCallFrames only when necessary. We
213           used to eagerly create them at each op_debug statement even though we would
214           just throw them away if we didn't hit a breakpoint.
215
216         - A valid DebuggerCallFrame will always have a valid CallFrame* pointer
217           into the stack. This pointer won't always refer to the logical frame
218           that the DebuggerCallFrame represents because a DebuggerCallFrame can
219           now represent a tail deleted frame. To do this, DebuggerCallFrame now
220           has a ShadowChicken::Frame member variable. This allows DebuggerCallFrame
221           to know when it represents a tail deleted frame and gives DebuggerCallFrame
222           a mechanism to ask the tail deleted frame for interesting information
223           (like its 'this' value, scope, CodeBlock, etc). A tail deleted frame's
224           machine frame pointer will be the machine caller of the tail deleted frame
225           (or the machine caller of the first of a series of consecutive tail calls).
226
227         - I added a new flag to UnlinkedCodeBlock to indicate when it is compiled
228           with debugging opcodes. I did this because ShadowChicken may read a JSScope
229           from the machine stack. This is only safe if the machine CodeBlock was
230           compiled with debugging opcodes. This is safer than asking if the
231           CodeBlock's global object has an interactive debugger enabled because
232           it's theoretically possible for the debugger to be enabled while code
233           compiled without a debugger is still live on the stack. This field is
234           also now used to indicate to the DFGGraph that the interactive debugger
235           is enabled.
236
237         - Finally, this patch adds a new field to the Inspector's CallFrame protocol
238           object called 'isTailDeleted' to allow the Inspector to know when a
239           CallFrame represents a tail deleted frame.
240
241         * JavaScriptCore.xcodeproj/project.pbxproj:
242         * bytecode/BytecodeList.json:
243         * bytecode/BytecodeUseDef.h:
244         (JSC::computeUsesForBytecodeOffset):
245         * bytecode/CodeBlock.cpp:
246         (JSC::CodeBlock::dumpBytecode):
247         (JSC::CodeBlock::findPC):
248         (JSC::CodeBlock::bytecodeOffsetFromCallSiteIndex):
249         * bytecode/CodeBlock.h:
250         (JSC::CodeBlock::clearDebuggerRequests):
251         (JSC::CodeBlock::wasCompiledWithDebuggingOpcodes):
252         * bytecode/UnlinkedCodeBlock.cpp:
253         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
254         * bytecode/UnlinkedCodeBlock.h:
255         (JSC::UnlinkedCodeBlock::wasCompiledWithDebuggingOpcodes):
256         (JSC::UnlinkedCodeBlock::finishCreation):
257         (JSC::UnlinkedGlobalCodeBlock::UnlinkedGlobalCodeBlock):
258         * bytecode/UnlinkedFunctionExecutable.cpp:
259         (JSC::generateUnlinkedFunctionCodeBlock):
260         * bytecompiler/BytecodeGenerator.cpp:
261         (JSC::BytecodeGenerator::generate):
262         (JSC::BytecodeGenerator::BytecodeGenerator):
263         (JSC::BytecodeGenerator::emitEnter):
264         (JSC::BytecodeGenerator::emitLogShadowChickenPrologueIfNecessary):
265         (JSC::BytecodeGenerator::emitLogShadowChickenTailIfNecessary):
266         (JSC::BytecodeGenerator::emitCallDefineProperty):
267         * debugger/Debugger.cpp:
268         (JSC::DebuggerPausedScope::DebuggerPausedScope):
269         (JSC::DebuggerPausedScope::~DebuggerPausedScope):
270         (JSC::Debugger::didReachBreakpoint):
271         (JSC::Debugger::currentDebuggerCallFrame):
272         * debugger/Debugger.h:
273         * debugger/DebuggerCallFrame.cpp:
274         (JSC::LineAndColumnFunctor::operator()):
275         (JSC::DebuggerCallFrame::create):
276         (JSC::DebuggerCallFrame::DebuggerCallFrame):
277         (JSC::DebuggerCallFrame::callerFrame):
278         (JSC::DebuggerCallFrame::globalExec):
279         (JSC::DebuggerCallFrame::vmEntryGlobalObject):
280         (JSC::DebuggerCallFrame::sourceID):
281         (JSC::DebuggerCallFrame::functionName):
282         (JSC::DebuggerCallFrame::scope):
283         (JSC::DebuggerCallFrame::type):
284         (JSC::DebuggerCallFrame::thisValue):
285         (JSC::DebuggerCallFrame::evaluateWithScopeExtension):
286         (JSC::DebuggerCallFrame::invalidate):
287         (JSC::DebuggerCallFrame::currentPosition):
288         (JSC::DebuggerCallFrame::positionForCallFrame):
289         (JSC::DebuggerCallFrame::sourceIDForCallFrame):
290         (JSC::FindCallerMidStackFunctor::FindCallerMidStackFunctor): Deleted.
291         (JSC::FindCallerMidStackFunctor::operator()): Deleted.
292         (JSC::FindCallerMidStackFunctor::getCallerFrame): Deleted.
293         (JSC::DebuggerCallFrame::thisValueForCallFrame): Deleted.
294         * debugger/DebuggerCallFrame.h:
295         (JSC::DebuggerCallFrame::isValid):
296         (JSC::DebuggerCallFrame::isTailDeleted):
297         (JSC::DebuggerCallFrame::create): Deleted.
298         (JSC::DebuggerCallFrame::exec): Deleted.
299         * dfg/DFGByteCodeParser.cpp:
300         (JSC::DFG::ByteCodeParser::parseBlock):
301         * dfg/DFGFixupPhase.cpp:
302         (JSC::DFG::FixupPhase::fixupNode):
303         * dfg/DFGGraph.cpp:
304         (JSC::DFG::Graph::Graph):
305         (JSC::DFG::Graph::~Graph):
306         * dfg/DFGJITCompiler.h:
307         (JSC::DFG::JITCompiler::addCallSite):
308         (JSC::DFG::JITCompiler::emitStoreCodeOrigin):
309         (JSC::DFG::JITCompiler::emitStoreCallSiteIndex):
310         * dfg/DFGSpeculativeJIT32_64.cpp:
311         (JSC::DFG::SpeculativeJIT::compile):
312         * dfg/DFGSpeculativeJIT64.cpp:
313         (JSC::DFG::SpeculativeJIT::compile):
314         * ftl/FTLAbstractHeapRepository.h:
315         * ftl/FTLLowerDFGToB3.cpp:
316         (JSC::FTL::DFG::LowerDFGToB3::compileLogShadowChickenPrologue):
317         (JSC::FTL::DFG::LowerDFGToB3::compileLogShadowChickenTail):
318         (JSC::FTL::DFG::LowerDFGToB3::compileRecordRegExpCachedResult):
319         (JSC::FTL::DFG::LowerDFGToB3::allocateJSArray):
320         (JSC::FTL::DFG::LowerDFGToB3::ensureShadowChickenPacket):
321         (JSC::FTL::DFG::LowerDFGToB3::setupShadowChickenPacket): Deleted.
322         * inspector/InjectedScriptSource.js:
323         (InjectedScript.CallFrameProxy):
324         * inspector/JSJavaScriptCallFrame.cpp:
325         (Inspector::JSJavaScriptCallFrame::thisObject):
326         (Inspector::JSJavaScriptCallFrame::isTailDeleted):
327         (Inspector::JSJavaScriptCallFrame::type):
328         * inspector/JSJavaScriptCallFrame.h:
329         * inspector/JSJavaScriptCallFramePrototype.cpp:
330         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
331         (Inspector::jsJavaScriptCallFramePrototypeFunctionEvaluateWithScopeExtension):
332         (Inspector::jsJavaScriptCallFrameAttributeType):
333         (Inspector::jsJavaScriptCallFrameIsTailDeleted):
334         * inspector/JavaScriptCallFrame.h:
335         (Inspector::JavaScriptCallFrame::type):
336         (Inspector::JavaScriptCallFrame::scopeChain):
337         (Inspector::JavaScriptCallFrame::vmEntryGlobalObject):
338         (Inspector::JavaScriptCallFrame::isTailDeleted):
339         (Inspector::JavaScriptCallFrame::thisValue):
340         (Inspector::JavaScriptCallFrame::evaluateWithScopeExtension):
341         * inspector/ScriptDebugServer.cpp:
342         (Inspector::ScriptDebugServer::evaluateBreakpointAction):
343         * inspector/protocol/Debugger.json:
344         * interpreter/ShadowChicken.cpp:
345         (JSC::ShadowChicken::update):
346         (JSC::ShadowChicken::visitChildren):
347         (JSC::ShadowChicken::reset):
348         * interpreter/ShadowChicken.h:
349         (JSC::ShadowChicken::Packet::throwMarker):
350         (JSC::ShadowChicken::Packet::prologue):
351         (JSC::ShadowChicken::Packet::tail):
352         (JSC::ShadowChicken::Frame::Frame):
353         (JSC::ShadowChicken::Frame::operator==):
354         * jit/CCallHelpers.cpp:
355         (JSC::CCallHelpers::logShadowChickenProloguePacket):
356         (JSC::CCallHelpers::logShadowChickenTailPacket):
357         (JSC::CCallHelpers::ensureShadowChickenPacket):
358         (JSC::CCallHelpers::setupShadowChickenPacket): Deleted.
359         * jit/CCallHelpers.h:
360         * jit/JITOpcodes.cpp:
361         (JSC::JIT::emit_op_profile_type):
362         (JSC::JIT::emit_op_log_shadow_chicken_prologue):
363         (JSC::JIT::emit_op_log_shadow_chicken_tail):
364         (JSC::JIT::emit_op_get_enumerable_length):
365         (JSC::JIT::emit_op_resume):
366         * jit/JITOpcodes32_64.cpp:
367         (JSC::JIT::emit_op_profile_type):
368         (JSC::JIT::emit_op_log_shadow_chicken_prologue):
369         (JSC::JIT::emit_op_log_shadow_chicken_tail):
370         * jit/RegisterSet.cpp:
371         (JSC::RegisterSet::webAssemblyCalleeSaveRegisters):
372         (JSC::RegisterSet::argumentGPRS):
373         (JSC::RegisterSet::registersToNotSaveForJSCall):
374         * jit/RegisterSet.h:
375         * llint/LLIntData.cpp:
376         (JSC::LLInt::Data::performAssertions):
377         * llint/LLIntSlowPaths.cpp:
378         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
379         * llint/LowLevelInterpreter.asm:
380         * llint/LowLevelInterpreter32_64.asm:
381         * llint/LowLevelInterpreter64.asm:
382         * runtime/CodeCache.cpp:
383         (JSC::CodeCache::getGlobalCodeBlock):
384         * runtime/Options.h:
385         * tests/stress/shadow-chicken-enabled.js:
386         (test5a.foo):
387         (test5a):
388         (test5b.foo):
389         (test5b):
390         (test6.foo):
391         (test6):
392
393 2016-05-16  Saam barati  <sbarati@apple.com>
394
395         TypeSet/StructureShape have a flawed sense of JS prototype chains
396         https://bugs.webkit.org/show_bug.cgi?id=157760
397
398         Reviewed by Joseph Pecoraro.
399
400         There was an assumption that we would bottom out in "Object". This is
401         not true for many reasons. JS objects may not end in Object.prototype.
402         Also, our mechanism of grabbing an Object's class name may also not
403         bottom out in "Object". We were seeing this in the JS objects we use
404         in the InjectedScriptSource.js inspector script.
405
406         * runtime/TypeSet.cpp:
407         (JSC::StructureShape::leastCommonAncestor):
408         * tests/typeProfiler/weird-prototype-chain.js: Added.
409         (wrapper.foo):
410         (wrapper.let.o2):
411         (wrapper):
412
413 2016-05-16  Joseph Pecoraro  <pecoraro@apple.com>
414
415         Unreviewed rollout r200924. Caused js/regress/string-replace-generic.html to fail.
416
417         * API/JSProfilerPrivate.cpp: Copied from Source/JavaScriptCore/profiler/ProfilerJettisonReason.h.
418         (JSStartProfiling):
419         (JSEndProfiling):
420         * API/JSProfilerPrivate.h: Copied from Source/JavaScriptCore/profiler/ProfilerJettisonReason.h.
421         * CMakeLists.txt:
422         * JavaScriptCore.xcodeproj/project.pbxproj:
423         * bytecode/BytecodeList.json:
424         * bytecode/BytecodeUseDef.h:
425         (JSC::computeUsesForBytecodeOffset):
426         (JSC::computeDefsForBytecodeOffset):
427         * bytecode/CodeBlock.cpp:
428         (JSC::CodeBlock::dumpBytecode):
429         * bytecode/UnlinkedFunctionExecutable.cpp:
430         (JSC::generateUnlinkedFunctionCodeBlock):
431         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
432         * bytecode/UnlinkedFunctionExecutable.h:
433         * bytecompiler/BytecodeGenerator.cpp:
434         (JSC::BytecodeGenerator::BytecodeGenerator):
435         (JSC::BytecodeGenerator::emitCall):
436         (JSC::BytecodeGenerator::emitCallVarargs):
437         (JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
438         (JSC::BytecodeGenerator::emitConstructVarargs):
439         (JSC::BytecodeGenerator::emitConstruct):
440         * bytecompiler/BytecodeGenerator.h:
441         (JSC::CallArguments::profileHookRegister):
442         (JSC::BytecodeGenerator::shouldEmitProfileHooks):
443         * bytecompiler/NodesCodegen.cpp:
444         (JSC::CallArguments::CallArguments):
445         (JSC::CallFunctionCallDotNode::emitBytecode):
446         (JSC::ApplyFunctionCallDotNode::emitBytecode):
447         * dfg/DFGAbstractInterpreterInlines.h:
448         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
449         * dfg/DFGByteCodeParser.cpp:
450         (JSC::DFG::ByteCodeParser::parseBlock):
451         * dfg/DFGCapabilities.cpp:
452         (JSC::DFG::capabilityLevel):
453         * dfg/DFGClobberize.h:
454         (JSC::DFG::clobberize):
455         * dfg/DFGDoesGC.cpp:
456         (JSC::DFG::doesGC):
457         * dfg/DFGFixupPhase.cpp:
458         (JSC::DFG::FixupPhase::fixupNode):
459         * dfg/DFGNodeType.h:
460         * dfg/DFGPredictionPropagationPhase.cpp:
461         * dfg/DFGSafeToExecute.h:
462         (JSC::DFG::safeToExecute):
463         * dfg/DFGSpeculativeJIT32_64.cpp:
464         (JSC::DFG::SpeculativeJIT::compile):
465         * dfg/DFGSpeculativeJIT64.cpp:
466         (JSC::DFG::SpeculativeJIT::compile):
467         * inspector/InjectedScriptBase.cpp:
468         (Inspector::InjectedScriptBase::callFunctionWithEvalEnabled):
469         * inspector/protocol/Timeline.json:
470         * interpreter/Interpreter.cpp:
471         (JSC::UnwindFunctor::operator()):
472         (JSC::Interpreter::execute):
473         (JSC::Interpreter::executeCall):
474         (JSC::Interpreter::executeConstruct):
475         * jit/JIT.cpp:
476         (JSC::JIT::privateCompileMainPass):
477         * jit/JIT.h:
478         * jit/JITOpcodes.cpp:
479         (JSC::JIT::emit_op_profile_will_call):
480         (JSC::JIT::emit_op_profile_did_call):
481         * jit/JITOpcodes32_64.cpp:
482         (JSC::JIT::emit_op_profile_will_call):
483         (JSC::JIT::emit_op_profile_did_call):
484         * jit/JITOperations.cpp:
485         * jit/JITOperations.h:
486         * jsc.cpp:
487         * llint/LLIntSlowPaths.cpp:
488         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
489         * llint/LLIntSlowPaths.h:
490         * llint/LowLevelInterpreter.asm:
491         * parser/ParserModes.h:
492         * profiler/CallIdentifier.h: Added.
493         (JSC::CallIdentifier::CallIdentifier):
494         (JSC::CallIdentifier::functionName):
495         (JSC::CallIdentifier::url):
496         (JSC::CallIdentifier::lineNumber):
497         (JSC::CallIdentifier::columnNumber):
498         (JSC::CallIdentifier::operator==):
499         (JSC::CallIdentifier::operator!=):
500         (JSC::CallIdentifier::Hash::hash):
501         (JSC::CallIdentifier::Hash::equal):
502         (JSC::CallIdentifier::hash):
503         (JSC::CallIdentifier::operator const char*):
504         (JSC::CallIdentifier::c_str):
505         (WTF::HashTraits<JSC::CallIdentifier>::constructDeletedValue):
506         (WTF::HashTraits<JSC::CallIdentifier>::isDeletedValue):
507         * profiler/LegacyProfiler.cpp: Added.
508         (JSC::LegacyProfiler::profiler):
509         (JSC::LegacyProfiler::startProfiling):
510         (JSC::LegacyProfiler::stopProfiling):
511         (JSC::callFunctionForProfilesWithGroup):
512         (JSC::LegacyProfiler::suspendProfiling):
513         (JSC::LegacyProfiler::unsuspendProfiling):
514         (JSC::LegacyProfiler::willExecute):
515         (JSC::LegacyProfiler::didExecute):
516         (JSC::LegacyProfiler::exceptionUnwind):
517         (JSC::LegacyProfiler::createCallIdentifier):
518         (JSC::createCallIdentifierFromFunctionImp):
519         * profiler/LegacyProfiler.h: Added.
520         (JSC::LegacyProfiler::currentProfiles):
521         * profiler/Profile.cpp: Added.
522         (JSC::Profile::create):
523         (JSC::Profile::Profile):
524         (JSC::Profile::~Profile):
525         (JSC::Profile::debugPrint):
526         (JSC::functionNameCountPairComparator):
527         (JSC::Profile::debugPrintSampleStyle):
528         * profiler/Profile.h: Copied from Source/JavaScriptCore/profiler/ProfilerJettisonReason.h.
529         * profiler/ProfileGenerator.cpp: Added.
530         (JSC::ProfileGenerator::create):
531         (JSC::ProfileGenerator::ProfileGenerator):
532         (JSC::AddParentForConsoleStartFunctor::AddParentForConsoleStartFunctor):
533         (JSC::AddParentForConsoleStartFunctor::foundParent):
534         (JSC::AddParentForConsoleStartFunctor::operator()):
535         (JSC::ProfileGenerator::addParentForConsoleStart):
536         (JSC::ProfileGenerator::title):
537         (JSC::ProfileGenerator::beginCallEntry):
538         (JSC::ProfileGenerator::endCallEntry):
539         (JSC::ProfileGenerator::willExecute):
540         (JSC::ProfileGenerator::didExecute):
541         (JSC::ProfileGenerator::exceptionUnwind):
542         (JSC::ProfileGenerator::stopProfiling):
543         (JSC::ProfileGenerator::removeProfileStart):
544         (JSC::ProfileGenerator::removeProfileEnd):
545         * profiler/ProfileGenerator.h: Added.
546         (JSC::ProfileGenerator::profile):
547         (JSC::ProfileGenerator::origin):
548         (JSC::ProfileGenerator::profileGroup):
549         (JSC::ProfileGenerator::setIsSuspended):
550         * profiler/ProfileNode.cpp: Added.
551         (JSC::ProfileNode::ProfileNode):
552         (JSC::ProfileNode::addChild):
553         (JSC::ProfileNode::removeChild):
554         (JSC::ProfileNode::spliceNode):
555         (JSC::ProfileNode::traverseNextNodePostOrder):
556         (JSC::ProfileNode::debugPrint):
557         (JSC::ProfileNode::debugPrintSampleStyle):
558         (JSC::ProfileNode::debugPrintRecursively):
559         (JSC::ProfileNode::debugPrintSampleStyleRecursively):
560         * profiler/ProfileNode.h: Added.
561         (JSC::ProfileNode::create):
562         (JSC::ProfileNode::Call::Call):
563         (JSC::ProfileNode::Call::startTime):
564         (JSC::ProfileNode::Call::setStartTime):
565         (JSC::ProfileNode::Call::elapsedTime):
566         (JSC::ProfileNode::Call::setElapsedTime):
567         (JSC::ProfileNode::operator==):
568         (JSC::ProfileNode::callerCallFrame):
569         (JSC::ProfileNode::callIdentifier):
570         (JSC::ProfileNode::id):
571         (JSC::ProfileNode::functionName):
572         (JSC::ProfileNode::url):
573         (JSC::ProfileNode::lineNumber):
574         (JSC::ProfileNode::columnNumber):
575         (JSC::ProfileNode::parent):
576         (JSC::ProfileNode::setParent):
577         (JSC::ProfileNode::calls):
578         (JSC::ProfileNode::lastCall):
579         (JSC::ProfileNode::appendCall):
580         (JSC::ProfileNode::children):
581         (JSC::ProfileNode::firstChild):
582         (JSC::ProfileNode::lastChild):
583         (JSC::ProfileNode::nextSibling):
584         (JSC::ProfileNode::setNextSibling):
585         (JSC::ProfileNode::forEachNodePostorder):
586         (JSC::CalculateProfileSubtreeDataFunctor::operator()):
587         (JSC::CalculateProfileSubtreeDataFunctor::returnValue):
588         * profiler/ProfilerJettisonReason.cpp:
589         (WTF::printInternal):
590         * profiler/ProfilerJettisonReason.h:
591         * runtime/CodeCache.cpp:
592         (JSC::CodeCache::getGlobalCodeBlock):
593         (JSC::CodeCache::getProgramCodeBlock):
594         (JSC::CodeCache::getEvalCodeBlock):
595         (JSC::CodeCache::getModuleProgramCodeBlock):
596         * runtime/CodeCache.h:
597         * runtime/Executable.cpp:
598         (JSC::ScriptExecutable::newCodeBlockFor):
599         * runtime/JSGlobalObject.cpp:
600         (JSC::JSGlobalObject::~JSGlobalObject):
601         (JSC::JSGlobalObject::hasLegacyProfiler):
602         (JSC::JSGlobalObject::createProgramCodeBlock):
603         (JSC::JSGlobalObject::createEvalCodeBlock):
604         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
605         * runtime/JSGlobalObject.h:
606         (JSC::JSGlobalObject::supportsLegacyProfiling):
607         * runtime/Options.h:
608         * runtime/VM.cpp:
609         (JSC::VM::VM):
610         (JSC::SetEnabledProfilerFunctor::operator()):
611         (JSC::VM::setEnabledProfiler):
612         * runtime/VM.h:
613         (JSC::VM::enabledProfiler):
614         (JSC::VM::enabledProfilerAddress):
615
616 2016-05-16  Konstantin Tokarev  <annulen@yandex.ru>
617
618         Unreviewed, fixed typo in a comment.
619
620         * assembler/MacroAssembler.h: Replaced "onvenience" with
621         "convenience".
622
623 2016-05-16  Filip Pizlo  <fpizlo@apple.com>
624
625         FixupPhase should be more eager to demote bit math to untyped
626         https://bugs.webkit.org/show_bug.cgi?id=157746
627
628         Reviewed by Mark Lam.
629         
630         This just makes the logic for how we fixup bit math match the way we do it in other places.
631         This doesn't affect performance on any major benchmark but it's a big win on new
632         microbenchmarks added in this change.
633         
634         Details:
635
636         object-and                                     11.1610+-0.7602     ^      4.8105+-0.1690        ^ definitely 2.3201x faster
637         object-or                                      11.0845+-0.2487     ^      4.7146+-0.0374        ^ definitely 2.3511x faster
638         object-xor                                     10.2946+-0.9946     ^      4.7278+-0.0814        ^ definitely 2.1775x faster
639         object-lshift                                  10.4896+-1.0867     ^      4.7699+-0.0721        ^ definitely 2.1991x faster
640         object-rshift                                  11.1239+-0.5010     ^      4.7194+-0.0445        ^ definitely 2.3570x faster
641         object-urshift                                 10.9745+-0.1315     ^      4.7848+-0.0479        ^ definitely 2.2936x faster
642
643         * dfg/DFGFixupPhase.cpp:
644         (JSC::DFG::FixupPhase::fixupNode):
645
646 2016-05-15  Michael Saboff  <msaboff@apple.com>
647
648         RegExp /y flag incorrect handling of mixed-length alternation
649         https://bugs.webkit.org/show_bug.cgi?id=157723
650
651         Reviewed by Filip Pizlo.
652
653         Previously for sticky patterns, we were bailing out and exiting when backtracking
654         alternatives with dissimilar match lengths.  Deleted that code.  Instead, for
655         sticky patterns we need to process the backtracking except for advancing to the
656         next input index.
657
658         * yarr/YarrJIT.cpp:
659         (JSC::Yarr::YarrGenerator::backtrack):
660
661 2016-05-15  Filip Pizlo  <fpizlo@apple.com>
662
663         DFG::Plan shouldn't read from its VM once it's been cancelled
664         https://bugs.webkit.org/show_bug.cgi?id=157726
665
666         Reviewed by Saam Barati.
667         
668         Plan::vm was a reference, not a pointer, and so wasn't nulled by Plan::cancel(). So, a
669         cancelled plan may have a dangling pointer to a VM: we could delete the VM after cancelling
670         the plan.
671         
672         Prior to http://trac.webkit.org/changeset/200705, this was probably fine because nobody
673         would read Plan::vm if the plan was cancelled. But r200705 changed that. It was a hard
674         regression to spot because usually a cancelled plan will still refer to a valid VM.
675         
676         This change fixes the regression and makes it a lot easier to spot the regression in the
677         future. Plan::vm is now a pointer and we null it in Plan::cancel(). Now if you make this
678         mistake, you will get a crash anytime the Plan is cancelled, not just anytime the plan is
679         cancelled and the VM gets deleted. Also, it's now very clear what to do when you want to
680         use Plan::vm on the cancel path: you can null-check vm; if it's null, assume the worst.
681         
682         Because we null the VM of a cancelled plan, we cannot have Safepoint::vm() return the
683         plan's VM anymore. That's because when we cancel a plan that is at a safepoint, we use the
684         safepoint's VM to determine whether this is one of our safepoints *after* the plan is
685         already cancelled. So, Safepoint now has its own copy of m_vm, and that copy gets nulled
686         when the Safepoint is cancelled. The Safepoint's m_vm will be nulled moments after Plan's
687         vm gets nulled (see Worklist::removeDeadPlans(), which has a cancel path for Plans in one
688         loop and a cancel path for Safepoints in the loop after it).
689
690         * dfg/DFGJITFinalizer.cpp:
691         (JSC::DFG::JITFinalizer::finalizeCommon):
692         * dfg/DFGPlan.cpp:
693         (JSC::DFG::Plan::Plan):
694         (JSC::DFG::Plan::computeCompileTimes):
695         (JSC::DFG::Plan::reportCompileTimes):
696         (JSC::DFG::Plan::compileInThreadImpl):
697         (JSC::DFG::Plan::reallyAdd):
698         (JSC::DFG::Plan::notifyCompiling):
699         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
700         (JSC::DFG::Plan::cancel):
701         * dfg/DFGPlan.h:
702         (JSC::DFG::Plan::canTierUpAndOSREnter):
703         * dfg/DFGSafepoint.cpp:
704         (JSC::DFG::Safepoint::cancel):
705         (JSC::DFG::Safepoint::vm):
706         * dfg/DFGSafepoint.h:
707         * dfg/DFGWorklist.cpp:
708         (JSC::DFG::Worklist::isActiveForVM):
709         (JSC::DFG::Worklist::waitUntilAllPlansForVMAreReady):
710         (JSC::DFG::Worklist::removeAllReadyPlansForVM):
711         (JSC::DFG::Worklist::rememberCodeBlocks):
712         (JSC::DFG::Worklist::visitWeakReferences):
713         (JSC::DFG::Worklist::removeDeadPlans):
714         (JSC::DFG::Worklist::runThread):
715         * ftl/FTLJITFinalizer.cpp:
716         (JSC::FTL::JITFinalizer::finalizeFunction):
717
718 2016-05-15  Yusuke Suzuki  <utatane.tea@gmail.com>
719
720         Modernize Intl constructors; using InternalFunction::createSubclassStructure
721         https://bugs.webkit.org/show_bug.cgi?id=157082
722
723         Reviewed by Darin Adler.
724
725         Previously, Intl constructors retrieve "prototype" to inherit the "new.target".
726         At that time, this mis-assumed that getDirect() always returns meaningful JS value.
727         Actually, it returns an empty value if a property does not exist.
728
729         Instead of fixing this assertion, we now use InternalFunction::createSubclassStructure
730         in Intl constructors. It is modern and preferable way since it can cache the derived
731         structures in InternalFunction.
732
733         This patch also cleans up the workaround in Intl.NumberFormat and Intl.DateTimeFormat.
734         Those code are largely duplicate. This is now extracted into
735         constructIntlInstanceWithWorkaroundForLegacyIntlConstructor. This clean up does not
736         have any behavior changes. They are already tested in LayoutTests/js/intl-datetimeformat
737         and LayoutTests/js/intl-numberformat.
738
739         * JavaScriptCore.xcodeproj/project.pbxproj:
740         * runtime/IntlCollator.cpp:
741         (JSC::IntlCollator::create):
742         * runtime/IntlCollator.h:
743         * runtime/IntlCollatorConstructor.cpp:
744         (JSC::constructIntlCollator):
745         (JSC::callIntlCollator):
746         * runtime/IntlDateTimeFormat.cpp:
747         (JSC::IntlDateTimeFormat::create):
748         * runtime/IntlDateTimeFormat.h:
749         * runtime/IntlDateTimeFormatConstructor.cpp:
750         (JSC::constructIntlDateTimeFormat):
751         (JSC::callIntlDateTimeFormat):
752         * runtime/IntlDateTimeFormatPrototype.cpp:
753         (JSC::IntlDateTimeFormatPrototypeGetterFormat):
754         (JSC::IntlDateTimeFormatPrototypeFuncResolvedOptions):
755         * runtime/IntlNumberFormat.cpp:
756         (JSC::IntlNumberFormat::create):
757         * runtime/IntlNumberFormat.h:
758         * runtime/IntlNumberFormatConstructor.cpp:
759         (JSC::constructIntlNumberFormat):
760         (JSC::callIntlNumberFormat):
761         * runtime/IntlNumberFormatPrototype.cpp:
762         (JSC::IntlNumberFormatPrototypeGetterFormat):
763         (JSC::IntlNumberFormatPrototypeFuncResolvedOptions):
764         * runtime/IntlObjectInlines.h: Added.
765         (JSC::constructIntlInstanceWithWorkaroundForLegacyIntlConstructor):
766         * tests/stress/intl-constructors-with-proxy.js: Added.
767         (shouldBe):
768         (throw.new.Error.Empty):
769         (throw.new.Error):
770         (shouldBe.Empty):
771
772 2016-05-14  Joseph Pecoraro  <pecoraro@apple.com>
773
774         Remove LegacyProfiler
775         https://bugs.webkit.org/show_bug.cgi?id=153565
776
777         Reviewed by Mark Lam.
778
779         JavaScriptCore now provides a sampling profiler and it is enabled
780         by all ports. Web Inspector switched months ago to using the
781         sampling profiler and displaying its data. Remove the legacy
782         profiler, as it is no longer being used by anything other then
783         console.profile and tests. We will update console.profile's
784         behavior soon to have new behavior and use the sampling data.
785
786         * API/JSProfilerPrivate.cpp: Removed.
787         * API/JSProfilerPrivate.h: Removed.
788         * CMakeLists.txt:
789         * JavaScriptCore.xcodeproj/project.pbxproj:
790         * bytecode/BytecodeList.json:
791         * bytecode/BytecodeUseDef.h:
792         (JSC::computeUsesForBytecodeOffset): Deleted.
793         (JSC::computeDefsForBytecodeOffset): Deleted.
794         * bytecode/CodeBlock.cpp:
795         (JSC::CodeBlock::dumpBytecode): Deleted.
796         * bytecode/UnlinkedFunctionExecutable.cpp:
797         (JSC::generateUnlinkedFunctionCodeBlock):
798         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
799         * bytecode/UnlinkedFunctionExecutable.h:
800         * bytecompiler/BytecodeGenerator.cpp:
801         (JSC::BytecodeGenerator::BytecodeGenerator):
802         (JSC::BytecodeGenerator::emitCall):
803         (JSC::BytecodeGenerator::emitCallVarargs):
804         (JSC::BytecodeGenerator::emitCallVarargsInTailPosition):
805         (JSC::BytecodeGenerator::emitConstructVarargs):
806         (JSC::BytecodeGenerator::emitConstruct):
807         * bytecompiler/BytecodeGenerator.h:
808         (JSC::CallArguments::profileHookRegister): Deleted.
809         (JSC::BytecodeGenerator::shouldEmitProfileHooks): Deleted.
810         * bytecompiler/NodesCodegen.cpp:
811         (JSC::CallFunctionCallDotNode::emitBytecode):
812         (JSC::ApplyFunctionCallDotNode::emitBytecode):
813         (JSC::CallArguments::CallArguments): Deleted.
814         * dfg/DFGAbstractInterpreterInlines.h:
815         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects): Deleted.
816         * dfg/DFGByteCodeParser.cpp:
817         (JSC::DFG::ByteCodeParser::parseBlock): Deleted.
818         * dfg/DFGCapabilities.cpp:
819         (JSC::DFG::capabilityLevel): Deleted.
820         * dfg/DFGClobberize.h:
821         (JSC::DFG::clobberize): Deleted.
822         * dfg/DFGDoesGC.cpp:
823         (JSC::DFG::doesGC): Deleted.
824         * dfg/DFGFixupPhase.cpp:
825         (JSC::DFG::FixupPhase::fixupNode): Deleted.
826         * dfg/DFGNodeType.h:
827         * dfg/DFGPredictionPropagationPhase.cpp:
828         * dfg/DFGSafeToExecute.h:
829         (JSC::DFG::safeToExecute): Deleted.
830         * dfg/DFGSpeculativeJIT32_64.cpp:
831         (JSC::DFG::SpeculativeJIT::compile): Deleted.
832         * dfg/DFGSpeculativeJIT64.cpp:
833         (JSC::DFG::SpeculativeJIT::compile): Deleted.
834         * inspector/InjectedScriptBase.cpp:
835         (Inspector::InjectedScriptBase::callFunctionWithEvalEnabled):
836         * inspector/protocol/Timeline.json:
837         * interpreter/Interpreter.cpp:
838         (JSC::UnwindFunctor::operator()): Deleted.
839         (JSC::Interpreter::execute): Deleted.
840         (JSC::Interpreter::executeCall): Deleted.
841         (JSC::Interpreter::executeConstruct): Deleted.
842         * jit/JIT.cpp:
843         (JSC::JIT::privateCompileMainPass): Deleted.
844         * jit/JIT.h:
845         * jit/JITOpcodes.cpp:
846         (JSC::JIT::emit_op_profile_will_call): Deleted.
847         (JSC::JIT::emit_op_profile_did_call): Deleted.
848         * jit/JITOpcodes32_64.cpp:
849         (JSC::JIT::emit_op_profile_will_call): Deleted.
850         (JSC::JIT::emit_op_profile_did_call): Deleted.
851         * jit/JITOperations.cpp:
852         * jit/JITOperations.h:
853         * jsc.cpp:
854         * llint/LLIntSlowPaths.cpp:
855         (JSC::LLInt::LLINT_SLOW_PATH_DECL): Deleted.
856         * llint/LLIntSlowPaths.h:
857         * llint/LowLevelInterpreter.asm:
858         * parser/ParserModes.h:
859         * profiler/CallIdentifier.h: Removed.
860         * profiler/LegacyProfiler.cpp: Removed.
861         * profiler/LegacyProfiler.h: Removed.
862         * profiler/Profile.cpp: Removed.
863         * profiler/Profile.h: Removed.
864         * profiler/ProfileGenerator.cpp: Removed.
865         * profiler/ProfileGenerator.h: Removed.
866         * profiler/ProfileNode.cpp: Removed.
867         * profiler/ProfileNode.h: Removed.
868         * profiler/ProfilerJettisonReason.cpp:
869         (WTF::printInternal): Deleted.
870         * profiler/ProfilerJettisonReason.h:
871         * runtime/CodeCache.cpp:
872         (JSC::CodeCache::getGlobalCodeBlock):
873         (JSC::CodeCache::getProgramCodeBlock):
874         (JSC::CodeCache::getEvalCodeBlock):
875         (JSC::CodeCache::getModuleProgramCodeBlock):
876         * runtime/CodeCache.h:
877         * runtime/Executable.cpp:
878         (JSC::ScriptExecutable::newCodeBlockFor):
879         * runtime/JSGlobalObject.cpp:
880         (JSC::JSGlobalObject::createProgramCodeBlock):
881         (JSC::JSGlobalObject::createEvalCodeBlock):
882         (JSC::JSGlobalObject::createModuleProgramCodeBlock):
883         (JSC::JSGlobalObject::~JSGlobalObject): Deleted.
884         (JSC::JSGlobalObject::hasLegacyProfiler): Deleted.
885         * runtime/JSGlobalObject.h:
886         (JSC::JSGlobalObject::supportsLegacyProfiling): Deleted.
887         * runtime/Options.h:
888         * runtime/VM.cpp:
889         (JSC::VM::VM): Deleted.
890         (JSC::SetEnabledProfilerFunctor::operator()): Deleted.
891         (JSC::VM::setEnabledProfiler): Deleted.
892         * runtime/VM.h:
893         (JSC::VM::enabledProfiler): Deleted.
894         (JSC::VM::enabledProfilerAddress): Deleted.
895
896 2016-05-13  Joseph Pecoraro  <pecoraro@apple.com>
897
898         jsc: samplingProfilerStackTraces() without starting sampling should not cause jsc to crash
899         https://bugs.webkit.org/show_bug.cgi?id=157704
900
901         Reviewed by Saam Barati.
902
903         * jsc.cpp:
904         (functionStartSamplingProfiler):
905         (functionSamplingProfilerStackTraces):
906         Throw an exception instead of crashing if we haven't started sampling.
907
908         * inspector/agents/InspectorScriptProfilerAgent.cpp:
909         (Inspector::InspectorScriptProfilerAgent::startTracking):
910         * runtime/VM.h:
911         * runtime/VM.cpp:
912         (JSC::VM::ensureSamplingProfiler):
913         Switch ensure to returning a reference, like most other ensures.
914
915 2016-05-13  Saam barati  <sbarati@apple.com>
916
917         DFG/FTL have a few bugs in their reasoning about the scope
918         https://bugs.webkit.org/show_bug.cgi?id=157696
919
920         Reviewed by Benjamin Poulain.
921
922         1. When the debugger is enabled, it is easier for the DFG to reason
923         about the scope register by simply claiming all nodes read the scope
924         register. This prevents us from ever entering the runtime where we
925         may take a stack trace but there isn't a scope on the stack.
926
927         2. This patch fixes a bug where the FTL compilation wasn't properly
928         setting the CodeBlock register. It was only doing this when there
929         was inline data, but when the debugger is enabled, we never inline.
930         So this code just needed to be removed from that loop. It was never
931         right for it to be inside the loop.
932
933         * dfg/DFGClobberize.h:
934         (JSC::DFG::clobberize):
935         * ftl/FTLCompile.cpp:
936         (JSC::FTL::compile):
937
938 2016-05-13  Benjamin Poulain  <bpoulain@apple.com>
939
940         [JSC] SetLocal without exit do not need phantoms
941         https://bugs.webkit.org/show_bug.cgi?id=157653
942
943         Reviewed by Filip Pizlo.
944
945         I made a mistake in r200498.
946
947         If a SetLocal cannot possibly exit, we were not clearing
948         the source of the operand. As a result, we sometime kept
949         a value alive up to the end of the block.
950
951         That's uncommon because SetLocal typically appear
952         toward the end of blocks. That's probably why there was
953         no perf impact with that fix.
954
955         * dfg/DFGPhantomInsertionPhase.cpp:
956
957 2016-05-13  Benjamin Poulain  <bpoulain@apple.com>
958
959         [JSC] Move the CheckTierUp function calls out of the main path
960         https://bugs.webkit.org/show_bug.cgi?id=157668
961
962         Reviewed by Mark Lam.
963
964         If you have a tiny tiny loop (for example, Sunspider's bits-in-byte),
965         the size of CheckTierUp is a problem.
966
967         On multi-issue CPUs, the node is so big that we do not
968         get to run anything from the loop in the instruction fetch.
969
970         On x86, having a bigger loop also pushes us out of the LSD.
971
972         This is a 6% improvement on bits-in-byte. Other Sunspider tests
973         only improves marginally.
974
975         * dfg/DFGSpeculativeJIT.cpp:
976         (JSC::DFG::SpeculativeJIT::addSlowPathGenerator):
977         (JSC::DFG::SpeculativeJIT::runSlowPathGenerators):
978         * dfg/DFGSpeculativeJIT.h:
979         (JSC::DFG::SpeculativeJIT::silentSpill):
980         (JSC::DFG::SpeculativeJIT::silentFill):
981         * dfg/DFGSpeculativeJIT64.cpp:
982         (JSC::DFG::SpeculativeJIT::compile):
983
984 2016-05-13  Benjamin Poulain  <bpoulain@apple.com>
985
986         [JSC] Emit the loads of emitLoadWithStructureCheck() in the order they are used
987         https://bugs.webkit.org/show_bug.cgi?id=157671
988
989         Reviewed by Mark Lam.
990
991         This improves the chances of having a value
992         when issuing the TEST.
993
994         * jit/JITPropertyAccess.cpp:
995         (JSC::JIT::emitLoadWithStructureCheck):
996
997 2016-05-13  Joseph Pecoraro  <pecoraro@apple.com>
998
999         Web Inspector: Inform augmenting client when inspector controller is destroyed
1000         https://bugs.webkit.org/show_bug.cgi?id=157688
1001         <rdar://problem/25832724>
1002
1003         Reviewed by Timothy Hatcher.
1004
1005         * inspector/JSGlobalObjectInspectorController.cpp:
1006         (Inspector::JSGlobalObjectInspectorController::~JSGlobalObjectInspectorController):
1007         * inspector/augmentable/AugmentableInspectorControllerClient.h:
1008         There is a weak relationship between the InspectorController and the
1009         AugmentingClient. Let the augmenting client know when the controller
1010         is destroyed so it doesn't try to use us anymore.
1011
1012 2016-05-13  Geoffrey Garen  <ggaren@apple.com>
1013
1014         Runaway malloc memory usage in this simple JSC program
1015         https://bugs.webkit.org/show_bug.cgi?id=157682
1016
1017         Reviewed by Mark Lam.
1018
1019         * heap/WeakSet.cpp:
1020         (JSC::WeakSet::sweep): Whenever we might add a block to
1021         m_logicallyEmptyWeakBlocks, be sure also to sweep a block in
1022         m_logicallyEmptyWeakBlocks. Otherwise, additions might outpace removals
1023         even when all memory is freed.
1024
1025         We do this whenever we *might* add a block and not just whenever we *do*
1026         add a block because we'd like to sweep the entries in
1027         m_logicallyEmptyWeakBlocks promptly even when it's not growing, and this
1028         is a reasonably rate-limited opportunity to do so.
1029
1030 2016-05-13  Mark Lam  <mark.lam@apple.com>
1031
1032         We should have one calleeSaveRegistersBuffer per VMEntryFrame, not one per VM.
1033         https://bugs.webkit.org/show_bug.cgi?id=157537
1034         <rdar://problem/24794845>
1035
1036         Reviewed by Michael Saboff.
1037
1038         The pre-existing code behaves this way:
1039
1040         1. When JS code throws an exception, it saves callee save registers in
1041            the VM calleeSaveRegistersBuffer.  These values are meant to be restored
1042            to the callee save registers later either at the catch handler or at the
1043            uncaught exception handler.
1044
1045         2. If the Inspector is enable, the VM will invoke inspector C++ code to inspect
1046            the exception.  That C++ code can change the values of the callee save
1047            registers.
1048
1049            The inspector code in turn re-enters the VM to execute JS inspector code.
1050
1051            The JS inspector code can run hot enough that we do an enterOptimizationCheck
1052            on it.  The enterOptimizationCheck first saves all callee save registers
1053            into the VM calleeSaveRegistersBuffer.
1054
1055            This effectively overwrites the values in the VM calleeSaveRegistersBuffer
1056            from (1).
1057
1058         3. Eventually, execution returns to the catch handler or the uncaught exception
1059            handler which restores the overwritten values in the VM
1060            calleeSaveRegistersBuffer to the callee save registers.
1061
1062            When execution returns to the C++ code that entered the VM before (1), the
1063            values in the callee registers are not what that code expects, and badness
1064            and/or crashes ensues.
1065
1066         This patch applies the following fix:
1067         
1068         1. Allocate space in the VMEntryFrame for the calleeSaveRegistersBuffer.
1069            This ensures that each VM entry session has its own buffer to use, and will
1070            not corrupt the one from the previous VM entry session.
1071
1072            Delete the VM calleeSaveRegistersBuffer.
1073
1074         2. Change all locations that uses the VM calleeSaveRegistersBuffer to use the
1075            calleeSaveRegistersBuffer in the current VMEntryFrame.
1076
1077         3. Renamed all uses of the term "VMCalleeSavesBuffer" to
1078            "VMEntryFrameCalleeSavesBuffer".
1079
1080         This fix has been tested on the following configurations:
1081         1. JSC and layout tests on a debug ASan build for 64-bit x86_64.
1082         2. JSC tests on a release ASan build for 32-bit x86.
1083         3. JSC tests on a release normal (non-ASan) build for ARM64.
1084         4. JSC tests on a release normal (non-ASan) build for ARMv7 and ARMv7s.
1085         5. JSC tests on a release ASan CLOOP build for x86_64.
1086
1087         These test runs did not produce any new crashes.  The ASan CLOOP has some
1088         pre-existing crashes which are not due to this patch.
1089
1090         This bug can be tested by running the inspector/debugger/regress-133182.html test
1091         on an ASan build.
1092
1093         * bytecode/PolymorphicAccess.cpp:
1094         (JSC::AccessGenerationState::emitExplicitExceptionHandler):
1095         * dfg/DFGJITCompiler.cpp:
1096         (JSC::DFG::JITCompiler::compileExceptionHandlers):
1097         * dfg/DFGOSREntry.cpp:
1098         (JSC::DFG::prepareOSREntry):
1099         * dfg/DFGOSRExitCompiler.cpp:
1100         * dfg/DFGOSRExitCompiler32_64.cpp:
1101         (JSC::DFG::OSRExitCompiler::compileExit):
1102         * dfg/DFGOSRExitCompiler64.cpp:
1103         (JSC::DFG::OSRExitCompiler::compileExit):
1104         * dfg/DFGThunks.cpp:
1105         (JSC::DFG::osrEntryThunkGenerator):
1106         * ftl/FTLCompile.cpp:
1107         (JSC::FTL::compile):
1108         * ftl/FTLLowerDFGToB3.cpp:
1109         (JSC::FTL::DFG::LowerDFGToB3::lower):
1110         * ftl/FTLOSRExitCompiler.cpp:
1111         (JSC::FTL::compileStub):
1112         * interpreter/Interpreter.cpp:
1113         (JSC::UnwindFunctor::operator()):
1114         (JSC::UnwindFunctor::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
1115         (JSC::UnwindFunctor::copyCalleeSavesToVMCalleeSavesBuffer): Deleted.
1116         * interpreter/Interpreter.h:
1117         (JSC::NativeCallFrameTracer::NativeCallFrameTracer):
1118         * interpreter/VMEntryRecord.h:
1119         (JSC::VMEntryRecord::calleeSaveRegistersBufferOffset):
1120         (JSC::VMEntryRecord::prevTopCallFrame):
1121         (JSC::VMEntryRecord::unsafePrevTopCallFrame):
1122         (JSC::VMEntryFrame::vmEntryRecordOffset):
1123         (JSC::VMEntryFrame::calleeSaveRegistersBufferOffset):
1124         * jit/AssemblyHelpers.cpp:
1125         (JSC::AssemblyHelpers::emitRandomThunk):
1126         (JSC::AssemblyHelpers::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer):
1127         (JSC::AssemblyHelpers::restoreCalleeSavesFromVMCalleeSavesBuffer): Deleted.
1128         * jit/AssemblyHelpers.h:
1129         (JSC::AssemblyHelpers::emitRestoreSavedTagRegisters):
1130         (JSC::AssemblyHelpers::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
1131         (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMEntryFrameCalleeSavesBuffer):
1132         (JSC::AssemblyHelpers::copyCalleeSavesToVMCalleeSavesBuffer): Deleted.
1133         (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer): Deleted.
1134         * jit/JIT.cpp:
1135         (JSC::JIT::emitEnterOptimizationCheck):
1136         (JSC::JIT::privateCompileExceptionHandlers):
1137         * jit/JITOpcodes.cpp:
1138         (JSC::JIT::emit_op_throw):
1139         (JSC::JIT::emit_op_catch):
1140         (JSC::JIT::emitSlow_op_loop_hint):
1141         * jit/JITOpcodes32_64.cpp:
1142         (JSC::JIT::emit_op_throw):
1143         (JSC::JIT::emit_op_catch):
1144         * jit/ThunkGenerators.cpp:
1145         (JSC::throwExceptionFromCallSlowPathGenerator):
1146         (JSC::nativeForGenerator):
1147         * llint/LLIntThunks.cpp:
1148         (JSC::vmEntryRecord):
1149         * llint/LowLevelInterpreter.asm:
1150         * llint/LowLevelInterpreter32_64.asm:
1151         * llint/LowLevelInterpreter64.asm:
1152         * runtime/VM.h:
1153         (JSC::VM::getCTIStub):
1154         (JSC::VM::calleeSaveRegistersBufferOffset): Deleted.
1155         * wasm/WASMFunctionCompiler.h:
1156         (JSC::WASMFunctionCompiler::endFunction):
1157
1158 2016-05-13  Beth Dakin  <bdakin@apple.com>
1159
1160         Add dyldSPI.h for linked on or after checks, and add one for link preview
1161         https://bugs.webkit.org/show_bug.cgi?id=157401
1162         -and corresponding-
1163         rdar://problem/26253396
1164
1165         Reviewed by Darin Adler.
1166
1167         Import #import <wtf/spi/darwin/dyldSPI.h> which now declares all of the 
1168         needed dyld code.
1169         * API/JSWrapperMap.mm:
1170
1171 2016-05-13  Yusuke Suzuki  <utatane.tea@gmail.com>
1172
1173         Assertion failure for direct eval in non-class method
1174         https://bugs.webkit.org/show_bug.cgi?id=157138
1175
1176         Reviewed by Saam Barati.
1177
1178         This assertion was incorrect. In method definitions in object literals,
1179         it can be sloppy mode, but its DerivedContextType may not be DerivedContextType::None.
1180
1181         * bytecode/EvalCodeCache.h:
1182         (JSC::EvalCodeCache::CacheKey::CacheKey):
1183         (JSC::EvalCodeCache::CacheKey::operator==):
1184         (JSC::EvalCodeCache::CacheKey::Hash::equal):
1185         (JSC::EvalCodeCache::tryGet):
1186         (JSC::EvalCodeCache::getSlow):
1187         * interpreter/Interpreter.cpp:
1188         (JSC::eval):
1189         * tests/stress/direct-eval-in-object-literal-methods.js: Added.
1190         (shouldBe):
1191         (throw.new.Error):
1192         (shouldBe.Parent.prototype.l):
1193         (shouldBe.Parent):
1194         (shouldBe.Derived.prototype.m):
1195         (shouldBe.Derived):
1196
1197 2016-05-13  Skachkov Oleksandr  <gskachkov@gmail.com>
1198
1199         Assertion failure for super() call in arrow function default parameters
1200         https://bugs.webkit.org/show_bug.cgi?id=157079
1201
1202         Reviewed by Saam Barati.
1203
1204         Root of the issue that in arrow function we load bounded variables this/super/new.target just after 
1205         input parameters were initialized, and did not covered case of default values for 
1206         function parameters. 
1207         Current patch tried to fix issue and allow to load bounded variables earlier, before the input 
1208         parameters are assigned by default values.
1209
1210         * bytecompiler/BytecodeGenerator.cpp:
1211         (JSC::BytecodeGenerator::BytecodeGenerator):
1212         * tests/stress/arrowfunction-lexical-bind-this-2.js:
1213
1214 2016-05-12  Mark Lam  <mark.lam@apple.com>
1215
1216         Baseline and DFG's JSC_report...CompileTimes needs CodeBlock hashes.
1217         https://bugs.webkit.org/show_bug.cgi?id=157643
1218
1219         Reviewed by Keith Miller.
1220
1221         * runtime/Options.cpp:
1222         (JSC::recomputeDependentOptions):
1223
1224 2016-05-12  Csaba Osztrogonác  <ossy@webkit.org>
1225
1226         Remove ENABLE(ES6_ARROWFUNCTION_SYNTAX) guards
1227         https://bugs.webkit.org/show_bug.cgi?id=157564
1228
1229         Reviewed by Darin Adler.
1230
1231         * Configurations/FeatureDefines.xcconfig:
1232         * parser/Parser.cpp:
1233
1234 2016-05-12  Joseph Pecoraro  <pecoraro@apple.com>
1235
1236         Web Inspector: CRASH getting internal properties of function with no bound arguments causes
1237         https://bugs.webkit.org/show_bug.cgi?id=157613
1238         <rdar://problem/26238754>
1239
1240         Reviewed by Timothy Hatcher.
1241
1242         * inspector/JSInjectedScriptHost.cpp:
1243         (Inspector::JSInjectedScriptHost::getInternalProperties):
1244         Gracefully handle a JSBoundFunction with no bound arguments.
1245         In this case boundArgs is JSValue() which we don't want to
1246         expose as the value of the internal property.
1247
1248 2016-05-11  Benjamin Poulain  <bpoulain@apple.com>
1249
1250         [JSC] Make sure StringRange is passed to Vector by register
1251         https://bugs.webkit.org/show_bug.cgi?id=157603
1252
1253         Reviewed by Darin Adler.
1254
1255         This is bizarre, but on my SDK, Vector::append(StringRange)
1256         is passing the values on the stack.
1257         The two integers are written to the stack, the address given
1258         to append(), then append() reads it back and store it.
1259
1260         This patch changes the code to use constructAndAppend(), ensuring
1261         the values are used directly.
1262
1263         On my machine, this helps Sunspider and Octane.
1264         This might be something wrong with my SDK but the fix is so easy
1265         that we might as well do this.
1266
1267         * runtime/StringPrototype.cpp:
1268         (JSC::removeUsingRegExpSearch):
1269         (JSC::replaceUsingRegExpSearch):
1270
1271 2016-05-11  Zan Dobersek  <zdobersek@igalia.com>
1272
1273         ARMv7Assembler: suppress a -Wnarrowing warning when compiling with GCC
1274         https://bugs.webkit.org/show_bug.cgi?id=157576
1275
1276         Reviewed by Csaba Osztrogonác.
1277
1278         * assembler/ARMv7Assembler.h:
1279         (JSC::ARMv7Assembler::revertJumpTo_movT3movtcmpT2): Explicitly cast the
1280         `OP_CMP_reg_T2 | left` value to uint16_t, avoiding a narrowing conversion
1281         warning that's being reported when compiling with GCC. The warning is sprung
1282         due to RegisterID (which is the type of `left`) being an enum based on int,
1283         even when the enum itself only declares 23 values.
1284
1285 2016-05-11  Joseph Pecoraro  <pecoraro@apple.com>
1286
1287         Web Inspector: `this` in Scope Chain Sidebar does not have preview, looks poor
1288         https://bugs.webkit.org/show_bug.cgi?id=157602
1289
1290         Reviewed by Timothy Hatcher.
1291
1292         * inspector/InjectedScriptSource.js:
1293         (InjectedScript.CallFrameProxy):
1294         Include a preview when creating the RemoteObject for `this`.
1295
1296 2016-05-11  Keith Miller  <keith_miller@apple.com>
1297
1298         Unreviewed, correct the title of the ChangeLog for r200667.
1299
1300 2016-05-11  Joseph Pecoraro  <pecoraro@apple.com>
1301
1302         JSC test stress/reflect-set.js failing after 200694
1303         https://bugs.webkit.org/show_bug.cgi?id=157586
1304
1305         Unreviewed test rebaseline.
1306
1307         * tests/stress/reflect-set.js:
1308         Update the expected error message. We are in strict mode, so the
1309         improved error message makes sense.
1310
1311 2016-05-11  Filip Pizlo  <fpizlo@apple.com>
1312
1313         Beef up JSC profiler event log
1314         https://bugs.webkit.org/show_bug.cgi?id=157584
1315
1316         Reviewed by Saam Barati.
1317         
1318         Also log more about compilation.
1319
1320         * bytecode/ExecutionCounter.cpp: Changed the meaning of codeBlock to be the codeBlock that is doing the profiling. This will now get the baseline version if it needs it. This is needed for logging the threshold checking event.
1321         (JSC::applyMemoryUsageHeuristics):
1322         (JSC::ExecutionCounter<countingVariant>::hasCrossedThreshold):
1323         * dfg/DFGJITCode.cpp: Pass the right codeBlock.
1324         (JSC::DFG::JITCode::checkIfOptimizationThresholdReached):
1325         (JSC::DFG::JITCode::optimizeNextInvocation):
1326         (JSC::DFG::JITCode::dontOptimizeAnytimeSoon):
1327         (JSC::DFG::JITCode::optimizeSoon):
1328         (JSC::DFG::JITCode::forceOptimizationSlowPathConcurrently):
1329         * dfg/DFGPlan.cpp: Log things about compile times and whether the compiler succeeded or failed.
1330         (JSC::DFG::Plan::computeCompileTimes):
1331         (JSC::DFG::Plan::reportCompileTimes):
1332         (JSC::DFG::Plan::compileInThread):
1333         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
1334         * jit/ExecutableAllocatorFixedVMPool.cpp: Make it possible to look at memory usage, though separately from the log, for now.
1335         (JSC::ExecutableAllocator::allocate):
1336         * runtime/Options.h:
1337
1338 2016-05-11  Saam barati  <sbarati@apple.com>
1339
1340         Air may decide to put the result register of an arithmetic snippet in the tag register
1341         https://bugs.webkit.org/show_bug.cgi?id=157548
1342
1343         Reviewed by Filip Pizlo.
1344
1345         This patch adds a new ValueRep to B3 called LateRegister. The semantics
1346         are similar to Register in that it can be used to pin an argument to
1347         a particular register. It differs from ValueRep::Register in that the semantics of
1348         LateRegister are that it is used after the result of the node its an argument to
1349         is computed. This means that a LateRegister argument will interfere with the result
1350         of a node. LateRegister is not a valid result ValueRep.
1351
1352         This was needed because there was a bug where B3/Air would assign the
1353         result of a patchpoint to the TagTypeNumber register. This broke our
1354         code when we would box a double into a JSValue in a snippet when the
1355         result is the same as the TagTypeNumber register. To fix the issue,
1356         we pass TagMaskRegister and TagTypeNumberRegister as ValueRep::LateRegister
1357         arguments to various patchpoints.
1358
1359         * b3/B3LowerToAir.cpp:
1360         (JSC::B3::Air::LowerToAir::fillStackmap):
1361         * b3/B3PatchpointSpecial.cpp:
1362         (JSC::B3::PatchpointSpecial::admitsStack):
1363         * b3/B3StackmapSpecial.cpp:
1364         (JSC::B3::StackmapSpecial::forEachArgImpl):
1365         (JSC::B3::StackmapSpecial::isArgValidForRep):
1366         * b3/B3Validate.cpp:
1367         * b3/B3ValueRep.cpp:
1368         (JSC::B3::ValueRep::addUsedRegistersTo):
1369         (JSC::B3::ValueRep::dump):
1370         (JSC::B3::ValueRep::emitRestore):
1371         (JSC::B3::ValueRep::recoveryForJSValue):
1372         (WTF::printInternal):
1373         * b3/B3ValueRep.h:
1374         (JSC::B3::ValueRep::reg):
1375         (JSC::B3::ValueRep::lateReg):
1376         (JSC::B3::ValueRep::stack):
1377         (JSC::B3::ValueRep::operator==):
1378         (JSC::B3::ValueRep::isSomeRegister):
1379         (JSC::B3::ValueRep::isReg):
1380         * b3/testb3.cpp:
1381         (JSC::B3::testSpillUseLargerThanDef):
1382         (JSC::B3::testLateRegister):
1383         (JSC::B3::zero):
1384         (JSC::B3::run):
1385         * ftl/FTLLowerDFGToB3.cpp:
1386         (JSC::FTL::DFG::LowerDFGToB3::lower):
1387         (JSC::FTL::DFG::LowerDFGToB3::compileIn):
1388         (JSC::FTL::DFG::LowerDFGToB3::getById):
1389         (JSC::FTL::DFG::LowerDFGToB3::emitBinarySnippet):
1390         (JSC::FTL::DFG::LowerDFGToB3::emitBinaryBitOpSnippet):
1391         (JSC::FTL::DFG::LowerDFGToB3::emitRightShiftSnippet):
1392
1393 2016-05-11  Joseph Pecoraro  <pecoraro@apple.com>
1394
1395         Improve error messages for accessing arguments.callee and similar getters in strict mode
1396         https://bugs.webkit.org/show_bug.cgi?id=157545
1397
1398         Reviewed by Mark Lam.
1399
1400         * runtime/ClonedArguments.cpp:
1401         (JSC::ClonedArguments::getOwnPropertySlot):
1402         (JSC::ClonedArguments::materializeSpecials):
1403         Provide better error GetterSetter in strict mode.
1404
1405         * runtime/JSFunction.cpp:
1406         (JSC::getThrowTypeErrorGetterSetter):
1407         (JSC::JSFunction::defineOwnProperty):
1408         Provide better error GetterSetter in strict mode.
1409
1410         * runtime/JSGlobalObject.cpp:
1411         (JSC::JSGlobalObject::init):
1412         (JSC::JSGlobalObject::visitChildren):
1413         * runtime/JSGlobalObject.h:
1414         (JSC::JSGlobalObject::throwTypeErrorGetterSetter):
1415         (JSC::JSGlobalObject::throwTypeErrorCalleeAndCallerGetterSetter):
1416         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerInStrictModeGetterSetter):
1417         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerInClassContextGetterSetter):
1418         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerGetterSetter): Deleted.
1419         * runtime/JSGlobalObjectFunctions.cpp:
1420         (JSC::globalFuncThrowTypeErrorCalleeAndCaller):
1421         (JSC::globalFuncThrowTypeErrorArgumentsAndCallerInStrictMode):
1422         (JSC::globalFuncThrowTypeErrorArgumentsAndCallerInClassContext):
1423         (JSC::globalFuncThrowTypeErrorArgumentsAndCaller): Deleted.
1424         * runtime/JSGlobalObjectFunctions.h:
1425         Rename and expose new handles for new error getter setter native functions.
1426
1427 2016-05-11  Commit Queue  <commit-queue@webkit.org>
1428
1429         Unreviewed, rolling out r200481.
1430         https://bugs.webkit.org/show_bug.cgi?id=157573
1431
1432         it's bad news for asm.js (Requested by pizlo on #webkit).
1433
1434         Reverted changeset:
1435
1436         "Reduce maximum JIT pool size on X86_64."
1437         http://trac.webkit.org/changeset/200481
1438
1439 2016-05-10  Keith Miller  <keith_miller@apple.com>
1440
1441         TypedArray.prototype.slice should not use the byteLength of the passed array for memmove
1442         https://bugs.webkit.org/show_bug.cgi?id=157551
1443         <rdar://problem/26179914>
1444
1445         Reviewed by Michael Saboff.
1446
1447         The TypedArray.prototype.slice function would use the byteLength of the passed array
1448         to determine the amount of data to copy. It should have been using the passed length
1449         times the size of each element. This fixes a crash on JavaPoly.com
1450
1451         * runtime/JSGenericTypedArrayViewInlines.h:
1452         (JSC::JSGenericTypedArrayView<Adaptor>::set):
1453         * tests/stress/typedarray-slice.js:
1454
1455 2016-05-10  Michael Saboff  <msaboff@apple.com>
1456
1457         REGRESSION(r200447): Unable to build C_LOOP with clang version 800.0.12 or higher
1458         https://bugs.webkit.org/show_bug.cgi?id=157549
1459
1460         Reviewed by Keith Miller.
1461
1462         Disable debug annotations for C_LOOP builds.  They are inline assembly directives,
1463         unnecessary and they cause syntax errors.
1464
1465         * offlineasm/asm.rb:
1466
1467 2016-05-10  Filip Pizlo  <fpizlo@apple.com>
1468
1469         Internal JSC profiler should have a timestamped log of events for each code block
1470         https://bugs.webkit.org/show_bug.cgi?id=157538
1471
1472         Reviewed by Benjamin Poulain.
1473         
1474         For example, in 3d-cube, I can query the events for MMulti and I get:
1475
1476         1462917476.17083  MMulti#DTZ7qc                          installCode        
1477         1462917476.179663 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline installCode        
1478         1462917476.179664 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline osrEntry           at bc#49
1479         1462917476.185651 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 1011.214233/1717.000000, -707
1480         1462917476.187913 MMulti#DTZ7qc MMulti#DTZ7qc-2-DFG      installCode        
1481         1462917476.187917 MMulti#DTZ7qc MMulti#DTZ7qc-2-DFG      osrEntry           at bc#49
1482         1462917476.205365 MMulti#DTZ7qc MMulti#DTZ7qc-2-DFG      jettison           due to OSRExit, counting = true, detail = (null)
1483         1462917476.205368 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline frequentExit       bc#65: BadCache/FromDFG
1484         1462917476.205369 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline installCode        
1485         1462917476.205482 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 1013.000000/3434.000000, -1000
1486         1462917476.211547 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 2013.000000/3434.000000, -1000
1487         1462917476.213721 MMulti#DTZ7qc MMulti#DTZ7qc-3-DFG      installCode        
1488         1462917476.213726 MMulti#DTZ7qc MMulti#DTZ7qc-3-DFG      osrEntry           at bc#49
1489         1462917476.223976 MMulti#DTZ7qc MMulti#DTZ7qc-3-DFG      jettison           due to OSRExit, counting = true, detail = (null)
1490         1462917476.223981 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline frequentExit       bc#77: BadCache/FromDFG
1491         1462917476.223982 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline frequentExit       bc#94: BadCache/FromDFG
1492         1462917476.223982 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline installCode        
1493         1462917476.224064 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 1013.000000/6868.000000, -1000
1494         1462917476.224151 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 2013.000000/6868.000000, -1000
1495         1462917476.224258 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 3013.000000/6868.000000, -1000
1496         1462917476.224337 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 4023.000000/6868.000000, -1000
1497         1462917476.224425 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 5023.000000/6868.000000, -1000
1498         1462917476.224785 MMulti#DTZ7qc MMulti#DTZ7qc-1-Baseline delayOptimizeToDFG counter = 6023.396484/6868.000000, -862
1499         1462917476.227669 MMulti#DTZ7qc MMulti#DTZ7qc-4-DFG      installCode        
1500         1462917476.227675 MMulti#DTZ7qc MMulti#DTZ7qc-4-DFG      osrEntry           at bc#0
1501         
1502         The output is ugly but useful. We can make it less ugly later.
1503
1504         * CMakeLists.txt:
1505         * JavaScriptCore.xcodeproj/project.pbxproj:
1506         * bytecode/CodeBlock.cpp:
1507         (JSC::CodeBlock::jettison):
1508         * bytecode/CodeBlock.h:
1509         (JSC::ScriptExecutable::forEachCodeBlock):
1510         * bytecode/DFGExitProfile.cpp:
1511         (JSC::DFG::ExitProfile::add):
1512         * dfg/DFGJITFinalizer.cpp:
1513         (JSC::DFG::JITFinalizer::finalizeCommon):
1514         * dfg/DFGOperations.cpp:
1515         * ftl/FTLJITFinalizer.cpp:
1516         (JSC::FTL::JITFinalizer::finalizeFunction):
1517         * jit/JIT.cpp:
1518         (JSC::JIT::privateCompile):
1519         * jit/JITOperations.cpp:
1520         * llint/LLIntSlowPaths.cpp:
1521         (JSC::LLInt::jitCompileAndSetHeuristics):
1522         (JSC::LLInt::entryOSR):
1523         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1524         * profiler/ProfilerCompilation.cpp:
1525         (JSC::Profiler::Compilation::Compilation):
1526         (JSC::Profiler::Compilation::setJettisonReason):
1527         (JSC::Profiler::Compilation::dump):
1528         (JSC::Profiler::Compilation::toJS):
1529         * profiler/ProfilerCompilation.h:
1530         (JSC::Profiler::Compilation::uid):
1531         * profiler/ProfilerDatabase.cpp:
1532         (JSC::Profiler::Database::ensureBytecodesFor):
1533         (JSC::Profiler::Database::notifyDestruction):
1534         (JSC::Profiler::Database::addCompilation):
1535         (JSC::Profiler::Database::toJS):
1536         (JSC::Profiler::Database::registerToSaveAtExit):
1537         (JSC::Profiler::Database::logEvent):
1538         (JSC::Profiler::Database::addDatabaseToAtExit):
1539         * profiler/ProfilerDatabase.h:
1540         * profiler/ProfilerEvent.cpp: Added.
1541         (JSC::Profiler::Event::dump):
1542         (JSC::Profiler::Event::toJS):
1543         * profiler/ProfilerEvent.h: Added.
1544         (JSC::Profiler::Event::Event):
1545         (JSC::Profiler::Event::operator bool):
1546         (JSC::Profiler::Event::time):
1547         (JSC::Profiler::Event::bytecodes):
1548         (JSC::Profiler::Event::compilation):
1549         (JSC::Profiler::Event::summary):
1550         (JSC::Profiler::Event::detail):
1551         * profiler/ProfilerUID.cpp: Added.
1552         (JSC::Profiler::UID::create):
1553         (JSC::Profiler::UID::dump):
1554         (JSC::Profiler::UID::toJS):
1555         * profiler/ProfilerUID.h: Added.
1556         (JSC::Profiler::UID::UID):
1557         (JSC::Profiler::UID::fromInt):
1558         (JSC::Profiler::UID::toInt):
1559         (JSC::Profiler::UID::operator==):
1560         (JSC::Profiler::UID::operator!=):
1561         (JSC::Profiler::UID::operator bool):
1562         (JSC::Profiler::UID::isHashTableDeletedValue):
1563         (JSC::Profiler::UID::hash):
1564         (JSC::Profiler::UIDHash::hash):
1565         (JSC::Profiler::UIDHash::equal):
1566         * runtime/CommonIdentifiers.h:
1567         * runtime/Executable.cpp:
1568         (JSC::ScriptExecutable::installCode):
1569         * runtime/VM.h:
1570         (JSC::VM::bytecodeIntrinsicRegistry):
1571         (JSC::VM::shadowChicken):
1572         * runtime/VMInlines.h:
1573         (JSC::VM::shouldTriggerTermination):
1574         (JSC::VM::logEvent):
1575
1576 2016-05-10  Joseph Pecoraro  <pecoraro@apple.com>
1577
1578         Web Inspector: Backend should initiate timeline recordings on page navigations to ensure nothing is missed
1579         https://bugs.webkit.org/show_bug.cgi?id=157504
1580         <rdar://problem/26188642>
1581
1582         Reviewed by Brian Burg.
1583
1584         * inspector/protocol/Timeline.json:
1585         Add protocol commands to enable/disable auto capture and list the
1586         instruments that should be enabled when auto capture starts.
1587         Add protocol event for when the backend starts an auto capture.
1588
1589 2016-05-10  Joseph Pecoraro  <pecoraro@apple.com>
1590
1591         Make the different evaluateWithScopeExtension implementations more consistent
1592         https://bugs.webkit.org/show_bug.cgi?id=157536
1593
1594         Reviewed by Timothy Hatcher.
1595
1596         * inspector/JSInjectedScriptHost.cpp:
1597         (Inspector::JSInjectedScriptHost::evaluateWithScopeExtension):
1598         Throw the exception consistent with JSJavaScriptCallFrame.
1599
1600         * inspector/JSJavaScriptCallFrame.cpp:
1601         (Inspector::JSJavaScriptCallFrame::evaluateWithScopeExtension):
1602         Better error message consistent with InjectedScriptHost.
1603
1604         * runtime/Completion.h:
1605         * runtime/Completion.cpp:
1606         (JSC::evaluateWithScopeExtension):
1607         Give this an Exception out parameter like other evaluations
1608         so the caller can decide what to do with it.
1609
1610 2016-05-10  Benjamin Poulain  <bpoulain@apple.com>
1611
1612         [JSC] FTL can produce GetByVal nodes without proper bounds checking
1613         https://bugs.webkit.org/show_bug.cgi?id=157502
1614         rdar://problem/26027027
1615
1616         Reviewed by Filip Pizlo.
1617
1618         It was possible for FTL to generates GetByVal on arbitrary offsets
1619         without any bounds checking.
1620
1621         The bug is caused by the order of optimization phases:
1622         -First, the Integer Range Optimization proves that a CheckInBounds
1623          test can never fail.
1624          This proof is based on control flow or preceeding instructions
1625          inside a loop.
1626         -The Loop Invariant Code Motion phase finds that the GetByVal does not
1627          depend on anything in the loop and hoist it out of the loop.
1628         -> As a result, the conditions that were necessary to eliminate
1629            the CheckInBounds are no longer met before the GetByVal.
1630
1631         This patch just moves the Integer Range Optimization phase after
1632         Loop Invariant Code Motion to make sure no code is moved after
1633         its integer ranges bounds proofs have been used.
1634
1635         * dfg/DFGPlan.cpp:
1636         (JSC::DFG::Plan::compileInThreadImpl):
1637         * tests/stress/bounds-check-not-eliminated-by-licm.js: Added.
1638         (testInLoopTests):
1639
1640 2016-05-10  Joseph Pecoraro  <pecoraro@apple.com>
1641
1642         Web Inspector: Eliminate the crazy code for evaluateOnCallFrame
1643         https://bugs.webkit.org/show_bug.cgi?id=157510
1644         <rdar://problem/26191332>
1645
1646         Reviewed by Timothy Hatcher.
1647
1648         * debugger/DebuggerCallFrame.cpp:
1649         (JSC::DebuggerCallFrame::evaluateWithScopeExtension):
1650         Set and clear an optional scope extension object.
1651
1652         * inspector/InjectedScriptSource.js:
1653         (InjectedScript.prototype.evaluate):
1654         (InjectedScript.prototype._evaluateOn):
1655         (InjectedScript.prototype.evaluateOnCallFrame):
1656         Unify the code to use the passed in evaluate function and object.
1657         When evaluating on a call frame the evaluate function ends up being
1658         DebuggerCallFrame::evaluateWithScopeExtension. When evaluating globally
1659         this ends up being JSInjectedScriptHost::evaluateWithScopeExtension.
1660         In both cases "object" is the preferred this object to use.
1661
1662         * debugger/DebuggerCallFrame.h:
1663         * inspector/JSJavaScriptCallFrame.cpp:
1664         (Inspector::JSJavaScriptCallFrame::evaluateWithScopeExtension):
1665         (Inspector::JSJavaScriptCallFrame::evaluate): Deleted.
1666         * inspector/JSJavaScriptCallFrame.h:
1667         * inspector/JSJavaScriptCallFramePrototype.cpp:
1668         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
1669         (Inspector::jsJavaScriptCallFramePrototypeFunctionEvaluateWithScopeExtension):
1670         * inspector/JavaScriptCallFrame.h:
1671         (Inspector::JavaScriptCallFrame::evaluateWithScopeExtension):
1672         (Inspector::JavaScriptCallFrame::evaluate): Deleted.
1673         Pass through to DebuggerCallFrame with the proper arguments.
1674
1675         * debugger/Debugger.cpp:
1676         (JSC::Debugger::hasBreakpoint):
1677         * inspector/ScriptDebugServer.cpp:
1678         (Inspector::ScriptDebugServer::evaluateBreakpointAction):
1679         Use the new evaluate on call frame method name and no scope extension object.
1680
1681 2016-05-10  Saam barati  <sbarati@apple.com>
1682
1683         Make super-property-access.js test run for less time because it was timing out in debug builds.
1684
1685         Rubber stamped by Filip Pizlo.
1686
1687         * tests/stress/super-property-access.js:
1688         (test):
1689         (test.value):
1690         (test.foo):
1691         (test.B.prototype.bar):
1692         (test.B):
1693
1694 2016-05-10  Csaba Osztrogonác  <ossy@webkit.org>
1695
1696         [JSC] Fix the !ENABLE(DFG_JIT) build
1697         https://bugs.webkit.org/show_bug.cgi?id=157512
1698
1699         Reviewed by Mark Lam.
1700
1701         * jit/Repatch.cpp:
1702
1703 2016-05-09  Joseph Pecoraro  <pecoraro@apple.com>
1704
1705         Web Inspector: CRASH under JSC::DebuggerCallFrame::thisValue when hitting breakpoint
1706         https://bugs.webkit.org/show_bug.cgi?id=157442
1707         <rdar://problem/24172015>
1708
1709         Reviewed by Saam Barati.
1710
1711         * debugger/DebuggerCallFrame.cpp:
1712         (JSC::DebuggerCallFrame::thisValueForCallFrame):
1713         When the thisValue is JSValue() return undefined and avoid calling
1714         toThisValue which would lead to a crash. Having `this` be an empty
1715         JSValue could happen inside an ES6 class constructor, before
1716         calling super.
1717
1718 2016-05-09  Filip Pizlo  <fpizlo@apple.com>
1719
1720         Unreviewed, fix cloop.
1721
1722         * bytecode/ValueProfile.cpp:
1723         (JSC::ResultProfile::emitDetectNumericness):
1724         (JSC::ResultProfile::emitSetNonNumber):
1725         * bytecode/ValueProfile.h:
1726         (JSC::ResultProfile::addressOfFlags):
1727         (JSC::ResultProfile::addressOfSpecialFastPathCount):
1728         (JSC::ResultProfile::detectNumericness):
1729         (JSC::ResultProfile::hasBits):
1730
1731 2016-05-09  Michael Saboff  <msaboff@apple.com>
1732
1733         Crash beneath ObjCCallbackFunctionImpl::call
1734         https://bugs.webkit.org/show_bug.cgi?id=157491
1735
1736         Reviewed by Saam Barati.
1737
1738         Clear any exceptions after the micro task runs.
1739
1740         Tried creating a test case, but I don't have source for the app.
1741         I can't seem to find the right combination of Promises and ObjC code.
1742
1743         * runtime/JSJob.cpp:
1744         (JSC::JSJobMicrotask::run):
1745
1746 2016-05-09  Filip Pizlo  <fpizlo@apple.com>
1747
1748         Polymorphic operands in operators coerces downstream values to double.
1749         https://bugs.webkit.org/show_bug.cgi?id=151793
1750
1751         Reviewed by Mark Lam.
1752         
1753         Previously if an object flowed into arithmetic, the prediction propagation phase would either
1754         assume that the output of the arithmetic had to be double or sometimes it would assume that it
1755         couldn't be double. We want it to only assume that the output is double if it actually had been.
1756         
1757         The first part of this patch is to roll out http://trac.webkit.org/changeset/200502. That removed
1758         some of the machinery that we had in place to detect whether the output of an operation is int or
1759         double. That changeset claimed that the machinery was "fundamentally broken". It actually wasn't.
1760         The reason why it didn't work was that ByteCodeParser was ignoring it if likelyToTakeSlowCase was
1761         false. I think this was a complete goof-up: the code in ByteCodeParser::makeSafe was structured
1762         in a way that made it non-obvious that the method is a no-op if !likelyToTakeSlowCase. So, this
1763         change rolls out r200502 and makes ResultProfile do its job by reshaping how makeSafe processes
1764         it.
1765         
1766         This also makes two other changes to shore up ResultProfile:
1767         - OSR exit can now refine a ResultProfile the same way that it refines ValueProfile.
1768         - Baseline JIT slow paths now set bits in ResultProfile.
1769         
1770         Based on this stuff, the DFG now predicts int/double/string in op_add/op_sub/op_mul based on
1771         ResultProfiles. To be conservative, we still only use the ResultProfiles if the incoming
1772         prediction is not number-or-boolean. This ensures that we exactly retain our old behavior in
1773         those cases for which it was tuned. But I hope to remove this soon. I believe that ResultProfile
1774         is already strictly better than what prediction propagation was doing before.
1775         
1776         This can be an enormous win. This patch adds some simple microbenchmarks that demonstrate the
1777         problem of assuming that arithmetic on objects returns double. The most extreme of these speeds
1778         up 8x with this change (object-int-add-array).
1779         
1780         * CMakeLists.txt:
1781         * JavaScriptCore.xcodeproj/project.pbxproj:
1782         * bytecode/CodeBlock.h:
1783         (JSC::CodeBlock::addFrequentExitSite):
1784         (JSC::CodeBlock::hasExitSite):
1785         * bytecode/DFGExitProfile.cpp:
1786         (JSC::DFG::FrequentExitSite::dump):
1787         (JSC::DFG::ExitProfile::ExitProfile):
1788         (JSC::DFG::ExitProfile::~ExitProfile):
1789         (JSC::DFG::ExitProfile::add):
1790         * bytecode/DFGExitProfile.h:
1791         (JSC::DFG::FrequentExitSite::isHashTableDeletedValue):
1792         * bytecode/MethodOfGettingAValueProfile.cpp:
1793         (JSC::MethodOfGettingAValueProfile::fromLazyOperand):
1794         (JSC::MethodOfGettingAValueProfile::emitReportValue):
1795         (JSC::MethodOfGettingAValueProfile::getSpecFailBucket): Deleted.
1796         * bytecode/MethodOfGettingAValueProfile.h:
1797         (JSC::MethodOfGettingAValueProfile::MethodOfGettingAValueProfile):
1798         (JSC::MethodOfGettingAValueProfile::operator bool):
1799         (JSC::MethodOfGettingAValueProfile::operator!): Deleted.
1800         * bytecode/PolymorphicAccess.cpp:
1801         (JSC::AccessCase::generateImpl):
1802         * bytecode/ValueProfile.cpp:
1803         (JSC::ResultProfile::emitDetectBitsLight):
1804         (JSC::ResultProfile::emitSetDouble):
1805         (JSC::ResultProfile::emitSetNonNumber):
1806         (WTF::printInternal):
1807         * bytecode/ValueProfile.h:
1808         (JSC::ResultProfile::ResultProfile):
1809         (JSC::ResultProfile::bytecodeOffset):
1810         (JSC::ResultProfile::specialFastPathCount):
1811         (JSC::ResultProfile::didObserveNonInt32):
1812         (JSC::ResultProfile::didObserveDouble):
1813         (JSC::ResultProfile::didObserveNonNegZeroDouble):
1814         (JSC::ResultProfile::didObserveNegZeroDouble):
1815         (JSC::ResultProfile::didObserveNonNumber):
1816         (JSC::ResultProfile::didObserveInt32Overflow):
1817         (JSC::ResultProfile::didObserveInt52Overflow):
1818         (JSC::ResultProfile::setObservedNonNegZeroDouble):
1819         (JSC::ResultProfile::setObservedNegZeroDouble):
1820         (JSC::ResultProfile::setObservedNonNumber):
1821         (JSC::ResultProfile::setObservedInt32Overflow):
1822         (JSC::ResultProfile::addressOfFlags):
1823         (JSC::ResultProfile::addressOfSpecialFastPathCount):
1824         (JSC::ResultProfile::detectBitsLight):
1825         (JSC::ResultProfile::hasBits):
1826         * dfg/DFGByteCodeParser.cpp:
1827         (JSC::DFG::ByteCodeParser::makeSafe):
1828         * dfg/DFGFixupPhase.cpp:
1829         (JSC::DFG::FixupPhase::fixupNode):
1830         * dfg/DFGGraph.cpp:
1831         (JSC::DFG::Graph::ensureNaturalLoops):
1832         (JSC::DFG::Graph::methodOfGettingAValueProfileFor):
1833         (JSC::DFG::Graph::valueProfileFor): Deleted.
1834         * dfg/DFGGraph.h:
1835         (JSC::DFG::Graph::hasExitSite):
1836         (JSC::DFG::Graph::numBlocks):
1837         * dfg/DFGNode.h:
1838         (JSC::DFG::Node::arithNodeFlags):
1839         (JSC::DFG::Node::mayHaveNonIntResult):
1840         (JSC::DFG::Node::mayHaveDoubleResult):
1841         (JSC::DFG::Node::mayHaveNonNumberResult):
1842         (JSC::DFG::Node::hasConstantBuffer):
1843         * dfg/DFGNodeFlags.cpp:
1844         (JSC::DFG::dumpNodeFlags):
1845         * dfg/DFGNodeFlags.h:
1846         * dfg/DFGOSRExitCompiler32_64.cpp:
1847         (JSC::DFG::OSRExitCompiler::compileExit):
1848         * dfg/DFGOSRExitCompiler64.cpp:
1849         (JSC::DFG::OSRExitCompiler::compileExit):
1850         * dfg/DFGOperations.cpp:
1851         * dfg/DFGOperations.h:
1852         * dfg/DFGPredictionPropagationPhase.cpp:
1853         * dfg/DFGSpeculativeJIT.h:
1854         (JSC::DFG::SpeculativeJIT::callOperation):
1855         * ftl/FTLOSRExitCompiler.cpp:
1856         (JSC::FTL::compileStub):
1857         * jit/AssemblyHelpers.h:
1858         (JSC::AssemblyHelpers::branchIfEqual):
1859         (JSC::AssemblyHelpers::branchIfNotCell):
1860         (JSC::AssemblyHelpers::branchIfNotNumber):
1861         (JSC::AssemblyHelpers::branchIfNotDoubleKnownNotInt32):
1862         (JSC::AssemblyHelpers::branchIfBoolean):
1863         (JSC::AssemblyHelpers::branchIfEmpty):
1864         (JSC::AssemblyHelpers::branchStructure):
1865         * jit/CCallHelpers.h:
1866         (JSC::CCallHelpers::CCallHelpers):
1867         (JSC::CCallHelpers::setupArguments):
1868         (JSC::CCallHelpers::setupArgumentsWithExecState):
1869         * jit/IntrinsicEmitter.cpp:
1870         (JSC::AccessCase::emitIntrinsicGetter):
1871         * jit/JIT.h:
1872         * jit/JITAddGenerator.cpp:
1873         (JSC::JITAddGenerator::generateFastPath):
1874         * jit/JITAddGenerator.h:
1875         (JSC::JITAddGenerator::JITAddGenerator):
1876         * jit/JITArithmetic.cpp:
1877         (JSC::JIT::emit_op_add):
1878         (JSC::JIT::emitSlow_op_add):
1879         (JSC::JIT::emit_op_div):
1880         (JSC::JIT::emit_op_mul):
1881         (JSC::JIT::emitSlow_op_mul):
1882         (JSC::JIT::emit_op_sub):
1883         (JSC::JIT::emitSlow_op_sub):
1884         * jit/JITInlines.h:
1885         (JSC::JIT::callOperation):
1886         (JSC::JIT::callOperationNoExceptionCheck):
1887         * jit/JITMulGenerator.cpp:
1888         (JSC::JITMulGenerator::generateFastPath):
1889         * jit/JITOperations.cpp:
1890         * jit/JITOperations.h:
1891         * jit/JITSubGenerator.cpp:
1892         (JSC::JITSubGenerator::generateFastPath):
1893         * jit/JITSubGenerator.h:
1894         (JSC::JITSubGenerator::JITSubGenerator):
1895         * jit/TagRegistersMode.cpp: Added.
1896         (WTF::printInternal):
1897         * jit/TagRegistersMode.h: Added.
1898         * runtime/CommonSlowPaths.cpp:
1899         (JSC::updateResultProfileForBinaryArithOp):
1900
1901 2016-05-09  Keith Miller  <keith_miller@apple.com>
1902
1903         CallObjectConstructor should not call operationToThis in the FTL
1904         https://bugs.webkit.org/show_bug.cgi?id=157492
1905         <rdar://problem/26149904>
1906
1907         Reviewed by Mark Lam.
1908
1909         At some point when I was working on intrinsifying the Object
1910         constructor, I realized that the Object constructor was different
1911         from the ToObject operation. I fixed the DFG but I guess I didn't
1912         fix the FTL.
1913
1914         This patch fixes an issue with www.wunderground.com not loading
1915         the 10-day forecast and local map.
1916
1917         * ftl/FTLLowerDFGToB3.cpp:
1918         (JSC::FTL::DFG::LowerDFGToB3::compileCallObjectConstructor):
1919         * tests/stress/call-object-constructor.js: Added.
1920         (test):
1921         (assert):
1922
1923 2016-05-09  Saam barati  <sbarati@apple.com>
1924
1925         Getter and setter on super are called with wrong "this" object
1926         https://bugs.webkit.org/show_bug.cgi?id=147064
1927         <rdar://problem/21885916>
1928
1929         Reviewed by Filip Pizlo.
1930
1931         This patch implements calls to 'super' getters and setters.
1932         The problem before is we were passing the 'super' (i.e, the prototype
1933         object) as the this value to these getters/setters, which is wrong. 
1934         We should be passing the caller's this value.
1935
1936         To implement this behavior, I've introduced four new opcodes and their corresponding DFG nodes:
1937         - op_get_by_id_with_this | GetByIdWithThis
1938         - op_put_by_id_with_this | PutByIdWithThis
1939         - op_get_by_val_with_this | GetByValWithThis
1940         - op_put_by_val_with_this | PutByValWithThis
1941
1942         These are implemented with no optimizations. The future plan is 
1943         to unite them with the *by_id and *by_val opcodes and nodes:
1944         https://bugs.webkit.org/show_bug.cgi?id=157215
1945
1946         * bytecode/BytecodeList.json:
1947         * bytecode/BytecodeUseDef.h:
1948         (JSC::computeUsesForBytecodeOffset):
1949         (JSC::computeDefsForBytecodeOffset):
1950         * bytecode/CodeBlock.cpp:
1951         (JSC::CodeBlock::dumpBytecode):
1952         * bytecompiler/BytecodeGenerator.cpp:
1953         (JSC::BytecodeGenerator::emitGetById):
1954         (JSC::BytecodeGenerator::emitPutById):
1955         (JSC::BytecodeGenerator::emitDirectPutById):
1956         (JSC::BytecodeGenerator::emitGetByVal):
1957         (JSC::BytecodeGenerator::emitPutByVal):
1958         (JSC::BytecodeGenerator::emitDirectPutByVal):
1959         (JSC::BytecodeGenerator::emitLoadDerivedConstructorFromArrowFunctionLexicalEnvironment):
1960         (JSC::BytecodeGenerator::ensureThis):
1961         (JSC::BytecodeGenerator::isThisUsedInInnerArrowFunction):
1962         * bytecompiler/BytecodeGenerator.h:
1963         * bytecompiler/NodesCodegen.cpp:
1964         (JSC::ThisNode::emitBytecode):
1965         (JSC::emitHomeObjectForCallee):
1966         (JSC::emitSuperBaseForCallee):
1967         (JSC::emitGetSuperFunctionForConstruct):
1968         (JSC::SuperNode::emitBytecode):
1969         (JSC::NewTargetNode::emitBytecode):
1970         (JSC::TaggedTemplateNode::emitBytecode):
1971         (JSC::BracketAccessorNode::emitBytecode):
1972         (JSC::DotAccessorNode::emitBytecode):
1973         (JSC::FunctionCallValueNode::emitBytecode):
1974         (JSC::FunctionCallBracketNode::emitBytecode):
1975         (JSC::FunctionCallDotNode::emitBytecode):
1976         (JSC::CallFunctionCallDotNode::emitBytecode):
1977         (JSC::ApplyFunctionCallDotNode::emitBytecode):
1978         (JSC::PostfixNode::emitBracket):
1979         (JSC::PostfixNode::emitDot):
1980         (JSC::PrefixNode::emitBracket):
1981         (JSC::PrefixNode::emitDot):
1982         (JSC::AssignDotNode::emitBytecode):
1983         (JSC::ReadModifyDotNode::emitBytecode):
1984         (JSC::AssignBracketNode::emitBytecode):
1985         (JSC::ReadModifyBracketNode::emitBytecode):
1986         (JSC::ForInNode::emitLoopHeader):
1987         (JSC::ForOfNode::emitBytecode):
1988         (JSC::AssignmentElementNode::bindValue):
1989         * dfg/DFGAbstractInterpreterInlines.h:
1990         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1991         * dfg/DFGByteCodeParser.cpp:
1992         (JSC::DFG::ByteCodeParser::parseBlock):
1993         * dfg/DFGCapabilities.cpp:
1994         (JSC::DFG::capabilityLevel):
1995         * dfg/DFGClobberize.h:
1996         (JSC::DFG::clobberize):
1997         * dfg/DFGDoesGC.cpp:
1998         (JSC::DFG::doesGC):
1999         * dfg/DFGFixupPhase.cpp:
2000         (JSC::DFG::FixupPhase::fixupNode):
2001         * dfg/DFGNode.h:
2002         (JSC::DFG::Node::hasIdentifier):
2003         * dfg/DFGNodeType.h:
2004         * dfg/DFGOperations.cpp:
2005         (JSC::DFG::newTypedArrayWithSize):
2006         (JSC::DFG::putWithThis):
2007         * dfg/DFGOperations.h:
2008         * dfg/DFGPredictionPropagationPhase.cpp:
2009         * dfg/DFGSafeToExecute.h:
2010         (JSC::DFG::safeToExecute):
2011         * dfg/DFGSpeculativeJIT.h:
2012         (JSC::DFG::SpeculativeJIT::callOperation):
2013         * dfg/DFGSpeculativeJIT32_64.cpp:
2014         (JSC::DFG::SpeculativeJIT::compile):
2015         * dfg/DFGSpeculativeJIT64.cpp:
2016         (JSC::DFG::SpeculativeJIT::compile):
2017         * ftl/FTLCapabilities.cpp:
2018         (JSC::FTL::canCompile):
2019         * ftl/FTLLowerDFGToB3.cpp:
2020         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2021         (JSC::FTL::DFG::LowerDFGToB3::compileGetById):
2022         (JSC::FTL::DFG::LowerDFGToB3::compileGetByIdWithThis):
2023         (JSC::FTL::DFG::LowerDFGToB3::compileGetByValWithThis):
2024         (JSC::FTL::DFG::LowerDFGToB3::compilePutByIdWithThis):
2025         (JSC::FTL::DFG::LowerDFGToB3::compilePutByValWithThis):
2026         (JSC::FTL::DFG::LowerDFGToB3::compilePutById):
2027         * jit/CCallHelpers.cpp:
2028         (JSC::CCallHelpers::setupShadowChickenPacket):
2029         (JSC::CCallHelpers::setupFourStubArgsGPR):
2030         * jit/CCallHelpers.h:
2031         (JSC::CCallHelpers::setupArgumentsWithExecState):
2032         (JSC::CCallHelpers::setupThreeStubArgsGPR):
2033         (JSC::CCallHelpers::setupTwoStubArgsFPR):
2034         (JSC::CCallHelpers::setupStubArguments134):
2035         * jit/GPRInfo.h:
2036         (JSC::argumentRegisterFor): Deleted.
2037         * jit/JIT.cpp:
2038         (JSC::JIT::privateCompileMainPass):
2039         * jit/JIT.h:
2040         * jit/JITOperations.h:
2041         * jit/JITPropertyAccess.cpp:
2042         (JSC::JIT::emit_op_put_by_val):
2043         (JSC::JIT::emit_op_put_by_val_with_this):
2044         (JSC::JIT::emitGenericContiguousPutByVal):
2045         (JSC::JIT::emit_op_get_by_id):
2046         (JSC::JIT::emit_op_get_by_id_with_this):
2047         (JSC::JIT::emit_op_get_by_val_with_this):
2048         (JSC::JIT::emitSlow_op_get_by_id):
2049         (JSC::JIT::emit_op_put_by_id):
2050         (JSC::JIT::emit_op_put_by_id_with_this):
2051         (JSC::JIT::emitSlow_op_put_by_id):
2052         * jit/JITPropertyAccess32_64.cpp:
2053         (JSC::JIT::emit_op_put_to_arguments):
2054         (JSC::JIT::emit_op_get_by_id_with_this):
2055         (JSC::JIT::emit_op_get_by_val_with_this):
2056         (JSC::JIT::emit_op_put_by_id_with_this):
2057         (JSC::JIT::emit_op_put_by_val_with_this):
2058         * llint/LowLevelInterpreter.asm:
2059         * runtime/CommonSlowPaths.cpp:
2060         (JSC::SLOW_PATH_DECL):
2061         * runtime/CommonSlowPaths.h:
2062         * tests/stress/super-property-access-exceptions.js: Added.
2063         (assert):
2064         (test):
2065         (test.fooProp):
2066         (test.A.prototype.get foo):
2067         (test.A.prototype.get x):
2068         (test.A):
2069         (test.B):
2070         (test.B.prototype.bar):
2071         (test.B.prototype.baz):
2072         (test.foo):
2073         (test.func):
2074         (test.A.prototype.set foo):
2075         * tests/stress/super-property-access-tdz.js: Added.
2076         (assert):
2077         (test):
2078         (shouldThrowTDZ):
2079         (test.A.prototype.get foo):
2080         (test.A.prototype.set foo):
2081         (test.A):
2082         (test.fooProp):
2083         (test.B):
2084         (test.C):
2085         (test.D):
2086         (test.E):
2087         (test.F):
2088         * tests/stress/super-property-access.js: Added.
2089         (assert):
2090         (test):
2091         (func):
2092         (test.A):
2093         (test.A.prototype.set value):
2094         (test.A.prototype.get value):
2095         (test.B.prototype.set value):
2096         (test.B.prototype.get value):
2097         (test.B):
2098         (test.value):
2099         (test.A.prototype.get func):
2100         (test.B.prototype.inc):
2101         (test.B.prototype.dec):
2102         (test.B.prototype.preInc):
2103         (test.B.prototype.preDec):
2104         (test.B.prototype.plusEq):
2105         (test.B.prototype.minusEq):
2106         (test.B.prototype.timesEq):
2107         (test.B.prototype.divEq):
2108         (test.B.prototype.funcDot):
2109         (test.B.prototype.funcBracket):
2110         (test.foo):
2111         (test.B.prototype.baz):
2112         (test.B.prototype.jaz):
2113         (test.B.prototype.bar):
2114         (test.B.prototype.index):
2115         (test.):
2116         (test.prototype.bar):
2117         (test.A.prototype.set foo):
2118         (test.A.prototype.get array):
2119         (test.A.prototype.get foo):
2120         (test.obj):
2121         (test.A.prototype.get call):
2122         (test.A.prototype.get apply):
2123         (test.B.prototype.foo):
2124         (test.A.prototype.get i):
2125
2126 2016-05-08  Chris Dumez  <cdumez@apple.com>
2127
2128         [COCOA] Disable HAVE_DTRACE at build time
2129         https://bugs.webkit.org/show_bug.cgi?id=157433
2130         <rdar://problem/26148841>
2131
2132         Reviewed by Mark Lam.
2133
2134         Drop DTRACE-related code from JSC since it is very old and seems
2135         unused.
2136
2137         * JavaScriptCore.xcodeproj/project.pbxproj:
2138         * PlatformMac.cmake:
2139         * heap/Heap.cpp:
2140         (JSC::Heap::collectImpl): Deleted.
2141         (JSC::Heap::didFinishCollection): Deleted.
2142         * profiler/ProfileGenerator.cpp:
2143         (JSC::ProfileGenerator::willExecute): Deleted.
2144         (JSC::ProfileGenerator::didExecute): Deleted.
2145         * runtime/Tracing.d: Removed.
2146         * runtime/Tracing.h: Removed.
2147
2148 2016-05-07  Mark Lam  <mark.lam@apple.com>
2149
2150         Add JSC options bytecodeRangeToJITCompile and jitWhitelist.
2151         https://bugs.webkit.org/show_bug.cgi?id=157428
2152
2153         Reviewed by Michael Saboff.
2154
2155         1. Added Options::bytecodeRangeToJITCompile and Options::jitWhitelist options.
2156
2157         2. Moved DFGFunctionWhitelist* to FunctionWhitelist* and made it generic so that
2158            it can be used for more than one whitelist instance.  In this case, we now have
2159            two: the dfgWhitelist and the jitWhitelist.
2160
2161         3. Added "can compile" checks in LLInt::shouldJIT() to check
2162            Options::bytecodeRangeToJITCompile and Options::jitWhitelist.
2163
2164         * CMakeLists.txt:
2165         * JavaScriptCore.xcodeproj/project.pbxproj:
2166         * dfg/DFGDriver.cpp:
2167         (JSC::DFG::getNumCompilations):
2168         (JSC::DFG::ensureGlobalDFGWhitelist):
2169         (JSC::DFG::compileImpl):
2170         * dfg/DFGFunctionWhitelist.cpp: Removed.
2171         * dfg/DFGFunctionWhitelist.h: Removed.
2172
2173         * llint/LLIntSlowPaths.cpp:
2174         (JSC::LLInt::ensureGlobalJITWhitelist):
2175         (JSC::LLInt::shouldJIT):
2176
2177         * runtime/Options.h:
2178
2179         * tools/FunctionWhitelist.cpp: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.cpp.
2180         (JSC::FunctionWhitelist::FunctionWhitelist):
2181         (JSC::FunctionWhitelist::contains):
2182         (JSC::DFG::FunctionWhitelist::ensureGlobalWhitelist): Deleted.
2183         (JSC::DFG::FunctionWhitelist::FunctionWhitelist): Deleted.
2184         (JSC::DFG::FunctionWhitelist::parseFunctionNamesInFile): Deleted.
2185         (JSC::DFG::FunctionWhitelist::contains): Deleted.
2186         * tools/FunctionWhitelist.h: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.h.
2187
2188 2016-05-07  Benjamin Poulain  <bpoulain@apple.com>
2189
2190         [JSC][32bit] stress/tagged-templates-template-object.js fails in debug
2191         https://bugs.webkit.org/show_bug.cgi?id=157436
2192
2193         Reviewed by Filip Pizlo.
2194
2195         * dfg/DFGSpeculativeJIT32_64.cpp:
2196         (JSC::DFG::SpeculativeJIT::compile):
2197         The node OverridesHasInstance had a speculation after a jump.
2198
2199 2016-05-06  Joseph Pecoraro  <pecoraro@apple.com>
2200
2201         Web Inspector: Misc CommandLineAPI cleanup
2202         https://bugs.webkit.org/show_bug.cgi?id=157450
2203
2204         Reviewed by Ryosuke Niwa.
2205
2206         * inspector/InjectedScriptSource.js:
2207         (BasicCommandLineAPI):
2208         Fix mistake in r200533, and modernize related code.
2209
2210 2016-05-06  Joseph Pecoraro  <pecoraro@apple.com>
2211
2212         Web Inspector: Improve console.count()
2213         https://bugs.webkit.org/show_bug.cgi?id=157439
2214         <rdar://problem/26152654>
2215
2216         Reviewed by Timothy Hatcher.
2217
2218           - make console.count() increment an unnamed global counter.
2219           - make console.count(label) increment a counter with that label name.
2220
2221         * inspector/agents/InspectorConsoleAgent.cpp:
2222         (Inspector::InspectorConsoleAgent::count):
2223
2224 2016-05-06  Simon Fraser  <simon.fraser@apple.com>
2225
2226         Enable IOS_TEXT_AUTOSIZING on Mac and make it testable
2227         https://bugs.webkit.org/show_bug.cgi?id=157432
2228         rdar://problem/16406720
2229
2230         Reviewed by Dean Jackson.
2231
2232         Enable IOS_TEXT_AUTOSIZING on Mac so it can be tested.
2233
2234         * Configurations/FeatureDefines.xcconfig:
2235
2236 2016-05-06  Joseph Pecoraro  <pecoraro@apple.com>
2237
2238         Web Inspector: Console: Variables defined with let/const aren't accessible outside of console's scope
2239         https://bugs.webkit.org/show_bug.cgi?id=150752
2240         <rdar://problem/23343385>
2241
2242         Reviewed by Mark Lam.
2243
2244         This approach allows Web Inspector to hang a "Scope Extension", a
2245         WithObjectScope, off the GlobalObject. When resolving identifiers
2246         in fails to resolve anything in the normal scope chain, consult
2247         the scope extension.
2248
2249         This allows us to eliminate the `with (commandLineAPI) { ... }`
2250         block in global console evaluations, and instead makes it a full
2251         program evaluation, with the commandLineAPI available and safely
2252         shadowed by actual variables as expected.
2253
2254         * inspector/InjectedScriptSource.js:
2255         (InjectedScript.prototype._evaluateOn):
2256         Use the new evaluateWithScopeExtension and provide the CommandLineAPI
2257         object as the scope extension object.
2258
2259         (BasicCommandLineAPI):
2260         (BasicCommandLineAPI.inScopeVariables): Deleted.
2261         Simplify now that we don't need to check for variable shadowing ourselves.
2262
2263         * inspector/JSInjectedScriptHost.cpp:
2264         (Inspector::JSInjectedScriptHost::evaluateWithScopeExtension):
2265         * inspector/JSInjectedScriptHost.h:
2266         * inspector/JSInjectedScriptHostPrototype.cpp:
2267         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
2268         (Inspector::jsInjectedScriptHostPrototypeFunctionEvaluateWithScopeExtension):
2269         Provide a new InjectedScriptHost method to evaluate a program
2270         with a scope extension.
2271
2272         * runtime/Completion.cpp:
2273         (JSC::evaluateWithScopeExtension):
2274         * runtime/Completion.h:
2275         General JSC::evaluate function to evaluate a program with a scope extension.
2276
2277         * runtime/JSGlobalObject.cpp:
2278         (JSC::JSGlobalObject::setGlobalScopeExtension):
2279         (JSC::JSGlobalObject::clearGlobalScopeExtension):
2280         (JSC::JSGlobalObject::visitChildren):
2281         * runtime/JSGlobalObject.h:
2282         (JSC::JSGlobalObject::globalScopeExtension):
2283         Hang a scope extension off the global object.
2284
2285         * runtime/JSScope.cpp:
2286         (JSC::JSScope::resolve):
2287         Consult the scope extension when resolve fails to find anything normally.
2288
2289 2016-05-06  Mark Lam  <mark.lam@apple.com>
2290
2291         Add JSC options reportBaselineCompileTimes and reportDFGCompileTimes.
2292         https://bugs.webkit.org/show_bug.cgi?id=157427
2293
2294         Reviewed by Filip Pizlo and Keith Miller.
2295
2296         The compile times reporting options are now:
2297             reportCompileTimes         -> report compile times in all tiers.
2298             reportBaselineCompileTimes -> report compile times in baseline JIT.
2299             reportDFGCompileTimes      -> report compile times in DFG and FTL.
2300             reportFTLCompileTimes      -> report compile times in FTL.
2301
2302         Also updated reportTotalCompileTimes() to collect stats that include the baseline
2303         JIT.  compileTimeStats() is now moved into JIT.cpp (from DFGPlan.cpp). 
2304
2305         * dfg/DFGPlan.cpp:
2306         (JSC::DFG::Plan::reportCompileTimes):
2307         (JSC::DFG::Plan::compileInThread):
2308         (JSC::DFG::Plan::compileInThreadImpl):
2309         (JSC::DFG::Plan::cancel):
2310         (JSC::DFG::Plan::compileTimeStats): Deleted.
2311         * dfg/DFGPlan.h:
2312         (JSC::DFG::Plan::compileTimeStats): Deleted.
2313         * jit/JIT.cpp:
2314         (JSC::ctiPatchCallByReturnAddress):
2315         (JSC::JIT::privateCompile):
2316         (JSC::JIT::stackPointerOffsetFor):
2317         (JSC::JIT::reportCompileTimes):
2318         (JSC::JIT::computeCompileTimes):
2319         (JSC::JIT::compileTimeStats):
2320         * jit/JIT.h:
2321         (JSC::JIT::shouldEmitProfiling):
2322         * jsc.cpp:
2323         (runJSC):
2324         * runtime/Options.h:
2325
2326 2016-05-05  Benjamin Poulain  <bpoulain@apple.com>
2327
2328         [JSC] Get rid of NonNegZeroDouble, it is broken
2329         https://bugs.webkit.org/show_bug.cgi?id=157399
2330         rdar://problem/25339647
2331
2332         Reviewed by Mark Lam.
2333
2334         The profile "NonNegZeroDouble" is fundamentally broken.
2335
2336         It is used by DFG to predict the result of ArithMul as being a Double
2337         or Int32.
2338         The problem is you are likely to mispredict, and when you do, you are
2339         guaranteed to end up in a recompile loop.
2340
2341         The compile loops usually happen like this:
2342         -We speculate you have Int32 despite producing doubles.
2343         -We OSR exit on another node (ValueToInt32 for example) from the result of this ArithMul.
2344         -When we compile this block again, ArithMul will do the same misprediction
2345          because it unconditionally predicts Int32.
2346
2347         The flag NonNegZeroDouble was very unlikely to be set correctly
2348         in the first place.
2349
2350         In LLINT, the flag is only set on the slow path.
2351         Since double*double is on the fast path, those cases are ignored.
2352
2353         In Baseline, the flag is set for any case that falls back on double
2354         multiplication. BUT, the DFG flag was only set for nodes that spend
2355         many iteration in slow path, which obviously does not apply to double*double.
2356
2357         Given the perf drawbacks and the recompile loops, I removed
2358         the whole flag for now.
2359
2360         * bytecode/ValueProfile.cpp:
2361         (WTF::printInternal):
2362         * bytecode/ValueProfile.h:
2363         (JSC::ResultProfile::didObserveNonInt32): Deleted.
2364         (JSC::ResultProfile::didObserveDouble): Deleted.
2365         (JSC::ResultProfile::didObserveNonNegZeroDouble): Deleted.
2366         (JSC::ResultProfile::setObservedNonNegZeroDouble): Deleted.
2367         * dfg/DFGByteCodeParser.cpp:
2368         (JSC::DFG::ByteCodeParser::makeSafe): Deleted.
2369         * dfg/DFGNode.h:
2370         (JSC::DFG::Node::mayHaveNonIntResult): Deleted.
2371         * dfg/DFGNodeFlags.cpp:
2372         (JSC::DFG::dumpNodeFlags): Deleted.
2373         * dfg/DFGNodeFlags.h:
2374         * dfg/DFGPredictionPropagationPhase.cpp:
2375         * jit/JITMulGenerator.cpp:
2376         (JSC::JITMulGenerator::generateFastPath): Deleted.
2377         * runtime/CommonSlowPaths.cpp:
2378         (JSC::updateResultProfileForBinaryArithOp): Deleted.
2379
2380 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
2381
2382         REGRESSION(r200422): Web Inspector: Make new Array Iterator objects play nice with Web Inspector
2383         https://bugs.webkit.org/show_bug.cgi?id=157361
2384         <rdar://problem/26099793>
2385
2386         Reviewed by Timothy Hatcher.
2387
2388         * builtins/ArrayPrototype.js:
2389         (createArrayIterator):
2390         (values):
2391         (keys):
2392         (entries):
2393         * builtins/TypedArrayPrototype.js:
2394         (values):
2395         (keys):
2396         (entries):
2397         * runtime/CommonIdentifiers.h:
2398         Set the kind on the iterator object, that can be shown
2399         to the inspector if the object is shown in the console.
2400
2401         * inspector/InjectedScriptSource.js:
2402         (InjectedScript.prototype._describe):
2403         Get a better name for the new Array Iterator which is just an Object.
2404
2405         * inspector/JSInjectedScriptHost.cpp:
2406         (Inspector::JSInjectedScriptHost::subtype):
2407         (Inspector::JSInjectedScriptHost::getInternalProperties):
2408         Detect and handle ArrayIterator object instances. Porting the code
2409         from the JSArrayIterator code path.
2410
2411 2016-05-05  Benjamin Poulain  <bpoulain@apple.com>
2412
2413         [JSC] In DFG, an OSR Exit on SetLocal can trash its child node
2414         https://bugs.webkit.org/show_bug.cgi?id=157358
2415         rdar://problem/25339647
2416
2417         Reviewed by Filip Pizlo.
2418
2419         When we OSR Exit on SetLocal, the child is never restored if its representation
2420         was changed since the MovHint.
2421
2422         For example, say we have:
2423             @1 = SomethingProducingDouble()
2424             @2 = MovHint(@1)
2425             @3 = ValueRep(@1)
2426             @4 = SetLocal(@3, FlushedInt32)
2427
2428         When we lower SetLocal(), we start by speculating that @3 is an Int32.
2429         Now this can fail if @1 was really a double.
2430         When that happens, we go over the VariableEventStream to find where values
2431         are, and @1 died at @3. Since the speculation failure happens before
2432         the SetLocal event, we don't do anything with @3.
2433
2434         In this patch, I extend the PhantomInsertion phase to keep the MovHint
2435         alive past the SetLocal.
2436
2437         * dfg/DFGPhantomInsertionPhase.cpp:
2438         * tests/stress/multiply-typed-double-and-object.js: Added.
2439         (otherObject.valueOf):
2440         (targetDFG.multiply):
2441         (targetFTL.multiply):
2442
2443 2016-05-05  Oliver Hunt  <oliver@apple.com>
2444
2445         Enable separated heap by default on ios
2446         https://bugs.webkit.org/show_bug.cgi?id=156720
2447
2448         Reviewed by Geoffrey Garen.
2449
2450         We've fixed the xnu side of things, so we can reland this.
2451
2452         * runtime/Options.cpp:
2453         (JSC::recomputeDependentOptions):
2454
2455 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
2456
2457         JSContext Inspector: Better CommandLineAPI in JSContext inspection
2458         https://bugs.webkit.org/show_bug.cgi?id=157387
2459         <rdar://problem/22630583>
2460
2461         Reviewed by Timothy Hatcher.
2462
2463         * inspector/InjectedScriptSource.js:
2464         (InjectedScript.prototype._evaluateOn):
2465         (BasicCommandLineAPI.inScopeVariables):
2466         (BasicCommandLineAPI):
2467         When creating a BasicCommandLineAPI, pass the call frame so
2468         that we don't shadow variables in the callstack.
2469
2470         (BasicCommandLineAPI.methods):
2471         (clear):
2472         (table):
2473         (profile):
2474         (profileEnd):
2475         (keys):
2476         (values):
2477         Some just pass through to console, others are tiny methods.
2478         Implement them, and give them the expected toString string.
2479
2480 2016-05-05  Filip Pizlo  <fpizlo@apple.com>
2481
2482         Reduce maximum JIT pool size on X86_64.
2483
2484         Rubber stamped by Geoffrey Garen.
2485         
2486         This changes our maximum pool size to 100MB. The problem with letting a page allocate much
2487         more than this is that we will sometimes call deleteAllCode() or one of its friends. Deleting
2488         a huge amount of memory is expensive in our allocator.
2489         
2490         So long as we allow for such large-scale code death to happen, and so long as it's expensive,
2491         we should bound the amount of code we end up with in the first place.
2492         
2493         In the long run, we should fix our executable allocator so that it's not so expensive to kill
2494         all code.
2495         
2496         * jit/ExecutableAllocator.h:
2497
2498 2016-05-05  Filip Pizlo  <fpizlo@apple.com>
2499
2500         Reduce thresholds that control the maximum IC stub size.
2501
2502         Rubber stamped by Chris Dumez and Benjamin Poulain.
2503         
2504         This reduces the thresholds to before the megamorphic load optimizations to see if that
2505         recovers a PLT regression.
2506
2507         * runtime/Options.h:
2508
2509 2016-05-05  Filip Pizlo  <fpizlo@apple.com>
2510
2511         We shouldn't crash if DFG AI proved that something was unreachable on one run but then decided not to prove it on another run
2512         https://bugs.webkit.org/show_bug.cgi?id=157379
2513
2514         Reviewed by Mark Lam.
2515         
2516         Any run of DFG AI is a fixpoint that loosens the proof until it can't find any more
2517         counterexamples to the proof.  It errs on the side of loosening proofs, i.e., on the side of
2518         proving fewer things.
2519
2520         We run this fixpoint multiple times since there are multiple points in the DFG optimization
2521         pipeline when we run DFG AI.  Each of those runs completes a fixpoint and produces the
2522         tightest proof it can that did not result in counterexamples being found.
2523
2524         It's possible that on run K of DFG AI, we prove some property, but on run K+1, we don't prove
2525         that property. The code could have changed between the two runs due to other phases. Other
2526         phases may modify the code in such a way that it's less amenable to AI's analysis. Our design
2527         allows this because DFG AI is not 100% precise. It defends itself from making unsound choices
2528         or running forever by sometimes punting on proving some property. It must be able to do this,
2529         and so therefore, it might sometimes prove fewer things on a later run.
2530
2531         Currently in trunk if the property that AI proves on run K but fails to prove on run K+1 is
2532         the reachability of a piece of code, then run K+1 will crash on an assertion at the
2533         Unreachable node. It will complain that it reached an Unreachable. But it might be reaching
2534         that Unreachable because it failed to prove that something earlier was always exiting. That's
2535         OK, see above.
2536
2537         So, we should remove the assertion that AI doesn't see Unreachable.
2538         
2539         No new tests because I don't know how to make this happen. I believe that this happens in the
2540         wild based on crash logs.
2541
2542         * dfg/DFGAbstractInterpreterInlines.h:
2543         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2544
2545 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
2546
2547         Crash if you type "debugger" in the console and continue
2548         https://bugs.webkit.org/show_bug.cgi?id=156924
2549         <rdar://problem/25884189>
2550
2551         Reviewed by Mark Lam.
2552
2553         * inspector/agents/InspectorDebuggerAgent.cpp:
2554         (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame):
2555         Bail with an error when we are not paused.
2556
2557         * inspector/agents/InspectorRuntimeAgent.cpp:
2558         (Inspector::InspectorRuntimeAgent::callFunctionOn):
2559         (Inspector::InspectorRuntimeAgent::getProperties):
2560         (Inspector::InspectorRuntimeAgent::getDisplayableProperties):
2561         (Inspector::InspectorRuntimeAgent::getCollectionEntries):
2562         (Inspector::InspectorRuntimeAgent::saveResult):
2563         Update poor error message.
2564
2565 2016-05-05  Keith Miller  <keith_miller@apple.com>
2566
2567         Add support for delete by value to the DFG
2568         https://bugs.webkit.org/show_bug.cgi?id=157372
2569
2570         Reviewed by Filip Pizlo.
2571
2572         This patch adds basic support for delete by value to the DFG. delete by value
2573         just calls out to a C++ operation on each execution. Additionally, this patch
2574         fixes an issue with delete by id where we would crash if the base was null
2575         or undefined.
2576
2577         * dfg/DFGAbstractInterpreterInlines.h:
2578         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2579         * dfg/DFGByteCodeParser.cpp:
2580         (JSC::DFG::ByteCodeParser::parseBlock):
2581         * dfg/DFGCapabilities.cpp:
2582         (JSC::DFG::capabilityLevel):
2583         * dfg/DFGClobberize.h:
2584         (JSC::DFG::clobberize):
2585         * dfg/DFGDoesGC.cpp:
2586         (JSC::DFG::doesGC):
2587         * dfg/DFGFixupPhase.cpp:
2588         (JSC::DFG::FixupPhase::fixupNode):
2589         * dfg/DFGNodeType.h:
2590         * dfg/DFGPredictionPropagationPhase.cpp:
2591         * dfg/DFGSafeToExecute.h:
2592         (JSC::DFG::safeToExecute):
2593         * dfg/DFGSpeculativeJIT.cpp:
2594         (JSC::DFG::SpeculativeJIT::compileDeleteById):
2595         (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
2596         * dfg/DFGSpeculativeJIT.h:
2597         (JSC::DFG::SpeculativeJIT::callOperation):
2598         * dfg/DFGSpeculativeJIT32_64.cpp:
2599         (JSC::DFG::SpeculativeJIT::compile):
2600         * dfg/DFGSpeculativeJIT64.cpp:
2601         (JSC::DFG::SpeculativeJIT::compile):
2602         * jit/JIT.cpp:
2603         (JSC::JIT::privateCompileMainPass):
2604         * jit/JIT.h:
2605         * jit/JITOperations.cpp:
2606         * jit/JITOperations.h:
2607         * jit/JITPropertyAccess.cpp:
2608         (JSC::JIT::emit_op_del_by_val):
2609         * jit/JITPropertyAccess32_64.cpp:
2610         (JSC::JIT::emit_op_del_by_val):
2611         * tests/stress/delete-by-val.js: Added.
2612         (assert):
2613         (test):
2614         * tests/stress/delete-to-object-exception.js: Added.
2615         (assert):
2616         (test):
2617
2618 2016-05-05  Michael Saboff  <msaboff@apple.com>
2619
2620         Unreviewed build fix after change set r200447.
2621
2622         Made the detection of clang version XCode build specific.
2623         Now shouldEnableDebugAnnotations() should return false for all other build types.
2624
2625         * offlineasm/config.rb:
2626
2627 2016-05-05  Joseph Pecoraro  <pecoraro@apple.com>
2628
2629         Create console object lazily
2630         https://bugs.webkit.org/show_bug.cgi?id=157328
2631
2632         Reviewed by Geoffrey Garen.
2633
2634         * runtime/CommonIdentifiers.h:
2635         * runtime/JSGlobalObject.cpp:
2636         (JSC::createConsoleProperty):
2637         (JSC::JSGlobalObject::init): Deleted.
2638
2639 2016-05-04  Michael Saboff  <msaboff@apple.com>
2640
2641         Enable Dwarf2 debug information in offline assembler for clang compiler
2642         https://bugs.webkit.org/show_bug.cgi?id=157364.
2643
2644         Reviewed by Mark Lam.
2645
2646         Added a new function shouldEnableDebugAnnotations() that determines if
2647         we are using clang and a new enough version to support the debug annotations.
2648
2649         * offlineasm/config.rb:
2650         (shouldEnableDebugAnnotations): Added.
2651
2652 2016-05-04  Keith Miller  <keith_miller@apple.com>
2653
2654         Unreviewed, fix test for new ArrayIteratorPrototype.next() error message.
2655
2656         * tests/stress/array-iterators-next-with-call.js:
2657
2658 2016-05-04  Filip Pizlo  <fpizlo@apple.com>
2659
2660         Speed up JSGlobalObject initialization by making some properties lazy
2661         https://bugs.webkit.org/show_bug.cgi?id=157045
2662
2663         Reviewed by Keith Miller.
2664         
2665         This makes about half of JSGlobalObject's state lazy. There are three categories of
2666         state in JSGlobalObject:
2667         
2668         1) C++ fields in JSGlobalObject.
2669         2) JS object properties in JSGlobalObject's JSObject superclass.
2670         3) JS variables in JSGlobalObject's JSSegmentedVariableObject superclass.
2671         
2672         State held in JS variables cannot yet be made lazy. That's why this patch only goes
2673         half-way.
2674         
2675         State in JS object properties can be made lazy if we move it to the static property
2676         hashtable. JSGlobalObject already had one of those. This patch makes static property
2677         hashtables a lot more powerful, by adding three new kinds of static properties. These
2678         new kinds allow us to make almost all of JSGlobalObject's object properties lazy.
2679         
2680         State in C++ fields can now be made lazy thanks in part to WTF's support for stateless
2681         lambdas. You can of course make anything lazy by hand, but there are many C++ fields in
2682         JSGlobalObject and we are adding more all the time. We don't want to require that each
2683         of these has a getter with an initialization check and a corresponding out-of-line slow
2684         path that does the initialization. We want this kind of boilerplate to be handled by
2685         some abstractions.
2686         
2687         The primary abstraction introduced in this patch is LazyProperty<Type>. Currently, this
2688         only works where Type is a subclass of JSCell. Such a property holds a pointer to Type.
2689         You can use it like you would a WriteBarrier<Type>. It even has set() and get() methods,
2690         so it's almost a drop-in replacement.
2691         
2692         The key to LazyProperty<Type>'s power is that you can do this:
2693         
2694             class Bar {
2695                 ...
2696                 LazyProperty<Foo> m_foo;
2697             };
2698             ...
2699             m_foo.initLater(
2700                 [] (const LazyProperty<Foo>::Initializer<Bar>& init) {
2701                     init.set(Foo::create(init.vm, init.owner));
2702                 });
2703         
2704         This initLater() call requires that you pass a stateless lambda (see WTF changelog for
2705         the definition). Miraculously, this initLater() call is guaranteed to compile to a store
2706         of a pointer constant to m_foo, as in:
2707         
2708             movabsq 0xBLAH, %rax
2709             movq %rax, &m_foo
2710         
2711         This magical pointer constant points to a callback that was generated by the template
2712         instantiation of initLater(). That callback knows to call your stateless lambda, but
2713         also does some other bookkeeping: it makes sure that you indeed initialized the property
2714         inside the callback and it manages recursive initializations. It's totally legal to call
2715         m_foo.get() inside the initLater() callback. If you do that before you call init.set(),
2716         m_foo.get() will return null. This is an excellent escape hatch if we ever find
2717         ourselves in a dependency cycle. I added this feature because I already had to create a
2718         dependency cycle.
2719         
2720         Note that using LazyProperties from DFG threads is super awkward. It's going to be hard
2721         to get this right. The DFG thread cannot initialize those fields, so it has to make sure
2722         that it does conservative things. But for some nodes this could mean adding a lot of new
2723         logic, like NewTypedArray, which currently is written in such a way that it assumes that
2724         we always have the typed array structure. Currently we take a two-fold approach: for
2725         typed arrays we don't handle the NewTypedArray intrinsic if the structure isn't
2726         initialized, and for everything else we don't make the properties lazy if the DFG needs
2727         them. As we optimize this further we might need to teach the DFG to handle more lazy
2728         properties. I tried to do this for RegExp but found it to be very confusing. With typed
2729         arrays I got lucky.
2730         
2731         There is also a somewhat more powerful construct called LazyClassStructure. We often
2732         need to keep around the structure of some standard JS class, like Date. We also need to
2733         make sure that the constructor ends up in the global object's property table. And we
2734         often need to keep the original value of the constructor for ourselves. In this case, we
2735         want to make sure that the creation of the structure-prototype-constructor constellation
2736         is atomic. We don't want code to start looking at the structure if it points to a
2737         prototype that doesn't have its "constructor" property set yet, for example.
2738         LazyClassStructure solves this by abstracting that whole initialization. You provide the
2739         callback that allocates everything, since we are super inconsistent about the way we
2740         initialize things, but LazyClassStructure establishes the workflow and helps you not
2741         mess up.
2742         
2743         Finally, the new static hashtable attributes allow for all of this to work with the JS
2744         property table:
2745         
2746         PropertyCallback: if you use this attribute, the second column in the table should be
2747         the name of a function to call to initialize this property. This is useful for things
2748         like the Math property. The Math object turns out to be very expensive to allocate.
2749         Delaying its allocation is super easy with the PropertyCallback attribute.
2750         
2751         CellProperty: with this attribute the second column should be a C++ field name like
2752         JSGlobalObject::m_evalErrorConstructor. The static hashtable will grab the offset of
2753         this property, and when it needs to be initialized, Lookup will assume you have a
2754         LazyProperty<JSCell> and call its get() method. It will initialize the property to
2755         whatever get() returned. Note that it's legal to cast a LazyProperty<Anything> to
2756         LazyProperty<JSCell> for the purpose of calling get() because the get() method will just
2757         call whatever callback function pointer is encoded in the property and it does not need
2758         to know anything about what type that callback will instantiate.
2759         
2760         ClassStructure: with this attribute the second column should be a C++ field name. The
2761         static hashtable will initialize the property by treating the field as a
2762         LazyClassStructure and it will call get(). LazyClassStructure completely owns the whole
2763         initialization workflow, so Lookup assumes that when LazyClassStructure::get() returns,
2764         the property in question will already be set. By convention, we have LazyClassStructure
2765         initialize the property with a pointer to the constructor, since that's how all of our
2766         classes work: "globalObject.Date" points to the DateConstructor.
2767         
2768         This is a 2x speed-up in JSGlobalObject initialization time in a microbenchmark that
2769         calls our C API. This is a 1% speed-up on SunSpider and JSRegress.
2770         
2771         Rolling this back in after fixing the function pointer alignment issue. The last version
2772         relied on function pointers being aligned to a 4-byte boundary. We cannot rely on this,
2773         especially since ARMv7 uses the low bit of function pointers as a tag to indicate the
2774         instruction set. This version adds an extra indirection, so that
2775         LazyProperty<>::m_pointer points to a pointer that points to the function. A pointer to
2776         a pointer is guaranteed to be at least 4-byte aligned.
2777
2778         * API/JSCallbackFunction.cpp:
2779         (JSC::JSCallbackFunction::create):
2780         * API/ObjCCallbackFunction.h:
2781         (JSC::ObjCCallbackFunction::impl):
2782         * API/ObjCCallbackFunction.mm:
2783         (JSC::ObjCCallbackFunction::ObjCCallbackFunction):
2784         (JSC::ObjCCallbackFunction::create):
2785         * CMakeLists.txt:
2786         * JavaScriptCore.xcodeproj/project.pbxproj:
2787         * create_hash_table:
2788         * debugger/DebuggerScope.cpp:
2789         (JSC::DebuggerScope::create):
2790         (JSC::DebuggerScope::DebuggerScope):
2791         * debugger/DebuggerScope.h:
2792         (JSC::DebuggerScope::jsScope):
2793         (JSC::DebuggerScope::create): Deleted.
2794         * dfg/DFGAbstractInterpreterInlines.h:
2795         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2796         * dfg/DFGAbstractValue.cpp:
2797         (JSC::DFG::AbstractValue::set):
2798         * dfg/DFGArrayMode.cpp:
2799         (JSC::DFG::ArrayMode::originalArrayStructure):
2800         * dfg/DFGByteCodeParser.cpp:
2801         (JSC::DFG::ByteCodeParser::handleTypedArrayConstructor):
2802         * dfg/DFGSpeculativeJIT.cpp:
2803         (JSC::DFG::SpeculativeJIT::compileNewTypedArray):
2804         * dfg/DFGSpeculativeJIT32_64.cpp:
2805         (JSC::DFG::SpeculativeJIT::compile):
2806         * dfg/DFGSpeculativeJIT64.cpp:
2807         (JSC::DFG::SpeculativeJIT::compile):
2808         * dfg/DFGStructureRegistrationPhase.cpp:
2809         (JSC::DFG::StructureRegistrationPhase::run):
2810         * ftl/FTLLowerDFGToB3.cpp:
2811         (JSC::FTL::DFG::LowerDFGToB3::compileNewTypedArray):
2812         * runtime/ClonedArguments.cpp:
2813         (JSC::ClonedArguments::getOwnPropertySlot):
2814         (JSC::ClonedArguments::materializeSpecials):
2815         * runtime/CommonSlowPaths.cpp:
2816         (JSC::SLOW_PATH_DECL):
2817         * runtime/FunctionPrototype.cpp:
2818         (JSC::functionProtoFuncToString):
2819         * runtime/InternalFunction.cpp:
2820         (JSC::InternalFunction::visitChildren):
2821         (JSC::InternalFunction::name):
2822         (JSC::InternalFunction::calculatedDisplayName):
2823         (JSC::InternalFunction::createSubclassStructure):
2824         * runtime/InternalFunction.h:
2825         * runtime/JSBoundFunction.cpp:
2826         (JSC::JSBoundFunction::finishCreation):
2827         (JSC::JSBoundFunction::visitChildren):
2828         * runtime/JSBoundSlotBaseFunction.cpp:
2829         (JSC::JSBoundSlotBaseFunction::create):
2830         * runtime/JSFunction.cpp:
2831         (JSC::retrieveCallerFunction):
2832         (JSC::getThrowTypeErrorGetterSetter):
2833         (JSC::JSFunction::callerGetter):
2834         (JSC::JSFunction::getOwnPropertySlot):
2835         (JSC::JSFunction::defineOwnProperty):
2836         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
2837         (JSC::constructGenericTypedArrayView):
2838         * runtime/JSGlobalObject.cpp:
2839         (JSC::createProxyProperty):
2840         (JSC::createJSONProperty):
2841         (JSC::createMathProperty):
2842         (JSC::JSGlobalObject::init):
2843         (JSC::JSGlobalObject::stringPrototypeChainIsSane):
2844         (JSC::JSGlobalObject::resetPrototype):
2845         (JSC::JSGlobalObject::visitChildren):
2846         (JSC::JSGlobalObject::toThis):
2847         (JSC::JSGlobalObject::getOwnPropertySlot):
2848         (JSC::JSGlobalObject::createThrowTypeError): Deleted.
2849         (JSC::JSGlobalObject::createThrowTypeErrorArgumentsAndCaller): Deleted.
2850         * runtime/JSGlobalObject.h:
2851         (JSC::JSGlobalObject::objectConstructor):
2852         (JSC::JSGlobalObject::promiseConstructor):
2853         (JSC::JSGlobalObject::internalPromiseConstructor):
2854         (JSC::JSGlobalObject::evalErrorConstructor):
2855         (JSC::JSGlobalObject::rangeErrorConstructor):
2856         (JSC::JSGlobalObject::referenceErrorConstructor):
2857         (JSC::JSGlobalObject::syntaxErrorConstructor):
2858         (JSC::JSGlobalObject::typeErrorConstructor):
2859         (JSC::JSGlobalObject::URIErrorConstructor):
2860         (JSC::JSGlobalObject::nullGetterFunction):
2861         (JSC::JSGlobalObject::nullSetterFunction):
2862         (JSC::JSGlobalObject::callFunction):
2863         (JSC::JSGlobalObject::applyFunction):
2864         (JSC::JSGlobalObject::definePropertyFunction):
2865         (JSC::JSGlobalObject::arrayProtoValuesFunction):
2866         (JSC::JSGlobalObject::initializePromiseFunction):
2867         (JSC::JSGlobalObject::newPromiseCapabilityFunction):
2868         (JSC::JSGlobalObject::functionProtoHasInstanceSymbolFunction):
2869         (JSC::JSGlobalObject::regExpProtoExecFunction):
2870         (JSC::JSGlobalObject::regExpProtoSymbolReplaceFunction):
2871         (JSC::JSGlobalObject::regExpProtoGlobalGetter):
2872         (JSC::JSGlobalObject::regExpProtoUnicodeGetter):
2873         (JSC::JSGlobalObject::throwTypeErrorGetterSetter):
2874         (JSC::JSGlobalObject::throwTypeErrorArgumentsAndCallerGetterSetter):
2875         (JSC::JSGlobalObject::moduleLoader):
2876         (JSC::JSGlobalObject::objectPrototype):
2877         (JSC::JSGlobalObject::functionPrototype):
2878         (JSC::JSGlobalObject::arrayPrototype):
2879         (JSC::JSGlobalObject::booleanPrototype):
2880         (JSC::JSGlobalObject::stringPrototype):
2881         (JSC::JSGlobalObject::symbolPrototype):
2882         (JSC::JSGlobalObject::numberPrototype):
2883         (JSC::JSGlobalObject::datePrototype):
2884         (JSC::JSGlobalObject::regExpPrototype):
2885         (JSC::JSGlobalObject::errorPrototype):
2886         (JSC::JSGlobalObject::iteratorPrototype):
2887         (JSC::JSGlobalObject::generatorFunctionPrototype):
2888         (JSC::JSGlobalObject::generatorPrototype):
2889         (JSC::JSGlobalObject::debuggerScopeStructure):
2890         (JSC::JSGlobalObject::withScopeStructure):
2891         (JSC::JSGlobalObject::strictEvalActivationStructure):
2892         (JSC::JSGlobalObject::activationStructure):
2893         (JSC::JSGlobalObject::moduleEnvironmentStructure):
2894         (JSC::JSGlobalObject::directArgumentsStructure):
2895         (JSC::JSGlobalObject::scopedArgumentsStructure):
2896         (JSC::JSGlobalObject::clonedArgumentsStructure):
2897         (JSC::JSGlobalObject::isOriginalArrayStructure):
2898         (JSC::JSGlobalObject::booleanObjectStructure):
2899         (JSC::JSGlobalObject::callbackConstructorStructure):
2900         (JSC::JSGlobalObject::callbackFunctionStructure):
2901         (JSC::JSGlobalObject::callbackObjectStructure):
2902         (JSC::JSGlobalObject::propertyNameIteratorStructure):
2903         (JSC::JSGlobalObject::objcCallbackFunctionStructure):
2904         (JSC::JSGlobalObject::objcWrapperObjectStructure):
2905         (JSC::JSGlobalObject::dateStructure):
2906         (JSC::JSGlobalObject::nullPrototypeObjectStructure):
2907         (JSC::JSGlobalObject::errorStructure):
2908         (JSC::JSGlobalObject::calleeStructure):
2909         (JSC::JSGlobalObject::functionStructure):
2910         (JSC::JSGlobalObject::boundFunctionStructure):
2911         (JSC::JSGlobalObject::boundSlotBaseFunctionStructure):
2912         (JSC::JSGlobalObject::getterSetterStructure):
2913         (JSC::JSGlobalObject::nativeStdFunctionStructure):
2914         (JSC::JSGlobalObject::namedFunctionStructure):
2915         (JSC::JSGlobalObject::functionNameOffset):
2916         (JSC::JSGlobalObject::numberObjectStructure):
2917         (JSC::JSGlobalObject::privateNameStructure):
2918         (JSC::JSGlobalObject::mapStructure):
2919         (JSC::JSGlobalObject::regExpStructure):
2920         (JSC::JSGlobalObject::generatorFunctionStructure):
2921         (JSC::JSGlobalObject::setStructure):
2922         (JSC::JSGlobalObject::stringObjectStructure):
2923         (JSC::JSGlobalObject::symbolObjectStructure):
2924         (JSC::JSGlobalObject::iteratorResultObjectStructure):
2925         (JSC::JSGlobalObject::lazyTypedArrayStructure):
2926         (JSC::JSGlobalObject::typedArrayStructure):
2927         (JSC::JSGlobalObject::typedArrayStructureConcurrently):
2928         (JSC::JSGlobalObject::isOriginalTypedArrayStructure):
2929         (JSC::JSGlobalObject::typedArrayConstructor):
2930         (JSC::JSGlobalObject::actualPointerFor):
2931         (JSC::JSGlobalObject::internalFunctionStructure): Deleted.
2932         * runtime/JSNativeStdFunction.cpp:
2933         (JSC::JSNativeStdFunction::create):
2934         * runtime/JSWithScope.cpp:
2935         (JSC::JSWithScope::create):
2936         (JSC::JSWithScope::visitChildren):
2937         (JSC::JSWithScope::createStructure):
2938         (JSC::JSWithScope::JSWithScope):
2939         * runtime/JSWithScope.h:
2940         (JSC::JSWithScope::object):
2941         (JSC::JSWithScope::create): Deleted.
2942         (JSC::JSWithScope::createStructure): Deleted.
2943         (JSC::JSWithScope::JSWithScope): Deleted.
2944         * runtime/LazyClassStructure.cpp: Added.
2945         (JSC::LazyClassStructure::Initializer::Initializer):
2946         (JSC::LazyClassStructure::Initializer::setPrototype):
2947         (JSC::LazyClassStructure::Initializer::setStructure):
2948         (JSC::LazyClassStructure::Initializer::setConstructor):
2949         (JSC::LazyClassStructure::visit):
2950         (JSC::LazyClassStructure::dump):
2951         * runtime/LazyClassStructure.h: Added.
2952         (JSC::LazyClassStructure::LazyClassStructure):
2953         (JSC::LazyClassStructure::get):
2954         (JSC::LazyClassStructure::prototype):
2955         (JSC::LazyClassStructure::constructor):
2956         (JSC::LazyClassStructure::getConcurrently):
2957         (JSC::LazyClassStructure::prototypeConcurrently):
2958         (JSC::LazyClassStructure::constructorConcurrently):
2959         * runtime/LazyClassStructureInlines.h: Added.
2960         (JSC::LazyClassStructure::initLater):
2961         * runtime/LazyProperty.h: Added.
2962         (JSC::LazyProperty::Initializer::Initializer):
2963         (JSC::LazyProperty::LazyProperty):
2964         (JSC::LazyProperty::get):
2965         (JSC::LazyProperty::getConcurrently):
2966         * runtime/LazyPropertyInlines.h: Added.
2967         (JSC::ElementType>::Initializer::set):
2968         (JSC::ElementType>::initLater):
2969         (JSC::ElementType>::setMayBeNull):
2970         (JSC::ElementType>::set):
2971         (JSC::ElementType>::visit):
2972         (JSC::ElementType>::dump):
2973         (JSC::ElementType>::callFunc):
2974         * runtime/Lookup.cpp:
2975         (JSC::setUpStaticFunctionSlot):
2976         * runtime/Lookup.h:
2977         (JSC::HashTableValue::function):
2978         (JSC::HashTableValue::functionLength):
2979         (JSC::HashTableValue::propertyGetter):
2980         (JSC::HashTableValue::propertyPutter):
2981         (JSC::HashTableValue::accessorGetter):
2982         (JSC::HashTableValue::accessorSetter):
2983         (JSC::HashTableValue::constantInteger):
2984         (JSC::HashTableValue::lexerValue):
2985         (JSC::HashTableValue::lazyCellPropertyOffset):
2986         (JSC::HashTableValue::lazyClassStructureOffset):
2987         (JSC::HashTableValue::lazyPropertyCallback):
2988         (JSC::getStaticPropertySlot):
2989         (JSC::getStaticValueSlot):
2990         (JSC::putEntry):
2991         (JSC::reifyStaticProperty):
2992         * runtime/PropertySlot.h:
2993         * runtime/TypedArrayType.h:
2994
2995 2016-05-04  Joseph Pecoraro  <pecoraro@apple.com>
2996
2997         Improve the grammar of some error messages 'a argument list' => 'an argument list'
2998         https://bugs.webkit.org/show_bug.cgi?id=157350
2999         <rdar://problem/26082108>
3000
3001         Reviewed by Mark Lam.
3002
3003         * parser/Parser.cpp:
3004         (JSC::Parser<LexerType>::parseIfStatement):
3005         (JSC::Parser<LexerType>::parseImportDeclaration):
3006         (JSC::Parser<LexerType>::parseExportDeclaration):
3007         (JSC::Parser<LexerType>::parseObjectLiteral):
3008         (JSC::Parser<LexerType>::parseStrictObjectLiteral):
3009         (JSC::Parser<LexerType>::parseArguments):
3010         Use the alternate error message formatter macro which outputs 'an'
3011         instead of 'a' preceding the last argument.
3012
3013 2016-05-04  Keith Miller  <keith_miller@apple.com>
3014
3015         Corrections to r200422
3016         https://bugs.webkit.org/show_bug.cgi?id=157351
3017
3018         Reviewed by Joseph Pecoraro.
3019
3020         Fix some typos in various files. Also, make separate error messages
3021         for the this value being undefined vs null in the ArrayIteratorprototype
3022         next function and add test.
3023
3024         * Scripts/builtins/builtins_model.py:
3025         * builtins/ArrayIteratorPrototype.js:
3026         (next):
3027         (arrayIteratorValueNext):
3028         (arrayIteratorKeyNext):
3029         (arrayIteratorKeyValueNext):
3030         * builtins/ArrayPrototype.js:
3031         (keys):
3032         (entries):
3033         * builtins/TypedArrayPrototype.js:
3034         * runtime/JSGlobalObject.cpp:
3035         (JSC::JSGlobalObject::init): Deleted.
3036         * tests/stress/array-iterators-next-error-messages.js: Added.
3037         (assert):
3038         (catch):
3039
3040 2016-05-04  Keith Miller  <keith_miller@apple.com>
3041
3042         Unreviewed, reland r200149 since the rollout had inconclusive PLT AB testing results.
3043
3044 2016-05-04  Mark Lam  <mark.lam@apple.com>
3045
3046         ES6 Function.name inferred from property names of literal objects can break some websites.
3047         https://bugs.webkit.org/show_bug.cgi?id=157246
3048
3049         Reviewed by Geoffrey Garen.
3050
3051         Specifically, the library mathjs (see http://mathjs.org and https://github.com/josdejong/mathjs)
3052         uses an idiom where it created literal objects with property names that look like
3053         this: 'number | BigNumber | Unit'.  Later, this name is used in a string to create
3054         function source code that gets eval'ed.  Since 'number | BigNumber | Unit' is not
3055         a valid function name, we get a syntax error.
3056
3057         Here are the details:
3058
3059         1. mathjs uses object literals with the funky property names for its function members.
3060            For example, 
3061
3062               // helper function to type check the middle value of the array
3063               var middle = typed({
3064                 'number | BigNumber | Unit': function (value) {
3065                   return value;
3066                 }
3067               });
3068
3069         2. mathjs' getName() uses Function.name to get the name of functions (hence, picks
3070            up the property name as inferred value of Function.name as specified by ES6):
3071
3072                 /**
3073                  * Retrieve the function name from a set of functions, and check
3074                  * whether the name of all functions match (if given)
3075                  ...
3076                  */
3077                 function getName (fns) {
3078                   var name = '';
3079
3080                   for (var i = 0; i < fns.length; i++) {
3081                     var fn = fns[i];
3082                     ...
3083                         name = fn.name;
3084                     ...
3085                   return name;
3086                 }
3087
3088         3. mathjs uses that name to assembler new function source code that gets eval'ed:
3089
3090                 /**
3091                  * Compose a function from sub-functions each handling a single type signature.
3092                  ...
3093                  */
3094                 function _typed(name, signatures) {
3095                   ...
3096                   // generate code for the typed function
3097                   var code = [];
3098                   var _name = name || '';
3099                   ...
3100                   code.push('function ' + _name + '(' + _args.join(', ') + ') {');
3101                   code.push('  "use strict";');
3102                   code.push('  var name = \'' + _name + '\';');
3103                   code.push(node.toCode(refs, '  '));
3104                   code.push('}');
3105
3106                   // generate body for the factory function
3107                   var body = [
3108                     refs.toCode(),
3109                     'return ' + code.join('\n')
3110                   ].join('\n');
3111
3112                   // evaluate the JavaScript code and attach function references
3113                   var factory = (new Function(refs.name, 'createError', body));  // <== Syntax Error here!
3114                   var fn = factory(refs, createError);
3115                   ...
3116                   return fn;
3117                 }
3118
3119         Until mathjs (and any other frameworks that does similar things) and sites that
3120         uses mathjs has been updated to work with ES6, we'll need a compatibility hack to
3121         work around it.
3122
3123         Here's what we'll do:
3124         1. Introduce a needsSiteSpecificQuirks flag in JSGlobalObject.
3125         2. Have WebCore's JSDOMWindowBase set that flag if the browser's
3126            needsSiteSpecificQuirks is enabled in its settings.
3127         3. If needsSiteSpecificQuirks is enabled, have JSFunction::reifyName() check for
3128            ' ' or '|' in the name string it will use to reify the Function.name property.
3129            If those characters exists in the name, we'll replace the name string with a
3130            null string.
3131
3132         * runtime/JSFunction.cpp:
3133         (JSC::JSFunction::reifyName):
3134         * runtime/JSGlobalObject.h:
3135         (JSC::JSGlobalObject::needsSiteSpecificQuirks):
3136         (JSC::JSGlobalObject::GlobalPropertyInfo::GlobalPropertyInfo):
3137         (JSC::JSGlobalObject::setNeedsSiteSpecificQuirks):
3138
3139 2016-05-04  Keith Miller  <keith_miller@apple.com>
3140
3141         Speedup array iterators
3142         https://bugs.webkit.org/show_bug.cgi?id=157315
3143
3144         Reviewed by Michael Saboff.
3145
3146         This patch improves the performance of Array iterators in ES6. There are two main changes
3147         that make things faster. The first is that the value, keys and entries functions have been
3148         moved to JS. This enables us to inline the construction of the iterator. Thus, when we get
3149         to the FTL we are able to sink the allocation of the iterator object. This significantly
3150         improves the performance of any for-of loop since we are now able to have both the iteration
3151         counter and the iterated object in local variables rather than in the heap.
3152
3153         Secondly, instead of using a number to store the iteratation kind we now use a virtual
3154         method on the iteration object to indicate which next function to use. This ends up being
3155         helpful because it means we can eliminate the branches in the old next function that decide
3156         what value to return. With those branches gone the various next functions are now small
3157         enough to inline. Once the next functions are inlined then the FTL is able to sink the
3158         allocation of next() result object. There is still room for optimization in the loop since
3159         we currently don't recognize that the array access in the next function is in bounds or that
3160         the increment to the loop counter cannot overflow.
3161
3162         The overall performance changes appear to be a ~4-6x speedup in a simple microbenchmark that
3163         computes the sum of an array with some extra arithmetic. The variance depends on the exact
3164         body of the loop. Additionally, on a new regress test that changes all the loops in
3165         deltablue into for-of loops this patch is a 1.8x progression. Overall, it still looks like
3166         for-of loops are significantly slower than an indexed for loop. In the first test it's ~2-4x
3167         slower with the difference depending on the body of the loop. If the loop is just the sum
3168         then we see a much larger regression than if the loop does even simple arithmetic. It looks
3169         like the indexed for loop without extra arithmetic is small enough to fit into the x86
3170         replay buffer on my machine, which would explain why there is such a big difference between
3171         the for of loop in that case. On the deltablue benchmark it's 1.4x slower. It's clear from
3172         these numbers that there is still a lot of work we can do to make for of loops faster.
3173
3174         This patch also makes some changes to the way that we decorate our builtin js
3175         functions. Instead of the old syntax (putting the decorated values in [] before the function
3176         declaration i.e. [intrinsic=foo]) this patch changes the syntax to be closer to the way that
3177         decorators are proposed in a future ECMAScript proposal (using @ followed by the entry on a
3178         new line before the function declaration i.e. @intrinsic=foo).
3179
3180         Finally, in the builtin scripts regular expressions re.S has been changed to re.DOTALL since
3181         DOTALL is easier to understand without going to the reference page for python regular
3182         expressions.
3183
3184         * Scripts/builtins/builtins_model.py:
3185         * builtins/ArrayIteratorPrototype.js:
3186         (next):
3187         (arrayIteratorValueNext):
3188         (arrayIteratorKeyNext):
3189         (arrayIteratorKeyValueNext):
3190         * builtins/ArrayPrototype.js:
3191         (createArrayIterator):
3192         (values):
3193         (keys):
3194         (entries):
3195         * builtins/RegExpPrototype.js:
3196         (intrinsic.RegExpTestIntrinsic.test):
3197         * builtins/StringPrototype.js:
3198         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
3199         * builtins/TypedArrayPrototype.js:
3200         (values):
3201         (keys):
3202         (entries):
3203         * inspector/JSInjectedScriptHost.cpp:
3204         (Inspector::cloneArrayIteratorObject):
3205         (Inspector::JSInjectedScriptHost::iteratorEntries):
3206         * jit/ThunkGenerators.cpp:
3207         * runtime/ArrayPrototype.cpp:
3208         (JSC::ArrayPrototype::finishCreation):
3209         (JSC::arrayProtoFuncValues): Deleted.
3210         (JSC::arrayProtoFuncEntries): Deleted.
3211         (JSC::arrayProtoFuncKeys): Deleted.
3212         * runtime/CommonIdentifiers.h:
3213         * runtime/JSArrayIterator.cpp:
3214         (JSC::JSArrayIterator::clone): Deleted.
3215         * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
3216         (JSC::genericTypedArrayViewProtoFuncEntries): Deleted.
3217         (JSC::genericTypedArrayViewProtoFuncKeys): Deleted.
3218         (JSC::typedArrayViewProtoFuncValues): Deleted.
3219         * runtime/JSGlobalObject.cpp:
3220         (JSC::JSGlobalObject::init):
3221         * runtime/JSGlobalObject.h:
3222         * runtime/JSTypedArrayViewPrototype.cpp:
3223         (JSC::JSTypedArrayViewPrototype::finishCreation):
3224         (JSC::typedArrayViewProtoFuncEntries): Deleted.
3225         (JSC::typedArrayViewProtoFuncKeys): Deleted.
3226         (JSC::typedArrayViewProtoFuncValues): Deleted.
3227         * runtime/MapPrototype.cpp:
3228         (JSC::MapPrototype::finishCreation):
3229         * runtime/SetPrototype.cpp:
3230         (JSC::SetPrototype::finishCreation):
3231
3232 2016-05-04  Yusuke Suzuki  <utatane.tea@gmail.com>
3233
3234         [JSC] Object constructor need to be aware of new.target
3235         https://bugs.webkit.org/show_bug.cgi?id=157196
3236
3237         Reviewed by Darin Adler.
3238
3239         Object constructor should be aware of new.target.
3240         When the new.target is specified, we should store it.prototype to the newly created
3241         object's [[Prototype]].
3242
3243         * runtime/JSGlobalObject.cpp:
3244         (JSC::JSGlobalObject::init):
3245         (JSC::JSGlobalObject::visitChildren):
3246         Take the design that caches the structure used for empty object.
3247         This structure is also used in constructEmptyObject frequently.
3248
3249         * runtime/JSGlobalObject.h:
3250         (JSC::JSGlobalObject::objectStructureForObjectConstructor):
3251         * runtime/ObjectConstructor.cpp:
3252         (JSC::constructObject):
3253         (JSC::constructWithObjectConstructor):
3254         (JSC::callObjectConstructor):
3255         * runtime/ObjectConstructor.h:
3256         (JSC::constructEmptyObject):
3257         Construct the object by using the plain structure that is also used in the ObjectConstructor.
3258
3259         * tests/stress/object-constructor-should-be-new-target-aware.js: Added.
3260         (shouldBe):
3261         (Hello):
3262
3263 2016-05-04  Chris Dumez  <cdumez@apple.com>
3264
3265         Unreviewed, rolling out r200383 and r200406.
3266
3267         Seems to have caused crashes on iOS / ARMv7s
3268
3269         Reverted changesets:
3270
3271         "Speed up JSGlobalObject initialization by making some
3272         properties lazy"
3273         https://bugs.webkit.org/show_bug.cgi?id=157045
3274         http://trac.webkit.org/changeset/200383
3275
3276         "REGRESSION(r200383): Setting lazily initialized properties
3277         across frame boundaries crashes"
3278         https://bugs.webkit.org/show_bug.cgi?id=157333
3279         http://trac.webkit.org/changeset/200406
3280
3281 2016-05-04  Yusuke Suzuki  <utatane.tea@gmail.com>
3282
3283         Assertion failure for super() call in direct eval in method function
3284         https://bugs.webkit.org/show_bug.cgi?id=157091
3285
3286         Reviewed by Darin Adler.
3287
3288         While we ensure that direct super is under the correct context,
3289         we don't check it for the eval code. This patch moves the check from the end of parsing the function
3290         to the places where we found the direct super or the super bindings. This covers the direct eval that
3291         contains the direct super calls.
3292
3293         * parser/Parser.cpp:
3294         (JSC::Parser<LexerType>::parseGeneratorFunctionSourceElements):
3295         (JSC::Parser<LexerType>::parseFunctionInfo):
3296         (JSC::Parser<LexerType>::parseMemberExpression):
3297         * parser/Parser.h:
3298         (JSC::Scope::hasDirectSuper):
3299         (JSC::Scope::setHasDirectSuper):
3300         (JSC::Scope::needsSuperBinding):
3301         (JSC::Scope::setNeedsSuperBinding):
3302         (JSC::Parser::closestParentOrdinaryFunctionNonLexicalScope):
3303         * tests/stress/eval-and-super.js: Added.
3304         (shouldBe):
3305         (shouldThrow):
3306         (prototype.m):
3307         (prototype.n):
3308         * tests/stress/generator-and-super.js: Added.
3309         (testSyntaxError):
3310         (testSyntaxError.Base.prototype.hello):