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