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