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