Move vmEntryGlobalObject() to VM from CallFrame.
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2018-08-23  Mark Lam  <mark.lam@apple.com>
2
3         Move vmEntryGlobalObject() to VM from CallFrame.
4         https://bugs.webkit.org/show_bug.cgi?id=188900
5         <rdar://problem/43655753>
6
7         Reviewed by Michael Saboff.
8
9         Also introduced CallFrame::isGlobalExec() which makes use of one property of
10         GlobalExecs to identify them i.e. GlobalExecs have null callerFrame and returnPCs.
11         CallFrame::initGlobalExec() ensures this.
12
13         In contrast, normal CallFrames always have a callerFrame (because they must at
14         least be preceded by a VM EntryFrame) and a returnPC (at least return to the
15         VM entry glue).
16
17         * API/APIUtils.h:
18         (handleExceptionIfNeeded):
19         (setException):
20         * API/JSBase.cpp:
21         (JSEvaluateScript):
22         (JSCheckScriptSyntax):
23         * API/JSContextRef.cpp:
24         (JSGlobalContextRetain):
25         (JSGlobalContextRelease):
26         (JSGlobalContextCopyName):
27         (JSGlobalContextSetName):
28         (JSGlobalContextGetRemoteInspectionEnabled):
29         (JSGlobalContextSetRemoteInspectionEnabled):
30         (JSGlobalContextGetIncludesNativeCallStackWhenReportingExceptions):
31         (JSGlobalContextSetIncludesNativeCallStackWhenReportingExceptions):
32         (JSGlobalContextGetDebuggerRunLoop):
33         (JSGlobalContextSetDebuggerRunLoop):
34         (JSGlobalContextGetAugmentableInspectorController):
35         * API/JSValue.mm:
36         (reportExceptionToInspector):
37         * API/glib/JSCClass.cpp:
38         (jscContextForObject):
39         * API/glib/JSCContext.cpp:
40         (jsc_context_evaluate_in_object):
41         * debugger/Debugger.cpp:
42         (JSC::Debugger::pauseIfNeeded):
43         * debugger/DebuggerCallFrame.cpp:
44         (JSC::DebuggerCallFrame::vmEntryGlobalObject const):
45         (JSC::DebuggerCallFrame::evaluateWithScopeExtension):
46         * interpreter/CallFrame.cpp:
47         (JSC::CallFrame::vmEntryGlobalObject): Deleted.
48         * interpreter/CallFrame.h:
49         (JSC::ExecState::scope const):
50         (JSC::ExecState::noCaller):
51         (JSC::ExecState::isGlobalExec const):
52         * interpreter/Interpreter.cpp:
53         (JSC::notifyDebuggerOfUnwinding):
54         (JSC::Interpreter::notifyDebuggerOfExceptionToBeThrown):
55         (JSC::Interpreter::debug):
56         * runtime/CallData.cpp:
57         (JSC::profiledCall):
58         * runtime/Completion.cpp:
59         (JSC::evaluate):
60         (JSC::profiledEvaluate):
61         (JSC::evaluateWithScopeExtension):
62         (JSC::loadAndEvaluateModule):
63         (JSC::loadModule):
64         (JSC::linkAndEvaluateModule):
65         (JSC::importModule):
66         * runtime/ConstructData.cpp:
67         (JSC::profiledConstruct):
68         * runtime/Error.cpp:
69         (JSC::getStackTrace):
70         * runtime/VM.cpp:
71         (JSC::VM::throwException):
72         (JSC::VM::vmEntryGlobalObject const):
73         * runtime/VM.h:
74
75 2018-08-23  Andy Estes  <aestes@apple.com>
76
77         [Apple Pay] Introduce Apple Pay JS v4 on iOS 12 and macOS Mojave
78         https://bugs.webkit.org/show_bug.cgi?id=188829
79
80         Reviewed by Tim Horton.
81
82         * Configurations/FeatureDefines.xcconfig:
83
84 2018-08-23  Devin Rousso  <drousso@apple.com>
85
86         Web Inspector: support breakpoints for timers and animation-frame events
87         https://bugs.webkit.org/show_bug.cgi?id=188778
88
89         Reviewed by Brian Burg.
90
91         * inspector/protocol/Debugger.json:
92         Add `AnimationFrame` and `Timer` types to the list of pause reasons.
93
94         * inspector/protocol/DOMDebugger.json:
95         Introduced `setEventBreakpoint` and `removeEventBreakpoint` to replace the more specific:
96          - `setEventListenerBreakpoint`
97          - `removeEventListenerBreakpoint`
98          - `setInstrumentationBreakpoint`
99          - `removeInstrumentationBreakpoint`
100         Also created an `EventBreakpointType` to enumerate the available types of event breakpoints.
101
102         * inspector/scripts/codegen/generate_cpp_protocol_types_header.py:
103         (CppProtocolTypesHeaderGenerator.generate_output):
104         (CppProtocolTypesHeaderGenerator._generate_forward_declarations_for_binding_traits):
105         (CppProtocolTypesHeaderGenerator._generate_declarations_for_enum_conversion_methods):
106         (CppProtocolTypesHeaderGenerator._generate_hash_declarations): Added.
107         Generate `DefaultHash` for all `enum class` used by inspector protocols.
108
109         * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
110         * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
111         * inspector/scripts/tests/generic/expected/enum-values.json-result:
112         * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result:
113         * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result:
114         * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
115         * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
116
117 2018-08-23  Michael Saboff  <msaboff@apple.com>
118
119         YARR: Need to JIT compile a RegExp before using containsNestedSubpatterns flag
120         https://bugs.webkit.org/show_bug.cgi?id=188895
121
122         Reviewed by Mark Lam.
123
124         Found while working on another change.  This will allow processing of nested
125         parenthesis that require saved ParenContext structures.
126
127         * yarr/YarrJIT.cpp:
128         (JSC::Yarr::YarrGenerator::compile):
129
130 2018-08-22  Michael Saboff  <msaboff@apple.com>
131
132         https://bugs.webkit.org/show_bug.cgi?id=188859
133         Eliminate dead code operationThrowDivideError() and operationThrowOutOfBoundsAccessError()
134
135         Rubber-stamped by Saam Barati.
136
137         Deleted these two functions.
138
139         * jit/JITOperations.cpp:
140         * jit/JITOperations.h:
141
142 2018-08-22  Mark Lam  <mark.lam@apple.com>
143
144         The DFG CFGSimplification phase shouldn’t jettison a block when it’s the target of both branch directions.
145         https://bugs.webkit.org/show_bug.cgi?id=188298
146         <rdar://problem/42888427>
147
148         Reviewed by Saam Barati.
149
150         In the event that both targets of a Branch is the same block, then even if we'll
151         always take one path of the branch, the other target is not unreachable because
152         it is the same target as the one in the taken path.  Hence, it should not be
153         jettisoned.
154
155         * JavaScriptCore.xcodeproj/project.pbxproj:
156         - Added DFGCFG.h which is in use and should have been added to the project.
157         * dfg/DFGCFGSimplificationPhase.cpp:
158         (JSC::DFG::CFGSimplificationPhase::run):
159
160 2018-08-20  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
161
162         [JSC] HeapUtil should care about pointer overflow
163         https://bugs.webkit.org/show_bug.cgi?id=188740
164
165         Reviewed by Saam Barati.
166
167         `pointer - sizeof(IndexingHeader) - 1` causes an undefined behavior if a pointer overflows.
168         For example, if `pointer` is nullptr, it causes pointer overflow. Instead of calculating this
169         with `char*` pointer, we cast it to `uintptr_t` temporarily. This issue is found by UBSan.
170
171         * heap/HeapUtil.h:
172         (JSC::HeapUtil::findGCObjectPointersForMarking):
173
174 2018-08-19  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
175
176         [JSC] Should not rotate constant with 64
177         https://bugs.webkit.org/show_bug.cgi?id=188556
178
179         Reviewed by Saam Barati.
180
181         To defend against JIT splaying, we rotate a constant with a randomly generated seed.
182         But if a seed becomes 64 or 0, the following code performs `value << 64` or `value >> 64`
183         where value's type is uint64_t, and they cause undefined behaviors (UBs). This patch limits
184         the seed in the range of [1, 63] not to generate code causing UBs. This is found by UBSan.
185
186         * assembler/MacroAssembler.h:
187         (JSC::MacroAssembler::generateRotationSeed):
188         (JSC::MacroAssembler::rotationBlindConstant):
189
190 2018-08-21  Commit Queue  <commit-queue@webkit.org>
191
192         Unreviewed, rolling out r235107.
193         https://bugs.webkit.org/show_bug.cgi?id=188832
194
195         "It revealed bugs in Blob code as well as regressed JS
196         performance tests" (Requested by saamyjoon on #webkit).
197
198         Reverted changeset:
199
200         "JSRunLoopTimer may run part of a member function after it's
201         destroyed"
202         https://bugs.webkit.org/show_bug.cgi?id=188426
203         https://trac.webkit.org/changeset/235107
204
205 2018-08-21  Saam barati  <sbarati@apple.com>
206
207         JSRunLoopTimer may run part of a member function after it's destroyed
208         https://bugs.webkit.org/show_bug.cgi?id=188426
209
210         Reviewed by Mark Lam.
211
212         When I was reading the JSRunLoopTimer code, I noticed that it is possible
213         to end up running timer code after the class had been destroyed.
214         
215         The issue I spotted was in this function:
216         ```
217         void JSRunLoopTimer::timerDidFire()
218         {
219             JSLock* apiLock = m_apiLock.get();
220             if (!apiLock) {
221                 // Likely a buggy usage: the timer fired while JSRunLoopTimer was being destroyed.
222                 return;
223             }
224             // HERE
225             std::lock_guard<JSLock> lock(*apiLock);
226             RefPtr<VM> vm = apiLock->vm();
227             if (!vm) {
228                 // The VM has been destroyed, so we should just give up.
229                 return;
230             }
231         
232             doWork();
233         }
234         ```
235         
236         Look at the comment 'HERE'. Let's say that the timer callback thread gets context
237         switched before grabbing the API lock. Then, some other thread destroys the VM.
238         And let's say that the VM owns (perhaps transitively) this timer. Then, the
239         timer would run code and access member variables after it was destroyed.
240         
241         This patch fixes this issue by introducing a new timer manager class. 
242         This class manages timers on a per VM basis. When a timer is scheduled,
243         this class refs the timer. It also calls the timer callback while actively
244         maintaining a +1 ref to it. So, it's no longer possible to call the timer
245         callback after the timer has been destroyed. However, calling a timer callback
246         can still race with the VM being destroyed. We continue to detect this case and
247         bail out of the callback early.
248         
249         This patch also removes a lot of duplicate code between GCActivityCallback
250         and JSRunLoopTimer.
251
252         * heap/EdenGCActivityCallback.cpp:
253         (JSC::EdenGCActivityCallback::doCollection):
254         (JSC::EdenGCActivityCallback::lastGCLength):
255         (JSC::EdenGCActivityCallback::deathRate):
256         * heap/EdenGCActivityCallback.h:
257         * heap/FullGCActivityCallback.cpp:
258         (JSC::FullGCActivityCallback::doCollection):
259         (JSC::FullGCActivityCallback::lastGCLength):
260         (JSC::FullGCActivityCallback::deathRate):
261         * heap/FullGCActivityCallback.h:
262         * heap/GCActivityCallback.cpp:
263         (JSC::GCActivityCallback::doWork):
264         (JSC::GCActivityCallback::scheduleTimer):
265         (JSC::GCActivityCallback::didAllocate):
266         (JSC::GCActivityCallback::willCollect):
267         (JSC::GCActivityCallback::cancel):
268         (JSC::GCActivityCallback::cancelTimer): Deleted.
269         (JSC::GCActivityCallback::nextFireTime): Deleted.
270         * heap/GCActivityCallback.h:
271         * heap/Heap.cpp:
272         (JSC::Heap::reportAbandonedObjectGraph):
273         (JSC::Heap::notifyIncrementalSweeper):
274         (JSC::Heap::updateAllocationLimits):
275         (JSC::Heap::didAllocate):
276         * heap/IncrementalSweeper.cpp:
277         (JSC::IncrementalSweeper::scheduleTimer):
278         (JSC::IncrementalSweeper::doWork):
279         (JSC::IncrementalSweeper::doSweep):
280         (JSC::IncrementalSweeper::sweepNextBlock):
281         (JSC::IncrementalSweeper::startSweeping):
282         (JSC::IncrementalSweeper::stopSweeping):
283         * heap/IncrementalSweeper.h:
284         * heap/StopIfNecessaryTimer.cpp:
285         (JSC::StopIfNecessaryTimer::doWork):
286         (JSC::StopIfNecessaryTimer::scheduleSoon):
287         * heap/StopIfNecessaryTimer.h:
288         * runtime/JSRunLoopTimer.cpp:
289         (JSC::epochTime):
290         (JSC::JSRunLoopTimer::Manager::timerDidFireCallback):
291         (JSC::JSRunLoopTimer::Manager::PerVMData::setRunLoop):
292         (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData):
293         (JSC::JSRunLoopTimer::Manager::PerVMData::~PerVMData):
294         (JSC::JSRunLoopTimer::Manager::timerDidFire):
295         (JSC::JSRunLoopTimer::Manager::shared):
296         (JSC::JSRunLoopTimer::Manager::registerVM):
297         (JSC::JSRunLoopTimer::Manager::unregisterVM):
298         (JSC::JSRunLoopTimer::Manager::scheduleTimer):
299         (JSC::JSRunLoopTimer::Manager::cancelTimer):
300         (JSC::JSRunLoopTimer::Manager::timeUntilFire):
301         (JSC::JSRunLoopTimer::Manager::didChangeRunLoop):
302         (JSC::JSRunLoopTimer::timerDidFire):
303         (JSC::JSRunLoopTimer::JSRunLoopTimer):
304         (JSC::JSRunLoopTimer::timeUntilFire):
305         (JSC::JSRunLoopTimer::setTimeUntilFire):
306         (JSC::JSRunLoopTimer::cancelTimer):
307         (JSC::JSRunLoopTimer::setRunLoop): Deleted.
308         (JSC::JSRunLoopTimer::timerDidFireCallback): Deleted.
309         (JSC::JSRunLoopTimer::scheduleTimer): Deleted.
310         * runtime/JSRunLoopTimer.h:
311         (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData):
312         * runtime/PromiseDeferredTimer.cpp:
313         (JSC::PromiseDeferredTimer::doWork):
314         (JSC::PromiseDeferredTimer::runRunLoop):
315         (JSC::PromiseDeferredTimer::addPendingPromise):
316         (JSC::PromiseDeferredTimer::hasPendingPromise):
317         (JSC::PromiseDeferredTimer::hasDependancyInPendingPromise):
318         (JSC::PromiseDeferredTimer::cancelPendingPromise):
319         (JSC::PromiseDeferredTimer::scheduleWorkSoon):
320         * runtime/PromiseDeferredTimer.h:
321         * runtime/VM.cpp:
322         (JSC::VM::VM):
323         (JSC::VM::~VM):
324         (JSC::VM::setRunLoop):
325         (JSC::VM::registerRunLoopTimer): Deleted.
326         (JSC::VM::unregisterRunLoopTimer): Deleted.
327         * runtime/VM.h:
328         (JSC::VM::runLoop const):
329         * wasm/js/WebAssemblyPrototype.cpp:
330         (JSC::webAssemblyModuleValidateAsyncInternal):
331         (JSC::instantiate):
332         (JSC::compileAndInstantiate):
333         (JSC::webAssemblyModuleInstantinateAsyncInternal):
334         (JSC::webAssemblyCompileStreamingInternal):
335         (JSC::webAssemblyInstantiateStreamingInternal):
336
337 2018-08-20  Saam barati  <sbarati@apple.com>
338
339         Inline DataView accesses into DFG/FTL
340         https://bugs.webkit.org/show_bug.cgi?id=188573
341         <rdar://problem/43286746>
342
343         Reviewed by Michael Saboff.
344
345         This patch teaches the DFG/FTL to inline DataView accesses. The approach is
346         straight forward. We inline the various get*/set* operations as intrinsics.
347         
348         This patch takes the most obvious approach for now. We OSR exit when:
349         - An isLittleEndian argument is provided, and is not a boolean.
350         - The index isn't an integer.
351         - The |this| isn't a DataView.
352         - We do an OOB access (or see a neutered array)
353         
354         To implement this change in a performant way, this patch teaches the macro
355         assembler how to emit byte swap operations. The semantics of the added functions
356         are byteSwap + zero extend. This means for the 16bit byte swaps, we need
357         to actually emit zero extend instructions. For the 32/64bit byte swaps,
358         the instructions already have these semantics.
359         
360         This patch is just a lightweight initial implementation. There are some easy
361         extensions we can do in future changes:
362         - Teach B3 how to byte swap: https://bugs.webkit.org/show_bug.cgi?id=188759
363         - CSE DataViewGet* nodes: https://bugs.webkit.org/show_bug.cgi?id=188768
364
365         * assembler/MacroAssemblerARM64.h:
366         (JSC::MacroAssemblerARM64::byteSwap16):
367         (JSC::MacroAssemblerARM64::byteSwap32):
368         (JSC::MacroAssemblerARM64::byteSwap64):
369         * assembler/MacroAssemblerX86Common.h:
370         (JSC::MacroAssemblerX86Common::byteSwap32):
371         (JSC::MacroAssemblerX86Common::byteSwap16):
372         (JSC::MacroAssemblerX86Common::byteSwap64):
373         * assembler/X86Assembler.h:
374         (JSC::X86Assembler::bswapl_r):
375         (JSC::X86Assembler::bswapq_r):
376         (JSC::X86Assembler::shiftInstruction16):
377         (JSC::X86Assembler::rolw_i8r):
378         (JSC::X86Assembler::X86InstructionFormatter::SingleInstructionBufferWriter::memoryModRM):
379         * assembler/testmasm.cpp:
380         (JSC::testByteSwap):
381         (JSC::run):
382         * bytecode/DataFormat.h:
383         * bytecode/SpeculatedType.cpp:
384         (JSC::dumpSpeculation):
385         (JSC::speculationFromClassInfo):
386         (JSC::speculationFromJSType):
387         (JSC::speculationFromString):
388         * bytecode/SpeculatedType.h:
389         * dfg/DFGAbstractInterpreterInlines.h:
390         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
391         * dfg/DFGByteCodeParser.cpp:
392         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
393         * dfg/DFGClobberize.h:
394         (JSC::DFG::clobberize):
395         * dfg/DFGDoesGC.cpp:
396         (JSC::DFG::doesGC):
397         * dfg/DFGFixupPhase.cpp:
398         (JSC::DFG::FixupPhase::fixupNode):
399         * dfg/DFGNode.h:
400         (JSC::DFG::Node::hasHeapPrediction):
401         (JSC::DFG::Node::dataViewData):
402         * dfg/DFGNodeType.h:
403         * dfg/DFGPredictionPropagationPhase.cpp:
404         * dfg/DFGSafeToExecute.h:
405         (JSC::DFG::SafeToExecuteEdge::operator()):
406         (JSC::DFG::safeToExecute):
407         * dfg/DFGSpeculativeJIT.cpp:
408         (JSC::DFG::SpeculativeJIT::speculateDataViewObject):
409         (JSC::DFG::SpeculativeJIT::speculate):
410         * dfg/DFGSpeculativeJIT.h:
411         * dfg/DFGSpeculativeJIT32_64.cpp:
412         (JSC::DFG::SpeculativeJIT::compile):
413         * dfg/DFGSpeculativeJIT64.cpp:
414         (JSC::DFG::SpeculativeJIT::compile):
415         * dfg/DFGUseKind.cpp:
416         (WTF::printInternal):
417         * dfg/DFGUseKind.h:
418         (JSC::DFG::typeFilterFor):
419         (JSC::DFG::isCell):
420         * ftl/FTLCapabilities.cpp:
421         (JSC::FTL::canCompile):
422         * ftl/FTLLowerDFGToB3.cpp:
423         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
424         (JSC::FTL::DFG::LowerDFGToB3::byteSwap32):
425         (JSC::FTL::DFG::LowerDFGToB3::byteSwap64):
426         (JSC::FTL::DFG::LowerDFGToB3::emitCodeBasedOnEndiannessBranch):
427         (JSC::FTL::DFG::LowerDFGToB3::compileDataViewGet):
428         (JSC::FTL::DFG::LowerDFGToB3::compileDataViewSet):
429         (JSC::FTL::DFG::LowerDFGToB3::lowDataViewObject):
430         (JSC::FTL::DFG::LowerDFGToB3::speculate):
431         (JSC::FTL::DFG::LowerDFGToB3::speculateDataViewObject):
432         * runtime/Intrinsic.cpp:
433         (JSC::intrinsicName):
434         * runtime/Intrinsic.h:
435         * runtime/JSDataViewPrototype.cpp:
436
437 2018-08-20  Yusuke Suzuki  <utatane.tea@gmail.com>
438
439         [YARR] Extend size of fixed characters bulk matching in 64bit platform
440         https://bugs.webkit.org/show_bug.cgi?id=181989
441
442         Reviewed by Michael Saboff.
443
444         This patch extends bulk matching style for fixed-sized characters.
445         In 64bit environment, the GPR can hold up to 8 characters. This change
446         reduces the code size since we can fuse multiple `mov` operations into one.
447
448         * assembler/LinkBuffer.h:
449         * runtime/Options.h:
450         * yarr/YarrJIT.cpp:
451         (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
452         (JSC::Yarr::YarrGenerator::compile):
453
454 2018-08-20  Devin Rousso  <drousso@apple.com>
455
456         Web Inspector: allow breakpoints to be set for specific event listeners
457         https://bugs.webkit.org/show_bug.cgi?id=183138
458
459         Reviewed by Joseph Pecoraro.
460
461         * inspector/protocol/DOM.json:
462         Add `setBreakpointForEventListener` and `removeBreakpointForEventListener`, each of which
463         takes an `eventListenerId` and toggles whether that specific usage of that event listener
464         should have a breakpoint and pause before running.
465
466 2018-08-20  Mark Lam  <mark.lam@apple.com>
467
468         Fix the LLInt so that btjs shows vmEntryToJavaScript instead of llintPCRangeStart for the entry frame.
469         https://bugs.webkit.org/show_bug.cgi?id=188769
470
471         Reviewed by Michael Saboff.
472
473         * llint/LowLevelInterpreter.asm:
474         - Just put an unused instruction between llintPCRangeStart and vmEntryToJavaScript
475           so that libunwind doesn't get confused by the 2 labels pointing to the same
476           code address.
477
478 2018-08-19  Carlos Garcia Campos  <cgarcia@igalia.com>
479
480         [GLIB] Add API to throw exceptions using printf formatted strings
481         https://bugs.webkit.org/show_bug.cgi?id=188698
482
483         Reviewed by Michael Catanzaro.
484
485         Add jsc_context_throw_printf() and jsc_context_throw_with_name_printf(). Also add new public constructors of
486         JSCException using printf formatted string.
487
488         * API/glib/JSCContext.cpp:
489         (jsc_context_throw_printf):
490         (jsc_context_throw_with_name_printf):
491         * API/glib/JSCContext.h:
492         * API/glib/JSCException.cpp:
493         (jsc_exception_new_printf):
494         (jsc_exception_new_vprintf):
495         (jsc_exception_new_with_name_printf):
496         (jsc_exception_new_with_name_vprintf):
497         * API/glib/JSCException.h:
498         * API/glib/docs/jsc-glib-4.0-sections.txt:
499
500 2018-08-19  Carlos Garcia Campos  <cgarcia@igalia.com>
501
502         [GLIB] Complete the JSCException API
503         https://bugs.webkit.org/show_bug.cgi?id=188695
504
505         Reviewed by Michael Catanzaro.
506
507         Add more API to JSCException:
508          - New function to get the column number
509          - New function get exception as string (toString())
510          - Add the possibility to create exceptions with a custom error name.
511          - New function to get the exception error name
512          - New function to get the exception backtrace.
513          - New convenience function to report a exception by returning a formatted string with all the exception
514            details, to be shown as a user error message.
515
516         * API/glib/JSCContext.cpp:
517         (jsc_context_throw_with_name):
518         * API/glib/JSCContext.h:
519         * API/glib/JSCException.cpp:
520         (jscExceptionEnsureProperties):
521         (jsc_exception_new):
522         (jsc_exception_new_with_name):
523         (jsc_exception_get_name):
524         (jsc_exception_get_column_number):
525         (jsc_exception_get_back_trace_string):
526         (jsc_exception_to_string):
527         (jsc_exception_report):
528         * API/glib/JSCException.h:
529         * API/glib/docs/jsc-glib-4.0-sections.txt:
530
531 2018-08-19  Commit Queue  <commit-queue@webkit.org>
532
533         Unreviewed, rolling out r234852.
534         https://bugs.webkit.org/show_bug.cgi?id=188736
535
536         Workaround is not correct (Requested by yusukesuzuki on
537         #webkit).
538
539         Reverted changeset:
540
541         "[JSC] Should not rotate constant with 64"
542         https://bugs.webkit.org/show_bug.cgi?id=188556
543         https://trac.webkit.org/changeset/234852
544
545 2018-08-19  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
546
547         [WTF] Add WTF::unalignedLoad and WTF::unalignedStore
548         https://bugs.webkit.org/show_bug.cgi?id=188716
549
550         Reviewed by Darin Adler.
551
552         Use WTF::unalignedLoad and WTF::unalignedStore to avoid undefined behavior.
553         The compiler can emit appropriate mov operations in x86 even if we use these
554         helper functions.
555
556         * assembler/AssemblerBuffer.h:
557         (JSC::AssemblerBuffer::LocalWriter::putIntegralUnchecked):
558         (JSC::AssemblerBuffer::putIntegral):
559         (JSC::AssemblerBuffer::putIntegralUnchecked):
560         * assembler/MacroAssemblerX86.h:
561         (JSC::MacroAssemblerX86::readCallTarget):
562         * assembler/X86Assembler.h:
563         (JSC::X86Assembler::linkJump):
564         (JSC::X86Assembler::readPointer):
565         (JSC::X86Assembler::replaceWithHlt):
566         (JSC::X86Assembler::replaceWithJump):
567         (JSC::X86Assembler::setPointer):
568         (JSC::X86Assembler::setInt32):
569         (JSC::X86Assembler::setInt8):
570         * interpreter/InterpreterInlines.h:
571         (JSC::Interpreter::getOpcodeID): Embedded opcode may be misaligned. Actually UBSan detects misaligned accesses here.
572
573 2018-08-17  Saam barati  <sbarati@apple.com>
574
575         intersectionOfPastValuesAtHead must filter values after they've observed an invalidation point
576         https://bugs.webkit.org/show_bug.cgi?id=188707
577         <rdar://problem/43015442>
578
579         Reviewed by Mark Lam.
580
581         We use the values in intersectionOfPastValuesAtHead to verify that it is safe to
582         OSR enter at the head of a block. We verify it's safe to OSR enter by checking
583         that each incoming value is compatible with its corresponding AbstractValue.
584         
585         The bug is that we were sometimes filtering the intersectionOfPastValuesAtHead
586         with abstract values that were clobbererd. This meant that the value we're
587         verifying with at OSR entry effectively has an infinite structure set because
588         it's clobbered. So, imagine we have code like this:
589         ```
590         ---> We OSR enter here, and we're clobbered here
591         InvalidationPoint
592         GetByOffset(@base)
593         ```
594         
595         The abstract value for @base inside intersectionOfPastValuesAtHead has a
596         clobberred structure set, so we'd allow an incoming object with any
597         structure. However, this is wrong because the invalidation point is no
598         longer fulfilling its promise that it filters the structure that @base has.
599         
600         We fix this by filtering the AbstractValues in intersectionOfPastValuesAtHead
601         as if the incoming value may be live past an InvalidationPoint.
602         This places a stricter requirement that to safely OSR enter at any basic
603         block, all incoming values must be compatible as if they lived past
604         the execution of an invalidation point.
605
606         * dfg/DFGCFAPhase.cpp:
607         (JSC::DFG::CFAPhase::run):
608
609 2018-08-17  Yusuke Suzuki  <yusukesuzuki@slowstart.org> and Fujii Hironori  <Hironori.Fujii@sony.com>
610
611         [JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg
612         https://bugs.webkit.org/show_bug.cgi?id=188589
613
614         Reviewed by Mark Lam.
615         And reviewed by Yusuke Suzuki for Hironori's change.
616
617         Since GPRReg(RegisterID) and FPRReg(FPRegisterID) do not include -1 in their enum values,
618         UBSan dumps bunch of warnings "runtime error: load of value 4294967295, which is not a valid value for type 'RegisterID'".
619
620         - We add InvalidGPRReg and InvalidFPRReg to enum values of GPRReg and FPRReg to suppress the above warnings.
621         - We make GPRReg and FPRReg int8_t enums.
622         - We replace `#define InvalidGPRReg ((JSC::GPRReg)-1)` to `static constexpr GPRReg InvalidGPRReg { GPRReg::InvalidGPRReg };`.
623         - We add operator+/- definition for RegisterIDs as a MSVC workaround. MSVC fails to resolve operator+ and operator-
624           if `enum : int8_t` is used instead of `enum`.
625
626         * assembler/ARM64Assembler.h:
627         * assembler/ARMAssembler.h:
628         * assembler/ARMv7Assembler.h:
629         * assembler/MIPSAssembler.h:
630         * assembler/MacroAssembler.h:
631         * assembler/X86Assembler.h:
632         * jit/CCallHelpers.h:
633         (JSC::CCallHelpers::clampArrayToSize):
634         * jit/FPRInfo.h:
635         * jit/GPRInfo.h:
636         (JSC::JSValueRegs::JSValueRegs):
637         (JSC::JSValueRegs::tagGPR const):
638         (JSC::JSValueRegs::payloadGPR const):
639         (JSC::JSValueSource::JSValueSource):
640         (JSC::JSValueSource::unboxedCell):
641         (JSC::JSValueSource::operator bool const):
642         (JSC::JSValueSource::base const):
643         (JSC::JSValueSource::tagGPR const):
644         (JSC::JSValueSource::payloadGPR const):
645         (JSC::JSValueSource::hasKnownTag const):
646
647 2018-08-16  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
648
649         [JSC] alignas for RegisterState should respect alignof(RegisterState) too
650         https://bugs.webkit.org/show_bug.cgi?id=188686
651
652         Reviewed by Saam Barati.
653
654         RegisterState would have larger alignment than `alignof(void*)`. We use the larger alignment value
655         for `alignof` for RegisterState.
656
657         * heap/RegisterState.h:
658
659 2018-08-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
660
661         [YARR] Align allocation size in BumpPointerAllocator with sizeof(void*)
662         https://bugs.webkit.org/show_bug.cgi?id=188571
663
664         Reviewed by Saam Barati.
665
666         UBSan finds YarrInterpreter performs misaligned accesses. This is because YarrInterpreter
667         allocates DisjunctionContext and ParenthesesDisjunctionContext from BumpPointerAllocator
668         without considering alignment of them. This patch adds DisjunctionContext::allocationSize
669         and ParenthesesDisjunctionContext::allocationSize to calculate allocation sizes for them.
670         The size is always rounded to `sizeof(void*)` so that these classes are always allocated
671         with `sizeof(void*)` alignment. We also ensure the alignments of both classes are less
672         than or equal to `sizeof(void*)` by `static_assert`.
673
674         * yarr/YarrInterpreter.cpp:
675         (JSC::Yarr::Interpreter::DisjunctionContext::allocationSize):
676         (JSC::Yarr::Interpreter::allocDisjunctionContext):
677         (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::ParenthesesDisjunctionContext):
678         (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::getDisjunctionContext):
679         (JSC::Yarr::Interpreter::ParenthesesDisjunctionContext::allocationSize):
680         (JSC::Yarr::Interpreter::allocParenthesesDisjunctionContext):
681         (JSC::Yarr::Interpreter::Interpreter):
682         (JSC::Yarr::Interpreter::DisjunctionContext::DisjunctionContext): Deleted.
683
684 2018-08-15  Keith Miller  <keith_miller@apple.com>
685
686         Remove evernote hacks
687         https://bugs.webkit.org/show_bug.cgi?id=188591
688
689         Reviewed by Joseph Pecoraro.
690
691         The hack was added in 2012 and the evernote app seems to work now.
692         It's probably not needed anymore.
693
694         * API/JSValueRef.cpp:
695         (JSValueUnprotect):
696         (evernoteHackNeeded): Deleted.
697
698 2018-08-14  Fujii Hironori  <Hironori.Fujii@sony.com>
699
700         Unreviewed, rolling out r234874 and r234876.
701
702         WinCairo port can't compile
703
704         Reverted changesets:
705
706         "[JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg"
707         https://bugs.webkit.org/show_bug.cgi?id=188589
708         https://trac.webkit.org/changeset/234874
709
710         "Unreviewed, attempt to fix CLoop build"
711         https://bugs.webkit.org/show_bug.cgi?id=188589
712         https://trac.webkit.org/changeset/234876
713
714 2018-08-14  Saam barati  <sbarati@apple.com>
715
716         HashMap<Ref<P>, V> asserts when V is not zero for its empty value
717         https://bugs.webkit.org/show_bug.cgi?id=188582
718
719         Reviewed by Sam Weinig.
720
721         * runtime/SparseArrayValueMap.h:
722
723 2018-08-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
724
725         Unreviewed, attempt to fix CLoop build
726         https://bugs.webkit.org/show_bug.cgi?id=188589
727
728         * assembler/MacroAssembler.h:
729
730 2018-08-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
731
732         [JSC] Add GPRReg::InvalidGPRReg and FPRReg::InvalidFPRReg
733         https://bugs.webkit.org/show_bug.cgi?id=188589
734
735         Reviewed by Mark Lam.
736
737         Since GPRReg(RegisterID) and FPRReg(FPRegisterID) do not include -1 in their enum values,
738         UBSan dumps bunch of warnings "runtime error: load of value 4294967295, which is not a valid value for type 'RegisterID'".
739
740         1. We add InvalidGPRReg and InvalidFPRReg to enum values of GPRReg and FPRReg to suppress the above warnings.
741         2. We make GPRReg and FPRReg int8_t enums.
742         3. We replace `#define InvalidGPRReg ((JSC::GPRReg)-1)` to `static constexpr GPRReg InvalidGPRReg { GPRReg::InvalidGPRReg };`.
743
744         * assembler/ARM64Assembler.h:
745         * assembler/ARMAssembler.h:
746         * assembler/ARMv7Assembler.h:
747         * assembler/MIPSAssembler.h:
748         * assembler/X86Assembler.h:
749         * jit/FPRInfo.h:
750         * jit/GPRInfo.h:
751         (JSC::JSValueRegs::JSValueRegs):
752         (JSC::JSValueRegs::tagGPR const):
753         (JSC::JSValueRegs::payloadGPR const):
754         (JSC::JSValueSource::JSValueSource):
755         (JSC::JSValueSource::unboxedCell):
756         (JSC::JSValueSource::operator bool const):
757         (JSC::JSValueSource::base const):
758         (JSC::JSValueSource::tagGPR const):
759         (JSC::JSValueSource::payloadGPR const):
760         (JSC::JSValueSource::hasKnownTag const):
761
762 2018-08-14  Keith Miller  <keith_miller@apple.com>
763
764         Add missing availability macro.
765         https://bugs.webkit.org/show_bug.cgi?id=188563
766
767         Reviewed by Mark Lam.
768
769         * API/JSValueRef.h:
770
771 2018-08-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
772
773         [JSC] GetByIdStatus::m_wasSeenInJIT is touched in GetByIdStatus::slowVersion
774         https://bugs.webkit.org/show_bug.cgi?id=188560
775
776         Reviewed by Keith Miller.
777
778         While GetByIdStatus() / GetByIdStatus(status) constructors do not set m_wasSeenInJIT,
779         it is loaded unconditionally in GetByIdStatus::slowVersion. This access to the
780         uninitialized member field is caught in UBSan. This patch fixes it by adding an initializer
781         `m_wasSeenInJIT { false }`.
782
783         * bytecode/GetByIdStatus.h:
784
785 2018-08-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
786
787         [DFG] DFGPredictionPropagation should set PrimaryPass when processing invariants
788         https://bugs.webkit.org/show_bug.cgi?id=188557
789
790         Reviewed by Mark Lam.
791
792         DFGPredictionPropagationPhase should set PrimaryPass before processing invariants since
793         processing for ArithRound etc.'s invariants requires `m_pass` load. This issue is found
794         in UBSan's result.
795
796         * dfg/DFGPredictionPropagationPhase.cpp:
797
798 2018-08-14  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
799
800         [JSC] Should not rotate constant with 64
801         https://bugs.webkit.org/show_bug.cgi?id=188556
802
803         Reviewed by Mark Lam.
804
805         To defend against JIT splaying, we rotate a constant with a randomly generated seed.
806         But if a seed becomes 64, the following code performs `value << 64` where value's type
807         is uint64_t, and it causes undefined behaviors (UBs). This patch limits the seed in the
808         range of [0, 64) not to generate code causing UBs. This is found by UBSan.
809
810         * assembler/MacroAssembler.h:
811         (JSC::MacroAssembler::generateRotationSeed):
812         (JSC::MacroAssembler::rotationBlindConstant):
813
814 2018-08-12  Karo Gyoker  <karogyoker2+webkit@gmail.com>
815
816         Disable JIT on IA-32 without SSE2
817         https://bugs.webkit.org/show_bug.cgi?id=188476
818
819         Reviewed by Michael Catanzaro.
820
821         Including missing header (MacroAssembler.h) in case of other
822         operating systems than Windows too.
823
824         * runtime/Options.cpp:
825
826 2018-08-11  Karo Gyoker  <karogyoker2+webkit@gmail.com>
827
828         Disable JIT on IA-32 without SSE2
829         https://bugs.webkit.org/show_bug.cgi?id=188476
830
831         Reviewed by Yusuke Suzuki.
832
833         On IA-32 CPUs without SSE2 most of the webpages cannot load
834         if the JIT is turned on.
835
836         * runtime/Options.cpp:
837         (JSC::recomputeDependentOptions):
838
839 2018-08-10  Joseph Pecoraro  <pecoraro@apple.com>
840
841         Web Inspector: console.log fires getters for deep properties
842         https://bugs.webkit.org/show_bug.cgi?id=187542
843         <rdar://problem/42873158>
844
845         Reviewed by Saam Barati.
846
847         * inspector/InjectedScriptSource.js:
848         (RemoteObject.prototype._isPreviewableObject):
849         Avoid getters/setters when checking for simple properties to preview.
850         Here we avoid invoking `object[property]` if it could be a user getter.
851
852 2018-08-10  Keith Miller  <keith_miller@apple.com>
853
854         Slicing an ArrayBuffer with a long number returns an ArrayBuffer with byteLength zero
855         https://bugs.webkit.org/show_bug.cgi?id=185127
856
857         Reviewed by Saam Barati.
858
859         Previously, we would truncate the indicies passed to slice to an
860         int. This meant that the value was not getting properly clamped
861         later.
862
863         This patch also removes a non-spec compliant check that slice was
864         passed at least one argument.
865
866         * runtime/ArrayBuffer.cpp:
867         (JSC::ArrayBuffer::clampValue):
868         (JSC::ArrayBuffer::clampIndex const):
869         (JSC::ArrayBuffer::slice const):
870         * runtime/ArrayBuffer.h:
871         (JSC::ArrayBuffer::clampValue): Deleted.
872         (JSC::ArrayBuffer::clampIndex const): Deleted.
873         * runtime/JSArrayBufferPrototype.cpp:
874         (JSC::arrayBufferProtoFuncSlice):
875
876 2018-08-10  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
877
878         Date.UTC should not return NaN with only Year param
879         https://bugs.webkit.org/show_bug.cgi?id=188378
880
881         Reviewed by Keith Miller.
882
883         Date.UTC requires one argument for |year|. But the other ones are optional.
884         This patch fix this handling.
885
886         * runtime/DateConstructor.cpp:
887         (JSC::millisecondsFromComponents):
888
889 2018-08-08  Keith Miller  <keith_miller@apple.com>
890
891         Array.prototype.sort should call @toLength instead of ">>> 0"
892         https://bugs.webkit.org/show_bug.cgi?id=188430
893
894         Reviewed by Saam Barati.
895
896         Also add a new function to $vm that will fetch a private
897         property. This can be useful for running builtin helper functions.
898
899         * builtins/ArrayPrototype.js:
900         (sort):
901         * tools/JSDollarVM.cpp:
902         (JSC::functionGetPrivateProperty):
903         (JSC::JSDollarVM::finishCreation):
904
905 2018-08-08  Keith Miller  <keith_miller@apple.com>
906
907         Array.prototype.sort should throw TypeError if param is a not callable object
908         https://bugs.webkit.org/show_bug.cgi?id=188382
909
910         Reviewed by Saam Barati.
911
912         Improve spec compatability by checking if the Array.prototype.sort comparator is a function
913         before doing anything else.
914
915         Also, refactor the various helper functions to use let instead of var.
916
917         * builtins/ArrayPrototype.js:
918         (sort.stringComparator):
919         (sort.compactSparse):
920         (sort.compactSlow):
921         (sort.compact):
922         (sort.merge):
923         (sort.mergeSort):
924         (sort.bucketSort):
925         (sort.comparatorSort):
926         (sort.stringSort):
927         (sort):
928
929 2018-08-08  Michael Saboff  <msaboff@apple.com>
930
931         Yarr JIT should include annotations with dumpDisassembly=true
932         https://bugs.webkit.org/show_bug.cgi?id=188415
933
934         Reviewed by Yusuke Suzuki.
935
936         Created a YarrDisassembler class that handles annotations similar to the baseline JIT.
937         Given that the Yarr creates matching code bu going through the YarrPattern ops forward and
938         then the backtracking code through the YarrPattern ops in reverse order, the disassembler
939         needs to do the same think.
940
941         Restructured some of the logging code in YarrPattern to eliminate redundent code and factor
942         out simple methods for what was needed by the YarrDisassembler.
943
944         Here is abbreviated sample output after this change.
945
946         Generated JIT code for 8-bit regular expression /ab*c/:
947             Code at [0x469561c03720, 0x469561c03840):
948                 0x469561c03720: push %rbp
949                 0x469561c03721: mov %rsp, %rbp
950                 ...
951                 0x469561c03762: sub $0x40, %rsp
952              == Matching ==
953            0:OpBodyAlternativeBegin minimum size 2
954                 0x469561c03766: add $0x2, %esi
955                 0x469561c03769: cmp %edx, %esi
956                 0x469561c0376b: ja 0x469561c037fa
957            1:OpTerm TypePatternCharacter 'a'
958                 0x469561c03771: movzx -0x2(%rdi,%rsi), %eax
959                 0x469561c03776: cmp $0x61, %eax
960                 0x469561c03779: jnz 0x469561c037e9
961            2:OpTerm TypePatternCharacter 'b' {0,...} greedy
962                 0x469561c0377f: xor %r9d, %r9d
963                 0x469561c03782: cmp %edx, %esi
964                 0x469561c03784: jz 0x469561c037a2
965                 ...
966                 0x469561c0379d: jmp 0x469561c03782
967                 0x469561c037a2: mov %r9, 0x8(%rsp)
968            3:OpTerm TypePatternCharacter 'c'
969                 0x469561c037a7: movzx -0x1(%rdi,%rsi), %eax
970                 0x469561c037ac: cmp $0x63, %eax
971                 0x469561c037af: jnz 0x469561c037d1
972            4:OpBodyAlternativeEnd
973                 0x469561c037b5: add $0x40, %rsp
974                 ...
975                 0x469561c037cf: pop %rbp
976                 0x469561c037d0: ret
977              == Backtracking ==
978            4:OpBodyAlternativeEnd
979            3:OpTerm TypePatternCharacter 'c'
980            2:OpTerm TypePatternCharacter 'b' {0,...} greedy
981                 0x469561c037d1: mov 0x8(%rsp), %r9
982                 ...
983                 0x469561c037e4: jmp 0x469561c037a2
984            1:OpTerm TypePatternCharacter 'a'
985            0:OpBodyAlternativeBegin minimum size 2
986                 0x469561c037e9: mov %rsi, %rax
987                 ...
988                 0x469561c0382f: pop %rbp
989                 0x469561c03830: ret
990
991         * JavaScriptCore.xcodeproj/project.pbxproj:
992         * Sources.txt:
993         * runtime/RegExp.cpp:
994         (JSC::RegExp::compile):
995         (JSC::RegExp::compileMatchOnly):
996         * yarr/YarrDisassembler.cpp: Added.
997         (JSC::Yarr::YarrDisassembler::indentString):
998         (JSC::Yarr::YarrDisassembler::YarrDisassembler):
999         (JSC::Yarr::YarrDisassembler::~YarrDisassembler):
1000         (JSC::Yarr::YarrDisassembler::dump):
1001         (JSC::Yarr::YarrDisassembler::dumpHeader):
1002         (JSC::Yarr::YarrDisassembler::dumpVectorForInstructions):
1003         (JSC::Yarr::YarrDisassembler::dumpForInstructions):
1004         (JSC::Yarr::YarrDisassembler::dumpDisassembly):
1005         * yarr/YarrDisassembler.h: Added.
1006         (JSC::Yarr::YarrJITInfo::~YarrJITInfo):
1007         (JSC::Yarr::YarrDisassembler::setStartOfCode):
1008         (JSC::Yarr::YarrDisassembler::setForGenerate):
1009         (JSC::Yarr::YarrDisassembler::setForBacktrack):
1010         (JSC::Yarr::YarrDisassembler::setEndOfGenerate):
1011         (JSC::Yarr::YarrDisassembler::setEndOfBacktrack):
1012         (JSC::Yarr::YarrDisassembler::setEndOfCode):
1013         (JSC::Yarr::YarrDisassembler::indentString):
1014         * yarr/YarrJIT.cpp:
1015         (JSC::Yarr::YarrGenerator::generate):
1016         (JSC::Yarr::YarrGenerator::backtrack):
1017         (JSC::Yarr::YarrGenerator::YarrGenerator):
1018         (JSC::Yarr::YarrGenerator::compile):
1019         (JSC::Yarr::jitCompile):
1020         * yarr/YarrJIT.h:
1021         * yarr/YarrPattern.cpp:
1022         (JSC::Yarr::dumpCharacterClass):
1023         (JSC::Yarr::PatternTerm::dump):
1024         (JSC::Yarr::YarrPattern::dumpPatternString):
1025         (JSC::Yarr::YarrPattern::dumpPattern):
1026         * yarr/YarrPattern.h:
1027
1028 2018-08-05  Darin Adler  <darin@apple.com>
1029
1030         [Cocoa] More tweaks and refactoring to prepare for ARC
1031         https://bugs.webkit.org/show_bug.cgi?id=188245
1032
1033         Reviewed by Dan Bernstein.
1034
1035         * API/JSValue.mm: Use __unsafe_unretained.
1036         (JSContainerConvertor::convert): Use auto for compatibility with the above.
1037         * API/JSWrapperMap.mm:
1038         (allocateConstructorForCustomClass): Use CFTypeRef instead of Protocol *.
1039         (-[JSWrapperMap initWithGlobalContextRef:]): Use __unsafe_unretained.
1040
1041         * heap/Heap.cpp: Updated include for rename: FoundationSPI.h -> objcSPI.h.
1042
1043 2018-08-07  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
1044
1045         Shrink size of PropertyCondition by packing UniquedStringImpl* and Kind
1046         https://bugs.webkit.org/show_bug.cgi?id=188328
1047
1048         Reviewed by Saam Barati.
1049
1050         Shrinking the size of PropertyCondition can improve memory consumption by a lot.
1051         For example, cnn.com can show 7000 persistent StructureStubClearingWatchpoint
1052         and 6000 LLIntPrototypeLoadAdaptiveStructureWatchpoint which have PropertyCondition
1053         as a member field.
1054
1055         This patch shrinks the size of PropertyCondition by packing UniquedStringImpl* and
1056         PropertyCondition::Kind into uint64_t data in 64bit architecture. Since our address
1057         are within 48bit, we can put PropertyCondition::Kind in this unused bits.
1058         To make it easy, we add WTF::CompactPointerTuple<PointerType, Type>, which automatically
1059         folds a pointer and 1byte type into 64bit data.
1060
1061         This change shrinks PropertyCondition from 24bytes to 16bytes.
1062
1063         * bytecode/PropertyCondition.cpp:
1064         (JSC::PropertyCondition::dumpInContext const):
1065         (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint const):
1066         (JSC::PropertyCondition::validityRequiresImpurePropertyWatchpoint const):
1067         (JSC::PropertyCondition::isStillValid const):
1068         (JSC::PropertyCondition::isWatchableWhenValid const):
1069         * bytecode/PropertyCondition.h:
1070         (JSC::PropertyCondition::PropertyCondition):
1071         (JSC::PropertyCondition::presenceWithoutBarrier):
1072         (JSC::PropertyCondition::absenceWithoutBarrier):
1073         (JSC::PropertyCondition::absenceOfSetEffectWithoutBarrier):
1074         (JSC::PropertyCondition::equivalenceWithoutBarrier):
1075         (JSC::PropertyCondition::hasPrototypeWithoutBarrier):
1076         (JSC::PropertyCondition::operator bool const):
1077         (JSC::PropertyCondition::kind const):
1078         (JSC::PropertyCondition::uid const):
1079         (JSC::PropertyCondition::hasOffset const):
1080         (JSC::PropertyCondition::hasAttributes const):
1081         (JSC::PropertyCondition::hasPrototype const):
1082         (JSC::PropertyCondition::hasRequiredValue const):
1083         (JSC::PropertyCondition::hash const):
1084         (JSC::PropertyCondition::operator== const):
1085         (JSC::PropertyCondition::isHashTableDeletedValue const):
1086         (JSC::PropertyCondition::watchingRequiresReplacementWatchpoint const):
1087
1088 2018-08-07  Mark Lam  <mark.lam@apple.com>
1089
1090         Use a more specific PtrTag for PlatformRegisters PC and LR.
1091         https://bugs.webkit.org/show_bug.cgi?id=188366
1092         <rdar://problem/42984123>
1093
1094         Reviewed by Keith Miller.
1095
1096         Also fixed a bug in linkRegister(), which was previously returning the PC instead
1097         of LR.  It now returns LR.
1098
1099         * runtime/JSCPtrTag.h:
1100         * runtime/MachineContext.h:
1101         (JSC::MachineContext::instructionPointer):
1102         (JSC::MachineContext::linkRegister):
1103         * runtime/VMTraps.cpp:
1104         (JSC::SignalContext::SignalContext):
1105         * tools/SigillCrashAnalyzer.cpp:
1106         (JSC::SignalContext::SignalContext):
1107
1108 2018-08-07  Karo Gyoker  <karogyoker2+webkit@gmail.com>
1109
1110         Hardcoded LFENCE instruction
1111         https://bugs.webkit.org/show_bug.cgi?id=188145
1112
1113         Reviewed by Filip Pizlo.
1114
1115         Remove lfence instruction because it is crashing systems without SSE2 and
1116         this is not the way how WebKit mitigates Spectre.
1117
1118         * runtime/JSLock.cpp:
1119         (JSC::JSLock::didAcquireLock):
1120         (JSC::JSLock::willReleaseLock):
1121
1122 2018-08-04  David Kilzer  <ddkilzer@apple.com>
1123
1124         REGRESSION (r208953): TemplateObjectDescriptor constructor calculates m_hash on use-after-move variable
1125         <https://webkit.org/b/188331>
1126
1127         Reviewed by Yusuke Suzuki.
1128
1129         * runtime/TemplateObjectDescriptor.h:
1130         (JSC::TemplateObjectDescriptor::TemplateObjectDescriptor):
1131         Use `m_rawstrings` instead of `rawStrings` to calculate hash.
1132
1133 2018-08-03  Saam Barati  <sbarati@apple.com>
1134
1135         Give the `jsc` shell the JIT entitlement
1136         https://bugs.webkit.org/show_bug.cgi?id=188324
1137         <rdar://problem/42885806>
1138
1139         Reviewed by Dan Bernstein.
1140
1141         This should help us in ensuring the system jsc is able to JIT.
1142
1143         * Configurations/JSC.xcconfig:
1144         * JavaScriptCore.xcodeproj/project.pbxproj:
1145         * allow-jit-macOS.entitlements: Added.
1146
1147 2018-08-03  Alex Christensen  <achristensen@webkit.org>
1148
1149         Fix spelling of "overridden"
1150         https://bugs.webkit.org/show_bug.cgi?id=188315
1151
1152         Reviewed by Darin Adler.
1153
1154         * API/JSExport.h:
1155         * inspector/InjectedScriptSource.js:
1156
1157 2018-08-02  Saam Barati  <sbarati@apple.com>
1158
1159         Reading instructionPointer from PlatformRegisters may fail when using pointer profiling
1160         https://bugs.webkit.org/show_bug.cgi?id=188271
1161         <rdar://problem/42850884>
1162
1163         Reviewed by Michael Saboff.
1164
1165         This patch defends against the instructionPointer containing garbage bits.
1166         See radar for details.
1167
1168         * runtime/MachineContext.h:
1169         (JSC::MachineContext::instructionPointer):
1170         * runtime/SamplingProfiler.cpp:
1171         (JSC::SamplingProfiler::takeSample):
1172         * runtime/VMTraps.cpp:
1173         (JSC::SignalContext::SignalContext):
1174         (JSC::SignalContext::tryCreate):
1175         * tools/CodeProfiling.cpp:
1176         (JSC::profilingTimer):
1177         * tools/SigillCrashAnalyzer.cpp:
1178         (JSC::SignalContext::SignalContext):
1179         (JSC::SignalContext::tryCreate):
1180         (JSC::SignalContext::dump):
1181         (JSC::installCrashHandler):
1182         * wasm/WasmFaultSignalHandler.cpp:
1183         (JSC::Wasm::trapHandler):
1184
1185 2018-08-02  David Fenton  <david_fenton@apple.com>
1186
1187         Unreviewed, rolling out r234489.
1188
1189         Caused 50+ crashes and 60+ API failures on iOS
1190
1191         Reverted changeset:
1192
1193         "[WTF] Rename String::format to String::deprecatedFormat"
1194         https://bugs.webkit.org/show_bug.cgi?id=188191
1195         https://trac.webkit.org/changeset/234489
1196
1197 2018-08-01  Yusuke Suzuki  <utatane.tea@gmail.com>
1198
1199         Add self.queueMicrotask(f) on DOMWindow
1200         https://bugs.webkit.org/show_bug.cgi?id=188212
1201
1202         Reviewed by Ryosuke Niwa.
1203
1204         * CMakeLists.txt:
1205         * JavaScriptCore.xcodeproj/project.pbxproj:
1206         * Sources.txt:
1207         * runtime/JSGlobalObject.cpp:
1208         (JSC::enqueueJob):
1209         * runtime/JSMicrotask.cpp: Renamed from Source/JavaScriptCore/runtime/JSJob.cpp.
1210         (JSC::createJSMicrotask):
1211         Export them to WebCore.
1212
1213         (JSC::JSMicrotask::run):
1214         * runtime/JSMicrotask.h: Renamed from Source/JavaScriptCore/runtime/JSJob.h.
1215         Add another version of JSMicrotask which does not have arguments.
1216
1217 2018-08-01  Tomas Popela  <tpopela@redhat.com>
1218
1219         [WTF] Rename String::format to String::deprecatedFormat
1220         https://bugs.webkit.org/show_bug.cgi?id=188191
1221
1222         Reviewed by Darin Adler.
1223
1224         It should be replaced with string concatenation.
1225
1226         * bytecode/CodeBlock.cpp:
1227         (JSC::CodeBlock::nameForRegister):
1228         * inspector/InjectedScriptBase.cpp:
1229         (Inspector::InjectedScriptBase::makeCall):
1230         * inspector/InspectorBackendDispatcher.cpp:
1231         (Inspector::BackendDispatcher::getPropertyValue):
1232         * inspector/agents/InspectorConsoleAgent.cpp:
1233         (Inspector::InspectorConsoleAgent::enable):
1234         (Inspector::InspectorConsoleAgent::stopTiming):
1235         * jsc.cpp:
1236         (FunctionJSCStackFunctor::operator() const):
1237         * parser/Lexer.cpp:
1238         (JSC::Lexer<T>::invalidCharacterMessage const):
1239         * runtime/IntlDateTimeFormat.cpp:
1240         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
1241         * runtime/IntlObject.cpp:
1242         (JSC::canonicalizeLocaleList):
1243         * runtime/LiteralParser.cpp:
1244         (JSC::LiteralParser<CharType>::Lexer::lex):
1245         (JSC::LiteralParser<CharType>::Lexer::lexStringSlow):
1246         (JSC::LiteralParser<CharType>::parse):
1247         * runtime/LiteralParser.h:
1248         (JSC::LiteralParser::getErrorMessage):
1249
1250 2018-08-01  Andy VanWagoner  <andy@vanwagoner.family>
1251
1252         [INTL] Allow "unknown" formatToParts types
1253         https://bugs.webkit.org/show_bug.cgi?id=188176
1254
1255         Reviewed by Darin Adler.
1256
1257         Originally extra unexpected field types were marked as "literal", since
1258         the spec did not account for these. The ECMA 402 spec has since been updated
1259         to specify "unknown" should be used in these cases.
1260
1261         Currently there is no known way to reach these cases, so no tests can
1262         account for them. Theoretically they shoudn't exist, but they are specified,
1263         just to be safe. Marking them as "unknown" instead of "literal" hopefully
1264         will make such cases easy to identify if they ever happen.
1265
1266         * runtime/IntlDateTimeFormat.cpp:
1267         (JSC::IntlDateTimeFormat::partTypeString):
1268         * runtime/IntlNumberFormat.cpp:
1269         (JSC::IntlNumberFormat::partTypeString):
1270
1271 2018-08-01  Andy VanWagoner  <andy@vanwagoner.family>
1272
1273         [INTL] Implement hourCycle in DateTimeFormat
1274         https://bugs.webkit.org/show_bug.cgi?id=188006
1275
1276         Reviewed by Darin Adler.
1277
1278         Implemented hourCycle, updating both the skeleton and the final pattern.
1279         Changed resolveLocale to assume undefined options are not given and null
1280         strings actually mean null, which removes the tag extension.
1281
1282         * runtime/CommonIdentifiers.h:
1283         * runtime/IntlCollator.cpp:
1284         (JSC::IntlCollator::initializeCollator):
1285         * runtime/IntlDateTimeFormat.cpp:
1286         (JSC::IntlDTFInternal::localeData):
1287         (JSC::IntlDateTimeFormat::setFormatsFromPattern):
1288         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
1289         (JSC::IntlDateTimeFormat::resolvedOptions):
1290         * runtime/IntlDateTimeFormat.h:
1291         * runtime/IntlObject.cpp:
1292         (JSC::resolveLocale):
1293
1294 2018-08-01  Keith Miller  <keith_miller@apple.com>
1295
1296         JSArrayBuffer should have its own JSType
1297         https://bugs.webkit.org/show_bug.cgi?id=188231
1298
1299         Reviewed by Saam Barati.
1300
1301         * runtime/JSArrayBuffer.cpp:
1302         (JSC::JSArrayBuffer::createStructure):
1303         * runtime/JSCast.h:
1304         * runtime/JSType.h:
1305
1306 2018-07-31  Keith Miller  <keith_miller@apple.com>
1307
1308         Unreviewed 32-bit build fix...
1309
1310         * dfg/DFGSpeculativeJIT32_64.cpp:
1311
1312 2018-07-31  Keith Miller  <keith_miller@apple.com>
1313
1314         Long compiling JSC files should not be unified
1315         https://bugs.webkit.org/show_bug.cgi?id=188205
1316
1317         Reviewed by Saam Barati.
1318
1319         The DFGSpeculativeJIT and FTLLowerDFGToB3 files take a long time
1320         to compile. Unifying them means touching anything in the same
1321         bundle as those files takes a long time to incrementally build.
1322         This patch separates those files so they build standalone.
1323
1324         * JavaScriptCore.xcodeproj/project.pbxproj:
1325         * Sources.txt:
1326         * dfg/DFGSpeculativeJIT64.cpp:
1327
1328 2018-07-31  Yusuke Suzuki  <utatane.tea@gmail.com>
1329
1330         [JSC] Remove unnecessary cellLock() in JSObject's GC marking if IndexingType is contiguous
1331         https://bugs.webkit.org/show_bug.cgi?id=188201
1332
1333         Reviewed by Keith Miller.
1334
1335         We do not reuse the existing butterfly with Contiguous shape for new ArrayStorage butterfly.
1336         When converting the butterfly with Contiguous shape to ArrayStorage, we always allocate a
1337         new one. So this cellLock() is unnecessary for contiguous shape since contigous shaped butterfly
1338         never becomes broken state. This patch removes unnecessary locking.
1339
1340         * runtime/JSObject.cpp:
1341         (JSC::JSObject::visitButterflyImpl):
1342
1343 2018-07-31  Guillaume Emont  <guijemont@igalia.com>
1344
1345         [JSC] Remove gcc warnings for 32-bit platforms
1346         https://bugs.webkit.org/show_bug.cgi?id=187803
1347
1348         Reviewed by Yusuke Suzuki.
1349
1350         * assembler/MacroAssemblerPrinter.cpp:
1351         (JSC::Printer::printPCRegister):
1352         (JSC::Printer::printRegisterID):
1353         (JSC::Printer::printAddress):
1354         * dfg/DFGSpeculativeJIT.cpp:
1355         (JSC::DFG::SpeculativeJIT::speculateNumber):
1356         (JSC::DFG::SpeculativeJIT::speculateMisc):
1357         * jit/CCallHelpers.h:
1358         (JSC::CCallHelpers::calculatePokeOffset):
1359         * runtime/Options.cpp:
1360         (JSC::parse):
1361
1362 2018-07-30  Wenson Hsieh  <wenson_hsieh@apple.com>
1363
1364         watchOS engineering build is broken after r234227
1365         https://bugs.webkit.org/show_bug.cgi?id=188180
1366
1367         Reviewed by Keith Miller.
1368
1369         In the case where we're building with a `PLATFORM_NAME` of neither "macosx" nor "iphone*",
1370         postprocess-headers.sh attempts to delete any usage of the JSC availability macros. However,
1371         `JSC_MAC_VERSION_TBA` and `JSC_IOS_VERSION_TBA` still remain, and JSValue.h's usage of
1372         `JSC_IOS_VERSION_TBA` causes engineering watchOS builds to fail.
1373
1374         To fix this, simply allow the fallback path to remove these macros from JavaScriptCore headers
1375         entirely, since there's no relevant version to replace them with.
1376
1377         * postprocess-headers.sh:
1378
1379 2018-07-30  Keith Miller  <keith_miller@apple.com>
1380
1381         Clarify conversion rules for JSValue property access API
1382         https://bugs.webkit.org/show_bug.cgi?id=188179
1383
1384         Reviewed by Geoffrey Garen.
1385
1386         * API/JSValue.h:
1387
1388 2018-07-30  Keith Miller  <keith_miller@apple.com>
1389
1390         Rename some JSC API functions/types.
1391         https://bugs.webkit.org/show_bug.cgi?id=188173
1392
1393         Reviewed by Saam Barati.
1394
1395         * API/JSObjectRef.cpp:
1396         (JSObjectHasPropertyForKey):
1397         (JSObjectGetPropertyForKey):
1398         (JSObjectSetPropertyForKey):
1399         (JSObjectDeletePropertyForKey):
1400         (JSObjectHasPropertyKey): Deleted.
1401         (JSObjectGetPropertyKey): Deleted.
1402         (JSObjectSetPropertyKey): Deleted.
1403         (JSObjectDeletePropertyKey): Deleted.
1404         * API/JSObjectRef.h:
1405         * API/JSValue.h:
1406         * API/JSValue.mm:
1407         (-[JSValue valueForProperty:]):
1408         (-[JSValue setValue:forProperty:]):
1409         (-[JSValue deleteProperty:]):
1410         (-[JSValue hasProperty:]):
1411         (-[JSValue defineProperty:descriptor:]):
1412         * API/tests/testapi.cpp:
1413         (TestAPI::run):
1414
1415 2018-07-30  Mark Lam  <mark.lam@apple.com>
1416
1417         Add a debugging utility to dump the memory layout of a JSCell.
1418         https://bugs.webkit.org/show_bug.cgi?id=188157
1419
1420         Reviewed by Yusuke Suzuki.
1421
1422         This patch adds $vm.dumpCell() and VMInspector::dumpCellMemory() to allow us to
1423         dump the memory contents of a cell and if present, its butterfly for debugging
1424         purposes.
1425
1426         Example usage for JS code when JSC_useDollarVM=true:
1427
1428             $vm.dumpCell(obj);
1429
1430         Example usage from C++ code or from lldb: 
1431
1432             (lldb) p JSC::VMInspector::dumpCellMemory(obj)
1433
1434         Some examples of dumps:
1435
1436             <0x104bc8260, Object>
1437               [0] 0x104bc8260 : 0x010016000000016c header
1438                 structureID 364 0x16c structure 0x104b721b0
1439                 indexingTypeAndMisc 0 0x0 NonArray
1440                 type 22 0x16
1441                 flags 0 0x0
1442                 cellState 1
1443               [1] 0x104bc8268 : 0x0000000000000000 butterfly
1444               [2] 0x104bc8270 : 0xffff000000000007
1445               [3] 0x104bc8278 : 0xffff000000000008
1446
1447             <0x104bb4360, Array>
1448               [0] 0x104bb4360 : 0x0108210b00000171 header
1449                 structureID 369 0x171 structure 0x104b723e0
1450                 indexingTypeAndMisc 11 0xb ArrayWithArrayStorage
1451                 type 33 0x21
1452                 flags 8 0x8
1453                 cellState 1
1454               [1] 0x104bb4368 : 0x00000008000f4718 butterfly
1455                 base 0x8000f46e0
1456                 hasIndexingHeader YES hasAnyArrayStorage YES
1457                 publicLength 4 vectorLength 7 indexBias 2
1458                 preCapacity 2 propertyCapacity 4
1459                   <--- preCapacity
1460                   [0] 0x8000f46e0 : 0x0000000000000000
1461                   [1] 0x8000f46e8 : 0x0000000000000000
1462                   <--- propertyCapacity
1463                   [2] 0x8000f46f0 : 0x0000000000000000
1464                   [3] 0x8000f46f8 : 0x0000000000000000
1465                   [4] 0x8000f4700 : 0xffff00000000000d
1466                   [5] 0x8000f4708 : 0xffff00000000000c
1467                   <--- indexingHeader
1468                   [6] 0x8000f4710 : 0x0000000700000004
1469                   <--- butterfly
1470                   <--- arrayStorage
1471                   [7] 0x8000f4718 : 0x0000000000000000
1472                   [8] 0x8000f4720 : 0x0000000400000002
1473                   <--- indexedProperties
1474                   [9] 0x8000f4728 : 0xffff000000000008
1475                   [10] 0x8000f4730 : 0xffff000000000009
1476                   [11] 0x8000f4738 : 0xffff000000000005
1477                   [12] 0x8000f4740 : 0xffff000000000006
1478                   [13] 0x8000f4748 : 0x0000000000000000
1479                   [14] 0x8000f4750 : 0x0000000000000000
1480                   [15] 0x8000f4758 : 0x0000000000000000
1481                   <--- unallocated capacity
1482                   [16] 0x8000f4760 : 0x0000000000000000
1483                   [17] 0x8000f4768 : 0x0000000000000000
1484                   [18] 0x8000f4770 : 0x0000000000000000
1485                   [19] 0x8000f4778 : 0x0000000000000000
1486
1487         * runtime/JSObject.h:
1488         * tools/JSDollarVM.cpp:
1489         (JSC::functionDumpCell):
1490         (JSC::JSDollarVM::finishCreation):
1491         * tools/VMInspector.cpp:
1492         (JSC::VMInspector::dumpCellMemory):
1493         (JSC::IndentationScope::IndentationScope):
1494         (JSC::IndentationScope::~IndentationScope):
1495         (JSC::VMInspector::dumpCellMemoryToStream):
1496         * tools/VMInspector.h:
1497
1498 2018-07-27  Mark Lam  <mark.lam@apple.com>
1499
1500         Add some crash info to Heap::checkConn() RELEASE_ASSERTs.
1501         https://bugs.webkit.org/show_bug.cgi?id=188123
1502         <rdar://problem/42672268>
1503
1504         Reviewed by Keith Miller.
1505
1506         1. Add VM::m_id and Heap::m_lastPhase fields.  Both of these fit within existing
1507            padding space in VM and Heap, and should not cost any measurable perf to
1508            initialize and update.
1509
1510         2. Add some crash info to the RELEASE_ASSERTs in Heap::checkConn():
1511
1512            worldState tells us the value we failed the assertion on.
1513
1514            m_lastPhase, m_currentPhase, and m_nextPhase tells us the GC phase transition
1515            that led us here.
1516
1517            VM::id(), and VM::numberOfIDs() tells us how many VMs may be in play.
1518
1519            VM::isEntered() tells us if the current VM is currently executing JS code.
1520
1521            Some of this data may be redundant, but the redundancy is intentional so that
1522            we can double check what is really happening at the time of crash.
1523
1524         * heap/Heap.cpp:
1525         (JSC::asInt):
1526         (JSC::Heap::checkConn):
1527         (JSC::Heap::changePhase):
1528         * heap/Heap.h:
1529         * runtime/VM.cpp:
1530         (JSC::VM::nextID):
1531         (JSC::VM::VM):
1532         * runtime/VM.h:
1533         (JSC::VM::numberOfIDs):
1534         (JSC::VM::id const):
1535         (JSC::VM::isEntered const):
1536
1537 2018-07-25  Yusuke Suzuki  <utatane.tea@gmail.com>
1538
1539         [JSC] Record CoW status in ArrayProfile correctly
1540         https://bugs.webkit.org/show_bug.cgi?id=187949
1541
1542         Reviewed by Saam Barati.
1543
1544         In this patch, we simplify asArrayModes: just shifting the value with IndexingMode.
1545         This is important since our OSR exit compiler records m_observedArrayModes by calculating
1546         ArrayModes with shifting. Since ArrayModes for CoW arrays are incorrectly calculated,
1547         our OSR exit compiler records incorrect results in ArrayProfile. And it leads to
1548         Array::Generic DFG nodes.
1549
1550         * bytecode/ArrayProfile.h:
1551         (JSC::asArrayModes):
1552         (JSC::ArrayProfile::ArrayProfile):
1553         * dfg/DFGOSRExit.cpp:
1554         (JSC::DFG::OSRExit::compileExit):
1555         * ftl/FTLOSRExitCompiler.cpp:
1556         (JSC::FTL::compileStub):
1557         * runtime/IndexingType.h:
1558
1559 2018-07-26  Andy VanWagoner  <andy@vanwagoner.family>
1560
1561         [INTL] Remove INTL sub-feature compile flags
1562         https://bugs.webkit.org/show_bug.cgi?id=188081
1563
1564         Reviewed by Michael Catanzaro.
1565
1566         Removed ENABLE_INTL_NUMBER_FORMAT_TO_PARTS and ENABLE_INTL_PLURAL_RULES flags.
1567         The runtime flags are still present, and should be relied on instead.
1568         The defines for ICU features have also been updated to match HAVE() style.
1569
1570         * Configurations/FeatureDefines.xcconfig:
1571         * runtime/IntlPluralRules.cpp:
1572         (JSC::IntlPluralRules::resolvedOptions):
1573         (JSC::IntlPluralRules::select):
1574         * runtime/IntlPluralRules.h:
1575         * runtime/Options.h:
1576
1577 2018-07-26  Yusuke Suzuki  <utatane.tea@gmail.com>
1578
1579         [JSC] Dump IndexingMode in Structure
1580         https://bugs.webkit.org/show_bug.cgi?id=188085
1581
1582         Reviewed by Keith Miller.
1583
1584         Dump IndexingMode instead of IndexingType.
1585
1586         * runtime/Structure.cpp:
1587         (JSC::Structure::dump const):
1588
1589 2018-07-26  Ross Kirsling  <ross.kirsling@sony.com>
1590
1591         String(View) should have a splitAllowingEmptyEntries function instead of a flag parameter
1592         https://bugs.webkit.org/show_bug.cgi?id=187963
1593
1594         Reviewed by Alex Christensen.
1595
1596         * inspector/InspectorBackendDispatcher.cpp:
1597         (Inspector::BackendDispatcher::dispatch):
1598         * jsc.cpp:
1599         (ModuleName::ModuleName):
1600         (resolvePath):
1601         * runtime/IntlObject.cpp:
1602         (JSC::canonicalizeLanguageTag):
1603         (JSC::removeUnicodeLocaleExtension):
1604         Update split/splitAllowingEmptyEntries usage.
1605
1606 2018-07-26  Commit Queue  <commit-queue@webkit.org>
1607
1608         Unreviewed, rolling out r234181 and r234189.
1609         https://bugs.webkit.org/show_bug.cgi?id=188075
1610
1611         These are not needed right now (Requested by thorton on
1612         #webkit).
1613
1614         Reverted changesets:
1615
1616         "Enable Web Content Filtering on watchOS"
1617         https://bugs.webkit.org/show_bug.cgi?id=187979
1618         https://trac.webkit.org/changeset/234181
1619
1620         "HAVE(PARENTAL_CONTROLS) should be true on watchOS"
1621         https://bugs.webkit.org/show_bug.cgi?id=187985
1622         https://trac.webkit.org/changeset/234189
1623
1624 2018-07-26  Mark Lam  <mark.lam@apple.com>
1625
1626         arrayProtoPrivateFuncConcatMemcpy() should handle copying from an Undecided type array.
1627         https://bugs.webkit.org/show_bug.cgi?id=188065
1628         <rdar://problem/42515726>
1629
1630         Reviewed by Saam Barati.
1631
1632         * runtime/ArrayPrototype.cpp:
1633         (JSC::clearElement):
1634         (JSC::copyElements):
1635         (JSC::arrayProtoPrivateFuncConcatMemcpy):
1636
1637 2018-07-26  Andy VanWagoner  <andy@vanwagoner.family>
1638
1639         JSC: Intl API should ignore encoding when parsing BCP 47 language tag from ISO 15897 locale string (passed via LANG)
1640         https://bugs.webkit.org/show_bug.cgi?id=167991
1641
1642         Reviewed by Michael Catanzaro.
1643
1644         Improved the conversion of ICU locales to BCP47 tags, using their preferred method.
1645         Checked locale.isEmpty() before returning it from defaultLocale, so there should be
1646         no more cases where you might have an invalid locale come back from resolveLocale.
1647
1648         * runtime/IntlObject.cpp:
1649         (JSC::convertICULocaleToBCP47LanguageTag):
1650         (JSC::defaultLocale):
1651         (JSC::lookupMatcher):
1652         * runtime/IntlObject.h:
1653         * runtime/JSGlobalObject.cpp:
1654         (JSC::JSGlobalObject::intlCollatorAvailableLocales):
1655         (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales):
1656         (JSC::JSGlobalObject::intlNumberFormatAvailableLocales):
1657         (JSC::JSGlobalObject::intlPluralRulesAvailableLocales):
1658
1659 2018-07-26  Fujii Hironori  <Hironori.Fujii@sony.com>
1660
1661         REGRESSION(r234248) [Win] testapi.c: nonstandard extension used: non-constant aggregate initializer
1662         https://bugs.webkit.org/show_bug.cgi?id=188040
1663
1664         Unreviewed build fix for AppleWin port.
1665
1666         * API/tests/testapi.c: Disabled warning C4204.
1667         (testMarkingConstraintsAndHeapFinalizers): Added an explicit void* cast for weakRefs.
1668
1669 2018-07-26  Fujii Hironori  <Hironori.Fujii@sony.com>
1670
1671         [JSC API] We should support the symbol type in our C/Obj-C API
1672         https://bugs.webkit.org/show_bug.cgi?id=175836
1673
1674         Unreviewed build fix for Windows port.
1675
1676         r234227 introduced a compilation error unresolved external symbol
1677         "int __cdecl testCAPIViaCpp(void)" in testapi for Windows ports.
1678
1679         Windows ports are compiling testapi.c as C++ by using /TP switch.
1680
1681         * API/tests/testapi.c:
1682         (main): Removed `::` prefix of ::SetErrorMode Windows API.
1683         (dllLauncherEntryPoint): Converted into C style.
1684         * shell/PlatformWin.cmake: Do not use /TP switch for testapi.c
1685
1686 2018-07-25  Keith Miller  <keith_miller@apple.com>
1687
1688         [JSC API] We should support the symbol type in our C/Obj-C API
1689         https://bugs.webkit.org/show_bug.cgi?id=175836
1690
1691         Reviewed by Filip Pizlo.
1692
1693         This patch makes the following API additions:
1694         1) Test if a JSValue/JSValueRef is a symbol via any of the methods API are able to test for the types of other JSValues.
1695         2) Create a symbol on both APIs.
1696         3) Get/Set/Delete/Define property now take ids in the Obj-C API.
1697         4) Add Get/Set/Delete in the C API.
1698
1699         We can do 3 because it is both binary and source compatable with
1700         the existing API. I added (4) because the current property access
1701         APIs only have the ability to get Strings. It was possible to
1702         merge symbols into JSStringRef but that felt confusing and exposes
1703         implementation details of our engine. The new functions match the
1704         same meaning that they have in JS, thus should be forward
1705         compatible with any future language extensions.
1706
1707         Lastly, this patch adds the same availability preproccessing phase
1708         in WebCore to JavaScriptCore, which enables TBA features for
1709         testing on previous releases.
1710
1711         * API/APICast.h:
1712         * API/JSBasePrivate.h:
1713         * API/JSContext.h:
1714         * API/JSContextPrivate.h:
1715         * API/JSContextRef.h:
1716         * API/JSContextRefInternal.h:
1717         * API/JSContextRefPrivate.h:
1718         * API/JSManagedValue.h:
1719         * API/JSObjectRef.cpp:
1720         (JSObjectHasPropertyKey):
1721         (JSObjectGetPropertyKey):
1722         (JSObjectSetPropertyKey):
1723         (JSObjectDeletePropertyKey):
1724         * API/JSObjectRef.h:
1725         * API/JSRemoteInspector.h:
1726         * API/JSTypedArray.h:
1727         * API/JSValue.h:
1728         * API/JSValue.mm:
1729         (+[JSValue valueWithNewSymbolFromDescription:inContext:]):
1730         (performPropertyOperation):
1731         (-[JSValue valueForProperty:valueForProperty:]):
1732         (-[JSValue setValue:forProperty:setValue:forProperty:]):
1733         (-[JSValue deleteProperty:deleteProperty:]):
1734         (-[JSValue hasProperty:hasProperty:]):
1735         (-[JSValue defineProperty:descriptor:defineProperty:descriptor:]):
1736         (-[JSValue isSymbol]):
1737         (-[JSValue objectForKeyedSubscript:]):
1738         (-[JSValue setObject:forKeyedSubscript:]):
1739         (-[JSValue valueForProperty:]): Deleted.
1740         (-[JSValue setValue:forProperty:]): Deleted.
1741         (-[JSValue deleteProperty:]): Deleted.
1742         (-[JSValue hasProperty:]): Deleted.
1743         (-[JSValue defineProperty:descriptor:]): Deleted.
1744         * API/JSValueRef.cpp:
1745         (JSValueGetType):
1746         (JSValueIsSymbol):
1747         (JSValueMakeSymbol):
1748         * API/JSValueRef.h:
1749         * API/WebKitAvailability.h:
1750         * API/tests/CurrentThisInsideBlockGetterTest.mm:
1751         * API/tests/CustomGlobalObjectClassTest.c:
1752         * API/tests/DateTests.mm:
1753         * API/tests/JSExportTests.mm:
1754         * API/tests/JSNode.c:
1755         * API/tests/JSNodeList.c:
1756         * API/tests/Node.c:
1757         * API/tests/NodeList.c:
1758         * API/tests/minidom.c:
1759         * API/tests/testapi.c:
1760         (main):
1761         * API/tests/testapi.cpp: Added.
1762         (APIString::APIString):
1763         (APIString::~APIString):
1764         (APIString::operator JSStringRef):
1765         (APIContext::APIContext):
1766         (APIContext::~APIContext):
1767         (APIContext::operator JSGlobalContextRef):
1768         (APIVector::APIVector):
1769         (APIVector::~APIVector):
1770         (APIVector::append):
1771         (testCAPIViaCpp):
1772         (TestAPI::evaluateScript):
1773         (TestAPI::callFunction):
1774         (TestAPI::functionReturnsTrue):
1775         (TestAPI::check):
1776         (TestAPI::checkJSAndAPIMatch):
1777         (TestAPI::interestingObjects):
1778         (TestAPI::interestingKeys):
1779         (TestAPI::run):
1780         * API/tests/testapi.mm:
1781         (testObjectiveCAPIMain):
1782         * JavaScriptCore.xcodeproj/project.pbxproj:
1783         * config.h:
1784         * postprocess-headers.sh:
1785         * shell/CMakeLists.txt:
1786         * testmem/testmem.mm:
1787
1788 2018-07-25  Andy VanWagoner  <andy@vanwagoner.family>
1789
1790         [INTL] Call Typed Array elements toLocaleString with locale and options
1791         https://bugs.webkit.org/show_bug.cgi?id=185796
1792
1793         Reviewed by Keith Miller.
1794
1795         Improve ECMA 402 compliance of typed array toLocaleString, passing along
1796         the locale and options to element toLocaleString calls.
1797
1798         * builtins/TypedArrayPrototype.js:
1799         (toLocaleString):
1800
1801 2018-07-25  Andy VanWagoner  <andy@vanwagoner.family>
1802
1803         [INTL] Intl constructor lengths should be configurable
1804         https://bugs.webkit.org/show_bug.cgi?id=187960
1805
1806         Reviewed by Saam Barati.
1807
1808         Removed DontDelete from Intl constructor lengths.
1809         Fixed DateTimeFormat formatToParts length.
1810
1811         * runtime/IntlCollatorConstructor.cpp:
1812         (JSC::IntlCollatorConstructor::finishCreation):
1813         * runtime/IntlDateTimeFormatConstructor.cpp:
1814         (JSC::IntlDateTimeFormatConstructor::finishCreation):
1815         * runtime/IntlDateTimeFormatPrototype.cpp:
1816         (JSC::IntlDateTimeFormatPrototype::finishCreation):
1817         * runtime/IntlNumberFormatConstructor.cpp:
1818         (JSC::IntlNumberFormatConstructor::finishCreation):
1819         * runtime/IntlPluralRulesConstructor.cpp:
1820         (JSC::IntlPluralRulesConstructor::finishCreation):
1821
1822 2018-07-24  Fujii Hironori  <Hironori.Fujii@sony.com>
1823
1824         runJITThreadLimitTests is failing
1825         https://bugs.webkit.org/show_bug.cgi?id=187886
1826         <rdar://problem/42561966>
1827
1828         Unreviewed build fix for MSVC.
1829
1830         MSVC doen't support ternary operator without second operand.
1831
1832         * dfg/DFGWorklist.cpp:
1833         (JSC::DFG::getNumberOfDFGCompilerThreads):
1834         (JSC::DFG::getNumberOfFTLCompilerThreads):
1835
1836 2018-07-24  Commit Queue  <commit-queue@webkit.org>
1837
1838         Unreviewed, rolling out r234183.
1839         https://bugs.webkit.org/show_bug.cgi?id=187983
1840
1841         cause regression in Kraken gaussian blur and desaturate
1842         (Requested by yusukesuzuki on #webkit).
1843
1844         Reverted changeset:
1845
1846         "[JSC] Record CoW status in ArrayProfile"
1847         https://bugs.webkit.org/show_bug.cgi?id=187949
1848         https://trac.webkit.org/changeset/234183
1849
1850 2018-07-24  Yusuke Suzuki  <utatane.tea@gmail.com>
1851
1852         [JSC] Record CoW status in ArrayProfile
1853         https://bugs.webkit.org/show_bug.cgi?id=187949
1854
1855         Reviewed by Saam Barati.
1856
1857         Once CoW array is converted to non-CoW array, subsequent operations are done for this non-CoW array.
1858         Even though these operations are performed onto both CoW and non-CoW arrays in the code, array profiles
1859         in these code typically record only non-CoW arrays since array profiles hold only one StructureID recently
1860         seen. This results emitting CheckStructure for non-CoW arrays in DFG, and it soon causes OSR exits due to
1861         CoW arrays.
1862
1863         In this patch, we record CoW status in ArrayProfile separately to construct more appropriate DFG::ArrayMode
1864         speculation. To do so efficiently, we store union of seen IndexingMode in ArrayProfile.
1865
1866         This patch removes one of Kraken/stanford-crypto-aes's OSR exit reason, and improves the performance by 6-7%.
1867
1868                                       baseline                  patched
1869
1870         stanford-crypto-aes        60.893+-1.346      ^      57.412+-1.298         ^ definitely 1.0606x faster
1871         stanford-crypto-ccm        62.124+-1.992             58.921+-1.844           might be 1.0544x faster
1872
1873         * bytecode/ArrayProfile.cpp:
1874         (JSC::ArrayProfile::briefDescriptionWithoutUpdating):
1875         * bytecode/ArrayProfile.h:
1876         (JSC::asArrayModes):
1877         We simplify asArrayModes instead of giving up Int8ArrayMode - Float64ArrayMode contiguous sequence.
1878
1879         (JSC::ArrayProfile::ArrayProfile):
1880         (JSC::ArrayProfile::addressOfObservedIndexingModes):
1881         (JSC::ArrayProfile::observedIndexingModes const):
1882         Currently, our macro assembler and offlineasm only support `or32` / `ori` operation onto addresses.
1883         So storing the union of seen IndexingMode in `unsigned` instead.
1884
1885         * dfg/DFGArrayMode.cpp:
1886         (JSC::DFG::ArrayMode::fromObserved):
1887         * dfg/DFGArrayMode.h:
1888         (JSC::DFG::ArrayMode::withProfile const):
1889         * jit/JITCall.cpp:
1890         (JSC::JIT::compileOpCall):
1891         * jit/JITCall32_64.cpp:
1892         (JSC::JIT::compileOpCall):
1893         * jit/JITInlines.h:
1894         (JSC::JIT::emitArrayProfilingSiteWithCell):
1895         * llint/LowLevelInterpreter.asm:
1896         * llint/LowLevelInterpreter32_64.asm:
1897         * llint/LowLevelInterpreter64.asm:
1898
1899 2018-07-24  Tim Horton  <timothy_horton@apple.com>
1900
1901         Enable Web Content Filtering on watchOS
1902         https://bugs.webkit.org/show_bug.cgi?id=187979
1903         <rdar://problem/42559346>
1904
1905         Reviewed by Wenson Hsieh.
1906
1907         * Configurations/FeatureDefines.xcconfig:
1908
1909 2018-07-24  Tadeu Zagallo  <tzagallo@apple.com>
1910
1911         Don't modify Options when setting JIT thread limits
1912         https://bugs.webkit.org/show_bug.cgi?id=187886
1913
1914         Reviewed by Filip Pizlo.
1915
1916         Previously, when setting the JIT thread limit prior to the worklist
1917         initialization, it'd be set via Options, which didn't work if Options
1918         hadn't been initialized yet. Change it to use a static variable in the
1919         Worklist instead.
1920
1921         * API/JSVirtualMachine.mm:
1922         (+[JSVirtualMachine setNumberOfDFGCompilerThreads:]):
1923         (+[JSVirtualMachine setNumberOfFTLCompilerThreads:]):
1924         * API/tests/testapi.mm:
1925         (testObjectiveCAPIMain):
1926         * dfg/DFGWorklist.cpp:
1927         (JSC::DFG::getNumberOfDFGCompilerThreads):
1928         (JSC::DFG::getNumberOfFTLCompilerThreads):
1929         (JSC::DFG::setNumberOfDFGCompilerThreads):
1930         (JSC::DFG::setNumberOfFTLCompilerThreads):
1931         (JSC::DFG::ensureGlobalDFGWorklist):
1932         (JSC::DFG::ensureGlobalFTLWorklist):
1933         * dfg/DFGWorklist.h:
1934
1935 2018-07-24  Mark Lam  <mark.lam@apple.com>
1936
1937         Refactoring: make DFG::Plan a class.
1938         https://bugs.webkit.org/show_bug.cgi?id=187968
1939
1940         Reviewed by Saam Barati.
1941
1942         This patch makes all the DFG::Plan fields private, and provide accessor methods
1943         for them.  This makes it easier to reason about how these fields are used and
1944         modified.
1945
1946         * dfg/DFGAbstractInterpreterInlines.h:
1947         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1948         * dfg/DFGByteCodeParser.cpp:
1949         (JSC::DFG::ByteCodeParser::handleCall):
1950         (JSC::DFG::ByteCodeParser::handleVarargsCall):
1951         (JSC::DFG::ByteCodeParser::handleInlining):
1952         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1953         (JSC::DFG::ByteCodeParser::handleDOMJITGetter):
1954         (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad):
1955         (JSC::DFG::ByteCodeParser::handleGetById):
1956         (JSC::DFG::ByteCodeParser::handlePutById):
1957         (JSC::DFG::ByteCodeParser::parseBlock):
1958         (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
1959         (JSC::DFG::ByteCodeParser::parseCodeBlock):
1960         (JSC::DFG::ByteCodeParser::parse):
1961         * dfg/DFGCFAPhase.cpp:
1962         (JSC::DFG::CFAPhase::run):
1963         (JSC::DFG::CFAPhase::injectOSR):
1964         * dfg/DFGClobberize.h:
1965         (JSC::DFG::clobberize):
1966         * dfg/DFGCommonData.cpp:
1967         (JSC::DFG::CommonData::notifyCompilingStructureTransition):
1968         * dfg/DFGCommonData.h:
1969         * dfg/DFGConstantFoldingPhase.cpp:
1970         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1971         * dfg/DFGDriver.cpp:
1972         (JSC::DFG::compileImpl):
1973         * dfg/DFGFinalizer.h:
1974         * dfg/DFGFixupPhase.cpp:
1975         (JSC::DFG::FixupPhase::fixupNode):
1976         (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue):
1977         * dfg/DFGGraph.cpp:
1978         (JSC::DFG::Graph::Graph):
1979         (JSC::DFG::Graph::watchCondition):
1980         (JSC::DFG::Graph::inferredTypeFor):
1981         (JSC::DFG::Graph::requiredRegisterCountForExit):
1982         (JSC::DFG::Graph::registerFrozenValues):
1983         (JSC::DFG::Graph::registerStructure):
1984         (JSC::DFG::Graph::registerAndWatchStructureTransition):
1985         (JSC::DFG::Graph::assertIsRegistered):
1986         * dfg/DFGGraph.h:
1987         (JSC::DFG::Graph::compilation):
1988         (JSC::DFG::Graph::identifiers):
1989         (JSC::DFG::Graph::watchpoints):
1990         * dfg/DFGJITCompiler.cpp:
1991         (JSC::DFG::JITCompiler::JITCompiler):
1992         (JSC::DFG::JITCompiler::link):
1993         (JSC::DFG::JITCompiler::compile):
1994         (JSC::DFG::JITCompiler::compileFunction):
1995         (JSC::DFG::JITCompiler::disassemble):
1996         * dfg/DFGJITCompiler.h:
1997         (JSC::DFG::JITCompiler::addWeakReference):
1998         * dfg/DFGJITFinalizer.cpp:
1999         (JSC::DFG::JITFinalizer::finalize):
2000         (JSC::DFG::JITFinalizer::finalizeFunction):
2001         (JSC::DFG::JITFinalizer::finalizeCommon):
2002         * dfg/DFGOSREntrypointCreationPhase.cpp:
2003         (JSC::DFG::OSREntrypointCreationPhase::run):
2004         * dfg/DFGPhase.cpp:
2005         (JSC::DFG::Phase::beginPhase):
2006         * dfg/DFGPhase.h:
2007         (JSC::DFG::runAndLog):
2008         * dfg/DFGPlan.cpp:
2009         (JSC::DFG::Plan::Plan):
2010         (JSC::DFG::Plan::computeCompileTimes const):
2011         (JSC::DFG::Plan::reportCompileTimes const):
2012         (JSC::DFG::Plan::compileInThread):
2013         (JSC::DFG::Plan::compileInThreadImpl):
2014         (JSC::DFG::Plan::isStillValid):
2015         (JSC::DFG::Plan::reallyAdd):
2016         (JSC::DFG::Plan::notifyCompiling):
2017         (JSC::DFG::Plan::notifyReady):
2018         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
2019         (JSC::DFG::Plan::finalizeAndNotifyCallback):
2020         (JSC::DFG::Plan::key):
2021         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
2022         (JSC::DFG::Plan::finalizeInGC):
2023         (JSC::DFG::Plan::isKnownToBeLiveDuringGC):
2024         (JSC::DFG::Plan::cancel):
2025         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
2026         * dfg/DFGPlan.h:
2027         (JSC::DFG::Plan::canTierUpAndOSREnter const):
2028         (JSC::DFG::Plan::vm const):
2029         (JSC::DFG::Plan::codeBlock):
2030         (JSC::DFG::Plan::mode const):
2031         (JSC::DFG::Plan::osrEntryBytecodeIndex const):
2032         (JSC::DFG::Plan::mustHandleValues const):
2033         (JSC::DFG::Plan::threadData const):
2034         (JSC::DFG::Plan::compilation const):
2035         (JSC::DFG::Plan::finalizer const):
2036         (JSC::DFG::Plan::setFinalizer):
2037         (JSC::DFG::Plan::inlineCallFrames const):
2038         (JSC::DFG::Plan::watchpoints):
2039         (JSC::DFG::Plan::identifiers):
2040         (JSC::DFG::Plan::weakReferences):
2041         (JSC::DFG::Plan::transitions):
2042         (JSC::DFG::Plan::recordedStatuses):
2043         (JSC::DFG::Plan::willTryToTierUp const):
2044         (JSC::DFG::Plan::setWillTryToTierUp):
2045         (JSC::DFG::Plan::tierUpInLoopHierarchy):
2046         (JSC::DFG::Plan::tierUpAndOSREnterBytecodes):
2047         (JSC::DFG::Plan::stage const):
2048         (JSC::DFG::Plan::callback const):
2049         (JSC::DFG::Plan::setCallback):
2050         * dfg/DFGPlanInlines.h:
2051         (JSC::DFG::Plan::iterateCodeBlocksForGC):
2052         * dfg/DFGPreciseLocalClobberize.h:
2053         (JSC::DFG::PreciseLocalClobberizeAdaptor::readTop):
2054         * dfg/DFGPredictionInjectionPhase.cpp:
2055         (JSC::DFG::PredictionInjectionPhase::run):
2056         * dfg/DFGSafepoint.cpp:
2057         (JSC::DFG::Safepoint::Safepoint):
2058         (JSC::DFG::Safepoint::~Safepoint):
2059         (JSC::DFG::Safepoint::begin):
2060         * dfg/DFGSafepoint.h:
2061         * dfg/DFGSpeculativeJIT.h:
2062         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPointer):
2063         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer):
2064         * dfg/DFGStackLayoutPhase.cpp:
2065         (JSC::DFG::StackLayoutPhase::run):
2066         * dfg/DFGStrengthReductionPhase.cpp:
2067         (JSC::DFG::StrengthReductionPhase::handleNode):
2068         * dfg/DFGTierUpCheckInjectionPhase.cpp:
2069         (JSC::DFG::TierUpCheckInjectionPhase::run):
2070         * dfg/DFGTypeCheckHoistingPhase.cpp:
2071         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
2072         * dfg/DFGWorklist.cpp:
2073         (JSC::DFG::Worklist::isActiveForVM const):
2074         (JSC::DFG::Worklist::compilationState):
2075         (JSC::DFG::Worklist::waitUntilAllPlansForVMAreReady):
2076         (JSC::DFG::Worklist::removeAllReadyPlansForVM):
2077         (JSC::DFG::Worklist::completeAllReadyPlansForVM):
2078         (JSC::DFG::Worklist::visitWeakReferences):
2079         (JSC::DFG::Worklist::removeDeadPlans):
2080         (JSC::DFG::Worklist::removeNonCompilingPlansForVM):
2081         * dfg/DFGWorklistInlines.h:
2082         (JSC::DFG::Worklist::iterateCodeBlocksForGC):
2083         * ftl/FTLCompile.cpp:
2084         (JSC::FTL::compile):
2085         * ftl/FTLFail.cpp:
2086         (JSC::FTL::fail):
2087         * ftl/FTLJITFinalizer.cpp:
2088         (JSC::FTL::JITFinalizer::finalizeCommon):
2089         * ftl/FTLLink.cpp:
2090         (JSC::FTL::link):
2091         * ftl/FTLLowerDFGToB3.cpp:
2092         (JSC::FTL::DFG::LowerDFGToB3::compileMultiPutByOffset):
2093         (JSC::FTL::DFG::LowerDFGToB3::buildExitArguments):
2094         (JSC::FTL::DFG::LowerDFGToB3::addWeakReference):
2095         * ftl/FTLState.cpp:
2096         (JSC::FTL::State::State):
2097
2098 2018-07-24  Saam Barati  <sbarati@apple.com>
2099
2100         Make VM::canUseJIT an inlined function
2101         https://bugs.webkit.org/show_bug.cgi?id=187583
2102
2103         Reviewed by Mark Lam.
2104
2105         We know the answer to this query in initializeThreading after initializing
2106         the executable allocator. This patch makes it so that we just hold this value
2107         in a static variable and have an inlined function that just returns the value
2108         of that static variable.
2109
2110         * runtime/InitializeThreading.cpp:
2111         (JSC::initializeThreading):
2112         * runtime/VM.cpp:
2113         (JSC::VM::computeCanUseJIT):
2114         (JSC::VM::canUseJIT): Deleted.
2115         * runtime/VM.h:
2116         (JSC::VM::canUseJIT):
2117
2118 2018-07-24  Mark Lam  <mark.lam@apple.com>
2119
2120         Placate exception check verification after recent changes.
2121         https://bugs.webkit.org/show_bug.cgi?id=187961
2122         <rdar://problem/42545394>
2123
2124         Reviewed by Saam Barati.
2125
2126         * runtime/IntlObject.cpp:
2127         (JSC::intlNumberOption):
2128
2129 2018-07-23  Saam Barati  <sbarati@apple.com>
2130
2131         need to didFoldClobberWorld when we constant fold GetByVal
2132         https://bugs.webkit.org/show_bug.cgi?id=187917
2133         <rdar://problem/42505095>
2134
2135         Reviewed by Yusuke Suzuki.
2136
2137         * dfg/DFGAbstractInterpreterInlines.h:
2138         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2139
2140 2018-07-23  Andy VanWagoner  <andy@vanwagoner.family>
2141
2142         [INTL] Language tags are not canonicalized
2143         https://bugs.webkit.org/show_bug.cgi?id=185836
2144
2145         Reviewed by Keith Miller.
2146
2147         Canonicalize language tags, replacing deprecated tag parts with the
2148         preferred values. Remove broken support for algorithmic numbering systems,
2149         that can cause an error in icu, and are not supported in other engines.
2150
2151         Generate the lookup functions from the language-subtag-registry.
2152
2153         Also initialize the UNumberFormat in initializeNumberFormat so any
2154         failures are thrown immediately instead of failing to format later.
2155
2156         * CMakeLists.txt:
2157         * DerivedSources.make:
2158         * JavaScriptCore.xcodeproj/project.pbxproj:
2159         * Scripts/generateIntlCanonicalizeLanguage.py: Added.
2160         * runtime/IntlDateTimeFormat.cpp:
2161         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
2162         * runtime/IntlNumberFormat.cpp:
2163         (JSC::IntlNumberFormat::initializeNumberFormat):
2164         (JSC::IntlNumberFormat::formatNumber):
2165         (JSC::IntlNumberFormat::formatToParts):
2166         (JSC::IntlNumberFormat::createNumberFormat): Deleted.
2167         * runtime/IntlNumberFormat.h:
2168         * runtime/IntlObject.cpp:
2169         (JSC::intlNumberOption):
2170         (JSC::intlDefaultNumberOption):
2171         (JSC::preferredLanguage):
2172         (JSC::preferredRegion):
2173         (JSC::canonicalLangTag):
2174         (JSC::canonicalizeLanguageTag):
2175         (JSC::defaultLocale):
2176         (JSC::removeUnicodeLocaleExtension):
2177         (JSC::numberingSystemsForLocale):
2178         (JSC::grandfatheredLangTag): Deleted.
2179         * runtime/IntlObject.h:
2180         * runtime/IntlPluralRules.cpp:
2181         (JSC::IntlPluralRules::initializePluralRules):
2182         * runtime/JSGlobalObject.cpp:
2183         (JSC::addMissingScriptLocales):
2184         (JSC::JSGlobalObject::intlCollatorAvailableLocales):
2185         (JSC::JSGlobalObject::intlDateTimeFormatAvailableLocales):
2186         (JSC::JSGlobalObject::intlNumberFormatAvailableLocales):
2187         (JSC::JSGlobalObject::intlPluralRulesAvailableLocales):
2188         * ucd/language-subtag-registry.txt: Added.
2189
2190 2018-07-23  Mark Lam  <mark.lam@apple.com>
2191
2192         Add some asserts to help diagnose a crash.
2193         https://bugs.webkit.org/show_bug.cgi?id=187915
2194         <rdar://problem/42508166>
2195
2196         Reviewed by Michael Saboff.
2197
2198         Add some asserts to verify that an CodeBlock alternative should always have a
2199         non-null jitCode.  Also change a RELEASE_ASSERT_NOT_REACHED() in
2200         CodeBlock::setOptimizationThresholdBasedOnCompilationResult() to a RELEASE_ASSERT()
2201         so that we'll retain the state of the variables that failed the assertion (again
2202         to help with diagnosis).
2203
2204         * bytecode/CodeBlock.cpp:
2205         (JSC::CodeBlock::setAlternative):
2206         (JSC::CodeBlock::setOptimizationThresholdBasedOnCompilationResult):
2207         * dfg/DFGPlan.cpp:
2208         (JSC::DFG::Plan::Plan):
2209
2210 2018-07-23  Filip Pizlo  <fpizlo@apple.com>
2211
2212         Unreviewed, fix no-JIT build.
2213
2214         * bytecode/CallLinkStatus.cpp:
2215         (JSC::CallLinkStatus::computeFor):
2216         * bytecode/CodeBlock.cpp:
2217         (JSC::CodeBlock::finalizeUnconditionally):
2218         * bytecode/GetByIdStatus.cpp:
2219         (JSC::GetByIdStatus::computeFor):
2220         (JSC::GetByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
2221         * bytecode/InByIdStatus.cpp:
2222         * bytecode/PutByIdStatus.cpp:
2223         (JSC::PutByIdStatus::computeForStubInfo):
2224
2225 2018-07-22  Yusuke Suzuki  <utatane.tea@gmail.com>
2226
2227         [JSC] GetByIdVariant and InByIdVariant do not need slot base if they are not "hit" variants
2228         https://bugs.webkit.org/show_bug.cgi?id=187891
2229
2230         Reviewed by Saam Barati.
2231
2232         When merging GetByIdVariant and InByIdVariant, we accidentally make merging failed if
2233         two variants are mergeable but they have "Miss" status. We make merging failed if
2234         the merged OPCSet says hasOneSlotBaseCondition() is false. But it is only reasonable
2235         if the variant has "Hit" status. This bug is revealed when we introduce CreateThis in FTL,
2236         which patch have more chances to merge variants.
2237
2238         This patch fixes this issue by checking `!isPropertyUnset()` / `isHit()`. PutByIdVariant
2239         is not related since it does not use this check in Transition case.
2240
2241         * bytecode/GetByIdVariant.cpp:
2242         (JSC::GetByIdVariant::attemptToMerge):
2243         * bytecode/InByIdVariant.cpp:
2244         (JSC::InByIdVariant::attemptToMerge):
2245
2246 2018-07-22  Yusuke Suzuki  <utatane.tea@gmail.com>
2247
2248         [DFG] Fold GetByVal if the indexed value is non configurable and non writable
2249         https://bugs.webkit.org/show_bug.cgi?id=186462
2250
2251         Reviewed by Saam Barati.
2252
2253         Non-special DontDelete | ReadOnly properties mean that it won't be changed. If DFG AI can retrieve this
2254         property, AI can fold it into a constant. This type of property can be seen when we use ES6 tagged templates.
2255         Tagged templates' callsite includes indexed properties whose attributes are DontDelete | ReadOnly.
2256
2257         This patch attempts to fold such properties into constant in DFG AI. The challenge is that DFG AI runs
2258         concurrently with the mutator thread. In this patch, we insert WTF::storeStoreFence between value setting
2259         and attributes setting. The attributes must be set after the corresponding value is set. If the loaded
2260         attributes (with WTF::loadLoadFence) include DontDelete | ReadOnly, it means the given value won't be
2261         changed and we can safely use it. We arrange our existing code to use this protocol.
2262
2263         Since GetByVal folding requires the correct Structure & Butterfly pairs, it is only enabled in x86 architecture
2264         since it is TSO. So, our WTF::storeStoreFence in SparseArrayValueMap is also emitted only in x86.
2265
2266         This patch improves SixSpeed/template_string_tag.es6.
2267
2268                                           baseline                  patched
2269
2270         template_string_tag.es6      237.0301+-4.8374     ^      9.8779+-0.3628        ^ definitely 23.9960x faster
2271
2272         * dfg/DFGAbstractInterpreterInlines.h:
2273         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2274         * runtime/JSArray.cpp:
2275         (JSC::JSArray::setLengthWithArrayStorage):
2276         * runtime/JSObject.cpp:
2277         (JSC::JSObject::enterDictionaryIndexingModeWhenArrayStorageAlreadyExists):
2278         (JSC::JSObject::deletePropertyByIndex):
2279         (JSC::JSObject::getOwnPropertyNames):
2280         (JSC::putIndexedDescriptor):
2281         (JSC::JSObject::defineOwnIndexedProperty):
2282         (JSC::JSObject::attemptToInterceptPutByIndexOnHoleForPrototype):
2283         (JSC::JSObject::putIndexedDescriptor): Deleted.
2284         * runtime/JSObject.h:
2285         * runtime/SparseArrayValueMap.cpp:
2286         (JSC::SparseArrayValueMap::SparseArrayValueMap):
2287         (JSC::SparseArrayValueMap::add):
2288         (JSC::SparseArrayValueMap::putDirect):
2289         (JSC::SparseArrayValueMap::getConcurrently):
2290         (JSC::SparseArrayEntry::get const):
2291         (JSC::SparseArrayEntry::getConcurrently const):
2292         (JSC::SparseArrayEntry::put):
2293         (JSC::SparseArrayEntry::getNonSparseMode const):
2294         (JSC::SparseArrayValueMap::visitChildren):
2295         (JSC::SparseArrayValueMap::~SparseArrayValueMap): Deleted.
2296         * runtime/SparseArrayValueMap.h:
2297         (JSC::SparseArrayEntry::SparseArrayEntry):
2298         (JSC::SparseArrayEntry::attributes const):
2299         (JSC::SparseArrayEntry::forceSet):
2300         (JSC::SparseArrayEntry::asValue):
2301
2302 2018-06-02  Filip Pizlo  <fpizlo@apple.com>
2303
2304         We should support CreateThis in the FTL
2305         https://bugs.webkit.org/show_bug.cgi?id=164904
2306
2307         Reviewed by Yusuke Suzuki.
2308         
2309         This started with Saam's patch to implement CreateThis in the FTL, but turned into a type
2310         inference adventure.
2311         
2312         CreateThis in the FTL was a massive regression in raytrace because it disturbed that
2313         benchmark's extremely perverse way of winning at type inference:
2314         
2315         - The benchmark wanted polyvariant devirtualization of an object construction helper. But,
2316           the polyvariant profiler wasn't powerful enough to reliably devirtualize that code. So, the
2317           benchmark was falling back to other mechanisms...
2318         
2319         - The construction helper could not tier up into the FTL. When the DFG compiled it, it would
2320           see that the IC had 4 cases. That's too polymorphic for the DFG. So, the DFG would emit a
2321           GetById. Shortly after the DFG compile, that get_by_id would see many more cases, but now
2322           that the helper was compiled by the DFG, the baseline get_by_id would not see those cases.
2323           The DFG's GetById would "hide" those cases. The number of cases the DFG's GetById would see
2324           is larger than our polymorphic list limit (limit = 8, case count = 13, I think).
2325           
2326           Note that if the FTL compiles that construction helper, it sees the 4 cases, turns them
2327           into a MultiGetByOffset, then suffers from exits when the new cases hit, and then exits to
2328           baseline, which then sees those cases. Luckily, the FTL was not compiling the construction
2329           helper because it had a CreateThis.
2330         
2331         - Compilations that inlined the construction helper would have gotten super lucky with
2332           parse-time constant folding, so they knew what structure the input to the get_by_id would
2333           have at parse time. This is only profitable if the get_by_id parsing computed a
2334           GetByIdStatus that had a finite number of cases. Because the 13 cases were being hidden by
2335           the DFG GetById and GetByIdStatus would only look at the baseline get_by_id, which had 4
2336           cases, we would indeed get a finite number of cases. The parser would then prune those
2337           cases to just one - based on its knowledge of the structure - and that would result in that
2338           get_by_id being folded at parse time to a constant.
2339         
2340         - The subsequent op_call would inline based on parse-time knowledge of that constant.
2341         
2342         This patch comprehensively fixes these issues, as well as other issues that come up along the
2343         way. The short version is that raytrace was revealing sloppiness in our use of profiling for
2344         type inference. This patch fixes the sloppiness by vastly expanding *polyvariant* profiling,
2345         i.e. the profiling that considers call context. I was encouraged to do this by the fact that
2346         even the old version of polyvariant profiling was a speed-up on JetStream, ARES-6, and
2347         Speedometer 2 (it's easy to measure since it's a runtime flag). So, it seemed worthwhile to
2348         attack raytrace's problem as a shortcoming of polyvariant profiling.
2349         
2350         - Polyvariant profiling now consults every DFG or FTL code block that participated in any
2351           subset of the inline stack that includes the IC we're profiling. For example, if we have
2352           an inline stack like foo->bar->baz, with baz on top, then we will consult DFG or FTL
2353           compilations for foo, bar, and baz. In foo, we'll look up foo->bar->baz; in bar we'll look
2354           up bar->baz; etc. This fixes two problems encountered in raytrace. First, it ensures that
2355           a DFG GetById cannot hide anything from the profiling of that get_by_id, since the
2356           polyvariant profiling code will always consult it. Second, it enables raytrace to benefit
2357           from polyvariant profling. Previously, the polyvariant profiler would only look at the
2358           previous DFG compilation of foo and look up foo->bar->baz. But that only works if DFG-foo
2359           had inlined bar and then baz. It may not have done that, because those calls could have
2360           required polyvariant profiling that was only available in the FTL.
2361           
2362         - A particularly interesting case is when some IC in foo-baseline is also available in
2363           foo-DFG. This case is encountered by the polyvariant profiler as it walks the inline stack.
2364           In the case of gathering profiling for foo-FTL, the polyvariant profiler finds foo-DFG via
2365           the trivial case of no inline stack. This also means that if foo ever gets inlined, we will
2366           find foo-DFG or foo-FTL in the final case of polyvariant profiling. In those cases, we now
2367           merge the IC of foo-baseline and foo-DFG. This avoids lots of unnecessary recompilations,
2368           because it warns us of historical polymorphism. Historical polymorphism usually means
2369           future polymorphism. IC status code already had some merging functionality, but I needed to
2370           beef it up a lot to make this work right.
2371         
2372         - Inlining an inline cache now preserves as much information as profiling. One challenge of
2373           polyvariant profiling is that the FTL compile for bar (that includes bar->baz) could have
2374           inlined an inline cache based on polyvariant profiling. So, when the FTL compile for foo
2375           (that includes foo->bar->baz) asks bar what it knows about that IC inside bar->baz, it will
2376           say "I don't have such an IC". At this point the DFG compilation that included that IC that
2377           gave us the information that we used to inline the IC is no longer alive. To keep us from
2378           losing the information we learned about the IC, there is now a RecordedStatuses data
2379           structure that preserves the statuses we use for inlining ICs. We also filter those
2380           statuses according to things we learn from AI. This further reduces the risk of information
2381           about an IC being forgotten.
2382         
2383         - Exit profiling now considers whether or not an exit happened from inline code. This
2384           protects us in the case where the not-inlined version of an IC exited a lot because of
2385           polymorphism that doesn't exist in the inlined version. So, when using polyvariant
2386           profiling data, we consider only inlined exits.
2387         
2388         - CallLinkInfo now records when it's repatched to the virtual call thunk. Previously, this
2389           would clear the CallLinkInfo, so CallLinkStatus would fall back to the lastSeenCallee. It's
2390           surprising that we've had this bug.
2391         
2392         Altogether this patch is performance-neutral in run-jsc-benchmarks, except for speed-ups in
2393         microbenchmarks and a compile time regression. Octane/deltablue speeds up by ~5%.
2394         Octane/raytrace is regressed by a minuscule amount, which we could make up by implementing
2395         prototype access folding in the bytecode parser and constant folder. That would require some
2396         significant new logic in GetByIdStatus. That would also require a new benchmark - we want to
2397         have a test that captures raytrace's behavior in the case that the parser cannot fold the
2398         get_by_id.
2399         
2400         This change is a 1.2% regression on V8Spider-CompileTime. That's a smaller regression than
2401         recent compile time progressions, so I think that's an OK trade-off. Also, I would expect a
2402         compile time regression anytime we fill in FTL coverage.
2403         
2404         This is neutral on JetStream, ARES-6, and Speedometer2. JetStream agrees that deltablue
2405         speeds up and that raytrace slows down, but these changes balance out and don't affect the
2406         overall score. In ARES-6, it looks like individual tests have some significant 1-2% speed-ups
2407         or slow-downs. Air-steady is definitely ~1.5% faster. Basic-worst is probably 2% slower (p ~
2408         0.1, so it's not very certain). The JetStream, ARES-6, and Speedometer2 overall scores don't
2409         see a significant difference. In all three cases the difference is <0.5% with a high p value,
2410         with JetStream and Speedometer2 being insignificant infinitesimal speed-ups and ARES-6 being
2411         an insignificant infinitesimal slow-down.
2412         
2413         Oh, and this change means that the FTL now has 100% coverage of JavaScript. You could do an
2414         eval in a for-in loop in a for-of loop inside a with block that uses try/catch for control
2415         flow in a polymorphic constructor while having a bad time, and we'll still compile it.
2416
2417         * CMakeLists.txt:
2418         * JavaScriptCore.xcodeproj/project.pbxproj:
2419         * Sources.txt:
2420         * bytecode/ByValInfo.h:
2421         * bytecode/BytecodeDumper.cpp:
2422         (JSC::BytecodeDumper<Block>::printGetByIdCacheStatus):
2423         (JSC::BytecodeDumper<Block>::printPutByIdCacheStatus):
2424         (JSC::BytecodeDumper<Block>::printInByIdCacheStatus):
2425         (JSC::BytecodeDumper<Block>::dumpCallLinkStatus):
2426         (JSC::BytecodeDumper<CodeBlock>::dumpCallLinkStatus):
2427         (JSC::BytecodeDumper<Block>::printCallOp):
2428         (JSC::BytecodeDumper<Block>::dumpBytecode):
2429         (JSC::BytecodeDumper<Block>::dumpBlock):
2430         * bytecode/BytecodeDumper.h:
2431         * bytecode/CallLinkInfo.h:
2432         * bytecode/CallLinkStatus.cpp:
2433         (JSC::CallLinkStatus::computeFor):
2434         (JSC::CallLinkStatus::computeExitSiteData):
2435         (JSC::CallLinkStatus::computeFromCallLinkInfo):
2436         (JSC::CallLinkStatus::accountForExits):
2437         (JSC::CallLinkStatus::finalize):
2438         (JSC::CallLinkStatus::filter):
2439         (JSC::CallLinkStatus::computeDFGStatuses): Deleted.
2440         * bytecode/CallLinkStatus.h:
2441         (JSC::CallLinkStatus::operator bool const):
2442         (JSC::CallLinkStatus::operator! const): Deleted.
2443         * bytecode/CallVariant.cpp:
2444         (JSC::CallVariant::finalize):
2445         (JSC::CallVariant::filter):
2446         * bytecode/CallVariant.h:
2447         (JSC::CallVariant::operator bool const):
2448         (JSC::CallVariant::operator! const): Deleted.
2449         * bytecode/CodeBlock.cpp:
2450         (JSC::CodeBlock::dumpBytecode):
2451         (JSC::CodeBlock::propagateTransitions):
2452         (JSC::CodeBlock::finalizeUnconditionally):
2453         (JSC::CodeBlock::getICStatusMap):
2454         (JSC::CodeBlock::resetJITData):
2455         (JSC::CodeBlock::getStubInfoMap): Deleted.
2456         (JSC::CodeBlock::getCallLinkInfoMap): Deleted.
2457         (JSC::CodeBlock::getByValInfoMap): Deleted.
2458         * bytecode/CodeBlock.h:
2459         * bytecode/CodeOrigin.cpp:
2460         (JSC::CodeOrigin::isApproximatelyEqualTo const):
2461         (JSC::CodeOrigin::approximateHash const):
2462         * bytecode/CodeOrigin.h:
2463         (JSC::CodeOrigin::exitingInlineKind const):
2464         * bytecode/DFGExitProfile.cpp:
2465         (JSC::DFG::FrequentExitSite::dump const):
2466         (JSC::DFG::ExitProfile::add):
2467         * bytecode/DFGExitProfile.h:
2468         (JSC::DFG::FrequentExitSite::FrequentExitSite):
2469         (JSC::DFG::FrequentExitSite::operator== const):
2470         (JSC::DFG::FrequentExitSite::subsumes const):
2471         (JSC::DFG::FrequentExitSite::hash const):
2472         (JSC::DFG::FrequentExitSite::inlineKind const):
2473         (JSC::DFG::FrequentExitSite::withInlineKind const):
2474         (JSC::DFG::QueryableExitProfile::hasExitSite const):
2475         (JSC::DFG::QueryableExitProfile::hasExitSiteWithSpecificJITType const):
2476         (JSC::DFG::QueryableExitProfile::hasExitSiteWithSpecificInlineKind const):
2477         * bytecode/ExitFlag.cpp: Added.
2478         (JSC::ExitFlag::dump const):
2479         * bytecode/ExitFlag.h: Added.
2480         (JSC::ExitFlag::ExitFlag):
2481         (JSC::ExitFlag::operator| const):
2482         (JSC::ExitFlag::operator|=):
2483         (JSC::ExitFlag::operator& const):
2484         (JSC::ExitFlag::operator&=):
2485         (JSC::ExitFlag::operator bool const):
2486         (JSC::ExitFlag::isSet const):
2487         * bytecode/ExitingInlineKind.cpp: Added.
2488         (WTF::printInternal):
2489         * bytecode/ExitingInlineKind.h: Added.
2490         * bytecode/GetByIdStatus.cpp:
2491         (JSC::GetByIdStatus::computeFor):
2492         (JSC::GetByIdStatus::computeForStubInfo):
2493         (JSC::GetByIdStatus::slowVersion const):
2494         (JSC::GetByIdStatus::markIfCheap):
2495         (JSC::GetByIdStatus::finalize):
2496         (JSC::GetByIdStatus::hasExitSite): Deleted.
2497         * bytecode/GetByIdStatus.h:
2498         * bytecode/GetByIdVariant.cpp:
2499         (JSC::GetByIdVariant::markIfCheap):
2500         (JSC::GetByIdVariant::finalize):
2501         * bytecode/GetByIdVariant.h:
2502         * bytecode/ICStatusMap.cpp: Added.
2503         (JSC::ICStatusContext::get const):
2504         (JSC::ICStatusContext::isInlined const):
2505         (JSC::ICStatusContext::inlineKind const):
2506         * bytecode/ICStatusMap.h: Added.
2507         * bytecode/ICStatusUtils.cpp: Added.
2508         (JSC::hasBadCacheExitSite):
2509         * bytecode/ICStatusUtils.h:
2510         * bytecode/InstanceOfStatus.cpp:
2511         (JSC::InstanceOfStatus::computeFor):
2512         * bytecode/InstanceOfStatus.h:
2513         * bytecode/PolyProtoAccessChain.h:
2514         * bytecode/PutByIdStatus.cpp:
2515         (JSC::PutByIdStatus::hasExitSite):
2516         (JSC::PutByIdStatus::computeFor):
2517         (JSC::PutByIdStatus::slowVersion const):
2518         (JSC::PutByIdStatus::markIfCheap):
2519         (JSC::PutByIdStatus::finalize):
2520         (JSC::PutByIdStatus::filter):
2521         * bytecode/PutByIdStatus.h:
2522         * bytecode/PutByIdVariant.cpp:
2523         (JSC::PutByIdVariant::markIfCheap):
2524         (JSC::PutByIdVariant::finalize):
2525         * bytecode/PutByIdVariant.h:
2526         (JSC::PutByIdVariant::structureSet const):
2527         * bytecode/RecordedStatuses.cpp: Added.
2528         (JSC::RecordedStatuses::operator=):
2529         (JSC::RecordedStatuses::RecordedStatuses):
2530         (JSC::RecordedStatuses::addCallLinkStatus):
2531         (JSC::RecordedStatuses::addGetByIdStatus):
2532         (JSC::RecordedStatuses::addPutByIdStatus):
2533         (JSC::RecordedStatuses::markIfCheap):
2534         (JSC::RecordedStatuses::finalizeWithoutDeleting):
2535         (JSC::RecordedStatuses::finalize):
2536         (JSC::RecordedStatuses::shrinkToFit):
2537         * bytecode/RecordedStatuses.h: Added.
2538         (JSC::RecordedStatuses::RecordedStatuses):
2539         (JSC::RecordedStatuses::forEachVector):
2540         * bytecode/StructureSet.cpp:
2541         (JSC::StructureSet::markIfCheap const):
2542         (JSC::StructureSet::isStillAlive const):
2543         * bytecode/StructureSet.h:
2544         * bytecode/TerminatedCodeOrigin.h: Added.
2545         (JSC::TerminatedCodeOrigin::TerminatedCodeOrigin):
2546         (JSC::TerminatedCodeOriginHashTranslator::hash):
2547         (JSC::TerminatedCodeOriginHashTranslator::equal):
2548         * bytecode/Watchpoint.cpp:
2549         (WTF::printInternal):
2550         * bytecode/Watchpoint.h:
2551         * dfg/DFGAbstractInterpreter.h:
2552         * dfg/DFGAbstractInterpreterInlines.h:
2553         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2554         (JSC::DFG::AbstractInterpreter<AbstractStateType>::filterICStatus):
2555         * dfg/DFGByteCodeParser.cpp:
2556         (JSC::DFG::ByteCodeParser::handleCall):
2557         (JSC::DFG::ByteCodeParser::handleVarargsCall):
2558         (JSC::DFG::ByteCodeParser::handleDOMJITGetter):
2559         (JSC::DFG::ByteCodeParser::handleModuleNamespaceLoad):
2560         (JSC::DFG::ByteCodeParser::handleGetById):
2561         (JSC::DFG::ByteCodeParser::handlePutById):
2562         (JSC::DFG::ByteCodeParser::parseBlock):
2563         (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
2564         (JSC::DFG::ByteCodeParser::InlineStackEntry::~InlineStackEntry):
2565         (JSC::DFG::ByteCodeParser::parse):
2566         * dfg/DFGClobberize.h:
2567         (JSC::DFG::clobberize):
2568         * dfg/DFGClobbersExitState.cpp:
2569         (JSC::DFG::clobbersExitState):
2570         * dfg/DFGCommonData.h:
2571         * dfg/DFGConstantFoldingPhase.cpp:
2572         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2573         * dfg/DFGDesiredWatchpoints.h:
2574         (JSC::DFG::SetPointerAdaptor::hasBeenInvalidated):
2575         * dfg/DFGDoesGC.cpp:
2576         (JSC::DFG::doesGC):
2577         * dfg/DFGFixupPhase.cpp:
2578         (JSC::DFG::FixupPhase::fixupNode):
2579         * dfg/DFGGraph.cpp:
2580         (JSC::DFG::Graph::dump):
2581         * dfg/DFGMayExit.cpp:
2582         * dfg/DFGNode.h:
2583         (JSC::DFG::Node::hasCallLinkStatus):
2584         (JSC::DFG::Node::callLinkStatus):
2585         (JSC::DFG::Node::hasGetByIdStatus):
2586         (JSC::DFG::Node::getByIdStatus):
2587         (JSC::DFG::Node::hasPutByIdStatus):
2588         (JSC::DFG::Node::putByIdStatus):
2589         * dfg/DFGNodeType.h:
2590         * dfg/DFGOSRExitBase.cpp:
2591         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow):
2592         * dfg/DFGObjectAllocationSinkingPhase.cpp:
2593         * dfg/DFGPlan.cpp:
2594         (JSC::DFG::Plan::reallyAdd):
2595         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
2596         (JSC::DFG::Plan::finalizeInGC):
2597         * dfg/DFGPlan.h:
2598         * dfg/DFGPredictionPropagationPhase.cpp:
2599         * dfg/DFGSafeToExecute.h:
2600         (JSC::DFG::safeToExecute):
2601         * dfg/DFGSpeculativeJIT32_64.cpp:
2602         (JSC::DFG::SpeculativeJIT::compile):
2603         * dfg/DFGSpeculativeJIT64.cpp:
2604         (JSC::DFG::SpeculativeJIT::compile):
2605         * dfg/DFGStrengthReductionPhase.cpp:
2606         (JSC::DFG::StrengthReductionPhase::handleNode):
2607         * dfg/DFGWorklist.cpp:
2608         (JSC::DFG::Worklist::removeDeadPlans):
2609         * ftl/FTLAbstractHeapRepository.h:
2610         * ftl/FTLCapabilities.cpp:
2611         (JSC::FTL::canCompile):
2612         * ftl/FTLLowerDFGToB3.cpp:
2613         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2614         (JSC::FTL::DFG::LowerDFGToB3::compileCreateThis):
2615         (JSC::FTL::DFG::LowerDFGToB3::compileFilterICStatus):
2616         * jit/PolymorphicCallStubRoutine.cpp:
2617         (JSC::PolymorphicCallStubRoutine::hasEdges const):
2618         (JSC::PolymorphicCallStubRoutine::edges const):
2619         * jit/PolymorphicCallStubRoutine.h:
2620         * profiler/ProfilerBytecodeSequence.cpp:
2621         (JSC::Profiler::BytecodeSequence::BytecodeSequence):
2622         * runtime/FunctionRareData.cpp:
2623         (JSC::FunctionRareData::initializeObjectAllocationProfile):
2624         * runtime/Options.h:
2625
2626 2018-07-21  Yusuke Suzuki  <utatane.tea@gmail.com>
2627
2628         [JSC] Use Function / ScopedLambda / RecursableLambda instead of std::function
2629         https://bugs.webkit.org/show_bug.cgi?id=187472
2630
2631         Reviewed by Mark Lam.
2632
2633         std::function allocates memory from standard malloc instead of bmalloc. Instead of
2634         using that, we should use WTF::{Function,ScopedLambda,RecursableLambda}.
2635
2636         This patch attempts to replace std::function with the above WTF function types.
2637         If the function's lifetime can be the same to the stack, we can use ScopedLambda, which
2638         is really efficient. Otherwise, we should use WTF::Function.
2639         For recurring use cases, we can use RecursableLambda.
2640
2641         * assembler/MacroAssembler.cpp:
2642         (JSC::stdFunctionCallback):
2643         (JSC::MacroAssembler::probe):
2644         * assembler/MacroAssembler.h:
2645         * b3/air/AirDisassembler.cpp:
2646         (JSC::B3::Air::Disassembler::dump):
2647         * b3/air/AirDisassembler.h:
2648         * bytecompiler/BytecodeGenerator.cpp:
2649         (JSC::BytecodeGenerator::BytecodeGenerator):
2650         (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
2651         (JSC::BytecodeGenerator::emitEnumeration):
2652         * bytecompiler/BytecodeGenerator.h:
2653         * bytecompiler/NodesCodegen.cpp:
2654         (JSC::ArrayNode::emitBytecode):
2655         (JSC::ApplyFunctionCallDotNode::emitBytecode):
2656         (JSC::ForOfNode::emitBytecode):
2657         * dfg/DFGSpeculativeJIT.cpp:
2658         (JSC::DFG::SpeculativeJIT::addSlowPathGeneratorLambda):
2659         (JSC::DFG::SpeculativeJIT::compileMathIC):
2660         * dfg/DFGSpeculativeJIT.h:
2661         * dfg/DFGSpeculativeJIT64.cpp:
2662         (JSC::DFG::SpeculativeJIT::compile):
2663         * dfg/DFGValidate.cpp:
2664         * ftl/FTLCompile.cpp:
2665         (JSC::FTL::compile):
2666         * heap/HeapSnapshotBuilder.cpp:
2667         (JSC::HeapSnapshotBuilder::json):
2668         * heap/HeapSnapshotBuilder.h:
2669         * interpreter/StackVisitor.cpp:
2670         (JSC::StackVisitor::Frame::dump const):
2671         * interpreter/StackVisitor.h:
2672         * runtime/PromiseDeferredTimer.h:
2673         * runtime/VM.cpp:
2674         (JSC::VM::whenIdle):
2675         (JSC::enableProfilerWithRespectToCount):
2676         (JSC::disableProfilerWithRespectToCount):
2677         * runtime/VM.h:
2678         * runtime/VMEntryScope.cpp:
2679         (JSC::VMEntryScope::addDidPopListener):
2680         * runtime/VMEntryScope.h:
2681         * tools/HeapVerifier.cpp:
2682         (JSC::HeapVerifier::verifyCellList):
2683         (JSC::HeapVerifier::validateCell):
2684         (JSC::HeapVerifier::validateJSCell):
2685         * tools/HeapVerifier.h:
2686
2687 2018-07-20  Michael Saboff  <msaboff@apple.com>
2688
2689         DFG AbstractInterpreter: CheckArray filters array modes for DirectArguments/ScopedArguments using only NonArray
2690         https://bugs.webkit.org/show_bug.cgi?id=187827
2691         rdar://problem/42146858
2692
2693         Reviewed by Saam Barati.
2694
2695         When filtering array modes for DirectArguments or ScopedArguments, we need to allow for the possibility
2696         that they can either be NonArray or NonArrayWithArrayStorage (aka ArrayStorageShape).
2697         We can't end up with other shapes, Int32, Double, etc because GenericArguments sets 
2698         InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero which will cause us to go down a
2699         putByIndex() path that doesn't change the shape.
2700
2701         * dfg/DFGArrayMode.h:
2702         (JSC::DFG::ArrayMode::arrayModesThatPassFiltering const):
2703
2704 2018-07-20  Yusuke Suzuki  <utatane.tea@gmail.com>
2705
2706         [DFG] Fold GetByVal if Array is CoW
2707         https://bugs.webkit.org/show_bug.cgi?id=186459
2708
2709         Reviewed by Saam Barati.
2710
2711         CoW indexing type means that we now tracks the changes in CoW Array by structure. So DFG has a chance to
2712         fold GetByVal if the given array is CoW. This patch folds GetByVal onto the CoW Array. If the structure
2713         is watched and the butterfly is JSImmutableButterfly, we can load the value from this butterfly.
2714
2715         This can be useful since these CoW arrays are used for a storage for constants. Constant-indexed access
2716         to these constant arrays can be folded into an actual constant by this patch.
2717
2718                                            baseline                  patched
2719
2720         template_string.es6          4993.9853+-147.5308   ^    824.1685+-44.1839       ^ definitely 6.0594x faster
2721         template_string_tag.es5        67.0822+-2.0100     ^      9.3540+-0.5376        ^ definitely 7.1715x faster
2722
2723         * dfg/DFGAbstractInterpreterInlines.h:
2724         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2725
2726 2018-07-20  Yusuke Suzuki  <utatane.tea@gmail.com>
2727
2728         [JSC] Remove cellLock in JSObject::convertContiguousToArrayStorage
2729         https://bugs.webkit.org/show_bug.cgi?id=186602
2730
2731         Reviewed by Saam Barati.
2732
2733         JSObject::convertContiguousToArrayStorage's cellLock() is not necessary since we do not
2734         change the part of the butterfly, length etc. We prove that our procedure is safe, and
2735         drop the cellLock() here.
2736
2737         * runtime/JSObject.cpp:
2738         (JSC::JSObject::convertContiguousToArrayStorage):
2739
2740 2018-07-20  Saam Barati  <sbarati@apple.com>
2741
2742         CompareEq should be using KnownOtherUse instead of OtherUse
2743         https://bugs.webkit.org/show_bug.cgi?id=186814
2744         <rdar://problem/39720030>
2745
2746         Reviewed by Filip Pizlo.
2747
2748         CompareEq in fixup phase was doing this:
2749         insertCheck(child, OtherUse)
2750         setUseKind(child, OtherUse)
2751         And in the DFG/FTL backend, it would not emit a check for OtherUse. This could
2752         lead to edge verification crashing because a phase may optimize the check out
2753         by removing the node. However, AI may not be privy to that optimization, and
2754         AI may think the incoming value may not be Other. AI is expecting the DFG/FTL
2755         backend to actually emit a check here, but it does not.
2756         
2757         This exact pattern is why we have KnownXYZ use kinds. This patch introduces
2758         KnownOtherUse and changes the above pattern to be:
2759         insertCheck(child, OtherUse)
2760         setUseKind(child, KnownOtherUse)
2761
2762         * dfg/DFGFixupPhase.cpp:
2763         (JSC::DFG::FixupPhase::fixupNode):
2764         * dfg/DFGSafeToExecute.h:
2765         (JSC::DFG::SafeToExecuteEdge::operator()):
2766         * dfg/DFGSpeculativeJIT.cpp:
2767         (JSC::DFG::SpeculativeJIT::speculate):
2768         * dfg/DFGUseKind.cpp:
2769         (WTF::printInternal):
2770         * dfg/DFGUseKind.h:
2771         (JSC::DFG::typeFilterFor):
2772         (JSC::DFG::shouldNotHaveTypeCheck):
2773         (JSC::DFG::checkMayCrashIfInputIsEmpty):
2774         * dfg/DFGWatchpointCollectionPhase.cpp:
2775         (JSC::DFG::WatchpointCollectionPhase::handle):
2776         * ftl/FTLCapabilities.cpp:
2777         (JSC::FTL::canCompile):
2778         * ftl/FTLLowerDFGToB3.cpp:
2779         (JSC::FTL::DFG::LowerDFGToB3::compileCompareEq):
2780         (JSC::FTL::DFG::LowerDFGToB3::speculate):
2781
2782 2018-07-20  Yusuke Suzuki  <utatane.tea@gmail.com>
2783
2784         [JSC] A bit performance improvement for Object.assign by cleaning up code
2785         https://bugs.webkit.org/show_bug.cgi?id=187852
2786
2787         Reviewed by Saam Barati.
2788
2789         We clean up Object.assign code a bit.
2790
2791         1. Vector and MarkedArgumentBuffer are extracted out from the loop since repeatedly creating MarkedArgumentBuffer is costly.
2792         2. canDoFastPath is not necessary. Restructuring the code to clean up things.
2793
2794         It improves the performance a bit.
2795
2796                                     baseline                  patched
2797
2798         object-assign.es6      237.7719+-5.5175          231.2856+-4.6907          might be 1.0280x faster
2799
2800         * runtime/ObjectConstructor.cpp:
2801         (JSC::objectConstructorAssign):
2802
2803 2018-07-19  Carlos Garcia Campos  <cgarcia@igalia.com>
2804
2805         [GLIB] jsc_context_evaluate_in_object() should receive an instance when a JSCClass is given
2806         https://bugs.webkit.org/show_bug.cgi?id=187798
2807
2808         Reviewed by Michael Catanzaro.
2809
2810         Because a JSCClass is pretty much useless without an instance in this case. It should be similar to
2811         jsc_value_new_object() because indeed we are creating a new object. This makes destroy function and vtable
2812         functions to work. We can't use JSAPIWrapperObject to wrap this object, because it's a global object, so this
2813         patch adds JSAPIWrapperGlobalObject or that.
2814
2815         * API/glib/JSAPIWrapperGlobalObject.cpp: Added.
2816         (jsAPIWrapperGlobalObjectHandleOwner):
2817         (JSAPIWrapperGlobalObjectHandleOwner::finalize):
2818         (JSC::JSCallbackObject<JSAPIWrapperGlobalObject>::createStructure):
2819         (JSC::JSCallbackObject<JSAPIWrapperGlobalObject>::create):
2820         (JSC::JSAPIWrapperGlobalObject::JSAPIWrapperGlobalObject):
2821         (JSC::JSAPIWrapperGlobalObject::finishCreation):
2822         (JSC::JSAPIWrapperGlobalObject::visitChildren):
2823         * API/glib/JSAPIWrapperGlobalObject.h: Added.
2824         (JSC::JSAPIWrapperGlobalObject::wrappedObject const):
2825         (JSC::JSAPIWrapperGlobalObject::setWrappedObject):
2826         * API/glib/JSCClass.cpp:
2827         (isWrappedObject): Helper to check if the given object is a JSAPIWrapperObject or JSAPIWrapperGlobalObject.
2828         (wrappedObjectClass): Return the class of a wrapped object.
2829         (jscContextForObject): Get the execution context of an object. If the object is a JSAPIWrapperGlobalObject, the
2830         scope extension global object is used instead.
2831         (getProperty): Use isWrappedObject, wrappedObjectClass and jscContextForObject.
2832         (setProperty): Ditto.
2833         (hasProperty): Ditto.
2834         (deleteProperty): Ditto.
2835         (getPropertyNames): Ditto.
2836         (jscClassCreateContextWithJSWrapper): Call jscContextCreateContextWithJSWrapper().
2837         * API/glib/JSCClassPrivate.h:
2838         * API/glib/JSCContext.cpp:
2839         (jscContextCreateContextWithJSWrapper): Call WrapperMap::createContextWithJSWrappper().
2840         (jsc_context_evaluate_in_object): Use jscClassCreateContextWithJSWrapper() when a JSCClass is given.
2841         * API/glib/JSCContext.h:
2842         * API/glib/JSCContextPrivate.h:
2843         * API/glib/JSCWrapperMap.cpp:
2844         (JSC::WrapperMap::createContextWithJSWrappper): Create the new context for jsc_context_evaluate_in_object() here
2845         when a JSCClass is used to create the JSAPIWrapperGlobalObject.
2846         (JSC::WrapperMap::wrappedObject const): Return the wrapped object also in case of JSAPIWrapperGlobalObject.
2847         * API/glib/JSCWrapperMap.h:
2848         * GLib.cmake:
2849
2850 2018-07-19  Saam Barati  <sbarati@apple.com>
2851
2852         Conservatively make Object.assign's fast path do a two phase protocol of loading everything then storing everything to try to prevent a crash
2853         https://bugs.webkit.org/show_bug.cgi?id=187836
2854         <rdar://problem/42409527>
2855
2856         Reviewed by Mark Lam.
2857
2858         We have crash reports that we're crashing on source->getDirect in Object.assign's
2859         fast path. Mark investigated this and determined we end up with a nullptr for
2860         butterfly. This is curious, because source's Structure indicated that it has
2861         out of line properties. My leading hypothesis for this at the moment is a bit
2862         handwavy, but it's essentially:
2863         - We end up firing a watchpoint when assigning to the target (this can happen
2864         if a watchpoint was set up for storing to that particular field)
2865         - When we fire that watchpoint, we end up doing some kind work on the source,
2866         perhaps causing it to flattenDictionaryStructure. Therefore, we end up
2867         mutating source.
2868         
2869         I'm not super convinced this is what we're running into, but just by reading
2870         the code, I think it needs to be something similar to this. Seeing if this change
2871         fixes the crasher will give us good data to determine if something like this is
2872         happening or if the bug is something else entirely.
2873
2874         * runtime/ObjectConstructor.cpp:
2875         (JSC::objectConstructorAssign):
2876
2877 2018-07-19  Commit Queue  <commit-queue@webkit.org>
2878
2879         Unreviewed, rolling out r233998.
2880         https://bugs.webkit.org/show_bug.cgi?id=187815
2881
2882         Not needed. (Requested by mlam|a on #webkit).
2883
2884         Reverted changeset:
2885
2886         "Temporarily mitigate a bug where a source provider is null
2887         when it shouldn't be."
2888         https://bugs.webkit.org/show_bug.cgi?id=187812
2889         https://trac.webkit.org/changeset/233998
2890
2891 2018-07-19  Mark Lam  <mark.lam@apple.com>
2892
2893         Temporarily mitigate a bug where a source provider is null when it shouldn't be.
2894         https://bugs.webkit.org/show_bug.cgi?id=187812
2895         <rdar://problem/41192691>
2896
2897         Reviewed by Michael Saboff.
2898
2899         Adding a null check to temporarily mitigate https://bugs.webkit.org/show_bug.cgi?id=187811.
2900
2901         * runtime/Error.cpp:
2902         (JSC::addErrorInfo):
2903
2904 2018-07-19  Keith Rollin  <krollin@apple.com>
2905
2906         Adjust WEBCORE_EXPORT annotations for LTO
2907         https://bugs.webkit.org/show_bug.cgi?id=187781
2908         <rdar://problem/42351124>
2909
2910         Reviewed by Alex Christensen.
2911
2912         Continuation of Bug 186944. This bug addresses issues not caught
2913         during the first pass of adjustments. The initial work focussed on
2914         macOS; this one addresses issues found when building for iOS. From
2915         186944:
2916
2917         Adjust a number of places that result in WebKit's
2918         'check-for-weak-vtables-and-externals' script reporting weak external
2919         symbols:
2920
2921             ERROR: WebCore has a weak external symbol in it (/Volumes/Data/dev/webkit/OpenSource/WebKitBuild/Release/WebCore.framework/Versions/A/WebCore)
2922             ERROR: A weak external symbol is generated when a symbol is defined in multiple compilation units and is also marked as being exported from the library.
2923             ERROR: A common cause of weak external symbols is when an inline function is listed in the linker export file.
2924             ...
2925
2926         These cases are caused by inline methods being marked with WTF_EXPORT
2927         (or related macro) or with an inline function being in a class marked
2928         as such, and when enabling LTO builds.
2929
2930         For the most part, address these by removing the WEBCORE_EXPORT
2931         annotation from inline methods. In some cases, move the implementation
2932         out-of-line because it's the class that has the WEBCORE_EXPORT on it
2933         and removing the annotation from the class would be too disruptive.
2934         Finally, in other cases, move the implementation out-of-line because
2935         check-for-weak-vtables-and-externals still complains when keeping the
2936         implementation inline and removing the annotation; this seems to
2937         typically (but not always) happen with destructors.
2938
2939         * inspector/remote/RemoteAutomationTarget.cpp:
2940         (Inspector::RemoteAutomationTarget::~RemoteAutomationTarget):
2941         * inspector/remote/RemoteAutomationTarget.h:
2942         * inspector/remote/RemoteInspector.cpp:
2943         (Inspector::RemoteInspector::Client::~Client):
2944         * inspector/remote/RemoteInspector.h:
2945
2946 2018-07-19  Yusuke Suzuki  <utatane.tea@gmail.com>
2947
2948         Unreviewed, check scope after performing getPropertySlot in JSON.stringify
2949         https://bugs.webkit.org/show_bug.cgi?id=187807
2950
2951         Properly putting EXCEPTION_ASSERT to tell our exception checker mechanism
2952         that we know that exception occurrence and handle it well.
2953
2954         * runtime/JSONObject.cpp:
2955         (JSC::Stringifier::Holder::appendNextProperty):
2956
2957 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
2958
2959         [JSC] Reduce size of AST nodes
2960         https://bugs.webkit.org/show_bug.cgi?id=187689
2961
2962         Reviewed by Mark Lam.
2963
2964         We clean up AST nodes to reduce size. By doing so, we can reduce the memory consumption
2965         of ParserArena at peak state.
2966
2967         1. Annotate `final` to AST nodes to make them solid. And it allows the compiler to
2968         devirtualize a call to the function which are implemented in a final class.
2969
2970         2. Use default member initializers more.
2971
2972         3. And use `nullptr` instead of `0`.
2973
2974         4. Arrange the layout of AST nodes to reduce the size. It includes changing the order
2975         of classes in multiple inheritance. In particular, StatementNode is decreased from 48
2976         to 40. This decreases the sizes of all the derived Statement nodes.
2977
2978         * parser/NodeConstructors.h:
2979         (JSC::Node::Node):
2980         (JSC::StatementNode::StatementNode):
2981         (JSC::ElementNode::ElementNode):
2982         (JSC::ArrayNode::ArrayNode):
2983         (JSC::PropertyListNode::PropertyListNode):
2984         (JSC::ObjectLiteralNode::ObjectLiteralNode):
2985         (JSC::ArgumentListNode::ArgumentListNode):
2986         (JSC::ArgumentsNode::ArgumentsNode):
2987         (JSC::NewExprNode::NewExprNode):
2988         (JSC::BytecodeIntrinsicNode::BytecodeIntrinsicNode):
2989         (JSC::BinaryOpNode::BinaryOpNode):
2990         (JSC::LogicalOpNode::LogicalOpNode):
2991         (JSC::CommaNode::CommaNode):
2992         (JSC::SourceElements::SourceElements):
2993         (JSC::ClauseListNode::ClauseListNode):
2994         * parser/Nodes.cpp:
2995         (JSC::FunctionMetadataNode::FunctionMetadataNode):
2996         (JSC::FunctionMetadataNode::operator== const):
2997         (JSC::FunctionMetadataNode::dump const):
2998         * parser/Nodes.h:
2999         (JSC::BooleanNode::value): Deleted.
3000         (JSC::StringNode::value): Deleted.
3001         (JSC::TemplateExpressionListNode::value): Deleted.
3002         (JSC::TemplateExpressionListNode::next): Deleted.
3003         (JSC::TemplateStringNode::cooked): Deleted.
3004         (JSC::TemplateStringNode::raw): Deleted.
3005         (JSC::TemplateStringListNode::value): Deleted.
3006         (JSC::TemplateStringListNode::next): Deleted.
3007         (JSC::TemplateLiteralNode::templateStrings const): Deleted.
3008         (JSC::TemplateLiteralNode::templateExpressions const): Deleted.
3009         (JSC::TaggedTemplateNode::templateLiteral const): Deleted.
3010         (JSC::ResolveNode::identifier const): Deleted.
3011         (JSC::ElementNode::elision const): Deleted.
3012         (JSC::ElementNode::value): Deleted.
3013         (JSC::ElementNode::next): Deleted.
3014         (JSC::ArrayNode::elements const): Deleted.
3015         (JSC::PropertyNode::expressionName const): Deleted.
3016         (JSC::PropertyNode::name const): Deleted.
3017         (JSC::PropertyNode::type const): Deleted.
3018         (JSC::PropertyNode::needsSuperBinding const): Deleted.
3019         (JSC::PropertyNode::isClassProperty const): Deleted.
3020         (JSC::PropertyNode::isStaticClassProperty const): Deleted.
3021         (JSC::PropertyNode::isInstanceClassProperty const): Deleted.
3022         (JSC::PropertyNode::isOverriddenByDuplicate const): Deleted.
3023         (JSC::PropertyNode::setIsOverriddenByDuplicate): Deleted.
3024         (JSC::PropertyNode::putType const): Deleted.
3025         (JSC::BracketAccessorNode::base const): Deleted.
3026         (JSC::BracketAccessorNode::subscript const): Deleted.
3027         (JSC::BracketAccessorNode::subscriptHasAssignments const): Deleted.
3028         (JSC::DotAccessorNode::base const): Deleted.
3029         (JSC::DotAccessorNode::identifier const): Deleted.
3030         (JSC::SpreadExpressionNode::expression const): Deleted.
3031         (JSC::ObjectSpreadExpressionNode::expression const): Deleted.
3032         (JSC::BytecodeIntrinsicNode::type const): Deleted.
3033         (JSC::BytecodeIntrinsicNode::emitter const): Deleted.
3034         (JSC::BytecodeIntrinsicNode::identifier const): Deleted.
3035         (JSC::TypeOfResolveNode::identifier const): Deleted.
3036         (JSC::BitwiseNotNode::expr): Deleted.
3037         (JSC::BitwiseNotNode::expr const): Deleted.
3038         (JSC::AssignResolveNode::identifier const): Deleted.
3039         (JSC::ExprStatementNode::expr const): Deleted.
3040         (JSC::ForOfNode::isForAwait const): Deleted.
3041         (JSC::ReturnNode::value): Deleted.
3042         (JSC::ProgramNode::startColumn const): Deleted.
3043         (JSC::ProgramNode::endColumn const): Deleted.
3044         (JSC::EvalNode::startColumn const): Deleted.
3045         (JSC::EvalNode::endColumn const): Deleted.
3046         (JSC::ModuleProgramNode::startColumn const): Deleted.
3047         (JSC::ModuleProgramNode::endColumn const): Deleted.
3048         (JSC::ModuleProgramNode::moduleScopeData): Deleted.
3049         (JSC::ModuleNameNode::moduleName): Deleted.
3050         (JSC::ImportSpecifierNode::importedName): Deleted.
3051         (JSC::ImportSpecifierNode::localName): Deleted.
3052         (JSC::ImportSpecifierListNode::specifiers const): Deleted.
3053         (JSC::ImportSpecifierListNode::append): Deleted.
3054         (JSC::ImportDeclarationNode::specifierList const): Deleted.
3055         (JSC::ImportDeclarationNode::moduleName const): Deleted.
3056         (JSC::ExportAllDeclarationNode::moduleName const): Deleted.
3057         (JSC::ExportDefaultDeclarationNode::declaration const): Deleted.
3058         (JSC::ExportDefaultDeclarationNode::localName const): Deleted.
3059         (JSC::ExportLocalDeclarationNode::declaration const): Deleted.
3060         (JSC::ExportSpecifierNode::exportedName): Deleted.
3061         (JSC::ExportSpecifierNode::localName): Deleted.
3062         (JSC::ExportSpecifierListNode::specifiers const): Deleted.
3063         (JSC::ExportSpecifierListNode::append): Deleted.
3064         (JSC::ExportNamedDeclarationNode::specifierList const): Deleted.
3065         (JSC::ExportNamedDeclarationNode::moduleName const): Deleted.
3066         (JSC::ArrayPatternNode::appendIndex): Deleted.
3067         (JSC::ObjectPatternNode::appendEntry): Deleted.
3068         (JSC::ObjectPatternNode::setContainsRestElement): Deleted.
3069         (JSC::ObjectPatternNode::setContainsComputedProperty): Deleted.
3070         (JSC::DestructuringAssignmentNode::bindings): Deleted.
3071         (JSC::FunctionParameters::size const): Deleted.
3072         (JSC::FunctionParameters::append): Deleted.
3073         (JSC::FunctionParameters::isSimpleParameterList const): Deleted.
3074         (JSC::FuncDeclNode::metadata): Deleted.
3075         (JSC::CaseClauseNode::expr const): Deleted.
3076         (JSC::CaseClauseNode::setStartOffset): Deleted.
3077         (JSC::ClauseListNode::getClause const): Deleted.
3078         (JSC::ClauseListNode::getNext const): Deleted.
3079         * runtime/ExceptionHelpers.cpp:
3080         * runtime/JSObject.cpp:
3081
3082 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
3083
3084         JSON.stringify should emit non own properties if second array argument includes
3085         https://bugs.webkit.org/show_bug.cgi?id=187724
3086
3087         Reviewed by Mark Lam.
3088
3089         According to the spec[1], JSON.stringify needs to retrieve properties by using [[Get]],
3090         instead of [[GetOwnProperty]]. It means that we would look up a properties defined
3091         in [[Prototype]] or upper objects in the prototype chain. While enumeration is done
3092         by using EnumerableOwnPropertyNames typically, we can pass replacer array including
3093         property names which does not reside in the own properties. Or we can modify the
3094         own properties by deleting properties while JSON.stringify is calling a getter. So,
3095         using [[Get]] instead of [[GetOwnProperty]] is user-visible.
3096
3097         This patch changes getOwnPropertySlot to getPropertySlot to align the behavior to the spec.
3098         The performance of Kraken/json-stringify-tinderbox is neutral.
3099
3100         [1]: https://tc39.github.io/ecma262/#sec-serializejsonproperty
3101
3102         * runtime/JSONObject.cpp:
3103         (JSC::Stringifier::toJSON):
3104         (JSC::Stringifier::toJSONImpl):
3105         (JSC::Stringifier::appendStringifiedValue):
3106         (JSC::Stringifier::Holder::Holder):
3107         (JSC::Stringifier::Holder::appendNextProperty):
3108
3109 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
3110
3111         [JSC] JSON.stringify's replacer should use `isArray` instead of JSArray checks
3112         https://bugs.webkit.org/show_bug.cgi?id=187755
3113
3114         Reviewed by Mark Lam.
3115
3116         JSON.stringify used `inherits<JSArray>(vm)` to determine whether the given replacer is an array replacer.
3117         But this is wrong. According to the spec, we should use `isArray`[1], which accepts Proxies. This difference
3118         makes one test262 test failed.
3119
3120         This patch changes the code to using `isArray()`. And we reorder the evaluations of replacer check and ident space check
3121         to align these checks to the spec's order.
3122
3123         [1]: https://tc39.github.io/ecma262/#sec-json.stringify
3124
3125         * runtime/JSONObject.cpp:
3126         (JSC::Stringifier::Stringifier):
3127
3128 2018-07-18  Yusuke Suzuki  <utatane.tea@gmail.com>
3129
3130         [JSC] Root wrapper object in JSON.stringify is not necessary if replacer is not callable
3131         https://bugs.webkit.org/show_bug.cgi?id=187752
3132
3133         Reviewed by Mark Lam.
3134
3135         JSON.stringify has an implicit root wrapper object since we would like to call replacer
3136         with a wrapper object and a property name. While we always create this wrapper object,
3137         it is unnecessary if the given replacer is not callable.
3138
3139         This patch removes wrapper object creation when a replacer is not callable to avoid unnecessary
3140         allocations. This change slightly improves the performance of Kraken/json-stringify-tinderbox.
3141
3142                                            baseline                  patched
3143
3144         json-stringify-tinderbox        39.730+-0.590      ^      38.853+-0.266         ^ definitely 1.0226x faster
3145
3146         * runtime/JSONObject.cpp:
3147         (JSC::Stringifier::isCallableReplacer const):
3148         (JSC::Stringifier::Stringifier):
3149         (JSC::Stringifier::stringify):
3150         (JSC::Stringifier::appendStringifiedValue):
3151
3152 2018-07-18  Carlos Garcia Campos  <cgarcia@igalia.com>
3153
3154         [GLIB] Add jsc_context_check_syntax() to GLib API
3155         https://bugs.webkit.org/show_bug.cgi?id=187694
3156
3157         Reviewed by Yusuke Suzuki.
3158
3159         A new function to be able to check for syntax errors without actually evaluating the code.
3160
3161         * API/glib/JSCContext.cpp:
3162         (jsc_context_check_syntax):
3163         * API/glib/JSCContext.h:
3164         * API/glib/docs/jsc-glib-4.0-sections.txt:
3165
3166 2018-07-17  Keith Miller  <keith_miller@apple.com>
3167
3168         Revert r233630 since it broke internal wasm benchmarks
3169         https://bugs.webkit.org/show_bug.cgi?id=187746
3170
3171         Unreviewed revert.
3172
3173         This patch seems to have broken internal Wasm benchmarks. This
3174         issue is likely due to an underlying bug but let's rollout while
3175         we investigate.
3176
3177         * bytecode/CodeType.h:
3178         * bytecode/UnlinkedCodeBlock.cpp:
3179         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
3180         * bytecode/UnlinkedCodeBlock.h:
3181         (JSC::UnlinkedCodeBlock::codeType const):
3182         (JSC::UnlinkedCodeBlock::didOptimize const):
3183         (JSC::UnlinkedCodeBlock::setDidOptimize):
3184         * bytecode/VirtualRegister.h:
3185         (JSC::VirtualRegister::VirtualRegister):
3186         (): Deleted.
3187
3188 2018-07-17  Mark Lam  <mark.lam@apple.com>
3189
3190         CodeBlock::baselineVersion() should account for executables with purged codeBlocks.
3191         https://bugs.webkit.org/show_bug.cgi?id=187736
3192         <rdar://problem/42114371>
3193
3194         Reviewed by Michael Saboff.
3195
3196         CodeBlock::baselineVersion() currently checks for a null replacement but does not
3197         account for the fact that that the replacement can also be null due to the
3198         executable having being purged of its codeBlocks due to a memory event (see
3199         ExecutableBase::clearCode()).  This patch adds code to account for this.
3200
3201         * bytecode/CodeBlock.cpp:
3202         (JSC::CodeBlock::baselineVersion):
3203
3204 2018-07-16  Yusuke Suzuki  <utatane.tea@gmail.com>
3205
3206         [JSC] UnlinkedCodeBlock::shrinkToFit miss m_constantIdentifierSets
3207         https://bugs.webkit.org/show_bug.cgi?id=187709
3208
3209         Reviewed by Mark Lam.
3210
3211         UnlinkedCodeBlock::shrinkToFit accidentally misses m_constantIdentifierSets shrinking.
3212
3213         * bytecode/UnlinkedCodeBlock.cpp:
3214         (JSC::UnlinkedCodeBlock::shrinkToFit):
3215
3216 2018-07-16  Yusuke Suzuki  <utatane.tea@gmail.com>
3217
3218         [JSC] Make SourceParseMode small
3219         https://bugs.webkit.org/show_bug.cgi?id=187705
3220
3221         Reviewed by Mark Lam.
3222
3223         Each SourceParseMode is distinct. So we do not need to make it a set-style (power of 2 style).
3224         Originally, this is done to make SourceParseModeSet faster because it is critical in our parser.
3225         But we can keep SourceParseModeSet fast by `1U << mode | set`. And we can make SourceParseMode
3226         within 5 bits. This reduces the size of UnlinkedCodeBlock from 288 to 280.
3227
3228         * parser/ParserModes.h:
3229         (JSC::SourceParseModeSet::SourceParseModeSet):
3230         (JSC::SourceParseModeSet::contains):
3231         (JSC::SourceParseModeSet::mergeSourceParseModes):
3232
3233 2018-07-12  Yusuke Suzuki  <utatane.tea@gmail.com>
3234
3235         [JSC] Generator and AsyncGeneratorMethod's prototype is incorrect
3236         https://bugs.webkit.org/show_bug.cgi?id=187585
3237
3238         Reviewed by Darin Adler.
3239
3240         This patch fixes Generator and AsyncGenerator's prototype issues.
3241
3242         1. Generator's default prototype is incorrect when `generator.prototype = null` is performed.
3243         We fix this by changing JSFunction::prototypeForConstruction.
3244
3245         2. AsyncGeneratorMethod is not handled. We change the name isAsyncGeneratorFunctionParseMode
3246         to isAsyncGeneratorWrapperParseMode since it is aligned to Generator's code. And use it well
3247         to fix `prototype` issues for AsyncGeneratorMethod.
3248
3249         * bytecompiler/BytecodeGenerator.cpp:
3250         (JSC::BytecodeGenerator::emitPutAsyncGeneratorFields):
3251         (JSC::BytecodeGenerator::emitNewFunction):
3252         * bytecompiler/NodesCodegen.cpp:
3253         (JSC::FunctionNode::emitBytecode):
3254         * parser/ASTBuilder.h:
3255         (JSC::ASTBuilder::createFunctionMetadata):
3256         * parser/Parser.cpp:
3257         (JSC::getAsynFunctionBodyParseMode):
3258         (JSC::Parser<LexerType>::parseInner):
3259         (JSC::Parser<LexerType>::parseAsyncGeneratorFunctionSourceElements):
3260         * parser/ParserModes.h:
3261         (JSC::isAsyncGeneratorParseMode):
3262         (JSC::isAsyncGeneratorWrapperParseMode):
3263         (JSC::isAsyncGeneratorFunctionParseMode): Deleted.
3264         * runtime/FunctionExecutable.h:
3265         * runtime/JSFunction.cpp:
3266         (JSC::JSFunction::prototypeForConstruction):
3267         (JSC::JSFunction::getOwnPropertySlot):
3268
3269 2018-07-16  Mark Lam  <mark.lam@apple.com>
3270
3271         jsc shell's noFTL utility test function should be more robust.
3272         https://bugs.webkit.org/show_bug.cgi?id=187704
3273         <rdar://problem/42231988>
3274
3275         Reviewed by Michael Saboff and Keith Miller.
3276
3277         * jsc.cpp:
3278         (functionNoFTL):
3279         - only setNeverFTLOptimize() if the function is actually a JS function.
3280
3281 2018-07-15  Carlos Garcia Campos  <cgarcia@igalia.com>
3282
3283         [GLIB] Add API to evaluate code using a given object to store global symbols
3284         https://bugs.webkit.org/show_bug.cgi?id=187639
3285
3286         Reviewed by Michael Catanzaro.
3287
3288         Add jsc_context_evaluate_in_object(). It returns a new object as an out parameter. Global symbols in the
3289         evaluated script are added as properties to the new object instead of to the context global object. This is
3290         similar to JS::Evaluate in spider monkey when a scopeChain parameter is passed, but JSC doesn't support using a
3291         scope for assignments, so we have to create a new context and get its global object. This patch also updates
3292         jsc_context_evaluate_with_source_uri() to receive the starting line number for consistency with the new
3293         jsc_context_evaluate_in_object().
3294
3295         * API/glib/JSCContext.cpp:
3296         (jsc_context_evaluate): Pass 0 as line number to jsc_context_evaluate_with_source_uri().
3297         (evaluateScriptInContext): Helper function to evaluate a script in a JSGlobalContextRef.
3298         (jsc_context_evaluate_with_source_uri): Use evaluateScriptInContext().
3299         (jsc_context_evaluate_in_object): Create a new context and set the main context global object as extension
3300         scope of it. Evaluate the script in the new context and get its global object to be returned as parameter.
3301         * API/glib/JSCContext.h:
3302         * API/glib/docs/jsc-glib-4.0-sections.txt:
3303
3304 2018-07-13  Yusuke Suzuki  <utatane.tea@gmail.com>
3305
3306         [32bit JSC tests]  stress/cow-convert-double-to-contiguous.js and stress/cow-convert-int32-to-contiguous.js are failing
3307         https://bugs.webkit.org/show_bug.cgi?id=187561
3308
3309         Reviewed by Darin Adler.
3310
3311         This patch fixes the issue that CoW array handling is not introduced in 32bit put_by_val code.
3312         We clean up 32bit put_by_val code.
3313
3314         1. We remove inline out-of-bounds recording code since it is done in C operation code. This change
3315         aligns 32bit implementation to 64bit implementation.
3316
3317         2. We add CoW array checking, which is done in 64bit implementation.
3318
3319         * jit/JITPropertyAccess.cpp:
3320         (JSC::JIT::emit_op_put_by_val):
3321         * jit/JITPropertyAccess32_64.cpp:
3322         (JSC::JIT::emit_op_put_by_val):
3323         (JSC::JIT::emitSlow_op_put_by_val):
3324
3325 2018-07-12  Mark Lam  <mark.lam@apple.com>
3326
3327         Need to handle CodeBlock::replacement() being null.
3328         https://bugs.webkit.org/show_bug.cgi?id=187569
3329         <rdar://problem/41468692>
3330
3331         Reviewed by Saam Barati.
3332
3333         CodeBlock::replacement() may return a nullptr.  Some of our code already checks
3334         for this while others do not.  We should add null checks in all the places that
3335         need it.
3336
3337         * bytecode/CodeBlock.cpp:
3338         (JSC::CodeBlock::hasOptimizedReplacement):
3339         (JSC::CodeBlock::jettison):
3340         (JSC::CodeBlock::numberOfDFGCompiles):
3341         (JSC::CodeBlock::setOptimizationThresholdBasedOnCompilationResult):