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