[MinGW] Fixed C99/C++11 format attributes in printf-like functions
[WebKit-https.git] / Source / WTF / ChangeLog
1 2016-11-05  Konstantin Tokarev  <annulen@yandex.ru>
2
3         [MinGW] Fixed C99/C++11 format attributes in printf-like functions
4         https://bugs.webkit.org/show_bug.cgi?id=164448
5
6         Reviewed by Michael Catanzaro.
7
8         By default MinGW uses printf-like function provided in msvcrt.dll,
9         however they miss support for C99/C++11 format attributes. Use MinGW
10         implementations instead.
11
12         * wtf/Assertions.h: Use gnu_printf format in WTF_ATTRIBUTE_PRINTF
13
14 2016-11-05  Yusuke Suzuki  <utatane.tea@gmail.com>
15
16         [JSCOnly] RunLoopGeneric should adopt MonotonicTime / WallTime change
17         https://bugs.webkit.org/show_bug.cgi?id=164447
18
19         Reviewed by Csaba Osztrogon√°c.
20
21         Build fix for JSCOnly.
22
23         * wtf/generic/RunLoopGeneric.cpp:
24         (WTF::RunLoop::TimerBase::ScheduledTask::create):
25         (WTF::RunLoop::TimerBase::ScheduledTask::ScheduledTask):
26         (WTF::RunLoop::TimerBase::ScheduledTask::scheduledTimePoint):
27         (WTF::RunLoop::TimerBase::ScheduledTask::updateReadyTime):
28         (WTF::RunLoop::populateTasks):
29         (WTF::RunLoop::dispatchAfter):
30         (WTF::RunLoop::TimerBase::start):
31
32 2016-11-04  Filip Pizlo  <fpizlo@apple.com>
33
34         WTF::ParkingLot should stop using std::chrono because std::chrono::duration casts are prone to overflows
35         https://bugs.webkit.org/show_bug.cgi?id=152045
36
37         Reviewed by Andy Estes.
38         
39         We used to use 'double' for all time measurements. Sometimes it was milliseconds,
40         sometimes it was seconds. Sometimes we measured a span of time, sometimes we spoke of time
41         since some epoch. When we spoke of time since epoch, we either used a monotonic clock or
42         a wall clock. The type - always 'double' - never told us what kind of time we had, even
43         though there were roughly six of them (sec interval, ms interval, sec since epoch on wall,
44         ms since epoch on wall, sec since epoch monotonic, ms since epoch monotonic).
45         
46         At some point, we thought that it would be a good idea to replace these doubles with
47         std::chrono. But since replacing some things with std::chrono, we found it to be terribly
48         inconvenient:
49         
50         - Outrageous API. I never want to say std::chrono::milliseconds(blah). I never want to say
51           std::chrono::steady_clock::timepoint. The syntax for duration_cast is ugly, and ideally
52           duration_cast would not even be a thing.
53         
54         - No overflow protection. std::chrono uses integers by default and using anything else is
55           clumsy. But the integer math is done without regard for the rough edges of integer math,
56           so any cast between std::chrono types risks overflow. Any comparison risks overflow
57           because it may do conversions silently. We have even found bugs where some C++
58           implementations had more overflows than others, which ends up being a special kind of
59           hell. In many cases, the overflow also has nasal demons.
60         
61         It's an error to represent time using integers. It would have been excusable back when
62         floating point math was not guaranteed to be supported on all platforms, but that would
63         have been a long time ago. Time is a continuous, infinite concept and it's a perfect fit
64         for floating point:
65         
66         - Floating point preserves precision under multiplication in all but extreme cases, so
67           using floating point for time means that unit conversions are almost completely
68           lossless. This means that we don't have to think very hard about what units to use. In
69           this patch, we use seconds almost everywhere. We only convert at boundaries, like an API
70           boundary that wants something other than seconds.
71         
72         - Floating point makes it easy to reason about infinity, which is something that time code
73           wants to do a lot. Example: when would you like to timeout? Infinity please! This is the
74           most elegant way of having an API support both a timeout variant and a no-timeout
75           variant.
76
77         - Floating point does well-understood things when math goes wrong, and these things are
78           pretty well optimized to match what a mathematician would do when computing with real
79           numbers represented using scientific notation with a finite number of significant
80           digits. This means that time math under floating point looks like normal math. On the
81           other hand, std::chrono time math looks like garbage because you have to always check
82           for multiple possible UB corners whenever you touch large integers. Integers that
83           represent time are very likely to be large and you don't have to do much to overflow
84           them. At this time, based on the number of bugs we have already seen due to chrono
85           overflows, I am not certain that we even understand what are all of the corner cases
86           that we should even check for.
87         
88         This patch introduces a new set of timekeeping classes that are all based on double, and
89         all internally use seconds. These classes support algebraic typing. The classes are:
90         
91         - Seconds: this is for measuring a duration.
92         - WallTime: time since epoch according to a wall clock (aka real time clock).
93         - MonotonicTime: time since epoch according to a monotonic clock.
94         - ClockType: enum that says either Wall or Monotonic.
95         - TimeWithDynamicClockType: a tuple of double and ClockType, which represents either a
96           wall time or a monotonic time.
97         
98         All of these classes behave like C++ values and are cheap to copy around since they are
99         very nearly POD. This supports comprehensive conversions between the various time types.
100         Most of this is by way of algebra. Here are just some of the rules we recognize:
101         
102         WallTime = WallTime + Seconds
103         Seconds = WallTime - WallTime
104         MonotonicTime = MonotonicTime + Seconds
105         etc...
106         
107         We support negative, infinite, and NaN times because math.
108         
109         We support conversions between MonotonicTime and WallTime, like:
110         
111         WallTime wt = mt.approximateWallTime()
112         
113         This is called this "approximate" because the only way to do it is to get the current time
114         on both clocks and convert relative to that.
115         
116         Many of our APIs would be happy using whatever notion of time the user wanted to use. For
117         those APIs, which includes Condition and ParkingLot, we have TimeWithDynamicClockType. You
118         can automatically convert WallTime or MonotonicTime to TimeWithDynamicClockType. This
119         means that if you use a WallTime with Condition::waitUntil, then Condition's internal
120         logic for when it should wake up makes its decision based on the current WallTime - but if
121         you use MonotonicTime then waitUntil will make its decision based on current
122         MonotonicTime. This is a greater level of flexibility than chrono allowed, since chrono
123         did not have the concept of a dynamic clock type.
124         
125         This patch does not include conversions between std::chrono and these new time classes,
126         because past experience shows that we're quite bad at getting conversions between
127         std::chrono and anything else right. Also, I didn't need such conversion code because this
128         patch only converts code that transitively touches ParkingLot and Condition. It was easy
129         to get all of that code onto the new time classes.
130
131         * WTF.xcodeproj/project.pbxproj:
132         * wtf/AutomaticThread.cpp:
133         (WTF::AutomaticThread::start):
134         * wtf/CMakeLists.txt:
135         * wtf/ClockType.cpp: Added.
136         (WTF::printInternal):
137         * wtf/ClockType.h: Added.
138         * wtf/Condition.h:
139         (WTF::ConditionBase::waitUntil):
140         (WTF::ConditionBase::waitFor):
141         (WTF::ConditionBase::wait):
142         (WTF::ConditionBase::waitUntilWallClockSeconds): Deleted.
143         (WTF::ConditionBase::waitUntilMonotonicClockSeconds): Deleted.
144         (WTF::ConditionBase::waitForSeconds): Deleted.
145         (WTF::ConditionBase::waitForSecondsImpl): Deleted.
146         (WTF::ConditionBase::waitForImpl): Deleted.
147         (WTF::ConditionBase::absoluteFromRelative): Deleted.
148         * wtf/CrossThreadQueue.h:
149         (WTF::CrossThreadQueue<DataType>::waitForMessage):
150         * wtf/CurrentTime.cpp:
151         (WTF::sleep):
152         * wtf/MessageQueue.h:
153         (WTF::MessageQueue::infiniteTime): Deleted.
154         * wtf/MonotonicTime.cpp: Added.
155         (WTF::MonotonicTime::now):
156         (WTF::MonotonicTime::approximateWallTime):
157         (WTF::MonotonicTime::dump):
158         (WTF::MonotonicTime::sleep):
159         * wtf/MonotonicTime.h: Added.
160         (WTF::MonotonicTime::MonotonicTime):
161         (WTF::MonotonicTime::fromRawDouble):
162         (WTF::MonotonicTime::infinity):
163         (WTF::MonotonicTime::secondsSinceEpoch):
164         (WTF::MonotonicTime::approximateMonotonicTime):
165         (WTF::MonotonicTime::operator bool):
166         (WTF::MonotonicTime::operator+):
167         (WTF::MonotonicTime::operator-):
168         (WTF::MonotonicTime::operator+=):
169         (WTF::MonotonicTime::operator-=):
170         (WTF::MonotonicTime::operator==):
171         (WTF::MonotonicTime::operator!=):
172         (WTF::MonotonicTime::operator<):
173         (WTF::MonotonicTime::operator>):
174         (WTF::MonotonicTime::operator<=):
175         (WTF::MonotonicTime::operator>=):
176         * wtf/ParkingLot.cpp:
177         (WTF::ParkingLot::parkConditionallyImpl):
178         (WTF::ParkingLot::unparkOne):
179         (WTF::ParkingLot::unparkOneImpl):
180         (WTF::ParkingLot::unparkCount):
181         * wtf/ParkingLot.h:
182         (WTF::ParkingLot::parkConditionally):
183         (WTF::ParkingLot::compareAndPark):
184         * wtf/Seconds.cpp: Added.
185         (WTF::Seconds::operator+):
186         (WTF::Seconds::operator-):
187         (WTF::Seconds::dump):
188         (WTF::Seconds::sleep):
189         * wtf/Seconds.h: Added.
190         (WTF::Seconds::Seconds):
191         (WTF::Seconds::value):
192         (WTF::Seconds::seconds):
193         (WTF::Seconds::milliseconds):
194         (WTF::Seconds::microseconds):
195         (WTF::Seconds::nanoseconds):
196         (WTF::Seconds::fromMilliseconds):
197         (WTF::Seconds::fromMicroseconds):
198         (WTF::Seconds::fromNanoseconds):
199         (WTF::Seconds::infinity):
200         (WTF::Seconds::operator bool):
201         (WTF::Seconds::operator+):
202         (WTF::Seconds::operator-):
203         (WTF::Seconds::operator*):
204         (WTF::Seconds::operator/):
205         (WTF::Seconds::operator+=):
206         (WTF::Seconds::operator-=):
207         (WTF::Seconds::operator*=):
208         (WTF::Seconds::operator/=):
209         (WTF::Seconds::operator==):
210         (WTF::Seconds::operator!=):
211         (WTF::Seconds::operator<):
212         (WTF::Seconds::operator>):
213         (WTF::Seconds::operator<=):
214         (WTF::Seconds::operator>=):
215         * wtf/TimeWithDynamicClockType.cpp: Added.
216         (WTF::TimeWithDynamicClockType::now):
217         (WTF::TimeWithDynamicClockType::nowWithSameClock):
218         (WTF::TimeWithDynamicClockType::wallTime):
219         (WTF::TimeWithDynamicClockType::monotonicTime):
220         (WTF::TimeWithDynamicClockType::approximateWallTime):
221         (WTF::TimeWithDynamicClockType::approximateMonotonicTime):
222         (WTF::TimeWithDynamicClockType::operator-):
223         (WTF::TimeWithDynamicClockType::operator<):
224         (WTF::TimeWithDynamicClockType::operator>):
225         (WTF::TimeWithDynamicClockType::operator<=):
226         (WTF::TimeWithDynamicClockType::operator>=):
227         (WTF::TimeWithDynamicClockType::dump):
228         (WTF::TimeWithDynamicClockType::sleep):
229         * wtf/TimeWithDynamicClockType.h: Added.
230         (WTF::TimeWithDynamicClockType::TimeWithDynamicClockType):
231         (WTF::TimeWithDynamicClockType::fromRawDouble):
232         (WTF::TimeWithDynamicClockType::secondsSinceEpoch):
233         (WTF::TimeWithDynamicClockType::clockType):
234         (WTF::TimeWithDynamicClockType::withSameClockAndRawDouble):
235         (WTF::TimeWithDynamicClockType::operator bool):
236         (WTF::TimeWithDynamicClockType::operator+):
237         (WTF::TimeWithDynamicClockType::operator-):
238         (WTF::TimeWithDynamicClockType::operator+=):
239         (WTF::TimeWithDynamicClockType::operator-=):
240         (WTF::TimeWithDynamicClockType::operator==):
241         (WTF::TimeWithDynamicClockType::operator!=):
242         * wtf/WallTime.cpp: Added.
243         (WTF::WallTime::now):
244         (WTF::WallTime::approximateMonotonicTime):
245         (WTF::WallTime::dump):
246         (WTF::WallTime::sleep):
247         * wtf/WallTime.h: Added.
248         (WTF::WallTime::WallTime):
249         (WTF::WallTime::fromRawDouble):
250         (WTF::WallTime::infinity):
251         (WTF::WallTime::secondsSinceEpoch):
252         (WTF::WallTime::approximateWallTime):
253         (WTF::WallTime::operator bool):
254         (WTF::WallTime::operator+):
255         (WTF::WallTime::operator-):
256         (WTF::WallTime::operator+=):
257         (WTF::WallTime::operator-=):
258         (WTF::WallTime::operator==):
259         (WTF::WallTime::operator!=):
260         (WTF::WallTime::operator<):
261         (WTF::WallTime::operator>):
262         (WTF::WallTime::operator<=):
263         (WTF::WallTime::operator>=):
264         * wtf/threads/BinarySemaphore.cpp:
265         (WTF::BinarySemaphore::wait):
266         * wtf/threads/BinarySemaphore.h:
267
268 2016-11-03  Filip Pizlo  <fpizlo@apple.com>
269
270         DFG plays fast and loose with the shadow values of a Phi
271         https://bugs.webkit.org/show_bug.cgi?id=164309
272
273         Reviewed by Saam Barati.
274         
275         Made this API use size rather than maxIndex as its initialization parameter, because that's
276         less confusing.
277
278         * wtf/IndexSparseSet.h:
279         (WTF::IndexSparseSet<OverflowHandler>::IndexSparseSet):
280
281 2016-11-03  Commit Queue  <commit-queue@webkit.org>
282
283         Unreviewed, rolling out r208364.
284         https://bugs.webkit.org/show_bug.cgi?id=164402
285
286         broke the build (Requested by smfr on #webkit).
287
288         Reverted changeset:
289
290         "DFG plays fast and loose with the shadow values of a Phi"
291         https://bugs.webkit.org/show_bug.cgi?id=164309
292         http://trac.webkit.org/changeset/208364
293
294 2016-11-03  Filip Pizlo  <fpizlo@apple.com>
295
296         DFG plays fast and loose with the shadow values of a Phi
297         https://bugs.webkit.org/show_bug.cgi?id=164309
298
299         Reviewed by Saam Barati.
300         
301         Made this API use size rather than maxIndex as its initialization parameter, because that's
302         less confusing.
303
304         * wtf/IndexSparseSet.h:
305         (WTF::IndexSparseSet<OverflowHandler>::IndexSparseSet):
306
307 2016-11-03  Konstantin Tokarev  <annulen@yandex.ru>
308
309         Fixes to build JSCOnly on macOS
310         https://bugs.webkit.org/show_bug.cgi?id=164379
311
312         Reviewed by Michael Catanzaro.
313
314         * wtf/Platform.h: JSCOnly port should not provide any PLATFORM() macro
315
316 2016-11-03  Brady Eidson  <beidson@apple.com>
317
318         IndexedDB 2.0: Support binary keys.
319         <rdar://problem/28806927> and https://bugs.webkit.org/show_bug.cgi?id=164359
320
321         Reviewed by Alex Christensen.
322
323         * wtf/Hasher.h:
324         (WTF::StringHasher::hashMemory): Teach hashMemory() to handle buffers with odd lengths.
325
326 2016-11-02  Filip Pizlo  <fpizlo@apple.com>
327
328         The GC should be in a thread
329         https://bugs.webkit.org/show_bug.cgi?id=163562
330
331         Reviewed by Geoffrey Garen and Andreas Kling.
332         
333         This fixes some bugs and adds a few features.
334
335         * wtf/Atomics.h: The GC may do work on behalf of the JIT. If it does, the main thread needs to execute a cross-modifying code fence. This is cpuid on x86 and I believe it's isb on ARM. It would have been an isync on PPC and I think that isb is the ARM equivalent.
336         (WTF::arm_isb):
337         (WTF::crossModifyingCodeFence):
338         (WTF::x86_ortop):
339         (WTF::x86_cpuid):
340         * wtf/AutomaticThread.cpp: I accidentally had AutomaticThreadCondition inherit from ThreadSafeRefCounted<AutomaticThread> [sic]. This never crashed before because all of our prior AutomaticThreadConditions were immortal.
341         (WTF::AutomaticThread::AutomaticThread):
342         (WTF::AutomaticThread::~AutomaticThread):
343         (WTF::AutomaticThread::start):
344         * wtf/AutomaticThread.h:
345         * wtf/MainThread.cpp: Need to allow initializeGCThreads() to be called separately because it's now more than just a debugging thing.
346         (WTF::initializeGCThreads):
347
348 2016-11-02  Carlos Alberto Lopez Perez  <clopez@igalia.com>
349
350         Clean wrong comment about compositing on the UI process.
351         https://bugs.webkit.org/show_bug.cgi?id=164339
352
353         Reviewed by Michael Catanzaro.
354
355         * wtf/Platform.h: The comment about compositing on the UI process
356         was added on r109302 but was not removed properly when the Qt port
357         was removed from trunk.
358         USE_PROTECTION_SPACE_AUTH_CALLBACK has nothing to do with it.
359
360 2016-11-02  Alex Christensen  <achristensen@webkit.org>
361
362         Remove Battery Status API from the tree
363         https://bugs.webkit.org/show_bug.cgi?id=164213
364
365         Reviewed by Sam Weinig.
366
367         * wtf/FeatureDefines.h:
368
369 2016-11-02  Romain Bellessort  <romain.bellessort@crf.canon.fr>
370
371         [Readable Streams API] Enable creation of ReadableByteStreamController
372         https://bugs.webkit.org/show_bug.cgi?id=164014
373
374         Reviewed by Youenn Fablet.
375
376         Added flag for the byte stream part of Readable Streams API.
377
378         * wtf/FeatureDefines.h:
379
380 2016-11-02  Per Arne Vollan  <pvollan@apple.com>
381
382         [Win] Copy build results to AAS 'Program Files' folder.
383         https://bugs.webkit.org/show_bug.cgi?id=164273
384
385         Reviewed by Brent Fulgham.
386
387         The preferred location for the binaries is the AAS 'Program Files' folder.
388
389         * WTF.vcxproj/WTF.proj:
390
391 2016-10-29  Filip Pizlo  <fpizlo@apple.com>
392
393         JSC should support SharedArrayBuffer
394         https://bugs.webkit.org/show_bug.cgi?id=163986
395
396         Reviewed by Keith Miller.
397         
398         Adds some small things we need for SharedArrayBuffer.
399         
400         * wtf/Atomics.h:
401         (WTF::Atomic::compareExchangeWeakRelaxed):
402         (WTF::Atomic::exchangeAdd):
403         (WTF::Atomic::exchangeAnd):
404         (WTF::Atomic::exchangeOr):
405         (WTF::Atomic::exchangeSub):
406         (WTF::Atomic::exchangeXor):
407         (WTF::atomicLoad):
408         (WTF::atomicStore):
409         (WTF::atomicCompareExchangeWeak):
410         (WTF::atomicCompareExchangeWeakRelaxed):
411         (WTF::atomicCompareExchangeStrong):
412         (WTF::atomicExchangeAdd):
413         (WTF::atomicExchangeAnd):
414         (WTF::atomicExchangeOr):
415         (WTF::atomicExchangeSub):
416         (WTF::atomicExchangeXor):
417         (WTF::atomicExchange):
418         (WTF::Atomic::exchangeAndAdd): Deleted.
419         (WTF::weakCompareAndSwap): Deleted.
420         We need to be able to do atomics operations on naked pointers. We also need to be able to do
421         all of the things that std::atomic does. This adds those things and renames
422         weakCompareAndSwap to atomicCompareExchangeWeakRelaxed so that we're using consistent
423         terminology.
424         
425         * wtf/Bitmap.h:
426         (WTF::WordType>::concurrentTestAndSet): Renamed weakCompareAndSwap.
427         (WTF::WordType>::concurrentTestAndClear): Renamed weakCompareAndSwap.
428         * wtf/FastBitVector.h:
429         (WTF::FastBitVector::atomicSetAndCheck): Renamed weakCompareAndSwap.
430         * wtf/ParkingLot.cpp:
431         (WTF::ParkingLot::unparkOne):
432         (WTF::ParkingLot::unparkCount):
433         * wtf/ParkingLot.h:
434         Added unparkCount(), which lets you unpark some bounded number of threads and returns the
435         number of threads unparked. This is just a modest extension of unparkAll(). unparkAll() now
436         just calls unparkCount(ptr, UINT_MAX).
437
438 2016-10-30  Frederic Wang  <fwang@igalia.com>
439
440         Use HarfBuzz ot-math API to parse the OpenType MATH table
441         https://bugs.webkit.org/show_bug.cgi?id=162671
442
443         Reviewed by Michael Catanzaro.
444
445         * wtf/Platform.h: By default, do not enable internal OpenType MATH parsing on GTK.
446
447 2016-10-25  Mark Lam  <mark.lam@apple.com>
448
449         String.prototype.replace() should throw an OutOfMemoryError when using too much memory.
450         https://bugs.webkit.org/show_bug.cgi?id=163996
451         <rdar://problem/28263117>
452
453         Reviewed by Geoffrey Garen.
454
455         * wtf/Vector.h:
456         (WTF::minCapacity>::tryConstructAndAppend):
457         (WTF::minCapacity>::tryConstructAndAppendSlowCase):
458         - Added try versions of constructAndAppend() so that we can handle the failure
459           to allocate more gracefully.
460
461 2016-10-25  Konstantin Tokarev  <annulen@yandex.ru>
462
463         Non-specialized version of deleteObject should not have template argument
464         https://bugs.webkit.org/show_bug.cgi?id=163943
465
466         Reviewed by Anders Carlsson.
467
468         Fixes compilation of GDIObject.h with MinGW
469
470         * wtf/win/GDIObject.h:
471         (WTF::deleteObject):
472
473 2016-10-24  Per Arne Vollan  <pvollan@apple.com>
474
475         [Win] CMake build type is not set.
476         https://bugs.webkit.org/show_bug.cgi?id=163917
477
478         Reviewed by Alex Christensen.
479
480         The CMAKE_BUILD_TYPE variable should be set to Debug or Release.
481
482         * WTF.vcxproj/WTF.proj:
483
484 2016-10-23  Yusuke Suzuki  <utatane.tea@gmail.com>
485
486         [DOMJIT] Add a way for DOMJIT::Patchpoint to express effects
487         https://bugs.webkit.org/show_bug.cgi?id=163657
488
489         Reviewed by Saam Barati.
490
491         Simplify nonEmptyRangesOverlap.
492
493         * wtf/MathExtras.h:
494         (WTF::nonEmptyRangesOverlap):
495
496 2016-10-23  Chris Dumez  <cdumez@apple.com>
497
498         Another unreviewed attempt to fix the WatchOS / TvOS build after r207585.
499         <rdar://problem/28902292>
500
501         Disable USE_CFURLCONNECTION on newer WatchOS / TvOS.
502
503         * wtf/Platform.h:
504
505 2016-10-20  Keith Miller  <keith_miller@apple.com>
506
507         Add support for WASM calls
508         https://bugs.webkit.org/show_bug.cgi?id=161727
509
510         Reviewed by Filip Pizlo and Michael Saboff.
511
512         Added a new decodeUInt64. Also, added WTF::LEBDecoder namespace.
513
514         * wtf/LEBDecoder.h:
515         (WTF::LEBDecoder::decodeUInt):
516         (WTF::LEBDecoder::decodeUInt32):
517         (WTF::LEBDecoder::decodeUInt64):
518         (WTF::LEBDecoder::decodeInt32):
519         (decodeUInt32): Deleted.
520         (decodeInt32): Deleted.
521
522 2016-10-20  Filip Pizlo  <fpizlo@apple.com>
523
524         The tracking of the coarse-grain Heap state (allocating or not, collector or not, eden vs full) should respect the orthogonality between allocating and collecting
525         https://bugs.webkit.org/show_bug.cgi?id=163738
526
527         Reviewed by Geoffrey Garen.
528         
529         There will soon be different kinds of GC threads, and WTF's "are you a GC thread" thing
530         should know about this.
531
532         * wtf/MainThread.cpp:
533         (WTF::initializeGCThreads):
534         (WTF::registerGCThread):
535         (WTF::mayBeGCThread):
536         * wtf/MainThread.h:
537
538 2016-10-19  Sam Weinig  <sam@webkit.org>
539
540         Add convenience function that combines WTF::visit(...) with WTF::makeVisitor(...)
541         https://bugs.webkit.org/show_bug.cgi?id=163713
542
543         Reviewed by Dan Bernstein.
544
545         - Add WTF::switchOn which merges WTF::visit with WTF::makeVisitor in the following
546           way:
547                 WTF::visit(WTF::makeVisitor(...), variant)
548
549         * wtf/Variant.h:
550         (WTF::switchOn):
551
552 2016-10-19  Alex Christensen  <achristensen@webkit.org>
553
554         Revert r207151
555         https://bugs.webkit.org/show_bug.cgi?id=163675
556
557         Reviewed by Brent Fulgham.
558
559         * wtf/Platform.h:
560         * wtf/SchedulePair.h:
561         * wtf/SchedulePairMac.mm:
562
563 2016-10-19  Filip Pizlo  <fpizlo@apple.com>
564
565         REGRESSION (r207480): 3 Dromaeo tests failing
566         https://bugs.webkit.org/show_bug.cgi?id=163633
567
568         Reviewed by Mark Lam.
569         
570         It's a ParkingLot bug: if we timeout and get unparked at the same time, then the unparking
571         thread will clear our address eventually - but not immediately. This causes a nasty
572         assertion failure. The tricky thing is that when we detect this, we need to wait until that
573         unparking thread does the deed. Otherwise, they will still do it at some later time.
574         
575         Alternatively, we could use some kind of versioning to detect this - increment the version
576         when you park, so that unparking threads will know if they are time travelers. That seems
577         more yucky.
578         
579         I don't think it matters too much what we do here, so long as it's simple and correct, since
580         this requires a race that is rare enough that it didn't happen once in my testing, and I was
581         pretty thorough. For example, it didn't happen once in 15 runs of JetStream. The race is
582         rare because it requires the timeout to happen right as someone else is unparking. Since
583         it's so rare, its probably OK that the unparked thread waits just a tiny moment until the
584         unparking thread is done.
585
586         * wtf/ParkingLot.cpp:
587         (WTF::ParkingLot::parkConditionallyImpl):
588         (WTF::ParkingLot::unparkOneImpl):
589
590 2016-10-19  Filip Pizlo  <fpizlo@apple.com>
591
592         Baseline JIT should use AutomaticThread
593         https://bugs.webkit.org/show_bug.cgi?id=163686
594
595         Reviewed by Geoffrey Garen.
596         
597         Added a AutomaticThreadCondition::wait() method, so that if you really want to use one
598         common condition for your thread and something else, you can do it. This trivially works
599         if you only use notifyAll(), and behaves as you'd expect for notifyOne() (i.e. it's
600         dangerous, since you don't know who will wake up).
601         
602         The Baseline JIT used the one-true-Condition idiom because it used notifyAll() in an
603         optimal way: there are just two threads talking to each other, so it wakes up at most one
604         thread and that thread is exactly the one you want woken up. Adding wait() means that I did
605         not have to change that code.
606
607         * wtf/AutomaticThread.cpp:
608         (WTF::AutomaticThreadCondition::wait):
609         * wtf/AutomaticThread.h:
610
611 2016-10-18  Filip Pizlo  <fpizlo@apple.com>
612
613         DFG worklist should use AutomaticThread
614         https://bugs.webkit.org/show_bug.cgi?id=163615
615
616         Reviewed by Mark Lam.
617         
618         This adds new functionality to AutomaticThread to support DFG::Worklist:
619         
620         - AutomaticThread::threadDidStart/threadWillStop virtual methods called at the start and end
621           of a thread's lifetime. This allows Worklist to tie some resources to the life of the
622           thread, and also means that now those resources will naturally free up when the Worklist is
623           not in use.
624         
625         - AutomaticThreadCondition::notifyOne(). This required changes to Condition::notifyOne(). We
626           need to know if the Condition woke up anyone. If it didn't, then we need to launch one of
627           our threads.
628
629         * wtf/AutomaticThread.cpp:
630         (WTF::AutomaticThreadCondition::notifyOne):
631         (WTF::AutomaticThread::ThreadScope::ThreadScope):
632         (WTF::AutomaticThread::ThreadScope::~ThreadScope):
633         (WTF::AutomaticThread::start):
634         (WTF::AutomaticThread::threadDidStart):
635         (WTF::AutomaticThread::threadWillStop):
636         * wtf/AutomaticThread.h:
637         * wtf/Condition.h:
638         (WTF::ConditionBase::notifyOne):
639
640 2016-10-18  Sam Weinig  <sam@webkit.org>
641
642         Replace std::experimental::variant with WTF::Variant (or similar)
643         https://bugs.webkit.org/show_bug.cgi?id=163626
644
645         Reviewed by Chris Dumez.
646
647         Rename std::experimental::variant, Variant. Move helpers get/holds_alternative/etc.
648         into the WTF namespace.
649
650         * wtf/Forward.h:
651         * wtf/Variant.h:
652
653 2016-10-18  Filip Pizlo  <fpizlo@apple.com>
654
655         WTF should make it easier to create threads that die automatically after inactivity
656         https://bugs.webkit.org/show_bug.cgi?id=163576
657
658         Reviewed by Andreas Kling.
659         
660         For a long time now, I've been adding threads to WTF/JSC and each time I do this, I feel
661         guilty because those threads don't shut down when they are inactive. For example, in bug
662         163562, I need to add a new GC thread. There will be one of them per VM. This means that a
663         JSC API client that starts a lot of VMs will have a lot of threads. I don't think that's
664         good.
665         
666         A common pattern for all of these threads is that they have some well-defined trigger that
667         causes them to run. This trigger has a lock, a condition variable, some logic that determines
668         if there is work to do, and then of course the logic for the thread's actual work. The thread
669         bodies usually look like this:
670         
671         void Thingy::runThread()
672         {
673             for (;;) {
674                 Work work;
675                 {
676                     LockHolder locker(m_lock);
677                     while (!hasWork())
678                         m_cond.wait(m_lock);
679                     work = takeWork();
680                 }
681                 doWork(work);
682             }
683         }
684         
685         If you look at ParallelHelperPool (the GC's threads) and DFG::Worklist (some of the JIT's
686         threads), you will see this pattern.
687         
688         This change adds a new kind of thread, called AutomaticThread, that lets you write threads to
689         this pattern while getting automatic thread shutdown for free: instead of just waiting on a
690         condition variable, AutomaticThread will have a timeout that causes the thread to die. The
691         condition variable associated with AutomaticThread, called AutomaticThreadCondition, is smart
692         enough to restart any threads that have decided to stop due to inactivity. The inactivity
693         threshold is current just 1 second.
694         
695         In this patch I only adopt AutomaticThread for ParallelHelperPool. I plan to adopt it in more
696         places soon.
697
698         * WTF.xcodeproj/project.pbxproj:
699         * wtf/AutomaticThread.cpp: Added.
700         (WTF::AutomaticThreadCondition::create):
701         (WTF::AutomaticThreadCondition::AutomaticThreadCondition):
702         (WTF::AutomaticThreadCondition::~AutomaticThreadCondition):
703         (WTF::AutomaticThreadCondition::notifyAll):
704         (WTF::AutomaticThreadCondition::add):
705         (WTF::AutomaticThreadCondition::remove):
706         (WTF::AutomaticThreadCondition::contains):
707         (WTF::AutomaticThread::AutomaticThread):
708         (WTF::AutomaticThread::~AutomaticThread):
709         (WTF::AutomaticThread::join):
710         (WTF::AutomaticThread::start):
711         * wtf/AutomaticThread.h: Added.
712         * wtf/CMakeLists.txt:
713         * wtf/ParallelHelperPool.cpp:
714         (WTF::ParallelHelperClient::ParallelHelperClient):
715         (WTF::ParallelHelperClient::~ParallelHelperClient):
716         (WTF::ParallelHelperClient::setTask):
717         (WTF::ParallelHelperClient::finish):
718         (WTF::ParallelHelperClient::doSomeHelping):
719         (WTF::ParallelHelperClient::runTask):
720         (WTF::ParallelHelperPool::ParallelHelperPool):
721         (WTF::ParallelHelperPool::~ParallelHelperPool):
722         (WTF::ParallelHelperPool::ensureThreads):
723         (WTF::ParallelHelperPool::doSomeHelping):
724         (WTF::ParallelHelperPool::Thread::Thread):
725         (WTF::ParallelHelperPool::didMakeWorkAvailable):
726         (WTF::ParallelHelperPool::helperThreadBody): Deleted.
727         (WTF::ParallelHelperPool::waitForClientWithTask): Deleted.
728         * wtf/ParallelHelperPool.h:
729
730 2016-10-18  Said Abou-Hallawa  <sabouhallawa@apple.com>
731
732         SVGCSSParser: m_implicitShorthand value is not reset after adding the shorthand property
733         https://bugs.webkit.org/show_bug.cgi?id=116470
734
735         Reviewed by Simon Fraser.
736
737         * wtf/TemporaryChange.h:
738         (WTF::TemporaryChange::TemporaryChange):
739         Add a new constructor to make TemporaryChange work as a restorer. The
740         temporary change will happen after we construct the object.
741
742 2016-10-17  Simon Fraser  <simon.fraser@apple.com>
743
744         Implement DOMRect/DOMRectReadOnly
745         https://bugs.webkit.org/show_bug.cgi?id=163464
746
747         Reviewed by Darin Adler.
748         
749         Implement min()/max() in a way that follows Math.min/Math.max, which return
750         NaN if either argument is NaN.
751
752         * wtf/MathExtras.h:
753         (WTF::nanPropagatingMin):
754         (WTF::nanPropagatingMax):
755
756 2016-10-15  Sam Weinig  <sam@webkit.org>
757
758         MessageEvent's source property should be a (DOMWindow or MessagePort)? rather than a EventTarget?
759         https://bugs.webkit.org/show_bug.cgi?id=163475
760
761         Reviewed by Simon Fraser.
762
763         * wtf/Variant.h:
764         Add missing return statement that was tripping up some compilers.
765
766 2016-10-12  Ryan Haddad  <ryanhaddad@apple.com>
767
768         Unreviewed, rolling out r207225.
769
770         This change causes debug tests to exit early with crashes.
771
772         Reverted changeset:
773
774         "Optional's move-constructor and move-assignment operator
775         don't disengage the value being moved from"
776         https://bugs.webkit.org/show_bug.cgi?id=163309
777         http://trac.webkit.org/changeset/207225
778
779 2016-10-11  Sam Weinig  <sam@webkit.org>
780
781         Optional's move-constructor and move-assignment operator don't disengage the value being moved from
782         https://bugs.webkit.org/show_bug.cgi?id=163309
783
784         Reviewed by Anders Carlsson.
785
786         * wtf/Optional.h:
787         (WTF::Optional::Optional):
788         (WTF::Optional::operator=):
789         Disengage 'other' on move-construction and move-assignment.
790
791 2016-10-08  Filip Pizlo  <fpizlo@apple.com>
792
793         MarkedBlock should know what objects are live during marking
794         https://bugs.webkit.org/show_bug.cgi?id=162309
795
796         Reviewed by Geoffrey Garen.
797         
798         This removes the atomicity mode, because it's not really used: it only affects the
799         concurrentBlah methods, but their only users turn on atomicity. This was useful because
800         previously, some binary Bitmap methods (like merge(const Bitmap&)) couldn't be used
801         effectively in the GC because some of the GC's bitmaps set the atomic mode and some didn't.
802         Removing this useless mode is the best solution.
803         
804         Also added some new binary Bitmap methods: mergeAndClear(Bitmap& other) and
805         setAndClear(Bitmap& other). They perform their action on 'this' (either merge or set,
806         respectively) while also clearing the contents of 'other'. This is great for one of the GC
807         hot paths.
808
809         * wtf/Bitmap.h:
810         (WTF::WordType>::Bitmap):
811         (WTF::WordType>::get):
812         (WTF::WordType>::set):
813         (WTF::WordType>::testAndSet):
814         (WTF::WordType>::testAndClear):
815         (WTF::WordType>::concurrentTestAndSet):
816         (WTF::WordType>::concurrentTestAndClear):
817         (WTF::WordType>::clear):
818         (WTF::WordType>::clearAll):
819         (WTF::WordType>::nextPossiblyUnset):
820         (WTF::WordType>::findRunOfZeros):
821         (WTF::WordType>::count):
822         (WTF::WordType>::isEmpty):
823         (WTF::WordType>::isFull):
824         (WTF::WordType>::merge):
825         (WTF::WordType>::filter):
826         (WTF::WordType>::exclude):
827         (WTF::WordType>::forEachSetBit):
828         (WTF::WordType>::mergeAndClear):
829         (WTF::WordType>::setAndClear):
830         (WTF::=):
831         (WTF::WordType>::hash):
832
833 2016-10-11  Said Abou-Hallawa  <sabouhallawa@apple.com>
834
835         Add SynchronizedFixedQueue class
836         https://bugs.webkit.org/show_bug.cgi?id=162478
837
838         Reviewed by Geoffrey Garen.
839
840         This class represents a simple producer/consumer worker. It facilitates
841         synchronizing enqueuing to and dequeuing from a fixed size-queue. It uses
842         a single lock and a single condition to synchronize all its members among
843         the working threads. This means a single thread is active at any time and
844         and the other threads are blocked waiting for the lock to be released. Or
845         they are sleeping waiting for the condition to be satisfied.
846
847         * WTF.xcodeproj/project.pbxproj:
848         * wtf/SynchronizedFixedQueue.h: Added.
849         (WTF::SynchronizedFixedQueue::SynchronizedFixedQueue):
850         (WTF::SynchronizedFixedQueue::open): Restore the queue to its original state.
851         (WTF::SynchronizedFixedQueue::close): Wake all the sleeping threads with a closing state.
852         (WTF::SynchronizedFixedQueue::isOpen): Does the queue accept new items?
853         (WTF::SynchronizedFixedQueue::enqueue): Enqueue an item into the queue.
854         (WTF::SynchronizedFixedQueue::dequeue): Dequeue an item form the queue.
855
856 2016-10-11  Alex Christensen  <achristensen@webkit.org>
857
858         Remove dead networking code
859         https://bugs.webkit.org/show_bug.cgi?id=163263
860
861         Reviewed by Daniel Bates.
862
863         * wtf/Platform.h:
864         * wtf/SchedulePair.h:
865         * wtf/SchedulePairMac.mm:
866
867 2016-10-10  Zan Dobersek  <zdobersek@igalia.com>
868
869         Add ENABLE_ENCRYPTED_MEDIA configuration option
870         https://bugs.webkit.org/show_bug.cgi?id=163219
871
872         Reviewed by Darin Adler.
873
874         * wtf/FeatureDefines.h:
875         If undefined, define the ENABLE_ENCRYPTED_MEDIA option to 0.
876
877 2016-10-10  Yusuke Suzuki  <utatane.tea@gmail.com>
878
879         [DOMJIT] Implement Node accessors in DOMJIT
880         https://bugs.webkit.org/show_bug.cgi?id=163005
881
882         Reviewed by Filip Pizlo.
883
884         Add CAST_OFFSET. It is not necessary for JSCell thingy
885         since we don't use virtual member functions. However, it
886         is not true for WebCore DOM wrapped objects.
887
888         * wtf/StdLibExtras.h:
889
890 2016-10-07  Chris Dumez  <cdumez@apple.com>
891
892         window.navigator.language incorrectly returns all lowercase string
893         https://bugs.webkit.org/show_bug.cgi?id=163096
894
895         Reviewed by Darin Adler.
896
897         Update platformUserPreferredLanguages() so that it no longer lowercases
898         the string it returns. On Mac, we rely on CFLocale which returns
899         BCP-47 language tags as per:
900         - https://developer.apple.com/reference/corefoundation/1666963-cflocale?language=objc
901
902         * wtf/PlatformUserPreferredLanguagesMac.mm:
903         (WTF::httpStyleLanguageCode):
904         * wtf/PlatformUserPreferredLanguagesUnix.cpp:
905         (WTF::platformLanguage):
906
907 2016-10-06  Brent Fulgham  <bfulgham@apple.com>
908
909         [Win][Direct2D] Add Direct2D CMake rules
910         https://bugs.webkit.org/show_bug.cgi?id=162925
911
912         Reviewed by Brent Fulgham.
913
914         * wtf/Platform.h: Don't USE(CA) or USE(CG) if building
915         with Direct2D.
916
917 2016-10-05  Yusuke Suzuki  <utatane.tea@gmail.com>
918
919         [DOMJIT] Add initial CheckDOM and CallDOM implementations
920         https://bugs.webkit.org/show_bug.cgi?id=162941
921
922         Reviewed by Filip Pizlo.
923
924         * wtf/Box.h:
925         (WTF::Box::Box):
926
927 2016-10-05  Zan Dobersek  <zdobersek@igalia.com>
928
929         Rename ENABLE_ENCRYPTED_MEDIA_V2 to ENABLE_LEGACY_ENCRYPTED_MEDIA
930         https://bugs.webkit.org/show_bug.cgi?id=162903
931
932         Reviewed by Alex Christensen.
933
934         Rename build guards for the remaining implementation of the legacy EME API
935         to ENABLE_LEGACY_ENCRYPTED_MEDIA. This will allow for the future implementation
936         of the near-finished API to be guarded with the simple ENABLE_ENCRYPTED_MEDIA guards.
937
938         * wtf/FeatureDefines.h:
939
940 2016-10-04  Saam Barati  <sbarati@apple.com>
941
942         String.prototype.toLowerCase should be a DFG/FTL intrinsic
943         https://bugs.webkit.org/show_bug.cgi?id=162887
944
945         Reviewed by Filip Pizlo and Yusuke Suzuki.
946
947         This patch exposes a new StringImpl function called convertToLowercaseWithoutLocaleStartingAtFailingIndex8Bit
948         which extracts slow path for the 8-bit part of convertToLowercaseWithoutLocale
949         into a helper function. I decided to extract this into its own function because
950         it may be the case that JSCs JITs will want to continue the operation
951         after it has already ensured that part of an 8-bit string is lower case.
952
953         * wtf/text/StringImpl.cpp:
954         (WTF::StringImpl::convertToLowercaseWithoutLocale):
955         (WTF::StringImpl::convertToLowercaseWithoutLocaleStartingAtFailingIndex8Bit):
956         * wtf/text/StringImpl.h:
957         * wtf/text/WTFString.cpp:
958         (WTF::String::convertToLowercaseWithoutLocaleStartingAtFailingIndex8Bit):
959         * wtf/text/WTFString.h:
960
961 2016-10-04  Chris Dumez  <cdumez@apple.com>
962
963         Implement KeyboardEvent.code from the UI Event spec
964         https://bugs.webkit.org/show_bug.cgi?id=149584
965
966         Reviewed by Darin Adler.
967
968         Add build time flag to toggle support for the code attribute on
969         KeyboardEvent and only enable it on Mac for now, given that the
970         implementation is missing on other platforms.
971
972         * wtf/FeatureDefines.h:
973
974 2016-10-03  Chris Dumez  <cdumez@apple.com>
975
976         Add support for KeyboardEvent.key attribute
977         https://bugs.webkit.org/show_bug.cgi?id=36267
978
979         Reviewed by Darin Adler.
980
981         Add compile time flag for the key attribute on KeyboardEvent and enable
982         it on Cocoa only.
983
984         * wtf/FeatureDefines.h:
985
986 2016-09-29  Sam Weinig  <sam@webkit.org>
987
988         Add initial support for IDL union conversion
989         https://bugs.webkit.org/show_bug.cgi?id=161576
990
991         Reviewed by Chris Dumez.
992
993         * WTF.xcodeproj/project.pbxproj:
994         * wtf/CMakeLists.txt:
995         Add Brigand.h
996
997         * wtf/Brigand.h: Added.
998         Import a standalone copy of Edouard Alligand and Joel Falcou's 
999         Brigand library for help with for help with list based meta programming
1000
1001         * wtf/StdLibExtras.h:
1002         Add a new three new type traits, IsTemplate, IsBaseOfTemplate and RemoveCVAndReference.
1003         - IsTemplate acts like std::is_class, but works with a generic base.
1004         - IsBaseOfTemplate acts like std::is_base_of, but works with a generic base.
1005         - RemoveCVAndReference combines std::remove_cv and std::remove_reference.
1006
1007 2016-09-30  Filip Pizlo  <fpizlo@apple.com>
1008
1009         B3::moveConstants should be able to edit code to minimize the number of constants
1010         https://bugs.webkit.org/show_bug.cgi?id=162764
1011
1012         Reviewed by Saam Barati.
1013         
1014         I thought it would be a good idea to document the fact that dominator traversal happens in a
1015         particular order for a reason.
1016
1017         * wtf/Dominators.h:
1018
1019 2016-09-29  Filip Pizlo  <fpizlo@apple.com>
1020
1021         Air should have a way of expressing additional instruction flags
1022         https://bugs.webkit.org/show_bug.cgi?id=162699
1023
1024         Reviewed by Mark Lam.
1025
1026         * wtf/CommaPrinter.h:
1027         (WTF::CommaPrinter::CommaPrinter):
1028         (WTF::CommaPrinter::dump):
1029         (WTF::CommaPrinter::didPrint):
1030
1031 2016-09-30  Youenn Fablet  <youenn@apple.com>
1032
1033         Add a way to go from a RefPtr<T> to Ref<const T>
1034         https://bugs.webkit.org/show_bug.cgi?id=162683
1035
1036         Reviewed by Alex Christensen.
1037
1038         * wtf/RefPtr.h:
1039         (WTF::RefPtr::releaseConstNonNull): Added.
1040
1041 2016-09-29  Mark Lam  <mark.lam@apple.com>
1042
1043         Re-enable StringView life-cycle checking.
1044         https://bugs.webkit.org/show_bug.cgi?id=160384
1045         <rdar://problem/28479434>
1046
1047         Reviewed by Saam Barati.
1048
1049         Re-landing after slow running tests have been resolved.
1050
1051         * wtf/text/StringView.h:
1052
1053 2016-09-29  Commit Queue  <commit-queue@webkit.org>
1054
1055         Unreviewed, rolling out r206563.
1056         https://bugs.webkit.org/show_bug.cgi?id=162732
1057
1058         Caused stress/op_*.js.ftl-no-cjit tests to time out (Requested
1059         by ryanhaddad on #webkit).
1060
1061         Reverted changeset:
1062
1063         "Re-enable StringView life-cycle checking."
1064         https://bugs.webkit.org/show_bug.cgi?id=160384
1065         http://trac.webkit.org/changeset/206563
1066
1067 2016-09-29  Fujii Hironori  <Hironori.Fujii@sony.com>
1068
1069         Clang 3.9 reports a compilation warning about ENABLE_EXCEPTION_SCOPE_VERIFICATION
1070         https://bugs.webkit.org/show_bug.cgi?id=162718
1071
1072         Reviewed by Alex Christensen.
1073
1074         Clang 3.9 reports a following compilation warning:
1075           Source/JavaScriptCore/runtime/VM.h:656:5: warning: macro expansion producing 'defined' has undefined behavior [-Wexpansion-to-defined]
1076
1077         * wtf/Platform.h: Changed the definition of ENABLE_EXCEPTION_SCOPE_VERIFICATION not to use 'defined'.
1078
1079 2016-09-28  Mark Lam  <mark.lam@apple.com>
1080
1081         Re-enable StringView life-cycle checking.
1082         https://bugs.webkit.org/show_bug.cgi?id=160384
1083         <rdar://problem/28479434>
1084
1085         Reviewed by Saam Barati.
1086
1087         * wtf/text/StringView.h:
1088
1089 2016-09-28  Filip Pizlo  <fpizlo@apple.com>
1090
1091         The write barrier should be down with TSO
1092         https://bugs.webkit.org/show_bug.cgi?id=162316
1093
1094         Reviewed by Geoffrey Garen.
1095         
1096         Added clearRange(), which quickly clears a range of bits. This turned out to be useful for
1097         a DFG optimization pass.
1098
1099         * wtf/FastBitVector.cpp:
1100         (WTF::FastBitVector::clearRange):
1101         * wtf/FastBitVector.h:
1102
1103 2016-09-28  Mark Lam  <mark.lam@apple.com>
1104
1105         Fix race condition in StringView's UnderlyingString lifecycle management.
1106         https://bugs.webkit.org/show_bug.cgi?id=162702
1107
1108         Reviewed by Geoffrey Garen.
1109
1110         There 2 relevant functions at play:
1111
1112         void StringView::setUnderlyingString(const StringImpl* string)
1113         {
1114             UnderlyingString* underlyingString;
1115             if (!string)
1116                 underlyingString = nullptr;
1117             else {
1118                 std::lock_guard<StaticLock> lock(underlyingStringsMutex);
1119                 auto result = underlyingStrings().add(string, nullptr);
1120                 if (result.isNewEntry)
1121                     result.iterator->value = new UnderlyingString(*string);
1122                 else
1123                     ++result.iterator->value->refCount;
1124                 underlyingString = result.iterator->value; // Point P2.
1125             }
1126             adoptUnderlyingString(underlyingString); // Point P5.
1127         }
1128
1129         ... and ...
1130
1131         void StringView::adoptUnderlyingString(UnderlyingString* underlyingString)
1132         {
1133             if (m_underlyingString) {
1134                 // Point P0.
1135                 if (!--m_underlyingString->refCount) {
1136                     if (m_underlyingString->isValid) { // Point P1.
1137                         std::lock_guard<StaticLock> lock(underlyingStringsMutex);
1138                         underlyingStrings().remove(&m_underlyingString->string); // Point P3.
1139                     }
1140                     delete m_underlyingString; // Point P4.
1141                 }
1142             }
1143             m_underlyingString = underlyingString;
1144         }
1145
1146         Imagine the following scenario:
1147
1148         1. Thread T1 has been using an UnderlyingString U1, and is now done with it.
1149            T1 runs up to point P1 in adoptUnderlyingString(), and is blocked waiting for
1150            the underlyingStringsMutex (which is currently being held by Thread T2).
1151         2. Context switch to Thread T2.
1152            T2 wants to use UnderlyingString U1, and runs up to point P2 in setUnderlyingString()
1153            and releases the underlyingStringsMutex.
1154            Note: T2 thinks it has successfully refCounted U1, and therefore U1 is safe to use.
1155         3. Context switch to Thread T1.
1156            T1 acquires the underlyingStringsMutex, and proceeds to remove it from the
1157            underlyingStrings() map (see Point P3).  It thinks it has successfully done so
1158            and proceeds to delete U1 (see Point P4).
1159         4. Context switch to Thread T2.
1160            T2 proceeds to use U1 (see Point P5 in setUnderlyingString()).
1161            Note: U1 has already been freed.  This is a use after free.
1162
1163         The fix is to acquire the underlyingStringsMutex at Point P0 in adoptUnderlyingString()
1164         instead of after P1.  This ensures that the decrementing of the UnderlyingString
1165         refCount and its removal from the underlyingStrings() map is done as an atomic unit.
1166
1167         Note: If you look in StringView.cpp, you see another setUnderlyingString() which
1168         takes a StringView otherString.  This version of setUnderlyingString() can only
1169         be called from within the same thread that created the other StringView.  As a
1170         result, here, we are guaranteed that the UnderlyingString refCount is never zero,
1171         and there's no other threat of another thread trying to delete the UnderlyingString
1172         while we adopt it.  Hence, we don't need to acquire the underlyingStringsMutex
1173         here.
1174
1175         This race condition was found when running layout tests fetch/fetch-worker-crash.html
1176         and storage/indexeddb/modern/opendatabase-versions.html when CHECK_STRINGVIEW_LIFETIME
1177         is enabled.  This issue resulted in those tests crashing due to a use-after-free.
1178
1179         * wtf/text/StringView.cpp:
1180         (WTF::StringView::adoptUnderlyingString):
1181         (WTF::StringView::setUnderlyingString):
1182
1183 2016-09-28  Brent Fulgham  <bfulgham@apple.com>
1184
1185         Correct 'safeCast' implementation
1186         https://bugs.webkit.org/show_bug.cgi?id=162679
1187         <rdar://problem/28518189>
1188
1189         Reviewed by Zalan Bujtas.
1190
1191         * wtf/StdLibExtras.h:
1192         (WTF::safeCast): Use a RELEASE_ASSERT.
1193
1194 2016-09-27  Don Olmstead  <don.olmstead@am.sony.com>
1195
1196         [CMake] Add HAVE_LOCALTIME_R definition
1197         https://bugs.webkit.org/show_bug.cgi?id=162636
1198
1199         Reviewed by Alex Christensen.
1200
1201         * wtf/DateMath.cpp:
1202         (WTF::getLocalTime):
1203         * wtf/GregorianDateTime.cpp:
1204         (WTF::GregorianDateTime::setToCurrentLocalTime):
1205         * wtf/Platform.h:
1206
1207 2016-09-27  JF Bastien  <jfbastien@apple.com>
1208
1209         Speed up Heap::isMarkedConcurrently
1210         https://bugs.webkit.org/show_bug.cgi?id=162095
1211
1212         Reviewed by Filip Pizlo.
1213
1214         Heap::isMarkedConcurrently had a load-load fence which is expensive on weak memory ISAs such as ARM.
1215
1216         This patch is fairly perf-neutral overall, but the GC's instrumentation reports:
1217           GC:Eden is 93% average runtime after change
1218           GC:Full is 76% average runtime after change
1219
1220         The fence was there because:
1221          1. If the read of m_markingVersion in MarkedBlock::areMarksStale isn't what's expected then;
1222          2. The read of m_marks in MarkedBlock::isMarked needs to observe the value that was stored *before* m_markingVersion was stored.
1223
1224         This ordering isn't guaranteed on ARM, which has a weak memory model.
1225
1226         There are 3 ways to guarantee this ordering:
1227          A. Use a barrier instruction.
1228          B. Use a load-acquire (new in ARMv8).
1229          C. use ARM's address dependency rule, which C++ calls memory_order_consume.
1230
1231         In general:
1232          A. is slow but orders all of memory in an intuitive manner.
1233          B. is faster-ish and has the same property-ish.
1234          C. should be faster still, but *only orders dependent loads*. This last part is critical! Consume isn't an all-out replacement for acquire (acquire is rather a superset of consume).
1235
1236         ARM explains the address dependency rule in their document "barrier litmus tests and cookbook":
1237
1238         > *Resolving by the use of barriers and address dependency*
1239         >
1240         > There is a rule within the ARM architecture that:
1241         > Where the value returned by a read is used to compute the virtual address of a subsequent read or write (this is known as an address dependency), then these two memory accesses will be observed in program order. An address dependency exists even if the value read by the first read has no effect in changing the virtual address (as might be the case if the value returned is masked off before it is used, or if it had no effect on changing a predicted address value).
1242         > This restriction applies only when the data value returned from one read is used as a data value to calculate the address of a subsequent read or write. This does not apply if the data value returned from one read is used to determine the condition code flags, and the values of the flags are used for condition code evaluation to determine the address of a subsequent reads, either through conditional execution or the evaluation of a branch. This is known as a control dependency.
1243         > Where both a control and address dependency exist, the ordering behaviour is consistent with the address dependency.
1244
1245         C++'s memory_order_consume is unfortunately unimplemented by C++ compilers, and maybe unimplementable as spec'd. I'm working with interested folks in the committee to fix this situation: http://wg21.link/p0190r2
1246
1247         * wtf/Atomics.h:
1248         (WTF::zeroWithConsumeDependency): a 0 which carries a dependency
1249         (WTF::consumeLoad): pixie magic
1250
1251 2016-09-27  JF Bastien  <jfbastien@apple.com>
1252
1253         Atomics.h on Windows: remove seq_cst hack
1254         https://bugs.webkit.org/show_bug.cgi?id=162022
1255
1256         Reviewed by Mark Lam.
1257
1258         No need to force access to seq_cst, always inlining fixes the MSVC warning.
1259
1260         * wtf/Atomics.h:
1261         (WTF::Atomic::compareExchangeWeak): remove seq_cst hack
1262         (WTF::Atomic::compareExchangeStrong): remove seq_cst hack
1263         (WTF::Atomic::exchangeAndAdd): remove seq_cst hack
1264         (WTF::Atomic::exchange): remove seq_cst hack
1265
1266 2016-09-27  Don Olmstead  <don.olmstead@am.sony.com>
1267
1268         [CMake] Use CMake to determine HAVE_* defines
1269         https://bugs.webkit.org/show_bug.cgi?id=162368
1270
1271         Reviewed by Alex Christensen.
1272
1273         * wtf/Platform.h:
1274
1275 2016-09-20  Anders Carlsson  <andersca@apple.com>
1276
1277         PlatformEvent::m_modifiers should be an OptionSet
1278         https://bugs.webkit.org/show_bug.cgi?id=162326
1279
1280         Reviewed by Daniel Bates.
1281
1282         * wtf/OptionSet.h:
1283         (WTF::OptionSet::operator!=):
1284         (WTF::OptionSet::operator-):
1285
1286 2016-09-27  Jer Noble  <jer.noble@apple.com>
1287
1288         Remove deprecated ENCRYPTED_MEDIA implementation.
1289         https://bugs.webkit.org/show_bug.cgi?id=161010
1290
1291         Reviewed by Eric Carlson.
1292
1293         Remove ENABLE_ENCRYPTED_MEDIA.
1294
1295         * wtf/FeatureDefines.h:
1296
1297 2016-09-27  Youenn Fablet  <youenn@apple.com>
1298
1299         [Fetch API] Use Ref<const T> in FetchBody::m_data variant
1300         https://bugs.webkit.org/show_bug.cgi?id=162599
1301
1302         Reviewed by Alex Christensen.
1303
1304         Enabling to use DeferrableRefCounted<const T> by making m_refCount mutable.
1305
1306         * wtf/DeferrableRefCounted.h:
1307         (WTF::DeferrableRefCountedBase::ref):
1308         (WTF::DeferrableRefCountedBase::derefBase):
1309         (WTF::DeferrableRefCounted::deref):
1310
1311 2016-09-26  Daniel Bates  <dabates@apple.com>
1312
1313         Rename IOS_TEXT_AUTOSIZING to TEXT_AUTOSIZING
1314         https://bugs.webkit.org/show_bug.cgi?id=162365
1315
1316         Reviewed by Simon Fraser.
1317
1318         * wtf/FeatureDefines.h:
1319
1320 2016-09-26  Benjamin Poulain  <benjamin@webkit.org>
1321
1322         [JSC] Shrink the Math inline caches some more
1323         https://bugs.webkit.org/show_bug.cgi?id=162485
1324
1325         Reviewed by Saam Barati.
1326
1327         * wtf/Bag.h:
1328         Don't copy the arguments before initializing the nodes.
1329
1330 2016-09-26  Michael Catanzaro  <mcatanzaro@igalia.com>
1331
1332         std::unique_ptr deleter functions should not check if pointer is null
1333         https://bugs.webkit.org/show_bug.cgi?id=162558
1334
1335         Reviewed by Alex Christensen.
1336
1337         std::unique_ptr already does this before calling the deleter.
1338
1339         * wtf/efl/UniquePtrEfl.h:
1340         * wtf/glib/GUniquePtr.h:
1341
1342 == Rolled over to ChangeLog-2016-09-26 ==