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