Remove DeprecatedOptional
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-04-25  Alex Christensen  <achristensen@webkit.org>
2
3         Remove DeprecatedOptional
4         https://bugs.webkit.org/show_bug.cgi?id=197161
5
6         Reviewed by Darin Adler.
7
8         We need to keep a symbol exported from JavaScriptCore for binary compatibility with iOS12.
9         We need this symbol to be in a file that doesn't include anything because libcxx's implementation of
10         std::optional is actually std::__1::optional, which has a different mangled name.  This change will
11         prevent protocol errors from being reported if you are running the iOS12 simulator with a custom build of WebKit
12         and using the web inspector with it, but it's necessary to allow us to start using C++17 in WebKit.
13
14         * JavaScriptCore.xcodeproj/project.pbxproj:
15         * inspector/InspectorBackendDispatcher.cpp:
16         * inspector/InspectorBackendDispatcher.h:
17         * inspector/InspectorBackendDispatcherCompatibility.cpp: Added.
18         (Inspector::BackendDispatcher::reportProtocolError):
19         * inspector/InspectorBackendDispatcherCompatibility.h: Added.
20
21 2019-04-24  Saam Barati  <sbarati@apple.com>
22
23         Add SPI callbacks for before and after module execution
24         https://bugs.webkit.org/show_bug.cgi?id=197244
25         <rdar://problem/50180511>
26
27         Reviewed by Yusuke Suzuki.
28
29         This is helpful for clients that want to profile execution of modules
30         in some way. E.g, if they want to time module execution time.
31
32         * API/JSAPIGlobalObject.h:
33         * API/JSAPIGlobalObject.mm:
34         (JSC::JSAPIGlobalObject::moduleLoaderEvaluate):
35         * API/JSContextPrivate.h:
36         * API/tests/testapi.mm:
37         (+[JSContextFetchDelegate contextWithBlockForFetch:]):
38         (-[JSContextFetchDelegate willEvaluateModule:]):
39         (-[JSContextFetchDelegate didEvaluateModule:]):
40         (testFetch):
41         (testFetchWithTwoCycle):
42         (testFetchWithThreeCycle):
43         (testLoaderResolvesAbsoluteScriptURL):
44         (testLoaderRejectsNilScriptURL):
45         * runtime/JSModuleLoader.cpp:
46         (JSC::JSModuleLoader::evaluate):
47         (JSC::JSModuleLoader::evaluateNonVirtual):
48         * runtime/JSModuleLoader.h:
49
50 2019-04-23  Yusuke Suzuki  <ysuzuki@apple.com>
51
52         [JSC] Shrink DFG::MinifiedNode
53         https://bugs.webkit.org/show_bug.cgi?id=197224
54
55         Reviewed by Filip Pizlo.
56
57         Since it is kept alive with compiled DFG code, we should shrink it to save memory.
58         If it is effective, we should consider minimizing these OSR exit data more aggressively.
59
60         * dfg/DFGMinifiedNode.h:
61
62 2019-04-23  Saam Barati  <sbarati@apple.com>
63
64         LICM incorrectly assumes it'll never insert a node which provably OSR exits
65         https://bugs.webkit.org/show_bug.cgi?id=196721
66         <rdar://problem/49556479> 
67
68         Reviewed by Filip Pizlo.
69
70         Previously, we assumed LICM could never hoist code that caused us
71         to provably OSR exit. This is a bad assumption, as we may very well
72         hoist such code. Obviously hoisting such code is not ideal. We shouldn't
73         hoist something we provably know will OSR exit. However, this is super rare,
74         and the phase is written in such a way where it's easier to gracefully
75         handle this case than to prevent us from hoisting such code.
76         
77         If we wanted to ensure we never hoisted code that would provably exit, we'd
78         have to teach the phase to know when it inserted code that provably exits. I
79         saw two ways to do that:
80         1: Save and restore the AI state before actually hoisting.
81         2: Write an analysis that can determine if such a node would exit.
82         
83         (1) is bad because it costs in memory and compile time. (2) will inevitably
84         have bugs as running into this condition is rare.
85         
86         So instead of (1) or (2), I opted to have LICM gracefully handle when
87         it causes a provable exit. When we encounter this, we mark all blocks
88         in the loop as !cfaHasVisited and !cfaDidFinish.
89
90         * dfg/DFGLICMPhase.cpp:
91         (JSC::DFG::LICMPhase::attemptHoist):
92
93 2019-04-23  Yusuke Suzuki  <ysuzuki@apple.com>
94
95         [JSC] Use node index as DFG::MinifiedID
96         https://bugs.webkit.org/show_bug.cgi?id=197186
97
98         Reviewed by Saam Barati.
99
100         DFG Nodes can be identified with index if the graph is given. We should use unsigned index as a DFG::MinifiedID's underlying
101         source instead of Node* to reduce the size of VariableEvent from 16 to 12. Vector<VariableEvent> is the main data in DFG's OSR
102         tracking. It is kept after DFG compilation is done to make OSR work. We saw that this is allocated with large size in GMail.
103
104         * JavaScriptCore.xcodeproj/project.pbxproj:
105         * bytecode/DataFormat.h:
106         * bytecode/ValueRecovery.h:
107         * dfg/DFGGenerationInfo.h:
108         * dfg/DFGMinifiedID.h:
109         (JSC::DFG::MinifiedID::MinifiedID):
110         (JSC::DFG::MinifiedID::operator! const):
111         (JSC::DFG::MinifiedID::operator== const):
112         (JSC::DFG::MinifiedID::operator!= const):
113         (JSC::DFG::MinifiedID::operator< const):
114         (JSC::DFG::MinifiedID::operator> const):
115         (JSC::DFG::MinifiedID::operator<= const):
116         (JSC::DFG::MinifiedID::operator>= const):
117         (JSC::DFG::MinifiedID::hash const):
118         (JSC::DFG::MinifiedID::dump const):
119         (JSC::DFG::MinifiedID::isHashTableDeletedValue const):
120         (JSC::DFG::MinifiedID::fromBits):
121         (JSC::DFG::MinifiedID::bits const):
122         (JSC::DFG::MinifiedID::invalidIndex):
123         (JSC::DFG::MinifiedID::otherInvalidIndex):
124         (JSC::DFG::MinifiedID::node const): Deleted.
125         (JSC::DFG::MinifiedID::invalidID): Deleted.
126         (JSC::DFG::MinifiedID::otherInvalidID): Deleted.
127         * dfg/DFGMinifiedIDInlines.h: Copied from Source/JavaScriptCore/dfg/DFGMinifiedNode.cpp.
128         (JSC::DFG::MinifiedID::MinifiedID):
129         * dfg/DFGMinifiedNode.cpp:
130         * dfg/DFGValueSource.h:
131         (JSC::DFG::ValueSource::ValueSource):
132         * dfg/DFGVariableEvent.h:
133         (JSC::DFG::VariableEvent::dataFormat const):
134
135 2019-04-23  Keith Rollin  <krollin@apple.com>
136
137         Add Xcode version check for Header post-processing scripts
138         https://bugs.webkit.org/show_bug.cgi?id=197116
139         <rdar://problem/50058968>
140
141         Reviewed by Brent Fulgham.
142
143         There are several places in our Xcode projects that post-process
144         header files after they've been exported. Because of XCBuild, we're
145         moving to a model where the post-processing is performed at the same
146         time the header files are exported, rather than as a distinct
147         post-processing step. This patch disables the distinct step when the
148         inline processing is available.
149
150         In practice, this means prefixing appropriate post-processing Custom
151         Build phases with:
152
153         if [ "${XCODE_VERSION_MAJOR}" -ge "1100" -a "${USE_NEW_BUILD_SYSTEM}" = "YES" ]; then
154             # In this configuration, post-processing is performed at the same time as copying in the postprocess-header-rule script, so there's no need for this separate step.
155             exit 0
156         fi
157
158         * JavaScriptCore.xcodeproj/project.pbxproj:
159
160 2019-04-23  Commit Queue  <commit-queue@webkit.org>
161
162         Unreviewed, rolling out r244558.
163         https://bugs.webkit.org/show_bug.cgi?id=197219
164
165         Causing crashes on iOS Sim Release and Debug (Requested by
166         ShawnRoberts on #webkit).
167
168         Reverted changeset:
169
170         "Remove DeprecatedOptional"
171         https://bugs.webkit.org/show_bug.cgi?id=197161
172         https://trac.webkit.org/changeset/244558
173
174 2019-04-23  Devin Rousso  <drousso@apple.com>
175
176         Web Inspector: Uncaught Exception: null is not an object (evaluating 'this.ownerDocument.frameIdentifier')
177         https://bugs.webkit.org/show_bug.cgi?id=196420
178         <rdar://problem/49444205>
179
180         Reviewed by Timothy Hatcher.
181
182         * inspector/protocol/DOM.json:
183         Modify the existing `frameId` to represent the owner frame of the node, rather than the
184         frame it holds (in the case of an `<iframe>`).
185
186 2019-04-23  Alex Christensen  <achristensen@webkit.org>
187
188         Remove DeprecatedOptional
189         https://bugs.webkit.org/show_bug.cgi?id=197161
190
191         Reviewed by Darin Adler.
192
193         * inspector/InspectorBackendDispatcher.cpp:
194         * inspector/InspectorBackendDispatcher.h:
195
196 2019-04-22  Yusuke Suzuki  <ysuzuki@apple.com>
197
198         [JSC] Use volatile load to populate backing page in MarkedBlock::Footer instead of using holdLock
199         https://bugs.webkit.org/show_bug.cgi?id=197152
200
201         Reviewed by Saam Barati.
202
203         Emit volatile load instead of using holdLock to populate backing page in MarkedBlock::Footer.
204
205         * heap/BlockDirectory.cpp:
206         (JSC::BlockDirectory::isPagedOut):
207         * heap/MarkedBlock.h:
208         (JSC::MarkedBlock::populatePage const):
209
210 2019-04-22  Yusuke Suzuki  <ysuzuki@apple.com>
211
212         [JSC] useJIT should subsume useRegExpJIT
213         https://bugs.webkit.org/show_bug.cgi?id=197153
214
215         Reviewed by Alex Christensen.
216
217         useJIT should subsume useRegExpJIT. We should immediately disable JIT feature if useJIT = false,
218         even if useRegExpJIT is true.
219
220         * dfg/DFGCapabilities.cpp:
221         (JSC::DFG::isSupported):
222         * runtime/Options.cpp:
223         (JSC::recomputeDependentOptions):
224         * runtime/RegExp.cpp:
225         (JSC::RegExp::compile):
226         (JSC::RegExp::compileMatchOnly):
227         * runtime/VM.cpp:
228         (JSC::enableAssembler):
229         (JSC::VM::canUseRegExpJIT): Deleted.
230         * runtime/VM.h:
231
232 2019-04-22  Basuke Suzuki  <basuke.suzuki@sony.com>
233
234         [PlayStation] Restructuring Remote Inspector classes to support multiple platform.
235         https://bugs.webkit.org/show_bug.cgi?id=197030
236
237         Reviewed by Don Olmstead.
238
239         Restructuring the PlayStation's RemoteInspector backend which uses native socket for the communication to be ready for WinCairo.
240
241         What we did is basically:
242         - Renamed `remote/playstation/` to `remote/socket/`. This directory is now platform independent implementation of socket backend. 
243         - Renamed `RemoteInspectorSocket` class to `RemoteInspectorSocketEndpoint`. This class is platform independent and core of the backend.
244         - Merged `RemoteInspectorSocket{Client|Server}` classes into `RemoteInspectorSocketEndpoint` class because the differences are little.
245         - Defined a new interface functions in `Inspector::Socket` (new) namespace.
246         - Moved POSIX socket implementation into `posix\RemoteInspectorSocketPOSIX.{h|cpp}`.
247
248         * PlatformPlayStation.cmake:
249         * inspector/remote/RemoteInspector.h:
250         * inspector/remote/playstation/RemoteInspectorSocketClient.h: Merged into RemoteInspectorSocketEndpoint.
251         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp: Merged into RemoteInspectorSocketEndpoint.
252         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp: Removed.
253         * inspector/remote/playstation/RemoteInspectorSocketServer.h: Merged into RemoteInspectorSocketEndpoint.
254         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp: Merged into RemoteInspectorSocketEndpoint.
255         * inspector/remote/socket/RemoteInspectorConnectionClient.cpp: Renamed from inspector\remote\playstation\RemoteInspectorConnectionClientPlayStation.cpp.
256         * inspector/remote/socket/RemoteInspectorConnectionClient.h: Renamed from inspector\remote\playstation\RemoteInspectorConnectionClient.h.
257         (Inspector::RemoteInspectorConnectionClient::didAccept):
258         * inspector/remote/socket/RemoteInspectorMessageParser.cpp: Renamed from inspector\remote\playstation\RemoteInspectorMessageParserPlayStation.cpp.
259         * inspector/remote/socket/RemoteInspectorMessageParser.h: Renamed from inspector\remote\playstation\RemoteInspectorMessageParser.h.
260         * inspector/remote/socket/RemoteInspectorServer.cpp: Renamed from inspector\remote\playstation\RemoteInspectorServerPlayStation.cpp.
261         (Inspector::RemoteInspectorServer::didAccept):
262         (Inspector::RemoteInspectorServer::start):
263         * inspector/remote/socket/RemoteInspectorServer.h: Renamed from inspector\remote\playstation\RemoteInspectorServer.h.
264         * inspector/remote/socket/RemoteInspectorSocket.cpp: Renamed from inspector\remote\playstation\RemoteInspectorPlayStation.cpp.
265         (Inspector::RemoteInspector::start):
266         * inspector/remote/socket/RemoteInspectorSocket.h: Copied from inspector\remote\playstation\RemoteInspectorSocket.h.
267         * inspector/remote/socket/RemoteInspectorSocketEndpoint.cpp: Added.
268         (Inspector::RemoteInspectorSocketEndpoint::RemoteInspectorSocketEndpoint):
269         (Inspector::RemoteInspectorSocketEndpoint::~RemoteInspectorSocketEndpoint):
270         (Inspector::RemoteInspectorSocketEndpoint::wakeupWorkerThread):
271         (Inspector::RemoteInspectorSocketEndpoint::connectInet):
272         (Inspector::RemoteInspectorSocketEndpoint::listenInet):
273         (Inspector::RemoteInspectorSocketEndpoint::isListening):
274         (Inspector::RemoteInspectorSocketEndpoint::workerThread):
275         (Inspector::RemoteInspectorSocketEndpoint::createClient):
276         (Inspector::RemoteInspectorSocketEndpoint::recvIfEnabled):
277         (Inspector::RemoteInspectorSocketEndpoint::sendIfEnabled):
278         (Inspector::RemoteInspectorSocketEndpoint::send):
279         (Inspector::RemoteInspectorSocketEndpoint::acceptInetSocketIfEnabled):
280         * inspector/remote/socket/RemoteInspectorSocketEndpoint.h: Renamed from inspector\remote\playstation\RemoteInspectorSocket.h.
281         * inspector/remote/socket/posix/RemoteInspectorSocketPOSIX.cpp: Added.
282         (Inspector::Socket::connect):
283         (Inspector::Socket::listen):
284         (Inspector::Socket::accept):
285         (Inspector::Socket::createPair):
286         (Inspector::Socket::setup):
287         (Inspector::Socket::isValid):
288         (Inspector::Socket::isListening):
289         (Inspector::Socket::read):
290         (Inspector::Socket::write):
291         (Inspector::Socket::close):
292         (Inspector::Socket::preparePolling):
293         (Inspector::Socket::poll):
294         (Inspector::Socket::isReadable):
295         (Inspector::Socket::isWritable):
296         (Inspector::Socket::markWaitingWritable):
297         (Inspector::Socket::clearWaitingWritable):
298
299 2019-04-20  Yusuke Suzuki  <ysuzuki@apple.com>
300
301         Unreviewed, suppress warnings in non Darwin environments
302
303         * jit/ExecutableAllocator.cpp:
304         (JSC::dumpJITMemory):
305
306 2019-04-19  Saam Barati  <sbarati@apple.com>
307
308         AbstractValue can represent more than int52
309         https://bugs.webkit.org/show_bug.cgi?id=197118
310         <rdar://problem/49969960>
311
312         Reviewed by Michael Saboff.
313
314         Let's analyze this control flow diamond:
315         
316         #0
317         branch #1, #2
318         
319         #1:
320         PutStack(JSValue, loc42)
321         Jump #3
322         
323         #2:
324         PutStack(Int52, loc42)
325         Jump #3
326         
327         #3:
328         ...
329         
330         Our abstract value for loc42 at the head of #3 will contain an abstract
331         value that us the union of Int52 with other things. Obviously in the
332         above program, a GetStack for loc42 would be inavlid, since it might
333         be loading either JSValue or Int52. However, the abstract interpreter
334         just tracks what the value could be, and it could be Int52 or JSValue.
335         
336         When I did the Int52 refactoring, I expected such things to never happen,
337         but it turns out it does. We should just allow for this instead of asserting
338         against it since it's valid IR to do the above.
339
340         * bytecode/SpeculatedType.cpp:
341         (JSC::dumpSpeculation):
342         * dfg/DFGAbstractValue.cpp:
343         (JSC::DFG::AbstractValue::checkConsistency const):
344         * dfg/DFGAbstractValue.h:
345         (JSC::DFG::AbstractValue::validateTypeAcceptingBoxedInt52 const):
346
347 2019-04-19  Tadeu Zagallo  <tzagallo@apple.com>
348
349         Add option to dump JIT memory
350         https://bugs.webkit.org/show_bug.cgi?id=197062
351         <rdar://problem/49744332>
352
353         Reviewed by Saam Barati.
354
355         Dump all writes into JIT memory to the specified file. The format is:
356         - 64-bit destination address for the write
357         - 64-bit size of the content written
358         - Copy of the data that was written to JIT memory
359
360         * assembler/LinkBuffer.cpp:
361         (JSC::LinkBuffer::copyCompactAndLinkCode):
362         * jit/ExecutableAllocator.cpp:
363         (JSC::dumpJITMemory):
364         * jit/ExecutableAllocator.h:
365         (JSC::performJITMemcpy):
366         * runtime/Options.h:
367
368 2019-04-19  Keith Rollin  <krollin@apple.com>
369
370         Add postprocess-header-rule scripts
371         https://bugs.webkit.org/show_bug.cgi?id=197072
372         <rdar://problem/50027299>
373
374         Reviewed by Brent Fulgham.
375
376         Several projects have post-processing build phases where exported
377         headers are tweaked after they've been copied. This post-processing is
378         performed via scripts called postprocess-headers.sh. For reasons
379         related to XCBuild, we are now transitioning to a build process where
380         the post-processing is performed at the same time as the
381         exporting/copying. To support this process, add similar scripts named
382         postprocess-header-rule, which are geared towards processing a single
383         file at a time rather than all exported files at once. Also add a
384         build rule that makes use of these scripts. These scripts and build
385         rules are not used at the moment; they will come into use in an
386         imminent patch.
387
388         Note that I've named these postprocess-header-rule rather than
389         postprocess-header-rule.sh. Scripts in Tools/Scripts do not have
390         suffixes indicating how the tool is implemented. Scripts in
391         per-project Scripts folders appear to be mixed regarding the use of
392         suffixes. I'm opting here to follow the Tools/Scripts convention, with
393         the expectation that over time we completely standardize on that.
394
395         * JavaScriptCore.xcodeproj/project.pbxproj:
396         * Scripts/postprocess-header-rule: Added.
397
398 2019-04-18  Saam barati  <sbarati@apple.com>
399
400         Remove useConcurrentBarriers option
401         https://bugs.webkit.org/show_bug.cgi?id=197066
402
403         Reviewed by Michael Saboff.
404
405         This isn't a helpful option as it will lead us to crash when using the
406         concurrent GC.
407
408         * dfg/DFGStoreBarrierClusteringPhase.cpp:
409         * dfg/DFGStoreBarrierInsertionPhase.cpp:
410         * jit/AssemblyHelpers.h:
411         (JSC::AssemblyHelpers::barrierStoreLoadFence):
412         * runtime/Options.h:
413
414 2019-04-17  Saam Barati  <sbarati@apple.com>
415
416         Remove deprecated JSScript SPI
417         https://bugs.webkit.org/show_bug.cgi?id=194909
418         <rdar://problem/48283499>
419
420         Reviewed by Keith Miller.
421
422         * API/JSAPIGlobalObject.mm:
423         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
424         * API/JSScript.h:
425         * API/JSScript.mm:
426         (+[JSScript scriptWithSource:inVirtualMachine:]): Deleted.
427         (fillBufferWithContentsOfFile): Deleted.
428         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]): Deleted.
429         (+[JSScript scriptFromUTF8File:inVirtualMachine:withCodeSigning:andBytecodeCache:]): Deleted.
430         (-[JSScript setSourceURL:]): Deleted.
431         * API/JSScriptInternal.h:
432         * API/tests/testapi.mm:
433         (testFetch):
434         (testFetchWithTwoCycle):
435         (testFetchWithThreeCycle):
436         (testLoaderResolvesAbsoluteScriptURL):
437         (testImportModuleTwice):
438         (-[JSContextFileLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
439
440 2019-04-17  Keith Rollin  <krollin@apple.com>
441
442         Remove JSCBuiltins.cpp from Copy Headers phase
443         https://bugs.webkit.org/show_bug.cgi?id=196981
444         <rdar://problem/49952133>
445
446         Reviewed by Alex Christensen.
447
448         JSCBuiltins.cpp is not a header and so doesn't need to be in the Copy
449         Headers phase. Checking its history, it seems to have been added
450         accidentally at the same time that JSCBuiltins.h was added.
451
452         * JavaScriptCore.xcodeproj/project.pbxproj:
453
454 2019-04-16  Stephan Szabo  <stephan.szabo@sony.com>
455
456         [PlayStation] Update port for system library changes
457         https://bugs.webkit.org/show_bug.cgi?id=196978
458
459         Reviewed by Ross Kirsling.
460
461         * shell/playstation/Initializer.cpp:
462         Add reference to new posix compatibility library.
463
464 2019-04-16  Robin Morisset  <rmorisset@apple.com>
465
466         [WTF] holdLock should be marked WARN_UNUSED_RETURN
467         https://bugs.webkit.org/show_bug.cgi?id=196922
468
469         Reviewed by Keith Miller.
470
471         There was one case where holdLock was used and the result ignored.
472         From a comment that was deleted in https://bugs.webkit.org/attachment.cgi?id=328438&action=prettypatch, I believe that it is on purpose.
473         So I brought back a variant of the comment, and made the ignoring of the return explicit.
474
475         * heap/BlockDirectory.cpp:
476         (JSC::BlockDirectory::isPagedOut):
477
478 2019-04-16  Caitlin Potter  <caitp@igalia.com>
479
480         [JSC] Filter DontEnum properties in ProxyObject::getOwnPropertyNames()
481         https://bugs.webkit.org/show_bug.cgi?id=176810
482
483         Reviewed by Saam Barati.
484
485         This adds conditional logic following the invariant checks, to perform
486         filtering in common uses of getOwnPropertyNames.
487
488         While this would ideally only be done in JSPropertyNameEnumerator, adding
489         the filtering to ProxyObject::performGetOwnPropertyNames maintains the
490         invariant that the EnumerationMode is properly followed.
491
492         This was originally rolled out in r244020, as DontEnum filtering code
493         in ObjectConstructor.cpp's ownPropertyKeys() had not been removed. It's
494         now redundant due to being handled in ProxyObject::getOwnPropertyNames().
495
496         * runtime/PropertyNameArray.h:
497         (JSC::PropertyNameArray::reset):
498         * runtime/ProxyObject.cpp:
499         (JSC::ProxyObject::performGetOwnPropertyNames):
500
501 2019-04-15  Saam barati  <sbarati@apple.com>
502
503         Modify how we do SetArgument when we inline varargs calls
504         https://bugs.webkit.org/show_bug.cgi?id=196712
505         <rdar://problem/49605012>
506
507         Reviewed by Michael Saboff.
508
509         When we inline varargs calls, we guarantee that the number of arguments that
510         go on the stack are somewhere between the "mandatoryMinimum" and the "limit - 1".
511         However, we can't statically guarantee that the arguments between these two
512         ranges was filled out by Load/ForwardVarargs. This is because in the general
513         case we don't know the argument count statically.
514         
515         However, we used to always emit SetArgumentDefinitely up to "limit - 1" for
516         all arguments, even when some arguments aren't guaranteed to be in a valid
517         state. Emitting these SetArgumentDefinitely were helpful because they let us
518         handle variable liveness and OSR exit metadata. However, when we converted
519         to SSA, we ended up emitting a GetStack for each such SetArgumentDefinitely.
520         
521         This is wrong, as we can't guarantee such SetArgumentDefinitely nodes are
522         actually looking at a range of the stack that are guaranteed to be initialized.
523         This patch introduces a new form of SetArgument node: SetArgumentMaybe. In terms
524         of OSR exit metadata and variable liveness tracking, it behaves like SetArgumentDefinitely.
525         
526         However, it differs in a couple key ways:
527         1. In ThreadedCPS, GetLocal(@SetArgumentMaybe) is invalid IR, as this implies
528         you might be loading uninitialized stack. (This same rule applies when you do
529         the full data flow reachability analysis over CPS Phis.) If someone logically
530         wanted to emit code like this, the correct node to emit would be GetArgument,
531         not GetLocal. For similar reasons, PhantomLocal(@SetArgumentMaybe) is also
532         invalid IR.
533         2. To track liveness, Flush(@SetArgumentMaybe) is valid, and is the main user
534         of SetArgumentMaybe.
535         3. In SSA conversion, we don't lower SetArgumentMaybe to GetStack, as there
536         should be no data flow user of SetArgumentMaybe.
537         
538         SetArgumentDefinitely guarantees that the stack slot is initialized.
539         SetArgumentMaybe makes no such guarantee.
540
541         * dfg/DFGAbstractInterpreterInlines.h:
542         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
543         * dfg/DFGByteCodeParser.cpp:
544         (JSC::DFG::ByteCodeParser::handleVarargsInlining):
545         * dfg/DFGCPSRethreadingPhase.cpp:
546         (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes):
547         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
548         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
549         (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlock):
550         (JSC::DFG::CPSRethreadingPhase::propagatePhis):
551         (JSC::DFG::CPSRethreadingPhase::computeIsFlushed):
552         * dfg/DFGClobberize.h:
553         (JSC::DFG::clobberize):
554         * dfg/DFGCommon.h:
555         * dfg/DFGDoesGC.cpp:
556         (JSC::DFG::doesGC):
557         * dfg/DFGFixupPhase.cpp:
558         (JSC::DFG::FixupPhase::fixupNode):
559         * dfg/DFGInPlaceAbstractState.cpp:
560         (JSC::DFG::InPlaceAbstractState::endBasicBlock):
561         * dfg/DFGLiveCatchVariablePreservationPhase.cpp:
562         (JSC::DFG::LiveCatchVariablePreservationPhase::handleBlockForTryCatch):
563         * dfg/DFGMaximalFlushInsertionPhase.cpp:
564         (JSC::DFG::MaximalFlushInsertionPhase::treatRegularBlock):
565         (JSC::DFG::MaximalFlushInsertionPhase::treatRootBlock):
566         * dfg/DFGMayExit.cpp:
567         * dfg/DFGNode.cpp:
568         (JSC::DFG::Node::hasVariableAccessData):
569         * dfg/DFGNodeType.h:
570         * dfg/DFGPhantomInsertionPhase.cpp:
571         * dfg/DFGPredictionPropagationPhase.cpp:
572         * dfg/DFGSSAConversionPhase.cpp:
573         (JSC::DFG::SSAConversionPhase::run):
574         * dfg/DFGSafeToExecute.h:
575         (JSC::DFG::safeToExecute):
576         * dfg/DFGSpeculativeJIT32_64.cpp:
577         (JSC::DFG::SpeculativeJIT::compile):
578         * dfg/DFGSpeculativeJIT64.cpp:
579         (JSC::DFG::SpeculativeJIT::compile):
580         * dfg/DFGValidate.cpp:
581         * ftl/FTLCapabilities.cpp:
582         (JSC::FTL::canCompile):
583
584 2019-04-15  Commit Queue  <commit-queue@webkit.org>
585
586         Unreviewed, rolling out r243672.
587         https://bugs.webkit.org/show_bug.cgi?id=196952
588
589         [JSValue release] should be thread-safe (Requested by
590         yusukesuzuki on #webkit).
591
592         Reverted changeset:
593
594         "[JSC] JSWrapperMap should not use Objective-C Weak map
595         (NSMapTable with NSPointerFunctionsWeakMemory) for
596         m_cachedObjCWrappers"
597         https://bugs.webkit.org/show_bug.cgi?id=196392
598         https://trac.webkit.org/changeset/243672
599
600 2019-04-15  Saam barati  <sbarati@apple.com>
601
602         SafeToExecute for GetByOffset/GetGetterByOffset/PutByOffset is using the wrong child for the base
603         https://bugs.webkit.org/show_bug.cgi?id=196945
604         <rdar://problem/49802750>
605
606         Reviewed by Filip Pizlo.
607
608         * dfg/DFGSafeToExecute.h:
609         (JSC::DFG::safeToExecute):
610
611 2019-04-15  Robin Morisset  <rmorisset@apple.com>
612
613         DFG should be able to constant fold Object.create() with a constant prototype operand
614         https://bugs.webkit.org/show_bug.cgi?id=196886
615
616         Reviewed by Yusuke Suzuki.
617
618
619         It is a fairly simple and limited patch, as it only works when the DFG can prove the exact object used as prototype.
620         But when it applies it can be a significant win:
621                                                         Baseline                   Optim                                       
622         object-create-constant-prototype              3.6082+-0.0979     ^      1.6947+-0.0756        ^ definitely 2.1292x faster
623         object-create-null                           11.4492+-0.2510     ?     11.5030+-0.2402        ?
624         object-create-unknown-object-prototype       15.6067+-0.1851     ?     15.7500+-0.2322        ?
625         object-create-untyped-prototype               8.8873+-0.1240     ?      8.9806+-0.1202        ? might be 1.0105x slower
626         <geometric>                                   8.6967+-0.1208     ^      7.2408+-0.1367        ^ definitely 1.2011x faster
627
628         The only subtlety is that we need to to access the StructureCache concurrently from the compiler thread (see https://bugs.webkit.org/show_bug.cgi?id=186199)
629         I solved this with a simple lock, taken when the compiler thread tries to read it, and when the main thread tries to modify it.
630         I expect it to be extremely low contention, but will watch the bots just in case.
631         The lock is taken neither when the main thread is only reading the cache (it has no-one to race with), nor when the GC purges it of dead entries (it does not free anything while a compiler thread is in the middle of a phase).
632
633         * dfg/DFGAbstractInterpreterInlines.h:
634         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
635         * dfg/DFGConstantFoldingPhase.cpp:
636         (JSC::DFG::ConstantFoldingPhase::foldConstants):
637         * runtime/StructureCache.cpp:
638         (JSC::StructureCache::createEmptyStructure):
639         (JSC::StructureCache::tryEmptyObjectStructureForPrototypeFromCompilerThread):
640         * runtime/StructureCache.h:
641
642 2019-04-15  Devin Rousso  <drousso@apple.com>
643
644         Web Inspector: fake value descriptors for promises add a catch handler, preventing "rejectionhandled" events from being fired
645         https://bugs.webkit.org/show_bug.cgi?id=196484
646         <rdar://problem/49114725>
647
648         Reviewed by Joseph Pecoraro.
649
650         Only add a catch handler when the promise is reachable via a native getter and is known to
651         have rejected. A non-rejected promise doesn't need a catch handler, and any promise that
652         isn't reachable via a getter won't actually be reached, as `InjectedScript` doesn't call any
653         functions, instead only getting the function object itself.
654
655         * inspector/InjectedScriptSource.js:
656         (InjectedScript.prototype._propertyDescriptors.createFakeValueDescriptor):
657
658         * inspector/JSInjectedScriptHost.h:
659         * inspector/JSInjectedScriptHost.cpp:
660         (Inspector::JSInjectedScriptHost::isPromiseRejectedWithNativeGetterTypeError): Added.
661         * inspector/JSInjectedScriptHostPrototype.cpp:
662         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
663         (Inspector::jsInjectedScriptHostPrototypeFunctionIsPromiseRejectedWithNativeGetterTypeError): Added.
664
665         * runtime/ErrorInstance.h:
666         (JSC::ErrorInstance::setNativeGetterTypeError): Added.
667         (JSC::ErrorInstance::isNativeGetterTypeError const): Added.
668
669         * runtime/Error.h:
670         (JSC::throwVMGetterTypeError): Added.
671         * runtime/Error.cpp:
672         (JSC::createGetterTypeError): Added.
673         (JSC::throwGetterTypeError): Added.
674         (JSC::throwDOMAttributeGetterTypeError):
675
676 2019-04-15  Robin Morisset  <rmorisset@apple.com>
677
678         B3::Value should have different kinds of adjacency lists
679         https://bugs.webkit.org/show_bug.cgi?id=196091
680
681         Reviewed by Filip Pizlo.
682
683         The key idea of this optimization is to replace the Vector<Value*, 3> m_children in B3::Value (40 bytes on 64-bits platform) by one of the following:
684         - Nothing (0 bytes)
685         - 1 Value* (8 bytes)
686         - 2 Value* (16 bytes)
687         - 3 Value* (24 bytes)
688         - A Vector<Value*, 3>
689         after the end of the Value object, depending on the kind of the Value.
690         So for example, when allocating an Add, we would allocate an extra 16 bytes into which to store 2 Values.
691         This would halve the memory consumption of Const64/Const32/Nop/Identity and a bunch more kinds of values, and reduce by a more moderate amount the memory consumption of the rest of non-varargs values (e.g. Add would go from 72 to 48 bytes).
692
693         A few implementation points:
694         - Even if there is no children, we must remember to allocate at least enough space for replaceWithIdentity to work later. It needs sizeof(Value) (for the object itself) + sizeof(Value*) (for the pointer to its child)
695         - We must make sure to destroy the vector whenever we destroy a Value which is VarArgs
696         - We must remember how many elements there are in the case where we did not allocate a Vector. We cannot do it purely by relying on the kind, both for speed reasons and because Return can have either 0 or 1 argument in B3
697           Thankfully, we have an extra byte of padding to use in the middle of B3::Value
698         - In order to support clone(), we must have a separate version of allocate, which extracts the opcode from the to-be-cloned object instead of from the call to the constructor
699         - Speaking of which, we need a special templated function opcodeFromConstructor, because some of the constructors of subclasses of Value don't take an explicit Opcode as argument, typically because they match a single one.
700         - To maximize performance, we provide specialized versions of child/lastChild/numChildren/children in the subclasses of Value, skipping checks when the actual type of the Value is already known.
701           This is done through the B3_SPECIALIZE_VALUE_FOR_... defined at the bottom of B3Value.h
702         - In the constructors of Value, we convert all extra children arguments to Value* eagerly. It is not required for correctness (they will be converted when put into a Vector<Value*> or a Value* in the end), but it helps limit an explosion in the number of template instantiations.
703         - I moved DeepValueDump::dump from the .h to the .cpp, as there is no good reason to inline it, and recompiling JSC is already slow enough
704
705         * JavaScriptCore.xcodeproj/project.pbxproj:
706         * b3/B3ArgumentRegValue.cpp:
707         (JSC::B3::ArgumentRegValue::cloneImpl const): Deleted.
708         * b3/B3ArgumentRegValue.h:
709         * b3/B3AtomicValue.cpp:
710         (JSC::B3::AtomicValue::AtomicValue):
711         (JSC::B3::AtomicValue::cloneImpl const): Deleted.
712         * b3/B3AtomicValue.h:
713         * b3/B3BasicBlock.h:
714         * b3/B3BasicBlockInlines.h:
715         (JSC::B3::BasicBlock::appendNewNonTerminal): Deleted.
716         * b3/B3CCallValue.cpp:
717         (JSC::B3::CCallValue::appendArgs):
718         (JSC::B3::CCallValue::cloneImpl const): Deleted.
719         * b3/B3CCallValue.h:
720         * b3/B3CheckValue.cpp:
721         (JSC::B3::CheckValue::cloneImpl const): Deleted.
722         * b3/B3CheckValue.h:
723         * b3/B3Const32Value.cpp:
724         (JSC::B3::Const32Value::cloneImpl const): Deleted.
725         * b3/B3Const32Value.h:
726         * b3/B3Const64Value.cpp:
727         (JSC::B3::Const64Value::cloneImpl const): Deleted.
728         * b3/B3Const64Value.h:
729         * b3/B3ConstDoubleValue.cpp:
730         (JSC::B3::ConstDoubleValue::cloneImpl const): Deleted.
731         * b3/B3ConstDoubleValue.h:
732         * b3/B3ConstFloatValue.cpp:
733         (JSC::B3::ConstFloatValue::cloneImpl const): Deleted.
734         * b3/B3ConstFloatValue.h:
735         * b3/B3ConstPtrValue.h:
736         (JSC::B3::ConstPtrValue::opcodeFromConstructor):
737         * b3/B3FenceValue.cpp:
738         (JSC::B3::FenceValue::FenceValue):
739         (JSC::B3::FenceValue::cloneImpl const): Deleted.
740         * b3/B3FenceValue.h:
741         * b3/B3MemoryValue.cpp:
742         (JSC::B3::MemoryValue::MemoryValue):
743         (JSC::B3::MemoryValue::cloneImpl const): Deleted.
744         * b3/B3MemoryValue.h:
745         * b3/B3MoveConstants.cpp:
746         * b3/B3PatchpointValue.cpp:
747         (JSC::B3::PatchpointValue::cloneImpl const): Deleted.
748         * b3/B3PatchpointValue.h:
749         (JSC::B3::PatchpointValue::opcodeFromConstructor):
750         * b3/B3Procedure.cpp:
751         * b3/B3Procedure.h:
752         * b3/B3ProcedureInlines.h:
753         (JSC::B3::Procedure::add):
754         * b3/B3SlotBaseValue.cpp:
755         (JSC::B3::SlotBaseValue::cloneImpl const): Deleted.
756         * b3/B3SlotBaseValue.h:
757         * b3/B3StackmapSpecial.cpp:
758         (JSC::B3::StackmapSpecial::forEachArgImpl):
759         (JSC::B3::StackmapSpecial::isValidImpl):
760         * b3/B3StackmapValue.cpp:
761         (JSC::B3::StackmapValue::append):
762         (JSC::B3::StackmapValue::StackmapValue):
763         * b3/B3StackmapValue.h:
764         * b3/B3SwitchValue.cpp:
765         (JSC::B3::SwitchValue::SwitchValue):
766         (JSC::B3::SwitchValue::cloneImpl const): Deleted.
767         * b3/B3SwitchValue.h:
768         (JSC::B3::SwitchValue::opcodeFromConstructor):
769         * b3/B3UpsilonValue.cpp:
770         (JSC::B3::UpsilonValue::cloneImpl const): Deleted.
771         * b3/B3UpsilonValue.h:
772         * b3/B3Value.cpp:
773         (JSC::B3::DeepValueDump::dump const):
774         (JSC::B3::Value::~Value):
775         (JSC::B3::Value::replaceWithIdentity):
776         (JSC::B3::Value::replaceWithNopIgnoringType):
777         (JSC::B3::Value::replaceWithPhi):
778         (JSC::B3::Value::replaceWithJump):
779         (JSC::B3::Value::replaceWithOops):
780         (JSC::B3::Value::replaceWith):
781         (JSC::B3::Value::invertedCompare const):
782         (JSC::B3::Value::returnsBool const):
783         (JSC::B3::Value::cloneImpl const): Deleted.
784         * b3/B3Value.h:
785         (JSC::B3::DeepValueDump::dump const): Deleted.
786         * b3/B3ValueInlines.h:
787         (JSC::B3::Value::adjacencyListOffset const):
788         (JSC::B3::Value::cloneImpl const):
789         * b3/B3VariableValue.cpp:
790         (JSC::B3::VariableValue::VariableValue):
791         (JSC::B3::VariableValue::cloneImpl const): Deleted.
792         * b3/B3VariableValue.h:
793         * b3/B3WasmAddressValue.cpp:
794         (JSC::B3::WasmAddressValue::WasmAddressValue):
795         (JSC::B3::WasmAddressValue::cloneImpl const): Deleted.
796         * b3/B3WasmAddressValue.h:
797         * b3/B3WasmBoundsCheckValue.cpp:
798         (JSC::B3::WasmBoundsCheckValue::WasmBoundsCheckValue):
799         (JSC::B3::WasmBoundsCheckValue::cloneImpl const): Deleted.
800         * b3/B3WasmBoundsCheckValue.h:
801         (JSC::B3::WasmBoundsCheckValue::accepts):
802         (JSC::B3::WasmBoundsCheckValue::opcodeFromConstructor):
803         * b3/testb3.cpp:
804         (JSC::B3::testCallFunctionWithHellaArguments):
805         (JSC::B3::testCallFunctionWithHellaArguments2):
806         (JSC::B3::testCallFunctionWithHellaArguments3):
807         (JSC::B3::testCallFunctionWithHellaDoubleArguments):
808         (JSC::B3::testCallFunctionWithHellaFloatArguments):
809         * ftl/FTLOutput.h:
810         (JSC::FTL::Output::call):
811
812 2019-04-15  Tadeu Zagallo  <tzagallo@apple.com>
813
814         Bytecode cache should not encode the SourceProvider for UnlinkedFunctionExecutable's classSource
815         https://bugs.webkit.org/show_bug.cgi?id=196878
816
817         Reviewed by Saam Barati.
818
819         Every time we encode an (Unlinked)SourceCode, we encode its SourceProvider,
820         including the full source if it's a StringSourceProvider. This wasn't an issue,
821         since the SourceCode contains a RefPtr to the SourceProvider, and the Encoder
822         would avoid encoding the provider multiple times. With the addition of the
823         incremental cache, each UnlinkedFunctionCodeBlock is encoded in isolation, which
824         means we can no longer deduplicate it and the full program text was being encoded
825         multiple times in the cache.
826         As a work around, this patch adds a custom cached type for encoding the SourceCode
827         without its provider, and later injects the SourceProvider through the Decoder.
828
829         * parser/SourceCode.h:
830         * parser/UnlinkedSourceCode.h:
831         (JSC::UnlinkedSourceCode::provider const):
832         * runtime/CachedTypes.cpp:
833         (JSC::Decoder::Decoder):
834         (JSC::Decoder::create):
835         (JSC::Decoder::provider const):
836         (JSC::CachedSourceCodeWithoutProvider::encode):
837         (JSC::CachedSourceCodeWithoutProvider::decode const):
838         (JSC::decodeCodeBlockImpl):
839         * runtime/CachedTypes.h:
840
841 2019-04-15  Robin Morisset  <rmorisset@apple.com>
842
843         MarkedSpace.cpp is not in the Xcode workspace
844         https://bugs.webkit.org/show_bug.cgi?id=196928
845
846         Reviewed by Saam Barati.
847
848         * JavaScriptCore.xcodeproj/project.pbxproj:
849
850 2019-04-15  Tadeu Zagallo  <tzagallo@apple.com>
851
852         Incremental bytecode cache should not append function updates when loaded from memory
853         https://bugs.webkit.org/show_bug.cgi?id=196865
854
855         Reviewed by Filip Pizlo.
856
857         Function updates hold the assumption that a function can only be executed/cached
858         after its containing code block has already been cached. This assumptions does
859         not hold if the UnlinkedCodeBlock is loaded from memory by the CodeCache, since
860         we might have two independent SourceProviders executing different paths of the
861         code and causing the same UnlinkedCodeBlock to be modified in memory.
862         Use a RefPtr instead of Ref for m_cachedBytecode in ShellSourceProvider to distinguish
863         between a new, empty cache and a cache that was not loaded and therefore cannot be updated.
864
865         * jsc.cpp:
866         (ShellSourceProvider::ShellSourceProvider):
867
868 2019-04-15  Saam barati  <sbarati@apple.com>
869
870         mergeOSREntryValue is wrong when the incoming value does not match up with the flush format
871         https://bugs.webkit.org/show_bug.cgi?id=196918
872
873         Reviewed by Yusuke Suzuki.
874
875         r244238 lead to some debug failures because we were calling checkConsistency()
876         before doing fixTypeForRepresentation when merging in must handle values in
877         CFA. This patch fixes that.
878         
879         However, as I was reading over mergeOSREntryValue, I realized it was wrong. It
880         was possible it could merge in a value/type outside of the variable's flushed type.
881         Once the flush format types are locked in, we can't introduce a type out of
882         that range. This probably never lead to any crashes as our profiling injection
883         and speculation decision code is solid. However, what we were doing is clearly
884         wrong, and something a fuzzer could have found if we fuzzed the must handle
885         values inside prediction injection. We should do that fuzzing:
886         https://bugs.webkit.org/show_bug.cgi?id=196924
887
888         * dfg/DFGAbstractValue.cpp:
889         (JSC::DFG::AbstractValue::mergeOSREntryValue):
890         * dfg/DFGAbstractValue.h:
891         * dfg/DFGCFAPhase.cpp:
892         (JSC::DFG::CFAPhase::injectOSR):
893
894 2019-04-15  Robin Morisset  <rmorisset@apple.com>
895
896         Several structures and enums in the Yarr interpreter can be shrunk
897         https://bugs.webkit.org/show_bug.cgi?id=196923
898
899         Reviewed by Saam Barati.
900
901         YarrOp: 88 -> 80
902         RegularExpression: 40 -> 32
903         ByteTerm: 56 -> 48
904         PatternTerm: 56 -> 48
905
906         * yarr/RegularExpression.cpp:
907         * yarr/YarrInterpreter.h:
908         * yarr/YarrJIT.cpp:
909         (JSC::Yarr::YarrGenerator::YarrOp::YarrOp):
910         * yarr/YarrParser.h:
911         * yarr/YarrPattern.h:
912
913 2019-04-15  Devin Rousso  <drousso@apple.com>
914
915         Web Inspector: REGRESSION(r244172): crash when trying to add extra domain while inspecting JSContext
916         https://bugs.webkit.org/show_bug.cgi?id=196925
917         <rdar://problem/49873994>
918
919         Reviewed by Joseph Pecoraro.
920
921         Move the logic for creating the `InspectorAgent` and `InspectorDebuggerAgent` into separate
922         functions so that callers can be guaranteed to have a valid instance of the agent.
923
924         * inspector/JSGlobalObjectInspectorController.h:
925         * inspector/JSGlobalObjectInspectorController.cpp:
926         (Inspector::JSGlobalObjectInspectorController::connectFrontend):
927         (Inspector::JSGlobalObjectInspectorController::frontendInitialized):
928         (Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
929         (Inspector::JSGlobalObjectInspectorController::ensureInspectorAgent): Added.
930         (Inspector::JSGlobalObjectInspectorController::ensureDebuggerAgent): Added.
931         (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
932
933 2019-04-14  Don Olmstead  <don.olmstead@sony.com>
934
935         [CMake] JavaScriptCore derived sources should only be referenced inside JavaScriptCore
936         https://bugs.webkit.org/show_bug.cgi?id=196742
937
938         Reviewed by Konstantin Tokarev.
939
940         Migrate to using JavaScriptCore_DERIVED_SOURCES_DIR instead of DERIVED_SOURCES_JAVASCRIPTCORE_DIR
941         to support moving the JavaScriptCore derived sources outside of a shared directory.
942
943         Also use JavaScriptCore_DERIVED_SOURCES_DIR instead of DERIVED_SOUCES_DIR.
944
945         * CMakeLists.txt:
946
947 2019-04-13  Tadeu Zagallo  <tzagallo@apple.com>
948
949         CodeCache should check that the UnlinkedCodeBlock was successfully created before caching it
950         https://bugs.webkit.org/show_bug.cgi?id=196880
951
952         Reviewed by Yusuke Suzuki.
953
954         CodeCache should not tell the SourceProvider to cache the bytecode if it failed
955         to create the UnlinkedCodeBlock.
956
957         * runtime/CodeCache.cpp:
958         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
959
960 2019-04-12  Saam barati  <sbarati@apple.com>
961
962         r244079 logically broke shouldSpeculateInt52
963         https://bugs.webkit.org/show_bug.cgi?id=196884
964
965         Reviewed by Yusuke Suzuki.
966
967         In r244079, I changed shouldSpeculateInt52 to only return true
968         when the prediction is isAnyInt52Speculation(). However, it was
969         wrong to not to include SpecInt32 in this for two reasons:
970
971         1. We diligently write code that first checks if we should speculate Int32.
972         For example:
973         if (shouldSpeculateInt32()) ... 
974         else if (shouldSpeculateInt52()) ...
975
976         It would be wrong not to fall back to Int52 if we're dealing with the union of
977         Int32 and Int52.
978
979         It would be a performance mistake to not include Int32 here because
980         data flow can easily tell us that we have variables that are the union
981         of Int32 and Int52 values. It's better to speculate Int52 than Double
982         in that situation.
983
984         2. We also write code where we ask if the inputs can be Int52, e.g, if
985         we know via profiling that an Add overflows, we may not emit an Int32 add.
986         However, we only emit such an add if both inputs can be Int52, and Int32
987         can trivially become Int52.
988
989        This patch recovers the 0.5-1% regression r244079 caused on JetStream 2.
990
991         * bytecode/SpeculatedType.h:
992         (JSC::isInt32SpeculationForArithmetic):
993         (JSC::isInt32OrBooleanSpeculationForArithmetic):
994         (JSC::isInt32OrInt52Speculation):
995         * dfg/DFGFixupPhase.cpp:
996         (JSC::DFG::FixupPhase::observeUseKindOnNode):
997         * dfg/DFGNode.h:
998         (JSC::DFG::Node::shouldSpeculateInt52):
999         * dfg/DFGPredictionPropagationPhase.cpp:
1000         * dfg/DFGVariableAccessData.cpp:
1001         (JSC::DFG::VariableAccessData::couldRepresentInt52Impl):
1002
1003 2019-04-12  Saam barati  <sbarati@apple.com>
1004
1005         Unreviewed. Build fix after r244233.
1006
1007         * assembler/CPU.cpp:
1008
1009 2019-04-12  Saam barati  <sbarati@apple.com>
1010
1011         Sometimes we need to user fewer CPUs in our threading calculations
1012         https://bugs.webkit.org/show_bug.cgi?id=196794
1013         <rdar://problem/49389497>
1014
1015         Reviewed by Yusuke Suzuki.
1016
1017         * JavaScriptCore.xcodeproj/project.pbxproj:
1018         * Sources.txt:
1019         * assembler/CPU.cpp: Added.
1020         (JSC::isKernTCSMAvailable):
1021         (JSC::enableKernTCSM):
1022         (JSC::kernTCSMAwareNumberOfProcessorCores):
1023         * assembler/CPU.h:
1024         (JSC::isKernTCSMAvailable):
1025         (JSC::enableKernTCSM):
1026         (JSC::kernTCSMAwareNumberOfProcessorCores):
1027         * heap/MachineStackMarker.h:
1028         (JSC::MachineThreads::addCurrentThread):
1029         * runtime/JSLock.cpp:
1030         (JSC::JSLock::didAcquireLock):
1031         * runtime/Options.cpp:
1032         (JSC::computeNumberOfWorkerThreads):
1033         (JSC::computePriorityDeltaOfWorkerThreads):
1034         * wasm/WasmWorklist.cpp:
1035         (JSC::Wasm::Worklist::Worklist):
1036
1037 2019-04-12  Robin Morisset  <rmorisset@apple.com>
1038
1039         Use padding at end of ArrayBuffer
1040         https://bugs.webkit.org/show_bug.cgi?id=196823
1041
1042         Reviewed by Filip Pizlo.
1043
1044         * runtime/ArrayBuffer.h:
1045
1046 2019-04-11  Yusuke Suzuki  <ysuzuki@apple.com>
1047
1048         [JSC] op_has_indexed_property should not assume subscript part is Uint32
1049         https://bugs.webkit.org/show_bug.cgi?id=196850
1050
1051         Reviewed by Saam Barati.
1052
1053         op_has_indexed_property assumed that subscript part is always Uint32. However, this is just a load from non-constant RegisterID,
1054         DFG can store it in double format and can perform OSR exit. op_has_indexed_property should not assume that.
1055         In this patch, instead, we check it with isAnyInt and get uint32_t from AnyInt.
1056
1057         * jit/JITOpcodes.cpp:
1058         (JSC::JIT::emit_op_has_indexed_property):
1059         * jit/JITOpcodes32_64.cpp:
1060         (JSC::JIT::emit_op_has_indexed_property):
1061         * jit/JITOperations.cpp:
1062         * runtime/CommonSlowPaths.cpp:
1063         (JSC::SLOW_PATH_DECL):
1064
1065 2019-04-11  Saam barati  <sbarati@apple.com>
1066
1067         Remove invalid assertion in operationInstanceOfCustom
1068         https://bugs.webkit.org/show_bug.cgi?id=196842
1069         <rdar://problem/49725493>
1070
1071         Reviewed by Michael Saboff.
1072
1073         In the generated JIT code, we go to the slow path when the incoming function
1074         isn't the Node's CodeOrigin's functionProtoHasInstanceSymbolFunction. However,
1075         in the JIT operation, we were asserting against exec->lexicalGlobalObject()'s
1076         functionProtoHasInstanceSymbolFunction. That assertion might be wrong when
1077         inlining across global objects as exec->lexicalGlobalObject() uses the machine
1078         frame for procuring the global object. There is no harm when this assertion fails
1079         as we just execute the slow path. This patch removes the assertion. (However, this
1080         does shed light on the deficiency in our exec->lexicalGlobalObject() function with
1081         respect to inlining. However, this isn't new -- we've known about this for a while.)
1082
1083         * jit/JITOperations.cpp:
1084
1085 2019-04-11  Michael Saboff  <msaboff@apple.com>
1086
1087         Improve the Inline Cache Stats code
1088         https://bugs.webkit.org/show_bug.cgi?id=196836
1089
1090         Reviewed by Saam Barati.
1091
1092         Needed to handle the case where the Identifier could be null, for example with InstanceOfAddAccessCase
1093         and InstanceOfReplaceWithJump.
1094
1095         Added the ability to log the location of a GetBy and PutBy property as either on self or up the
1096         protocol chain.
1097
1098         * jit/ICStats.cpp:
1099         (JSC::ICEvent::operator< const):
1100         (JSC::ICEvent::dump const):
1101         * jit/ICStats.h:
1102         (JSC::ICEvent::ICEvent):
1103         (JSC::ICEvent::hash const):
1104         * jit/JITOperations.cpp:
1105         * jit/Repatch.cpp:
1106         (JSC::tryCacheGetByID):
1107         (JSC::tryCachePutByID):
1108         (JSC::tryCacheInByID):
1109
1110 2019-04-11  Devin Rousso  <drousso@apple.com>
1111
1112         Web Inspector: Timelines: can't reliably stop/start a recording
1113         https://bugs.webkit.org/show_bug.cgi?id=196778
1114         <rdar://problem/47606798>
1115
1116         Reviewed by Timothy Hatcher.
1117
1118         * inspector/protocol/ScriptProfiler.json:
1119         * inspector/protocol/Timeline.json:
1120         It is possible to determine when programmatic capturing starts/stops in the frontend based
1121         on the state when the backend causes the state to change, such as if the state is "inactive"
1122         when the frontend is told that the backend has started capturing.
1123
1124         * inspector/protocol/CPUProfiler.json:
1125         * inspector/protocol/Memory.json:
1126         Send an end timestamp to match other instruments.
1127
1128         * inspector/JSGlobalObjectConsoleClient.cpp:
1129         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
1130         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
1131
1132         * inspector/agents/InspectorScriptProfilerAgent.h:
1133         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1134         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
1135         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStarted): Deleted.
1136         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStopped): Deleted.
1137
1138 2019-04-11  Saam barati  <sbarati@apple.com>
1139
1140         Rename SetArgument to SetArgumentDefinitely
1141         https://bugs.webkit.org/show_bug.cgi?id=196828
1142
1143         Reviewed by Yusuke Suzuki.
1144
1145         This is in preparation for https://bugs.webkit.org/show_bug.cgi?id=196712
1146         where we will introduce a node named SetArgumentMaybe. Doing this refactoring
1147         first will make reviewing that other patch easier.
1148
1149         * dfg/DFGAbstractInterpreterInlines.h:
1150         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1151         * dfg/DFGByteCodeParser.cpp:
1152         (JSC::DFG::ByteCodeParser::handleVarargsInlining):
1153         (JSC::DFG::ByteCodeParser::parseBlock):
1154         * dfg/DFGCPSRethreadingPhase.cpp:
1155         (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes):
1156         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
1157         (JSC::DFG::CPSRethreadingPhase::canonicalizeFlushOrPhantomLocalFor):
1158         (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlock):
1159         (JSC::DFG::CPSRethreadingPhase::specialCaseArguments):
1160         (JSC::DFG::CPSRethreadingPhase::propagatePhis):
1161         (JSC::DFG::CPSRethreadingPhase::computeIsFlushed):
1162         * dfg/DFGClobberize.h:
1163         (JSC::DFG::clobberize):
1164         * dfg/DFGCommon.h:
1165         * dfg/DFGDoesGC.cpp:
1166         (JSC::DFG::doesGC):
1167         * dfg/DFGFixupPhase.cpp:
1168         (JSC::DFG::FixupPhase::fixupNode):
1169         * dfg/DFGGraph.cpp:
1170         (JSC::DFG::Graph::methodOfGettingAValueProfileFor):
1171         * dfg/DFGGraph.h:
1172         * dfg/DFGInPlaceAbstractState.cpp:
1173         (JSC::DFG::InPlaceAbstractState::initialize):
1174         (JSC::DFG::InPlaceAbstractState::endBasicBlock):
1175         * dfg/DFGLiveCatchVariablePreservationPhase.cpp:
1176         (JSC::DFG::LiveCatchVariablePreservationPhase::handleBlockForTryCatch):
1177         * dfg/DFGMaximalFlushInsertionPhase.cpp:
1178         (JSC::DFG::MaximalFlushInsertionPhase::treatRegularBlock):
1179         (JSC::DFG::MaximalFlushInsertionPhase::treatRootBlock):
1180         * dfg/DFGMayExit.cpp:
1181         * dfg/DFGNode.cpp:
1182         (JSC::DFG::Node::hasVariableAccessData):
1183         * dfg/DFGNode.h:
1184         (JSC::DFG::Node::convertPhantomToPhantomLocal):
1185         * dfg/DFGNodeType.h:
1186         * dfg/DFGOSREntrypointCreationPhase.cpp:
1187         (JSC::DFG::OSREntrypointCreationPhase::run):
1188         * dfg/DFGPhantomInsertionPhase.cpp:
1189         * dfg/DFGPredictionPropagationPhase.cpp:
1190         * dfg/DFGSSAConversionPhase.cpp:
1191         (JSC::DFG::SSAConversionPhase::run):
1192         * dfg/DFGSafeToExecute.h:
1193         (JSC::DFG::safeToExecute):
1194         * dfg/DFGSpeculativeJIT.cpp:
1195         (JSC::DFG::SpeculativeJIT::checkArgumentTypes):
1196         * dfg/DFGSpeculativeJIT32_64.cpp:
1197         (JSC::DFG::SpeculativeJIT::compile):
1198         * dfg/DFGSpeculativeJIT64.cpp:
1199         (JSC::DFG::SpeculativeJIT::compile):
1200         * dfg/DFGTypeCheckHoistingPhase.cpp:
1201         (JSC::DFG::TypeCheckHoistingPhase::run):
1202         * dfg/DFGValidate.cpp:
1203         * ftl/FTLCapabilities.cpp:
1204         (JSC::FTL::canCompile):
1205
1206 2019-04-11  Truitt Savell  <tsavell@apple.com>
1207
1208         Unreviewed, rolling out r244158.
1209
1210         Casued 8 inspector/timeline/ test failures.
1211
1212         Reverted changeset:
1213
1214         "Web Inspector: Timelines: can't reliably stop/start a
1215         recording"
1216         https://bugs.webkit.org/show_bug.cgi?id=196778
1217         https://trac.webkit.org/changeset/244158
1218
1219 2019-04-10  Saam Barati  <sbarati@apple.com>
1220
1221         AbstractValue::validateOSREntryValue is wrong for Int52 constants
1222         https://bugs.webkit.org/show_bug.cgi?id=196801
1223         <rdar://problem/49771122>
1224
1225         Reviewed by Yusuke Suzuki.
1226
1227         validateOSREntryValue should not care about the format of the incoming
1228         value for Int52s. This patch normalizes the format of m_value and
1229         the incoming value when comparing them.
1230
1231         * dfg/DFGAbstractValue.h:
1232         (JSC::DFG::AbstractValue::validateOSREntryValue const):
1233
1234 2019-04-10  Saam Barati  <sbarati@apple.com>
1235
1236         ArithSub over Int52 has shouldCheckOverflow as always true
1237         https://bugs.webkit.org/show_bug.cgi?id=196796
1238
1239         Reviewed by Yusuke Suzuki.
1240
1241         AI was checking for ArithSub over Int52 if !shouldCheckOverflow. However,
1242         shouldCheckOverflow is always true, so !shouldCheckOverflow is always
1243         false. We shouldn't check something we assert against.
1244
1245         * dfg/DFGAbstractInterpreterInlines.h:
1246         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1247
1248 2019-04-10  Basuke Suzuki  <basuke.suzuki@sony.com>
1249
1250         [PlayStation] Specify byte order clearly on Remote Inspector Protocol
1251         https://bugs.webkit.org/show_bug.cgi?id=196790
1252
1253         Reviewed by Ross Kirsling.
1254
1255         Original implementation lacks byte order specification. Network byte order is the
1256         good candidate if there's no strong reason to choose other.
1257         Currently no client exists for PlayStation remote inspector protocol, so we can
1258         change the byte order without care.
1259
1260         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp:
1261         (Inspector::MessageParser::createMessage):
1262         (Inspector::MessageParser::parse):
1263
1264 2019-04-10  Devin Rousso  <drousso@apple.com>
1265
1266        Web Inspector: Inspector: lazily create the agent
1267        https://bugs.webkit.org/show_bug.cgi?id=195971
1268        <rdar://problem/49039645>
1269
1270        Reviewed by Joseph Pecoraro.
1271
1272        * inspector/JSGlobalObjectInspectorController.cpp:
1273        (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
1274        (Inspector::JSGlobalObjectInspectorController::connectFrontend):
1275        (Inspector::JSGlobalObjectInspectorController::appendExtraAgent):
1276        (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
1277
1278        * inspector/agents/InspectorAgent.h:
1279        * inspector/agents/InspectorAgent.cpp:
1280
1281 2019-04-10  Saam Barati  <sbarati@apple.com>
1282
1283         Work around an arm64_32 LLVM miscompile bug
1284         https://bugs.webkit.org/show_bug.cgi?id=196788
1285
1286         Reviewed by Yusuke Suzuki.
1287
1288         * runtime/CachedTypes.cpp:
1289
1290 2019-04-10  Devin Rousso  <drousso@apple.com>
1291
1292         Web Inspector: Timelines: can't reliably stop/start a recording
1293         https://bugs.webkit.org/show_bug.cgi?id=196778
1294         <rdar://problem/47606798>
1295
1296         Reviewed by Timothy Hatcher.
1297
1298         * inspector/protocol/ScriptProfiler.json:
1299         * inspector/protocol/Timeline.json:
1300         It is possible to determine when programmatic capturing starts/stops in the frontend based
1301         on the state when the backend causes the state to change, such as if the state is "inactive"
1302         when the frontend is told that the backend has started capturing.
1303
1304         * inspector/protocol/CPUProfiler.json:
1305         * inspector/protocol/Memory.json:
1306         Send an end timestamp to match other instruments.
1307
1308         * inspector/JSGlobalObjectConsoleClient.cpp:
1309         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
1310         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
1311
1312         * inspector/agents/InspectorScriptProfilerAgent.h:
1313         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1314         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
1315         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStarted): Deleted.
1316         (Inspector::InspectorScriptProfilerAgent::programmaticCaptureStopped): Deleted.
1317
1318 2019-04-10  Tadeu Zagallo  <tzagallo@apple.com>
1319
1320         Unreviewed, fix watch build after r244143
1321         https://bugs.webkit.org/show_bug.cgi?id=195000
1322
1323         The result of `lseek` should be `off_t` rather than `int`.
1324
1325         * jsc.cpp:
1326
1327 2019-04-10  Tadeu Zagallo  <tzagallo@apple.com>
1328
1329         Add support for incremental bytecode cache updates
1330         https://bugs.webkit.org/show_bug.cgi?id=195000
1331
1332         Reviewed by Filip Pizlo.
1333
1334         Add support for incremental updates to the bytecode cache. The cache
1335         is constructed as follows:
1336         - When the cache is empty, the initial payload can be added to the BytecodeCache
1337         by calling BytecodeCache::addGlobalUpdate. This represents the encoded
1338         top-level UnlinkedCodeBlock.
1339         - Afterwards, updates can be added by calling BytecodeCache::addFunctionUpdate.
1340         The update is applied by appending the encoded UnlinkedFunctionCodeBlock
1341         to the existing cache and updating the CachedFunctionExecutableMetadata
1342         and the offset of the new CachedFunctionCodeBlock in the owner CachedFunctionExecutable.
1343
1344         * API/JSScript.mm:
1345         (-[JSScript readCache]):
1346         (-[JSScript isUsingBytecodeCache]):
1347         (-[JSScript init]):
1348         (-[JSScript cachedBytecode]):
1349         (-[JSScript writeCache:]):
1350         * API/JSScriptInternal.h:
1351         * API/JSScriptSourceProvider.h:
1352         * API/JSScriptSourceProvider.mm:
1353         (JSScriptSourceProvider::cachedBytecode const):
1354         * CMakeLists.txt:
1355         * JavaScriptCore.xcodeproj/project.pbxproj:
1356         * Sources.txt:
1357         * bytecode/UnlinkedFunctionExecutable.cpp:
1358         (JSC::generateUnlinkedFunctionCodeBlock):
1359         * jsc.cpp:
1360         (ShellSourceProvider::~ShellSourceProvider):
1361         (ShellSourceProvider::cachePath const):
1362         (ShellSourceProvider::loadBytecode const):
1363         (ShellSourceProvider::ShellSourceProvider):
1364         (ShellSourceProvider::cacheEnabled):
1365         * parser/SourceProvider.h:
1366         (JSC::SourceProvider::cachedBytecode const):
1367         (JSC::SourceProvider::updateCache const):
1368         (JSC::SourceProvider::commitCachedBytecode const):
1369         * runtime/CachePayload.cpp: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
1370         (JSC::CachePayload::makeMappedPayload):
1371         (JSC::CachePayload::makeMallocPayload):
1372         (JSC::CachePayload::makeEmptyPayload):
1373         (JSC::CachePayload::CachePayload):
1374         (JSC::CachePayload::~CachePayload):
1375         (JSC::CachePayload::operator=):
1376         (JSC::CachePayload::freeData):
1377         * runtime/CachePayload.h: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
1378         (JSC::CachePayload::data const):
1379         (JSC::CachePayload::size const):
1380         (JSC::CachePayload::CachePayload):
1381         * runtime/CacheUpdate.cpp: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
1382         (JSC::CacheUpdate::CacheUpdate):
1383         (JSC::CacheUpdate::operator=):
1384         (JSC::CacheUpdate::isGlobal const):
1385         (JSC::CacheUpdate::asGlobal const):
1386         (JSC::CacheUpdate::asFunction const):
1387         * runtime/CacheUpdate.h: Copied from Source/JavaScriptCore/API/JSScriptInternal.h.
1388         * runtime/CachedBytecode.cpp: Added.
1389         (JSC::CachedBytecode::addGlobalUpdate):
1390         (JSC::CachedBytecode::addFunctionUpdate):
1391         (JSC::CachedBytecode::copyLeafExecutables):
1392         (JSC::CachedBytecode::commitUpdates const):
1393         * runtime/CachedBytecode.h: Added.
1394         (JSC::CachedBytecode::create):
1395         (JSC::CachedBytecode::leafExecutables):
1396         (JSC::CachedBytecode::data const):
1397         (JSC::CachedBytecode::size const):
1398         (JSC::CachedBytecode::hasUpdates const):
1399         (JSC::CachedBytecode::sizeForUpdate const):
1400         (JSC::CachedBytecode::CachedBytecode):
1401         * runtime/CachedTypes.cpp:
1402         (JSC::Encoder::addLeafExecutable):
1403         (JSC::Encoder::release):
1404         (JSC::Decoder::Decoder):
1405         (JSC::Decoder::create):
1406         (JSC::Decoder::size const):
1407         (JSC::Decoder::offsetOf):
1408         (JSC::Decoder::ptrForOffsetFromBase):
1409         (JSC::Decoder::addLeafExecutable):
1410         (JSC::VariableLengthObject::VariableLengthObject):
1411         (JSC::VariableLengthObject::buffer const):
1412         (JSC::CachedPtrOffsets::offsetOffset):
1413         (JSC::CachedWriteBarrierOffsets::ptrOffset):
1414         (JSC::CachedFunctionExecutable::features const):
1415         (JSC::CachedFunctionExecutable::hasCapturedVariables const):
1416         (JSC::CachedFunctionExecutableOffsets::codeBlockForCallOffset):
1417         (JSC::CachedFunctionExecutableOffsets::codeBlockForConstructOffset):
1418         (JSC::CachedFunctionExecutableOffsets::metadataOffset):
1419         (JSC::CachedFunctionExecutable::encode):
1420         (JSC::CachedFunctionExecutable::decode const):
1421         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1422         (JSC::encodeCodeBlock):
1423         (JSC::encodeFunctionCodeBlock):
1424         (JSC::decodeCodeBlockImpl):
1425         (JSC::isCachedBytecodeStillValid):
1426         * runtime/CachedTypes.h:
1427         (JSC::VariableLengthObjectBase::VariableLengthObjectBase):
1428         (JSC::decodeCodeBlock):
1429         * runtime/CodeCache.cpp:
1430         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
1431         (JSC::CodeCache::updateCache):
1432         (JSC::CodeCache::write):
1433         (JSC::writeCodeBlock):
1434         (JSC::serializeBytecode):
1435         * runtime/CodeCache.h:
1436         (JSC::SourceCodeValue::SourceCodeValue):
1437         (JSC::CodeCacheMap::findCacheAndUpdateAge):
1438         (JSC::CodeCacheMap::fetchFromDiskImpl):
1439         * runtime/Completion.cpp:
1440         (JSC::generateProgramBytecode):
1441         (JSC::generateModuleBytecode):
1442         * runtime/Completion.h:
1443         * runtime/LeafExecutable.cpp: Copied from Source/JavaScriptCore/API/JSScriptSourceProvider.mm.
1444         (JSC::LeafExecutable::operator+ const):
1445         * runtime/LeafExecutable.h: Copied from Source/JavaScriptCore/API/JSScriptSourceProvider.mm.
1446         (JSC::LeafExecutable::LeafExecutable):
1447         (JSC::LeafExecutable::base const):
1448
1449 2019-04-10  Michael Catanzaro  <mcatanzaro@igalia.com>
1450
1451         Unreviewed, rolling out r243989.
1452
1453         Broke i686 builds
1454
1455         Reverted changeset:
1456
1457         "[CMake] Detect SSE2 at compile time"
1458         https://bugs.webkit.org/show_bug.cgi?id=196488
1459         https://trac.webkit.org/changeset/243989
1460
1461 2019-04-10  Robin Morisset  <rmorisset@apple.com>
1462
1463         We should clear m_needsOverflowCheck when hitting an exception in defineProperties in ObjectConstructor.cpp
1464         https://bugs.webkit.org/show_bug.cgi?id=196746
1465
1466         Reviewed by Yusuke Suzuki..
1467
1468         It should be safe as in that case we are not completing the operation, and so not going to have any buffer overflow.
1469
1470         * runtime/ObjectConstructor.cpp:
1471         (JSC::defineProperties):
1472
1473 2019-04-10  Antoine Quint  <graouts@apple.com>
1474
1475         Enable Pointer Events on watchOS
1476         https://bugs.webkit.org/show_bug.cgi?id=196771
1477         <rdar://problem/49040909>
1478
1479         Reviewed by Dean Jackson.
1480
1481         * Configurations/FeatureDefines.xcconfig:
1482
1483 2019-04-09  Keith Rollin  <krollin@apple.com>
1484
1485         Unreviewed build maintenance -- update .xcfilelists.
1486
1487         * DerivedSources-input.xcfilelist:
1488
1489 2019-04-09  Ross Kirsling  <ross.kirsling@sony.com>
1490
1491         JSC should build successfully even with -DENABLE_UNIFIED_BUILDS=OFF
1492         https://bugs.webkit.org/show_bug.cgi?id=193073
1493
1494         Reviewed by Keith Miller.
1495
1496         * bytecompiler/BytecodeGenerator.cpp:
1497         (JSC::BytecodeGenerator::emitEqualityOpImpl):
1498         (JSC::BytecodeGenerator::emitEqualityOp): Deleted.
1499         * bytecompiler/BytecodeGenerator.h:
1500         (JSC::BytecodeGenerator::emitEqualityOp):
1501         Factor out the logic that uses the template parameter and keep it in the header.
1502
1503         * jit/JITPropertyAccess.cpp:
1504         List off the template specializations needed by JITOperations.cpp.
1505         This is unfortunate but at least there are only two (x2) by definition?
1506         Trying to do away with this incurs a severe domino effect...
1507
1508         * API/JSValueRef.cpp:
1509         * b3/B3OptimizeAssociativeExpressionTrees.cpp:
1510         * b3/air/AirHandleCalleeSaves.cpp:
1511         * builtins/BuiltinNames.cpp:
1512         * bytecode/AccessCase.cpp:
1513         * bytecode/BytecodeIntrinsicRegistry.cpp:
1514         * bytecode/BytecodeIntrinsicRegistry.h:
1515         * bytecode/BytecodeRewriter.cpp:
1516         * bytecode/BytecodeUseDef.h:
1517         * bytecode/CodeBlock.cpp:
1518         * bytecode/InstanceOfAccessCase.cpp:
1519         * bytecode/MetadataTable.cpp:
1520         * bytecode/PolyProtoAccessChain.cpp:
1521         * bytecode/StructureSet.cpp:
1522         * bytecompiler/NodesCodegen.cpp:
1523         * dfg/DFGCFAPhase.cpp:
1524         * dfg/DFGPureValue.cpp:
1525         * heap/GCSegmentedArray.h:
1526         * heap/HeapInlines.h:
1527         * heap/IsoSubspace.cpp:
1528         * heap/LocalAllocator.cpp:
1529         * heap/LocalAllocator.h:
1530         * heap/LocalAllocatorInlines.h:
1531         * heap/MarkingConstraintSolver.cpp:
1532         * inspector/ScriptArguments.cpp:
1533         (Inspector::ScriptArguments::isEqual const):
1534         * inspector/ScriptCallStackFactory.cpp:
1535         * interpreter/CallFrame.h:
1536         * interpreter/Interpreter.cpp:
1537         * interpreter/StackVisitor.cpp:
1538         * llint/LLIntEntrypoint.cpp:
1539         * runtime/ArrayIteratorPrototype.cpp:
1540         * runtime/BigIntPrototype.cpp:
1541         * runtime/CachedTypes.cpp:
1542         * runtime/ErrorType.cpp:
1543         * runtime/IndexingType.cpp:
1544         * runtime/JSCellInlines.h:
1545         * runtime/JSImmutableButterfly.h:
1546         * runtime/Operations.h:
1547         * runtime/RegExpCachedResult.cpp:
1548         * runtime/RegExpConstructor.cpp:
1549         * runtime/RegExpGlobalData.cpp:
1550         * runtime/StackFrame.h:
1551         * wasm/WasmSignature.cpp:
1552         * wasm/js/JSToWasm.cpp:
1553         * wasm/js/JSToWasmICCallee.cpp:
1554         * wasm/js/WebAssemblyFunction.h:
1555         Fix includes / forward declarations (and a couple of nearby clang warnings).
1556
1557 2019-04-09  Don Olmstead  <don.olmstead@sony.com>
1558
1559         [CMake] Apple builds should use ICU_INCLUDE_DIRS
1560         https://bugs.webkit.org/show_bug.cgi?id=196720
1561
1562         Reviewed by Konstantin Tokarev.
1563
1564         * PlatformMac.cmake:
1565
1566 2019-04-09  Saam barati  <sbarati@apple.com>
1567
1568         Clean up Int52 code and some bugs in it
1569         https://bugs.webkit.org/show_bug.cgi?id=196639
1570         <rdar://problem/49515757>
1571
1572         Reviewed by Yusuke Suzuki.
1573
1574         This patch fixes bugs in our Int52 code. The primary change in this patch is
1575         adopting a segregated type lattice for Int52. Previously, for Int52 values,
1576         we represented them with SpecInt32Only and SpecInt52Only. For an Int52,
1577         SpecInt32Only meant that the value is in int32 range. And SpecInt52Only meant
1578         that the is outside of the int32 range.
1579         
1580         However, this got confusing because we reused SpecInt32Only both for JSValue
1581         representations and Int52 representations. This actually lead to some bugs.
1582         
1583         1. It's possible that roundtripping through Int52 representation would say
1584         it produces the wrong type. For example, consider this program and how we
1585         used to annotate types in AI:
1586         a: JSConstant(10.0) => m_type is SpecAnyIntAsDouble
1587         b: Int52Rep(@a) => m_type is SpecInt52Only
1588         c: ValueRep(@b) => m_type is SpecAnyIntAsDouble
1589         
1590         In AI, for the above program, we'd say that @c produces SpecAnyIntAsDouble.
1591         However, the execution semantics are such that it'd actually produce a boxed
1592         Int32. This patch fixes the bug where we'd say that Int52Rep over SpecAnyIntAsDouble
1593         would produce SpecInt52Only. This is clearly wrong, as SpecAnyIntAsDouble can
1594         mean an int value in either int32 or int52 range.
1595         
1596         2. AsbstractValue::validateTypeAcceptingBoxedInt52 was wrong in how it
1597         accepted Int52 values. It was wrong in two different ways:
1598         a: If the AbstractValue's type was SpecInt52Only, and the incoming value
1599         was a boxed double, but represented a value in int32 range, the incoming
1600         value would incorrectly validate as being acceptable. However, we should
1601         have rejected this value.
1602         b: If the AbstractValue's type was SpecInt32Only, and the incoming value
1603         was an Int32 boxed in a double, this would not validate, even though
1604         it should have validated.
1605         
1606         Solving 2 was easiest if we segregated out the Int52 type into its own
1607         lattice. This patch makes a new Int52 lattice, which is composed of
1608         SpecInt32AsInt52 and SpecNonInt32AsInt52.
1609         
1610         The conversion rules are now really simple.
1611         
1612         Int52 rep => JSValue rep
1613         SpecInt32AsInt52 => SpecInt32Only
1614         SpecNonInt32AsInt52 => SpecAnyIntAsDouble
1615         
1616         JSValue rep => Int52 rep
1617         SpecInt32Only => SpecInt32AsInt52
1618         SpecAnyIntAsDouble => SpecInt52Any
1619         
1620         With these rules, the program in (1) will now correctly report that @c
1621         returns SpecInt32Only | SpecAnyIntAsDouble.
1622
1623         * bytecode/SpeculatedType.cpp:
1624         (JSC::dumpSpeculation):
1625         (JSC::speculationToAbbreviatedString):
1626         (JSC::int52AwareSpeculationFromValue):
1627         (JSC::leastUpperBoundOfStrictlyEquivalentSpeculations):
1628         (JSC::speculationFromString):
1629         * bytecode/SpeculatedType.h:
1630         (JSC::isInt32SpeculationForArithmetic):
1631         (JSC::isInt32OrBooleanSpeculationForArithmetic):
1632         (JSC::isAnyInt52Speculation):
1633         (JSC::isIntAnyFormat):
1634         (JSC::isInt52Speculation): Deleted.
1635         (JSC::isAnyIntSpeculation): Deleted.
1636         * dfg/DFGAbstractInterpreterInlines.h:
1637         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1638         * dfg/DFGAbstractValue.cpp:
1639         (JSC::DFG::AbstractValue::fixTypeForRepresentation):
1640         (JSC::DFG::AbstractValue::checkConsistency const):
1641         * dfg/DFGAbstractValue.h:
1642         (JSC::DFG::AbstractValue::isInt52Any const):
1643         (JSC::DFG::AbstractValue::validateTypeAcceptingBoxedInt52 const):
1644         * dfg/DFGFixupPhase.cpp:
1645         (JSC::DFG::FixupPhase::fixupArithMul):
1646         (JSC::DFG::FixupPhase::fixupNode):
1647         (JSC::DFG::FixupPhase::fixupGetPrototypeOf):
1648         (JSC::DFG::FixupPhase::fixupToThis):
1649         (JSC::DFG::FixupPhase::fixupToStringOrCallStringConstructor):
1650         (JSC::DFG::FixupPhase::observeUseKindOnNode):
1651         (JSC::DFG::FixupPhase::fixIntConvertingEdge):
1652         (JSC::DFG::FixupPhase::attemptToMakeIntegerAdd):
1653         (JSC::DFG::FixupPhase::fixupCompareStrictEqAndSameValue):
1654         (JSC::DFG::FixupPhase::fixupChecksInBlock):
1655         * dfg/DFGGraph.h:
1656         (JSC::DFG::Graph::addShouldSpeculateInt52):
1657         (JSC::DFG::Graph::binaryArithShouldSpeculateInt52):
1658         (JSC::DFG::Graph::unaryArithShouldSpeculateInt52):
1659         (JSC::DFG::Graph::addShouldSpeculateAnyInt): Deleted.
1660         (JSC::DFG::Graph::binaryArithShouldSpeculateAnyInt): Deleted.
1661         (JSC::DFG::Graph::unaryArithShouldSpeculateAnyInt): Deleted.
1662         * dfg/DFGNode.h:
1663         (JSC::DFG::Node::shouldSpeculateInt52):
1664         (JSC::DFG::Node::shouldSpeculateAnyInt): Deleted.
1665         * dfg/DFGPredictionPropagationPhase.cpp:
1666         * dfg/DFGSpeculativeJIT.cpp:
1667         (JSC::DFG::SpeculativeJIT::setIntTypedArrayLoadResult):
1668         (JSC::DFG::SpeculativeJIT::compileArithAdd):
1669         (JSC::DFG::SpeculativeJIT::compileArithSub):
1670         (JSC::DFG::SpeculativeJIT::compileArithNegate):
1671         * dfg/DFGSpeculativeJIT64.cpp:
1672         (JSC::DFG::SpeculativeJIT::fillSpeculateInt32Internal):
1673         (JSC::DFG::SpeculativeJIT::fillSpeculateInt52):
1674         * dfg/DFGUseKind.h:
1675         (JSC::DFG::typeFilterFor):
1676         * dfg/DFGVariableAccessData.cpp:
1677         (JSC::DFG::VariableAccessData::makePredictionForDoubleFormat):
1678         (JSC::DFG::VariableAccessData::couldRepresentInt52Impl):
1679         * ftl/FTLLowerDFGToB3.cpp:
1680         (JSC::FTL::DFG::LowerDFGToB3::compileArithAddOrSub):
1681         (JSC::FTL::DFG::LowerDFGToB3::compileArithNegate):
1682         (JSC::FTL::DFG::LowerDFGToB3::setIntTypedArrayLoadResult):
1683
1684 2019-04-09  Tadeu Zagallo  <tzagallo@apple.com>
1685
1686         ASSERTION FAILED: !scope.exception() || !hasProperty in JSObject::get
1687         https://bugs.webkit.org/show_bug.cgi?id=196708
1688         <rdar://problem/49556803>
1689
1690         Reviewed by Yusuke Suzuki.
1691
1692         `operationPutToScope` needs to return early if an exception is thrown while
1693         checking if `hasProperty`.
1694
1695         * jit/JITOperations.cpp:
1696
1697 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1698
1699         [JSC] DFG should respect node's strict flag
1700         https://bugs.webkit.org/show_bug.cgi?id=196617
1701
1702         Reviewed by Saam Barati.
1703
1704         We accidentally use codeBlock->isStrictMode() directly in DFG and FTL. But this is wrong since this CodeBlock is the top level DFG/FTL CodeBlock,
1705         and this code does not respect the isStrictMode flag for the inlined CodeBlocks. In this patch, we start using isStrictModeFor(CodeOrigin) consistently
1706         in DFG and FTL to get the right isStrictMode flag for the DFG node.
1707         And we also split compilePutDynamicVar into compilePutDynamicVarStrict and compilePutDynamicVarNonStrict since (1) it is cleaner than accessing inlined
1708         callframe in the operation function, and (2) it is aligned to the other functions like operationPutByValDirectNonStrict etc.
1709         This bug is discovered by RandomizingFuzzerAgent by expanding the DFG coverage.
1710
1711         * dfg/DFGAbstractInterpreterInlines.h:
1712         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1713         * dfg/DFGConstantFoldingPhase.cpp:
1714         (JSC::DFG::ConstantFoldingPhase::foldConstants):
1715         * dfg/DFGFixupPhase.cpp:
1716         (JSC::DFG::FixupPhase::fixupToThis):
1717         * dfg/DFGOperations.cpp:
1718         * dfg/DFGOperations.h:
1719         * dfg/DFGPredictionPropagationPhase.cpp:
1720         * dfg/DFGSpeculativeJIT.cpp:
1721         (JSC::DFG::SpeculativeJIT::compileDoublePutByVal):
1722         (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray):
1723         (JSC::DFG::SpeculativeJIT::compilePutDynamicVar):
1724         (JSC::DFG::SpeculativeJIT::compileToThis):
1725         * dfg/DFGSpeculativeJIT32_64.cpp:
1726         (JSC::DFG::SpeculativeJIT::compileContiguousPutByVal):
1727         (JSC::DFG::SpeculativeJIT::compile):
1728         * dfg/DFGSpeculativeJIT64.cpp:
1729         (JSC::DFG::SpeculativeJIT::compile):
1730         * ftl/FTLLowerDFGToB3.cpp:
1731         (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
1732         (JSC::FTL::DFG::LowerDFGToB3::compilePutDynamicVar):
1733
1734 2019-04-08  Don Olmstead  <don.olmstead@sony.com>
1735
1736         [CMake][WinCairo] Separate copied headers into different directories
1737         https://bugs.webkit.org/show_bug.cgi?id=196655
1738
1739         Reviewed by Michael Catanzaro.
1740
1741         * CMakeLists.txt:
1742         * shell/PlatformWin.cmake:
1743
1744 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1745
1746         [JSC] isRope jump in StringSlice should not jump over register allocations
1747         https://bugs.webkit.org/show_bug.cgi?id=196716
1748
1749         Reviewed by Saam Barati.
1750
1751         Jumping over the register allocation code in DFG (like the following) is wrong.
1752
1753             auto jump = m_jit.branchXXX();
1754             {
1755                 GPRTemporary reg(this);
1756                 GPRReg regGPR = reg.gpr();
1757                 ...
1758             }
1759             jump.link(&m_jit);
1760
1761         When GPRTemporary::gpr allocates a new register, it can flush the previous register value into the stack and make the register usable.
1762         Jumping over this register allocation code skips the flushing code, and makes the DFG's stack and register content tracking inconsistent:
1763         DFG thinks that the content is flushed and stored in particular stack slot even while this flushing code is skipped.
1764         In this patch, we perform register allocations before jumping to the slow path based on `isRope` condition in StringSlice.
1765
1766         * dfg/DFGSpeculativeJIT.cpp:
1767         (JSC::DFG::SpeculativeJIT::compileStringSlice):
1768
1769 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1770
1771         [JSC] to_index_string should not assume incoming value is Uint32
1772         https://bugs.webkit.org/show_bug.cgi?id=196713
1773
1774         Reviewed by Saam Barati.
1775
1776         The slow path of to_index_string assumes that incoming value is Uint32. But we should not have
1777         this assumption since DFG may decide we should have it double format. This patch removes this
1778         assumption, and instead, we should assume that incoming value is AnyInt and the range of this
1779         is within Uint32.
1780
1781         * runtime/CommonSlowPaths.cpp:
1782         (JSC::SLOW_PATH_DECL):
1783
1784 2019-04-08  Justin Fan  <justin_fan@apple.com>
1785
1786         [Web GPU] Fix Web GPU experimental feature on iOS
1787         https://bugs.webkit.org/show_bug.cgi?id=196632
1788
1789         Reviewed by Myles C. Maxfield.
1790
1791         Properly make Web GPU available on iOS 11+.
1792
1793         * Configurations/FeatureDefines.xcconfig:
1794         * Configurations/WebKitTargetConditionals.xcconfig:
1795
1796 2019-04-08  Ross Kirsling  <ross.kirsling@sony.com>
1797
1798         -f[no-]var-tracking-assignments is GCC-only
1799         https://bugs.webkit.org/show_bug.cgi?id=196699
1800
1801         Reviewed by Don Olmstead.
1802
1803         * CMakeLists.txt:
1804         Just remove the build flag altogether -- it supposedly doesn't solve the problem it was meant to
1805         and said problem evidently no longer occurs as of GCC 9.
1806
1807 2019-04-08  Saam Barati  <sbarati@apple.com>
1808
1809         WebAssembly.RuntimeError missing exception check
1810         https://bugs.webkit.org/show_bug.cgi?id=196700
1811         <rdar://problem/49693932>
1812
1813         Reviewed by Yusuke Suzuki.
1814
1815         * wasm/js/JSWebAssemblyRuntimeError.h:
1816         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
1817         (JSC::constructJSWebAssemblyRuntimeError):
1818
1819 2019-04-08  Yusuke Suzuki  <ysuzuki@apple.com>
1820
1821         Unreviewed, rolling in r243948 with test fix
1822         https://bugs.webkit.org/show_bug.cgi?id=196486
1823
1824         * parser/ASTBuilder.h:
1825         (JSC::ASTBuilder::createString):
1826         * parser/Lexer.cpp:
1827         (JSC::Lexer<T>::parseMultilineComment):
1828         (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
1829         (JSC::Lexer<T>::lex): Deleted.
1830         * parser/Lexer.h:
1831         (JSC::Lexer::hasLineTerminatorBeforeToken const):
1832         (JSC::Lexer::setHasLineTerminatorBeforeToken):
1833         (JSC::Lexer<T>::lex):
1834         (JSC::Lexer::prevTerminator const): Deleted.
1835         (JSC::Lexer::setTerminator): Deleted.
1836         * parser/Parser.cpp:
1837         (JSC::Parser<LexerType>::allowAutomaticSemicolon):
1838         (JSC::Parser<LexerType>::parseSingleFunction):
1839         (JSC::Parser<LexerType>::parseStatementListItem):
1840         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
1841         (JSC::Parser<LexerType>::parseFunctionInfo):
1842         (JSC::Parser<LexerType>::parseClass):
1843         (JSC::Parser<LexerType>::parseExportDeclaration):
1844         (JSC::Parser<LexerType>::parseAssignmentExpression):
1845         (JSC::Parser<LexerType>::parseYieldExpression):
1846         (JSC::Parser<LexerType>::parseProperty):
1847         (JSC::Parser<LexerType>::parsePrimaryExpression):
1848         (JSC::Parser<LexerType>::parseMemberExpression):
1849         * parser/Parser.h:
1850         (JSC::Parser::nextWithoutClearingLineTerminator):
1851         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
1852         (JSC::Parser::internalSaveLexerState):
1853         (JSC::Parser::restoreLexerState):
1854
1855 2019-04-08  Ryan Haddad  <ryanhaddad@apple.com>
1856
1857         Unreviewed, rolling out r243948.
1858
1859         Caused inspector/runtime/parse.html to fail
1860
1861         Reverted changeset:
1862
1863         "SIGSEGV in JSC::BytecodeGenerator::addStringConstant"
1864         https://bugs.webkit.org/show_bug.cgi?id=196486
1865         https://trac.webkit.org/changeset/243948
1866
1867 2019-04-08  Ryan Haddad  <ryanhaddad@apple.com>
1868
1869         Unreviewed, rolling out r243943.
1870
1871         Caused test262 failures.
1872
1873         Reverted changeset:
1874
1875         "[JSC] Filter DontEnum properties in
1876         ProxyObject::getOwnPropertyNames()"
1877         https://bugs.webkit.org/show_bug.cgi?id=176810
1878         https://trac.webkit.org/changeset/243943
1879
1880 2019-04-08  Claudio Saavedra  <csaavedra@igalia.com>
1881
1882         [JSC] Partially fix the build with unified builds disabled
1883         https://bugs.webkit.org/show_bug.cgi?id=196647
1884
1885         Reviewed by Konstantin Tokarev.
1886
1887         If you disable unified builds you find all kind of build
1888         errors. This partially tries to fix them but there's a lot
1889         more.
1890
1891         * API/JSBaseInternal.h:
1892         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp:
1893         * b3/air/AirHandleCalleeSaves.h:
1894         * bytecode/ExecutableToCodeBlockEdge.cpp:
1895         * bytecode/ExitFlag.h:
1896         * bytecode/ICStatusUtils.h:
1897         * bytecode/UnlinkedMetadataTable.h:
1898         * dfg/DFGPureValue.h:
1899         * heap/IsoAlignedMemoryAllocator.cpp:
1900         * heap/IsoAlignedMemoryAllocator.h:
1901
1902 2019-04-08  Guillaume Emont  <guijemont@igalia.com>
1903
1904         Enable DFG on MIPS
1905         https://bugs.webkit.org/show_bug.cgi?id=196689
1906
1907         Reviewed by Žan Doberšek.
1908
1909         Since the bytecode change, we enabled the baseline JIT on mips in
1910         r240432, but DFG is still missing. With this change, all tests are
1911         passing on a ci20 board.
1912
1913         * jit/RegisterSet.cpp:
1914         (JSC::RegisterSet::calleeSaveRegisters):
1915         Added s0, which is used in llint.
1916
1917 2019-04-08  Xan Lopez  <xan@igalia.com>
1918
1919         [CMake] Detect SSE2 at compile time
1920         https://bugs.webkit.org/show_bug.cgi?id=196488
1921
1922         Reviewed by Carlos Garcia Campos.
1923
1924         * assembler/MacroAssemblerX86Common.cpp: Remove unnecessary (and
1925         incorrect) static_assert.
1926
1927 2019-04-07  Michael Saboff  <msaboff@apple.com>
1928
1929         REGRESSION (r243642): Crash in reddit.com page
1930         https://bugs.webkit.org/show_bug.cgi?id=196684
1931
1932         Reviewed by Geoffrey Garen.
1933
1934         In r243642, the code that saves and restores the count for non-greedy character classes
1935         was inadvertently put inside an if statement.  This code should be generated for all
1936         non-greedy character classes.
1937
1938         * yarr/YarrJIT.cpp:
1939         (JSC::Yarr::YarrGenerator::generateCharacterClassNonGreedy):
1940         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
1941
1942 2019-04-07  Yusuke Suzuki  <ysuzuki@apple.com>
1943
1944         [JSC] CallLinkInfo should clear Callee or CodeBlock even if it is unlinked by jettison
1945         https://bugs.webkit.org/show_bug.cgi?id=196683
1946
1947         Reviewed by Saam Barati.
1948
1949         In r243626, we stop repatching CallLinkInfo when the CallLinkInfo is held by jettisoned CodeBlock.
1950         But we still need to clear the Callee or CodeBlock since they are now dead. Otherwise, CodeBlock's
1951         visitWeak eventually accesses this dead cells and crashes because the owner CodeBlock of CallLinkInfo
1952         can be still live.
1953
1954         We also move all repatching operations from CallLinkInfo.cpp to Repatch.cpp for consistency because the
1955         other repatching operations in CallLinkInfo are implemented in Repatch.cpp side.
1956
1957         * bytecode/CallLinkInfo.cpp:
1958         (JSC::CallLinkInfo::setCallee):
1959         (JSC::CallLinkInfo::clearCallee):
1960         * jit/Repatch.cpp:
1961         (JSC::linkFor):
1962         (JSC::revertCall):
1963
1964 2019-04-05  Yusuke Suzuki  <ysuzuki@apple.com>
1965
1966         [JSC] OSRExit recovery for SpeculativeAdd does not consier "A = A + A" pattern
1967         https://bugs.webkit.org/show_bug.cgi?id=196582
1968
1969         Reviewed by Saam Barati.
1970
1971         In DFG, our ArithAdd with overflow is executed speculatively, and we recover the value when overflow flag is set.
1972         The recovery is subtracting the operand from the destination to get the original two operands. Our recovery code
1973         handles A + B = A, A + B = B cases. But it misses A + A = A case (here, A and B are GPRReg). Our recovery code
1974         attempts to produce the original operand by performing A - A, and it always produces zero accidentally.
1975
1976         This patch adds the recovery code for A + A = A case. Because we know that this ArithAdd overflows, and operands were
1977         same values, we can calculate the original operand from the destination value by `((int32_t)value >> 1) ^ 0x80000000`.
1978
1979         We also found that FTL recovery code is dead. We remove them in this patch.
1980
1981         * dfg/DFGOSRExit.cpp:
1982         (JSC::DFG::OSRExit::executeOSRExit):
1983         (JSC::DFG::OSRExit::compileExit):
1984         * dfg/DFGOSRExit.h:
1985         (JSC::DFG::SpeculationRecovery::SpeculationRecovery):
1986         * dfg/DFGSpeculativeJIT.cpp:
1987         (JSC::DFG::SpeculativeJIT::compileArithAdd):
1988         * ftl/FTLExitValue.cpp:
1989         (JSC::FTL::ExitValue::dataFormat const):
1990         (JSC::FTL::ExitValue::dumpInContext const):
1991         * ftl/FTLExitValue.h:
1992         (JSC::FTL::ExitValue::isArgument const):
1993         (JSC::FTL::ExitValue::hasIndexInStackmapLocations const):
1994         (JSC::FTL::ExitValue::adjustStackmapLocationsIndexByOffset):
1995         (JSC::FTL::ExitValue::recovery): Deleted.
1996         (JSC::FTL::ExitValue::isRecovery const): Deleted.
1997         (JSC::FTL::ExitValue::leftRecoveryArgument const): Deleted.
1998         (JSC::FTL::ExitValue::rightRecoveryArgument const): Deleted.
1999         (JSC::FTL::ExitValue::recoveryFormat const): Deleted.
2000         (JSC::FTL::ExitValue::recoveryOpcode const): Deleted.
2001         * ftl/FTLLowerDFGToB3.cpp:
2002         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2003         (JSC::FTL::DFG::LowerDFGToB3::preparePatchpointForExceptions):
2004         (JSC::FTL::DFG::LowerDFGToB3::appendOSRExit):
2005         (JSC::FTL::DFG::LowerDFGToB3::exitValueForNode):
2006         (JSC::FTL::DFG::LowerDFGToB3::addAvailableRecovery): Deleted.
2007         * ftl/FTLOSRExitCompiler.cpp:
2008         (JSC::FTL::compileRecovery):
2009
2010 2019-04-05  Ryan Haddad  <ryanhaddad@apple.com>
2011
2012         Unreviewed, rolling out r243665.
2013
2014         Caused iOS JSC tests to exit with an exception.
2015
2016         Reverted changeset:
2017
2018         "Assertion failed in JSC::createError"
2019         https://bugs.webkit.org/show_bug.cgi?id=196305
2020         https://trac.webkit.org/changeset/243665
2021
2022 2019-04-05  Yusuke Suzuki  <ysuzuki@apple.com>
2023
2024         SIGSEGV in JSC::BytecodeGenerator::addStringConstant
2025         https://bugs.webkit.org/show_bug.cgi?id=196486
2026
2027         Reviewed by Saam Barati.
2028
2029         When parsing a FunctionExpression / FunctionDeclaration etc., we use SyntaxChecker for the body of the function because we do not have any interest on the nodes of the body at that time.
2030         The nodes will be parsed with the ASTBuilder when the function itself is parsed for code generation. This works well previously because all the function ends with "}" previously.
2031         SyntaxChecker lexes this "}" token, and parser restores the context back to ASTBuilder and continues parsing.
2032
2033         But now, we have ArrowFunctionExpression without braces `arrow => expr`. Let's consider the following code.
2034
2035                 arrow => expr
2036                 "string!"
2037
2038         We parse arrow function's body with SyntaxChecker. At that time, we lex "string!" token under the SyntaxChecker context. But this means that we may not build string content for this token
2039         since SyntaxChecker may not have interest on string content itself in certain case. After the parser is back to ASTBuilder, we parse "string!" as ExpressionStatement with string constant,
2040         generate StringNode with non-built identifier (nullptr), and we accidentally create StringNode with nullptr.
2041
2042         This patch fixes this problem. The root cause of this problem is that the last token lexed in the previous context is used. We add lexCurrentTokenAgainUnderCurrentContext which will re-lex
2043         the current token under the current context (may be ASTBuilder). This should be done only when the caller's context is different from SyntaxChecker, which avoids unnecessary lexing.
2044         We leverage existing SavePoint mechanism to implement lexCurrentTokenAgainUnderCurrentContext cleanly.
2045
2046         And we also fix the bug in the existing SavePoint mechanism, which is shown in the attached test script. When we save LexerState, we do not save line terminator status. This patch also introduces
2047         lexWithoutClearingLineTerminator, which lex the token without clearing line terminator status.
2048
2049         * parser/ASTBuilder.h:
2050         (JSC::ASTBuilder::createString):
2051         * parser/Lexer.cpp:
2052         (JSC::Lexer<T>::parseMultilineComment):
2053         (JSC::Lexer<T>::lexWithoutClearingLineTerminator): EOF token also should record offset information. This offset information is correctly handled in Lexer::setOffset too.
2054         (JSC::Lexer<T>::lex): Deleted.
2055         * parser/Lexer.h:
2056         (JSC::Lexer::hasLineTerminatorBeforeToken const):
2057         (JSC::Lexer::setHasLineTerminatorBeforeToken):
2058         (JSC::Lexer<T>::lex):
2059         (JSC::Lexer::prevTerminator const): Deleted.
2060         (JSC::Lexer::setTerminator): Deleted.
2061         * parser/Parser.cpp:
2062         (JSC::Parser<LexerType>::allowAutomaticSemicolon):
2063         (JSC::Parser<LexerType>::parseSingleFunction):
2064         (JSC::Parser<LexerType>::parseStatementListItem):
2065         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
2066         (JSC::Parser<LexerType>::parseFunctionInfo):
2067         (JSC::Parser<LexerType>::parseClass):
2068         (JSC::Parser<LexerType>::parseExportDeclaration):
2069         (JSC::Parser<LexerType>::parseAssignmentExpression):
2070         (JSC::Parser<LexerType>::parseYieldExpression):
2071         (JSC::Parser<LexerType>::parseProperty):
2072         (JSC::Parser<LexerType>::parsePrimaryExpression):
2073         (JSC::Parser<LexerType>::parseMemberExpression):
2074         * parser/Parser.h:
2075         (JSC::Parser::nextWithoutClearingLineTerminator):
2076         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):
2077         (JSC::Parser::internalSaveLexerState):
2078         (JSC::Parser::restoreLexerState):
2079
2080 2019-04-05  Caitlin Potter  <caitp@igalia.com>
2081
2082         [JSC] Filter DontEnum properties in ProxyObject::getOwnPropertyNames()
2083         https://bugs.webkit.org/show_bug.cgi?id=176810
2084
2085         Reviewed by Saam Barati.
2086
2087         This adds conditional logic following the invariant checks, to perform
2088         filtering in common uses of getOwnPropertyNames.
2089
2090         While this would ideally only be done in JSPropertyNameEnumerator, adding
2091         the filtering to ProxyObject::performGetOwnPropertyNames maintains the
2092         invariant that the EnumerationMode is properly followed.
2093
2094         * runtime/PropertyNameArray.h:
2095         (JSC::PropertyNameArray::reset):
2096         * runtime/ProxyObject.cpp:
2097         (JSC::ProxyObject::performGetOwnPropertyNames):
2098
2099 2019-04-05  Commit Queue  <commit-queue@webkit.org>
2100
2101         Unreviewed, rolling out r243833.
2102         https://bugs.webkit.org/show_bug.cgi?id=196645
2103
2104         This change breaks build of WPE and GTK ports (Requested by
2105         annulen on #webkit).
2106
2107         Reverted changeset:
2108
2109         "[CMake][WTF] Mirror XCode header directories"
2110         https://bugs.webkit.org/show_bug.cgi?id=191662
2111         https://trac.webkit.org/changeset/243833
2112
2113 2019-04-05  Caitlin Potter  <caitp@igalia.com>
2114
2115         [JSC] throw if ownKeys Proxy trap result contains duplicate keys
2116         https://bugs.webkit.org/show_bug.cgi?id=185211
2117
2118         Reviewed by Saam Barati.
2119
2120         Implements the normative spec change in https://github.com/tc39/ecma262/pull/833
2121
2122         This involves tracking duplicate keys returned from the ownKeys trap in yet
2123         another HashTable, and may incur a minor performance penalty in some cases. This
2124         is not expected to significantly affect web performance.
2125
2126         * runtime/ProxyObject.cpp:
2127         (JSC::ProxyObject::performGetOwnPropertyNames):
2128
2129 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
2130
2131         [JSC] makeBoundFunction should not assume incoming "length" value is Int32 because it performs some calculation in bytecode
2132         https://bugs.webkit.org/show_bug.cgi?id=196631
2133
2134         Reviewed by Saam Barati.
2135
2136         makeBoundFunction assumes that "length" argument is always Int32. But this should not be done since this "length" value is calculated in builtin JS code.
2137         DFG may store this value in Double format so that we should not rely on that this value is Int32. This patch fixes makeBoundFunction function to perform
2138         toInt32 operation. We also insert a missing exception check for `JSString::value(ExecState*)` in makeBoundFunction.
2139
2140         * JavaScriptCore.xcodeproj/project.pbxproj:
2141         * Sources.txt:
2142         * interpreter/CallFrameInlines.h:
2143         * runtime/DoublePredictionFuzzerAgent.cpp: Copied from Source/JavaScriptCore/interpreter/CallFrameInlines.h.
2144         (JSC::DoublePredictionFuzzerAgent::DoublePredictionFuzzerAgent):
2145         (JSC::DoublePredictionFuzzerAgent::getPrediction):
2146         * runtime/DoublePredictionFuzzerAgent.h: Copied from Source/JavaScriptCore/interpreter/CallFrameInlines.h.
2147         * runtime/JSGlobalObject.cpp:
2148         (JSC::makeBoundFunction):
2149         * runtime/Options.h:
2150         * runtime/VM.cpp:
2151         (JSC::VM::VM):
2152
2153 2019-04-04  Robin Morisset  <rmorisset@apple.com>
2154
2155         B3ReduceStrength should know that Mul distributes over Add and Sub
2156         https://bugs.webkit.org/show_bug.cgi?id=196325
2157         <rdar://problem/49441650>
2158
2159         Reviewed by Saam Barati.
2160
2161         Fix some obviously wrong code that was due to an accidental copy-paste.
2162         It made the entire optimization dead code that never ran.
2163
2164         * b3/B3ReduceStrength.cpp:
2165
2166 2019-04-04  Saam Barati  <sbarati@apple.com>
2167
2168         Unreviewed, build fix for CLoop after r243886
2169
2170         * interpreter/Interpreter.cpp:
2171         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
2172         * interpreter/StackVisitor.cpp:
2173         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
2174         * interpreter/StackVisitor.h:
2175
2176 2019-04-04  Commit Queue  <commit-queue@webkit.org>
2177
2178         Unreviewed, rolling out r243898.
2179         https://bugs.webkit.org/show_bug.cgi?id=196624
2180
2181         `#if !ENABLE(C_LOOP) && NUMBER_OF_CALLEE_SAVES_REGISTERS > 0`
2182         does not work well (Requested by yusukesuzuki on #webkit).
2183
2184         Reverted changeset:
2185
2186         "Unreviewed, build fix for CLoop and Windows after r243886"
2187         https://bugs.webkit.org/show_bug.cgi?id=196387
2188         https://trac.webkit.org/changeset/243898
2189
2190 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
2191
2192         Unreviewed, build fix for CLoop and Windows after r243886
2193         https://bugs.webkit.org/show_bug.cgi?id=196387
2194
2195         RegisterAtOffsetList does not exist if ENABLE(ASSEMBLER) is false.
2196
2197         * interpreter/StackVisitor.cpp:
2198         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
2199         * interpreter/StackVisitor.h:
2200
2201 2019-04-04  Saam barati  <sbarati@apple.com>
2202
2203         Teach Call ICs how to call Wasm
2204         https://bugs.webkit.org/show_bug.cgi?id=196387
2205
2206         Reviewed by Filip Pizlo.
2207
2208         This patch teaches JS to call Wasm without going through the native thunk.
2209         Currently, we emit a JIT "JS" callee stub which marshals arguments from
2210         JS to Wasm. Like the native version of this, this thunk is responsible
2211         for saving and restoring the VM's current Wasm context. Instead of emitting
2212         an exception handler, we also teach the unwinder how to read the previous
2213         wasm context to restore it as it unwindws past this frame.
2214         
2215         This patch is straight forward, and leaves some areas for perf improvement:
2216         - We can teach the DFG/FTL to directly use the Wasm calling convention when
2217           it knows it's calling a single Wasm function. This way we don't shuffle
2218           registers to the stack and then back into registers.
2219         - We bail out to the slow path for mismatched arity. I opened a bug to fix
2220           optimize arity check failures: https://bugs.webkit.org/show_bug.cgi?id=196564
2221         - We bail out to the slow path Double JSValues flowing into i32 arguments.
2222           We should teach this thunk how to do that conversion directly.
2223         
2224         This patch also refactors the code to explicitly have a single pinned size register.
2225         We used pretend in some places that we could have more than one pinned size register.
2226         However, there was other code that just asserted the size was one. This patch just rips
2227         out this code since we never moved to having more than one pinned size register. Doing
2228         this refactoring cleans up the various places where we set up the size register.
2229         
2230         This patch is a 50-60% progression on JetStream 2's richards-wasm.
2231
2232         * JavaScriptCore.xcodeproj/project.pbxproj:
2233         * Sources.txt:
2234         * assembler/MacroAssemblerCodeRef.h:
2235         (JSC::MacroAssemblerCodeRef::operator=):
2236         (JSC::MacroAssemblerCodeRef::MacroAssemblerCodeRef):
2237         * interpreter/Interpreter.cpp:
2238         (JSC::UnwindFunctor::operator() const):
2239         (JSC::UnwindFunctor::copyCalleeSavesToEntryFrameCalleeSavesBuffer const):
2240         * interpreter/StackVisitor.cpp:
2241         (JSC::StackVisitor::Frame::calleeSaveRegistersForUnwinding):
2242         (JSC::StackVisitor::Frame::calleeSaveRegisters): Deleted.
2243         * interpreter/StackVisitor.h:
2244         * jit/JITOperations.cpp:
2245         * jit/RegisterSet.cpp:
2246         (JSC::RegisterSet::runtimeTagRegisters):
2247         (JSC::RegisterSet::specialRegisters):
2248         (JSC::RegisterSet::runtimeRegisters): Deleted.
2249         * jit/RegisterSet.h:
2250         * jit/Repatch.cpp:
2251         (JSC::linkPolymorphicCall):
2252         * runtime/JSFunction.cpp:
2253         (JSC::getCalculatedDisplayName):
2254         * runtime/JSGlobalObject.cpp:
2255         (JSC::JSGlobalObject::init):
2256         (JSC::JSGlobalObject::visitChildren):
2257         * runtime/JSGlobalObject.h:
2258         (JSC::JSGlobalObject::jsToWasmICCalleeStructure const):
2259         * runtime/VM.cpp:
2260         (JSC::VM::VM):
2261         * runtime/VM.h:
2262         * wasm/WasmAirIRGenerator.cpp:
2263         (JSC::Wasm::AirIRGenerator::AirIRGenerator):
2264         (JSC::Wasm::AirIRGenerator::restoreWebAssemblyGlobalState):
2265         (JSC::Wasm::AirIRGenerator::addCallIndirect):
2266         * wasm/WasmB3IRGenerator.cpp:
2267         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
2268         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
2269         (JSC::Wasm::B3IRGenerator::addCallIndirect):
2270         * wasm/WasmBinding.cpp:
2271         (JSC::Wasm::wasmToWasm):
2272         * wasm/WasmContext.h:
2273         (JSC::Wasm::Context::pointerToInstance):
2274         * wasm/WasmContextInlines.h:
2275         (JSC::Wasm::Context::store):
2276         * wasm/WasmMemoryInformation.cpp:
2277         (JSC::Wasm::getPinnedRegisters):
2278         (JSC::Wasm::PinnedRegisterInfo::get):
2279         (JSC::Wasm::PinnedRegisterInfo::PinnedRegisterInfo):
2280         * wasm/WasmMemoryInformation.h:
2281         (JSC::Wasm::PinnedRegisterInfo::toSave const):
2282         * wasm/WasmOMGPlan.cpp:
2283         (JSC::Wasm::OMGPlan::work):
2284         * wasm/js/JSToWasm.cpp:
2285         (JSC::Wasm::createJSToWasmWrapper):
2286         * wasm/js/JSToWasmICCallee.cpp: Added.
2287         (JSC::JSToWasmICCallee::create):
2288         (JSC::JSToWasmICCallee::createStructure):
2289         (JSC::JSToWasmICCallee::visitChildren):
2290         * wasm/js/JSToWasmICCallee.h: Added.
2291         (JSC::JSToWasmICCallee::function):
2292         (JSC::JSToWasmICCallee::JSToWasmICCallee):
2293         * wasm/js/WebAssemblyFunction.cpp:
2294         (JSC::WebAssemblyFunction::useTagRegisters const):
2295         (JSC::WebAssemblyFunction::calleeSaves const):
2296         (JSC::WebAssemblyFunction::usedCalleeSaveRegisters const):
2297         (JSC::WebAssemblyFunction::previousInstanceOffset const):
2298         (JSC::WebAssemblyFunction::previousInstance):
2299         (JSC::WebAssemblyFunction::jsCallEntrypointSlow):
2300         (JSC::WebAssemblyFunction::visitChildren):
2301         (JSC::WebAssemblyFunction::destroy):
2302         * wasm/js/WebAssemblyFunction.h:
2303         * wasm/js/WebAssemblyFunctionHeapCellType.cpp: Added.
2304         (JSC::WebAssemblyFunctionDestroyFunc::operator() const):
2305         (JSC::WebAssemblyFunctionHeapCellType::WebAssemblyFunctionHeapCellType):
2306         (JSC::WebAssemblyFunctionHeapCellType::~WebAssemblyFunctionHeapCellType):
2307         (JSC::WebAssemblyFunctionHeapCellType::finishSweep):
2308         (JSC::WebAssemblyFunctionHeapCellType::destroy):
2309         * wasm/js/WebAssemblyFunctionHeapCellType.h: Added.
2310         * wasm/js/WebAssemblyPrototype.h:
2311
2312 2019-04-04  Yusuke Suzuki  <ysuzuki@apple.com>
2313
2314         [JSC] Pass CodeOrigin to FuzzerAgent
2315         https://bugs.webkit.org/show_bug.cgi?id=196590
2316
2317         Reviewed by Saam Barati.
2318
2319         Pass CodeOrigin instead of bytecodeIndex. CodeOrigin includes richer information (InlineCallFrame*).
2320         We also mask prediction with SpecBytecodeTop in DFGByteCodeParser. The fuzzer can produce any SpeculatedTypes,
2321         but DFGByteCodeParser should only see predictions that can be actually produced from the bytecode execution.
2322
2323         * dfg/DFGByteCodeParser.cpp:
2324         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
2325         * runtime/FuzzerAgent.cpp:
2326         (JSC::FuzzerAgent::getPrediction):
2327         * runtime/FuzzerAgent.h:
2328         * runtime/RandomizingFuzzerAgent.cpp:
2329         (JSC::RandomizingFuzzerAgent::getPrediction):
2330         * runtime/RandomizingFuzzerAgent.h:
2331
2332 2019-04-04  Caio Lima  <ticaiolima@gmail.com>
2333
2334         [JSC] We should consider moving UnlinkedFunctionExecutable::m_parentScopeTDZVariables to RareData
2335         https://bugs.webkit.org/show_bug.cgi?id=194944
2336
2337         Reviewed by Keith Miller.
2338
2339         Based on profile data collected on JetStream2, Speedometer 2 and
2340         other benchmarks, it is very rare having non-empty
2341         UnlinkedFunctionExecutable::m_parentScopeTDZVariables.
2342
2343         - Data collected from Speedometer2
2344             Total number of UnlinkedFunctionExecutable: 39463
2345             Total number of non-empty parentScopeTDZVars: 428 (~1%)
2346
2347         - Data collected from JetStream2
2348             Total number of UnlinkedFunctionExecutable: 83715
2349             Total number of non-empty parentScopeTDZVars: 5285 (~6%)
2350
2351         We also collected numbers on 6 of top 10 Alexia sites.
2352
2353         - Data collected from youtube.com
2354             Total number of UnlinkedFunctionExecutable: 29599
2355             Total number of non-empty parentScopeTDZVars: 97 (~0.3%)
2356
2357         - Data collected from twitter.com
2358             Total number of UnlinkedFunctionExecutable: 23774
2359             Total number of non-empty parentScopeTDZVars: 172 (~0.7%)
2360
2361         - Data collected from google.com
2362             Total number of UnlinkedFunctionExecutable: 33209
2363             Total number of non-empty parentScopeTDZVars: 174 (~0.5%)
2364
2365         - Data collected from amazon.com:
2366             Total number of UnlinkedFunctionExecutable: 15182
2367             Total number of non-empty parentScopeTDZVars: 166 (~1%)
2368
2369         - Data collected from facebook.com:
2370             Total number of UnlinkedFunctionExecutable: 54443
2371             Total number of non-empty parentScopeTDZVars: 269 (~0.4%)
2372
2373         - Data collected from netflix.com:
2374             Total number of UnlinkedFunctionExecutable: 39266
2375             Total number of non-empty parentScopeTDZVars: 97 (~0.2%)
2376
2377         Considering such numbers, this patch is moving `m_parentScopeTDZVariables`
2378         to RareData. This decreases sizeof(UnlinkedFunctionExecutable) by
2379         16 bytes. With this change, now UnlinkedFunctionExecutable constructors
2380         receives an `Optional<VariableEnvironmentMap::Handle>` and only stores
2381         it when `value != WTF::nullopt`. We also changed
2382         UnlinkedFunctionExecutable::parentScopeTDZVariables() and it returns
2383         `VariableEnvironment()` whenever the Executable doesn't have RareData,
2384         or VariableEnvironmentMap::Handle is unitialized. This is required
2385         because RareData is instantiated when any of its field is stored and
2386         we can have an unitialized `Handle` even on cases when parentScopeTDZVariables
2387         is `WTF::nullopt`.
2388
2389         Results on memory usage on JetStrem2 is neutral.
2390
2391             Mean of memory peak on ToT: 4258633728 bytes (confidence interval: 249720072.95)
2392             Mean of memory peak on Changes: 4367325184 bytes (confidence interval: 321285583.61)
2393
2394         * builtins/BuiltinExecutables.cpp:
2395         (JSC::BuiltinExecutables::createExecutable):
2396         * bytecode/UnlinkedFunctionExecutable.cpp:
2397         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2398         * bytecode/UnlinkedFunctionExecutable.h:
2399         * bytecompiler/BytecodeGenerator.cpp:
2400         (JSC::BytecodeGenerator::getVariablesUnderTDZ):
2401
2402         BytecodeGenerator::getVariablesUnderTDZ now also caches if m_cachedVariablesUnderTDZ
2403         is empty, so we can properly return `WTF::nullopt` without the
2404         reconstruction of a VariableEnvironment to check if it is empty.
2405
2406         * bytecompiler/BytecodeGenerator.h:
2407         (JSC::BytecodeGenerator::makeFunction):
2408         * parser/VariableEnvironment.h:
2409         (JSC::VariableEnvironment::isEmpty const):
2410         * runtime/CachedTypes.cpp:
2411         (JSC::CachedCompactVariableMapHandle::decode const):
2412
2413         It returns an unitialized Handle when there is no
2414         CompactVariableEnvironment. This can happen when RareData is ensured
2415         because of another field.
2416
2417         (JSC::CachedFunctionExecutableRareData::encode):
2418         (JSC::CachedFunctionExecutableRareData::decode const):
2419         (JSC::CachedFunctionExecutable::encode):
2420         (JSC::CachedFunctionExecutable::decode const):
2421         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2422         * runtime/CodeCache.cpp:
2423
2424         Instead of creating a dummyVariablesUnderTDZ, we simply pass
2425         WTF::nullopt.
2426
2427         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
2428
2429 2019-04-04  Tadeu Zagallo  <tzagallo@apple.com>
2430
2431         Cache bytecode for jsc.cpp helpers and fix CachedStringImpl
2432         https://bugs.webkit.org/show_bug.cgi?id=196409
2433
2434         Reviewed by Saam Barati.
2435
2436         Some of the helpers in jsc.cpp, such as `functionRunString`, were stll using
2437         using `makeSource` instead of `jscSource`, which does not use the ShellSourceProvider
2438         and therefore does not write the bytecode cache to disk.
2439
2440         Changing that revealed a bug in bytecode cache. The Encoder keeps a mapping
2441         of pointers to offsets of already cached objects, in order to avoid caching
2442         the same object twice. Similarly, the Decoder keeps a mapping from offsets
2443         to pointers, in order to avoid creating multiple objects in memory for the
2444         same cached object. The following was happening:
2445         1) A StringImpl* S was cached as CachedPtr<CachedStringImpl> at offset O. We add
2446         an entry in the Encoder mapping that S has already been encoded at O.
2447         2) We cache StringImpl* S again, but now as CachedPtr<CachedUniquedStringImpl>.
2448         We find an entry in the Encoder mapping for S, and return the offset O. However,
2449         the object cached at O is a CachedPtr<CachedStringImpl> (i.e. not Uniqued).
2450
2451         3) When decoding, there are 2 possibilities:
2452         3.1) We find S for the first time through a CachedPtr<CachedStringImpl>. In
2453         this case, everything works as expected since we add an entry in the decoder
2454         mapping from the offset O to the decoded StringImpl* S. The next time we find
2455         S through the uniqued version, we'll return the already decoded S.
2456         3.2) We find S through a CachedPtr<CachedUniquedStringImpl>. Now we have a
2457         problem, since the CachedPtr has the offset of a CachedStringImpl (not uniqued),
2458         which has a different shape and we crash.
2459
2460         We fix this by making CachedStringImpl and CachedUniquedStringImpl share the
2461         same implementation. Since it doesn't matter whether a string is uniqued for
2462         encoding, and we always decode strings as uniqued either way, they can be used
2463         interchangeably.
2464
2465         * jsc.cpp:
2466         (functionRunString):
2467         (functionLoadString):
2468         (functionDollarAgentStart):
2469         (functionCheckModuleSyntax):
2470         (runInteractive):
2471         * runtime/CachedTypes.cpp:
2472         (JSC::CachedUniquedStringImplBase::decode const):
2473         (JSC::CachedFunctionExecutable::rareData const):
2474         (JSC::CachedCodeBlock::rareData const):
2475         (JSC::CachedFunctionExecutable::encode):
2476         (JSC::CachedCodeBlock<CodeBlockType>::encode):
2477         (JSC::CachedUniquedStringImpl::encode): Deleted.
2478         (JSC::CachedUniquedStringImpl::decode const): Deleted.
2479         (JSC::CachedStringImpl::encode): Deleted.
2480         (JSC::CachedStringImpl::decode const): Deleted.
2481
2482 2019-04-04  Tadeu Zagallo  <tzagallo@apple.com>
2483
2484         UnlinkedCodeBlock constructor from cache should initialize m_didOptimize
2485         https://bugs.webkit.org/show_bug.cgi?id=196396
2486
2487         Reviewed by Saam Barati.
2488
2489         The UnlinkedCodeBlock constructor in CachedTypes was missing the initialization
2490         for m_didOptimize, which leads to crashes in CodeBlock::thresholdForJIT.
2491
2492         * runtime/CachedTypes.cpp:
2493         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
2494
2495 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2496
2497         Unreviewed, rolling in r243843 with the build fix
2498         https://bugs.webkit.org/show_bug.cgi?id=196586
2499
2500         * runtime/Options.cpp:
2501         (JSC::recomputeDependentOptions):
2502         * runtime/Options.h:
2503         * runtime/RandomizingFuzzerAgent.cpp:
2504         (JSC::RandomizingFuzzerAgent::getPrediction):
2505
2506 2019-04-03  Ryan Haddad  <ryanhaddad@apple.com>
2507
2508         Unreviewed, rolling out r243843.
2509
2510         Broke CLoop and Windows builds.
2511
2512         Reverted changeset:
2513
2514         "[JSC] Add dump feature for RandomizingFuzzerAgent"
2515         https://bugs.webkit.org/show_bug.cgi?id=196586
2516         https://trac.webkit.org/changeset/243843
2517
2518 2019-04-03  Robin Morisset  <rmorisset@apple.com>
2519
2520         B3 should use associativity to optimize expression trees
2521         https://bugs.webkit.org/show_bug.cgi?id=194081
2522
2523         Reviewed by Filip Pizlo.
2524
2525         This patch adds a new B3 pass, that tries to find and optimize expression trees made purely of any one associative and commutative operator (Add/Mul/BitOr/BitAnd/BitXor).
2526         The pass only runs in O2, and runs once, after lowerMacros and just before a run of B3ReduceStrength (which helps clean up the dead code it tends to leave behind).
2527         I had to separate killDeadCode out of B3ReduceStrength (as a new B3EliminateDeadCode pass) to run it before B3OptimizeAssociativeExpressionTrees, as otherwise it is stopped by high use counts
2528         inherited from CSE.
2529         This extra run of DCE is by itself a win, most notably on microbenchmarks/instanceof-always-hit-two (1.5x faster), and on microbenchmarks/licm-dragons(-out-of-bounds) (both get 1.16x speedup).
2530         I suspect it is because it runs between CSE and tail-dedup, and as a result allows a lot more tail-dedup to occur.
2531
2532         The pass is currently extremely conservative, not trying anything if it would cause _any_ code duplication.
2533         For this purpose, it starts by computing use counts for the potentially interesting nodes (those with the right opcodes), and segregate them into expression trees.
2534         The root of an expression tree is a node that is either used in multiple places, or is used by a value with a different opcode.
2535         The leaves of an expression tree are nodes that are either used in multiple places, or have a different opcode.
2536         All constant leaves of a tree are combined, as well as all leaves that are identical. What remains is then laid out into a balanced binary tree, hopefully maximizing ILP.
2537
2538         This optimization was implemented as a stand-alone pass and not as part of B3ReduceStrength mostly because it needs use counts to avoid code duplication.
2539         It also benefits from finding all tree roots first, and not trying to repeatedly optimize subtrees.
2540
2541         I added several tests to testB3 with varying patterns of trees. It is also tested in a less focused way by lots of older tests.
2542
2543         In the future this pass could be expanded to allow some bounded amount of code duplication, and merging more leaves (e.g. Mul(a, 3) and a in an Add tree, into Mul(a, 4))
2544         The latter will need exposing the peephole optimizations out of B3ReduceStrength to avoid duplicating code.
2545
2546         * JavaScriptCore.xcodeproj/project.pbxproj:
2547         * Sources.txt:
2548         * b3/B3Common.cpp:
2549         (JSC::B3::shouldDumpIR):
2550         (JSC::B3::shouldDumpIRAtEachPhase):
2551         * b3/B3Common.h:
2552         * b3/B3EliminateDeadCode.cpp: Added.
2553         (JSC::B3::EliminateDeadCode::run):
2554         (JSC::B3::eliminateDeadCode):
2555         * b3/B3EliminateDeadCode.h: Added.
2556         (JSC::B3::EliminateDeadCode::EliminateDeadCode):
2557         * b3/B3Generate.cpp:
2558         (JSC::B3::generateToAir):
2559         * b3/B3OptimizeAssociativeExpressionTrees.cpp: Added.
2560         (JSC::B3::OptimizeAssociativeExpressionTrees::OptimizeAssociativeExpressionTrees):
2561         (JSC::B3::OptimizeAssociativeExpressionTrees::neutralElement):
2562         (JSC::B3::OptimizeAssociativeExpressionTrees::isAbsorbingElement):
2563         (JSC::B3::OptimizeAssociativeExpressionTrees::combineConstants):
2564         (JSC::B3::OptimizeAssociativeExpressionTrees::emitValue):
2565         (JSC::B3::OptimizeAssociativeExpressionTrees::optimizeRootedTree):
2566         (JSC::B3::OptimizeAssociativeExpressionTrees::run):
2567         (JSC::B3::optimizeAssociativeExpressionTrees):
2568         * b3/B3OptimizeAssociativeExpressionTrees.h: Added.
2569         * b3/B3ReduceStrength.cpp:
2570         * b3/B3Value.cpp:
2571         (JSC::B3::Value::replaceWithIdentity):
2572         * b3/testb3.cpp:
2573         (JSC::B3::testBitXorTreeArgs):
2574         (JSC::B3::testBitXorTreeArgsEven):
2575         (JSC::B3::testBitXorTreeArgImm):
2576         (JSC::B3::testAddTreeArg32):
2577         (JSC::B3::testMulTreeArg32):
2578         (JSC::B3::testBitAndTreeArg32):
2579         (JSC::B3::testBitOrTreeArg32):
2580         (JSC::B3::run):
2581
2582 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2583
2584         [JSC] Add dump feature for RandomizingFuzzerAgent
2585         https://bugs.webkit.org/show_bug.cgi?id=196586
2586
2587         Reviewed by Saam Barati.
2588
2589         Towards deterministic tests for the results from randomizing fuzzer agent, this patch adds Options::dumpRandomizingFuzzerAgentPredictions, which dumps the generated types.
2590         The results is like this.
2591
2592             getPrediction name:(#C2q9xD),bytecodeIndex:(22),original:(Array),generated:(OtherObj|Array|Float64Array|BigInt|NonIntAsDouble)
2593             getPrediction name:(makeUnwriteableUnconfigurableObject#AiEJv1),bytecodeIndex:(14),original:(OtherObj),generated:(Final|Uint8Array|Float64Array|SetObject|WeakSetObject|BigInt|NonIntAsDouble)
2594
2595         * runtime/Options.cpp:
2596         (JSC::recomputeDependentOptions):
2597         * runtime/Options.h:
2598         * runtime/RandomizingFuzzerAgent.cpp:
2599         (JSC::RandomizingFuzzerAgent::getPrediction):
2600
2601 2019-04-03  Myles C. Maxfield  <mmaxfield@apple.com>
2602
2603         -apple-trailing-word is needed for browser detection
2604         https://bugs.webkit.org/show_bug.cgi?id=196575
2605
2606         Unreviewed.
2607
2608         * Configurations/FeatureDefines.xcconfig:
2609
2610 2019-04-03  Michael Saboff  <msaboff@apple.com>
2611
2612         REGRESSION (r243642): com.apple.JavaScriptCore crash in JSC::RegExpObject::execInline
2613         https://bugs.webkit.org/show_bug.cgi?id=196477
2614
2615         Reviewed by Keith Miller.
2616
2617         The problem here is that when we advance the index by 2 for a character class that only
2618         has non-BMP characters, we might go past the end of the string.  This can happen for
2619         greedy counted character classes that are part of a alternative where there is one
2620         character to match after the greedy non-BMP character class.
2621
2622         The "do we have string left to match" check at the top of the JIT loop for the counted
2623         character class checks to see if index is not equal to the string length.  For non-BMP
2624         character classes, we need to check to see if there are at least 2 characters left.
2625         Therefore we now temporarily add 1 to the current index before comparing.  This checks
2626         to see if there are iat least 2 characters left to match, instead of 1.
2627
2628         * yarr/YarrJIT.cpp:
2629         (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy):
2630         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
2631
2632 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2633
2634         [JSC] Exception verification crash on operationArrayIndexOfValueInt32OrContiguous
2635         https://bugs.webkit.org/show_bug.cgi?id=196574
2636
2637         Reviewed by Saam Barati.
2638
2639         This patch adds missing exception check in operationArrayIndexOfValueInt32OrContiguous.
2640
2641         * dfg/DFGOperations.cpp:
2642
2643 2019-04-03  Don Olmstead  <don.olmstead@sony.com>
2644
2645         [CMake][WTF] Mirror XCode header directories
2646         https://bugs.webkit.org/show_bug.cgi?id=191662
2647
2648         Reviewed by Konstantin Tokarev.
2649
2650         Use WTFFramework as a dependency and include frameworks/WTF.cmake for AppleWin internal
2651         builds.
2652
2653         * CMakeLists.txt:
2654         * shell/CMakeLists.txt:
2655
2656 2019-04-03  Yusuke Suzuki  <ysuzuki@apple.com>
2657
2658         [JSC] Add FuzzerAgent, which has a hooks to get feedback & inject fuzz data into JSC
2659         https://bugs.webkit.org/show_bug.cgi?id=196530
2660
2661         Reviewed by Saam Barati.
2662
2663         This patch adds FuzzerAgent interface and simple RandomizingFuzzerAgent to JSC.
2664         This RandomizingFuzzerAgent returns random SpeculatedType for value profiling to find
2665         the issues in JSC. The seed for randomization can be specified by seedOfRandomizingFuzzerAgent.
2666
2667         I ran this with seedOfRandomizingFuzzerAgent=1 last night and it finds 3 failures in the current JSC tests,
2668         they should be fixed in subsequent patches.
2669
2670         * CMakeLists.txt:
2671         * JavaScriptCore.xcodeproj/project.pbxproj:
2672         * Sources.txt:
2673         * dfg/DFGByteCodeParser.cpp:
2674         (JSC::DFG::ByteCodeParser::getPredictionWithoutOSRExit):
2675         * runtime/FuzzerAgent.cpp: Added.
2676         (JSC::FuzzerAgent::~FuzzerAgent):
2677         (JSC::FuzzerAgent::getPrediction):
2678         * runtime/FuzzerAgent.h: Added.
2679         * runtime/JSGlobalObjectFunctions.cpp:
2680         * runtime/Options.h:
2681         * runtime/RandomizingFuzzerAgent.cpp: Added.
2682         (JSC::RandomizingFuzzerAgent::RandomizingFuzzerAgent):
2683         (JSC::RandomizingFuzzerAgent::getPrediction):
2684         * runtime/RandomizingFuzzerAgent.h: Added.
2685         * runtime/RegExpCachedResult.h:
2686         * runtime/RegExpGlobalData.cpp:
2687         * runtime/VM.cpp:
2688         (JSC::VM::VM):
2689         * runtime/VM.h:
2690         (JSC::VM::fuzzerAgent const):
2691         (JSC::VM::setFuzzerAgent):
2692
2693 2019-04-03  Myles C. Maxfield  <mmaxfield@apple.com>
2694
2695         Remove support for -apple-trailing-word
2696         https://bugs.webkit.org/show_bug.cgi?id=196525
2697
2698         Reviewed by Zalan Bujtas.
2699
2700         This CSS property is nonstandard and not used.
2701
2702         * Configurations/FeatureDefines.xcconfig:
2703
2704 2019-04-03  Joseph Pecoraro  <pecoraro@apple.com>
2705
2706         Web Inspector: Remote Inspector indicate callback should always happen on the main thread
2707         https://bugs.webkit.org/show_bug.cgi?id=196513
2708         <rdar://problem/49498284>
2709
2710         Reviewed by Devin Rousso.
2711
2712         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
2713         (Inspector::RemoteInspector::receivedIndicateMessage):
2714         When we have a WebThread, don't just run on the WebThread,
2715         run on the MainThread with the WebThreadLock.
2716
2717 2019-04-02  Michael Saboff  <msaboff@apple.com>
2718
2719         Crash in Options::setOptions() using --configFile option and libgmalloc
2720         https://bugs.webkit.org/show_bug.cgi?id=196506
2721
2722         Reviewed by Keith Miller.
2723
2724         Changed to call CString::data() while making the call to Options::setOptions().  This keeps
2725         the implicit CString temporary alive until after setOptions() returns.
2726
2727         * runtime/ConfigFile.cpp:
2728         (JSC::ConfigFile::parse):
2729
2730 2019-04-02  Fujii Hironori  <Hironori.Fujii@sony.com>
2731
2732         [CMake] WEBKIT_MAKE_FORWARDING_HEADERS shouldn't use POST_BUILD to copy generated headers
2733         https://bugs.webkit.org/show_bug.cgi?id=182757
2734
2735         Reviewed by Don Olmstead.
2736
2737         * CMakeLists.txt: Do not use DERIVED_SOURCE_DIRECTORIES parameter
2738         of WEBKIT_MAKE_FORWARDING_HEADERS. Added generated headers to
2739         JavaScriptCore_PRIVATE_FRAMEWORK_HEADERS.
2740
2741 2019-04-02  Saam barati  <sbarati@apple.com>
2742
2743         Add a ValueRepReduction phase
2744         https://bugs.webkit.org/show_bug.cgi?id=196234
2745
2746         Reviewed by Filip Pizlo.
2747
2748         This patch adds a ValueRepReduction phase. The main idea here is
2749         to try to reduce DoubleRep(RealNumberUse:ValueRep(DoubleRepUse:@x))
2750         to just be @x. This patch handles such above strengh reduction rules
2751         as long as we prove that all users of the ValueRep can be converted
2752         to using the incoming double value. That way we prevent introducing
2753         a parallel live range for the double value.
2754         
2755         This patch tracks the uses of the ValueRep through Phi variables,
2756         so we can convert entire Phi variables to being Double instead
2757         of JSValue if the Phi also has only double uses.
2758         
2759         This is implemented through a simple escape analysis. DoubleRep(RealNumberUse:)
2760         and OSR exit hints are not counted as escapes. All other uses are counted
2761         as escapes. Connected Phi graphs are converted to being Double only if the
2762         entire graph is ok with the result being Double.
2763         
2764         Some ways we could extend this phase in the future:
2765         - There are a lot of DoubleRep(NumberUse:@ValueRep(@x)) uses. This ensures
2766           that the result of the DoubleRep of @x is not impure NaN. We could
2767           handle this case if we introduced a PurifyNaN node and replace the DoubleRep
2768           with PurifyNaN(@x). Alternatively, we could see if certain users of this
2769           DoubleRep are okay with impure NaN flowing into them and we'd need to ensure
2770           their output type is always treated as if the input is impure NaN.
2771         - We could do sinking of ValueRep where we think it's profitable. So instead
2772           of an escape making it so we never represent the variable as a Double, we
2773           could make the escape reconstruct the JSValueRep where profitable.
2774         - We can extend this phase to handle Int52Rep if it's profitable.
2775         - We can opt other nodes into accepting incoming Doubles so we no longer
2776           treat them as escapes.
2777         
2778         This patch is somewhere between neutral and a 1% progression on JetStream 2.
2779
2780         * JavaScriptCore.xcodeproj/project.pbxproj:
2781         * Sources.txt:
2782         * dfg/DFGPlan.cpp:
2783         (JSC::DFG::Plan::compileInThreadImpl):
2784         * dfg/DFGValueRepReductionPhase.cpp: Added.
2785         (JSC::DFG::ValueRepReductionPhase::ValueRepReductionPhase):
2786         (JSC::DFG::ValueRepReductionPhase::run):
2787         (JSC::DFG::ValueRepReductionPhase::convertValueRepsToDouble):
2788         (JSC::DFG::performValueRepReduction):
2789         * dfg/DFGValueRepReductionPhase.h: Added.
2790         * runtime/Options.h:
2791
2792 2019-04-01  Yusuke Suzuki  <ysuzuki@apple.com>
2793
2794         [JSC] JSRunLoopTimer::Manager should be small
2795         https://bugs.webkit.org/show_bug.cgi?id=196425
2796
2797         Reviewed by Darin Adler.
2798
2799         Using very large Key or Value in HashMap potentially bloats memory since HashMap pre-allocates large size of
2800         memory ((sizeof(Key) + sizeof(Value)) * N) for its backing storage's array. Using std::unique_ptr<> for JSRunLoopTimer's
2801         PerVMData to keep HashMap's backing store size small.
2802
2803         * runtime/JSRunLoopTimer.cpp:
2804         (JSC::JSRunLoopTimer::Manager::timerDidFire):
2805         (JSC::JSRunLoopTimer::Manager::registerVM):
2806         (JSC::JSRunLoopTimer::Manager::scheduleTimer):
2807         (JSC::JSRunLoopTimer::Manager::cancelTimer):
2808         (JSC::JSRunLoopTimer::Manager::timeUntilFire):
2809         (JSC::JSRunLoopTimer::Manager::didChangeRunLoop):
2810         * runtime/JSRunLoopTimer.h:
2811
2812 2019-04-01  Stephan Szabo  <stephan.szabo@sony.com>
2813
2814         [PlayStation] Add initialization for JSC shell for PlayStation port
2815         https://bugs.webkit.org/show_bug.cgi?id=195411
2816
2817         Reviewed by Ross Kirsling.
2818
2819         Add ps options
2820
2821         * shell/PlatformPlayStation.cmake: Added.
2822         * shell/playstation/Initializer.cpp: Added.
2823         (initializer):
2824
2825 2019-04-01  Michael Catanzaro  <mcatanzaro@igalia.com>
2826
2827         Stop trying to support building JSC with clang 3.8
2828         https://bugs.webkit.org/show_bug.cgi?id=195947
2829         <rdar://problem/49069219>
2830
2831         Reviewed by Darin Adler.
2832
2833         It seems WebKit hasn't built with clang 3.8 in a while, no devs are using this compiler, we
2834         don't know how much effort it would be to make JSC work again, and it's making the code
2835         worse. Remove my hacks to support clang 3.8 from JSC.
2836
2837         * bindings/ScriptValue.cpp:
2838         (Inspector::jsToInspectorValue):
2839         * bytecode/GetterSetterAccessCase.cpp:
2840         (JSC::GetterSetterAccessCase::create):
2841         (JSC::GetterSetterAccessCase::clone const):
2842         * bytecode/InstanceOfAccessCase.cpp:
2843         (JSC::InstanceOfAccessCase::clone const):
2844         * bytecode/IntrinsicGetterAccessCase.cpp:
2845         (JSC::IntrinsicGetterAccessCase::clone const):
2846         * bytecode/ModuleNamespaceAccessCase.cpp:
2847         (JSC::ModuleNamespaceAccessCase::clone const):
2848         * bytecode/ProxyableAccessCase.cpp:
2849         (JSC::ProxyableAccessCase::clone const):
2850
2851 2019-03-31  Yusuke Suzuki  <ysuzuki@apple.com>
2852
2853         [JSC] Butterfly allocation from LargeAllocation should try "realloc" behavior if collector thread is not active
2854         https://bugs.webkit.org/show_bug.cgi?id=196160
2855
2856         Reviewed by Saam Barati.
2857
2858         "realloc" can be effective in terms of peak/current memory footprint when realloc succeeds because,
2859
2860         1. It does not allocate additional memory while expanding a vector
2861         2. It does not deallocate an old memory, just reusing the current memory by expanding, so that memory footprint is tight even before scavenging
2862
2863         We found that we can "realloc" large butterflies in certain conditions are met because,
2864
2865         1. If it goes to LargeAllocation, this memory region is never reused until GC sweeps it.
2866         2. Butterflies are owned by owner JSObjects, so we know the lifetime of Butterflies.
2867
2868         This patch attempts to use "realloc" onto butterflies if,
2869
2870         1. Butterflies are allocated in LargeAllocation kind
2871         2. Concurrent collector is not active
2872         3. Butterflies do not have property storage
2873
2874         The condition (2) is required to avoid deallocating butterflies while the concurrent collector looks into it. The condition (3) is
2875         also required to avoid deallocating butterflies while the concurrent compiler looks into it.
2876
2877         We also change LargeAllocation mechanism to using "malloc" and "free" instead of "posix_memalign". This allows us to use "realloc"
2878         safely in all the platforms. Since LargeAllocation uses alignment to distinguish LargeAllocation and MarkedBlock, we manually adjust
2879         16B alignment by allocating 8B more memory in "malloc".
2880
2881         Speedometer2 and JetStream2 are neutral. RAMification shows about 1% progression (even in some of JIT tests).
2882
2883         * heap/AlignedMemoryAllocator.h:
2884         * heap/CompleteSubspace.cpp:
2885         (JSC::CompleteSubspace::tryAllocateSlow):
2886         (JSC::CompleteSubspace::reallocateLargeAllocationNonVirtual):
2887         * heap/CompleteSubspace.h:
2888         * heap/FastMallocAlignedMemoryAllocator.cpp:
2889         (JSC::FastMallocAlignedMemoryAllocator::tryAllocateMemory):
2890         (JSC::FastMallocAlignedMemoryAllocator::freeMemory):
2891         (JSC::FastMallocAlignedMemoryAllocator::tryReallocateMemory):
2892         * heap/FastMallocAlignedMemoryAllocator.h:
2893         * heap/GigacageAlignedMemoryAllocator.cpp:
2894         (JSC::GigacageAlignedMemoryAllocator::tryAllocateMemory):
2895         (JSC::GigacageAlignedMemoryAllocator::freeMemory):
2896         (JSC::GigacageAlignedMemoryAllocator::tryReallocateMemory):
2897         * heap/GigacageAlignedMemoryAllocator.h:
2898         * heap/IsoAlignedMemoryAllocator.cpp:
2899         (JSC::IsoAlignedMemoryAllocator::tryAllocateMemory):
2900         (JSC::IsoAlignedMemoryAllocator::freeMemory):
2901         (JSC::IsoAlignedMemoryAllocator::tryReallocateMemory):
2902         * heap/IsoAlignedMemoryAllocator.h:
2903         * heap/LargeAllocation.cpp:
2904         (JSC::isAlignedForLargeAllocation):
2905         (JSC::LargeAllocation::tryCreate):
2906         (JSC::LargeAllocation::tryReallocate):
2907         (JSC::LargeAllocation::LargeAllocation):
2908         (JSC::LargeAllocation::destroy):
2909         * heap/LargeAllocation.h:
2910         (JSC::LargeAllocation::indexInSpace):
2911         (JSC::LargeAllocation::setIndexInSpace):
2912         (JSC::LargeAllocation::basePointer const):
2913         * heap/MarkedSpace.cpp:
2914         (JSC::MarkedSpace::sweepLargeAllocations):
2915         (JSC::MarkedSpace::prepareForConservativeScan):
2916         * heap/WeakSet.h:
2917         (JSC::WeakSet::isTriviallyDestructible const):
2918         * runtime/Butterfly.h:
2919         * runtime/ButterflyInlines.h:
2920         (JSC::Butterfly::reallocArrayRightIfPossible):
2921         * runtime/JSObject.cpp:
2922         (JSC::JSObject::ensureLengthSlow):
2923
2924 2019-03-31  Sam Weinig  <weinig@apple.com>
2925
2926         Remove more i386 specific configurations
2927         https://bugs.webkit.org/show_bug.cgi?id=196430
2928
2929         Reviewed by Alexey Proskuryakov.
2930
2931         * Configurations/FeatureDefines.xcconfig:
2932         ENABLE_WEB_AUTHN_macosx can now be enabled unconditionally on macOS.
2933
2934         * Configurations/ToolExecutable.xcconfig:
2935         ARC can be enabled unconditionally now.
2936
2937 2019-03-29  Yusuke Suzuki  <ysuzuki@apple.com>
2938
2939         [JSC] JSWrapperMap should not use Objective-C Weak map (NSMapTable with NSPointerFunctionsWeakMemory) for m_cachedObjCWrappers
2940         https://bugs.webkit.org/show_bug.cgi?id=196392
2941
2942         Reviewed by Saam Barati.
2943
2944         Weak representation in Objective-C is surprisingly costly in terms of memory. We can see that very easy program shows 10KB memory consumption due to
2945         this weak wrapper map in JavaScriptCore.framework. But we do not need this weak map since Objective-C JSValue has a dealloc. We can unregister itself
2946         from the map when it is deallocated without using Objective-C weak mechanism. And since Objective-C JSValue is tightly coupled to a specific JSContext,
2947         and wrapper map is created per JSContext, JSValue wrapper and actual JavaScriptCore value is one-on-one, and [JSValue dealloc] knows which JSContext's
2948         wrapper map holds itself.
2949
2950         1. We do not use Objective-C weak mechanism. We use WTF::HashSet instead. When JSValue is allocated, we register it to JSWrapperMap's HashSet. And unregister
2951            JSValue from this map when JSValue is deallocated.
2952         2. We use HashSet<JSValue> (logically) instead of HashMap<JSValueRef, JSValue> to keep JSValueRef and JSValue relationship. We can achieve it because JSValue
2953            holds JSValueRef inside it.
2954
2955         * API/JSContext.mm:
2956         (-[JSContext removeWrapper:]):
2957         * API/JSContextInternal.h:
2958         * API/JSValue.mm:
2959         (-[JSValue dealloc]):
2960         (-[JSValue initWithValue:inContext:]):
2961         * API/JSWrapperMap.h:
2962         * API/JSWrapperMap.mm:
2963         (WrapperKey::hashTableDeletedValue):
2964         (WrapperKey::WrapperKey):
2965         (WrapperKey::isHashTableDeletedValue const):
2966         (WrapperKey::Hash::hash):
2967         (WrapperKey::Hash::equal):
2968         (WrapperKey::Traits::isEmptyValue):
2969         (WrapperKey::Translator::hash):
2970         (WrapperKey::Translator::equal):
2971         (WrapperKey::Translator::translate):
2972         (-[JSWrapperMap initWithGlobalContextRef:]):
2973         (-[JSWrapperMap dealloc]):
2974         (-[JSWrapperMap objcWrapperForJSValueRef:inContext:]):
2975         (-[JSWrapperMap removeWrapper:]):
2976         * API/tests/testapi.mm:
2977         (testObjectiveCAPIMain):
2978
2979 2019-03-29  Robin Morisset  <rmorisset@apple.com>
2980
2981         B3ReduceStrength should know that Mul distributes over Add and Sub
2982         https://bugs.webkit.org/show_bug.cgi?id=196325
2983
2984         Reviewed by Michael Saboff.
2985
2986         In this patch I add the following patterns to B3ReduceStrength:
2987         - Turn this: Integer Neg(Mul(value, c))
2988           Into this: Mul(value, -c), as long as -c does not overflow
2989         - Turn these: Integer Mul(value, Neg(otherValue)) and Integer Mul(Neg(value), otherValue)
2990           Into this: Neg(Mul(value, otherValue))
2991         - For Op==Add or Sub, turn any of these:
2992              Op(Mul(x1, x2), Mul(x1, x3))
2993              Op(Mul(x2, x1), Mul(x1, x3))
2994              Op(Mul(x1, x2), Mul(x3, x1))
2995              Op(Mul(x2, x1), Mul(x3, x1))
2996           Into this: Mul(x1, Op(x2, x3))
2997
2998         Also includes a trivial change: a similar reduction for the distributivity of BitAnd over BitOr/BitXor now
2999         emits the arguments to BitAnd in the other order, to minimize the probability that we'll spend a full fixpoint step just to flip them.
3000
3001         * b3/B3ReduceStrength.cpp:
3002         * b3/testb3.cpp:
3003         (JSC::B3::testAddMulMulArgs):
3004         (JSC::B3::testMulArgNegArg):
3005         (JSC::B3::testMulNegArgArg):
3006         (JSC::B3::testNegMulArgImm):
3007         (JSC::B3::testSubMulMulArgs):
3008         (JSC::B3::run):
3009
3010 2019-03-29  Yusuke Suzuki  <ysuzuki@apple.com>
3011
3012         [JSC] Remove distancing for LargeAllocation
3013         https://bugs.webkit.org/show_bug.cgi?id=196335
3014
3015         Reviewed by Saam Barati.
3016
3017         In r230226, we removed distancing feature from our GC. This patch removes remaining distancing thing in LargeAllocation.
3018
3019         * heap/HeapCell.h:
3020         * heap/LargeAllocation.cpp:
3021         (JSC::LargeAllocation::tryCreate):
3022         * heap/MarkedBlock.h:
3023
3024 2019-03-29  Myles C. Maxfield  <mmaxfield@apple.com>
3025
3026         Delete WebMetal implementation in favor of WebGPU
3027         https://bugs.webkit.org/show_bug.cgi?id=195418
3028
3029         Reviewed by Dean Jackson.
3030
3031         * Configurations/FeatureDefines.xcconfig:
3032         * inspector/protocol/Canvas.json:
3033         * inspector/scripts/codegen/generator.py:
3034
3035 2019-03-29  Tadeu Zagallo  <tzagallo@apple.com>
3036
3037         Assertion failed in JSC::createError
3038         https://bugs.webkit.org/show_bug.cgi?id=196305
3039         <rdar://problem/49387382>
3040
3041         Reviewed by Saam Barati.
3042
3043         JSC::createError assumes that `errorDescriptionForValue` will either
3044         throw an exception or return a valid description string. However, that
3045         is not true if the value is a rope string and we successfully resolve it,
3046         but later fail to wrap the string in quotes with `tryMakeString`.
3047
3048         * runtime/ExceptionHelpers.cpp:
3049         (JSC::createError):
3050
3051 2019-03-29  Devin Rousso  <drousso@apple.com>
3052
3053         Web Inspector: add fast returns for instrumentation hooks that have no affect before a frontend is connected
3054         https://bugs.webkit.org/show_bug.cgi?id=196382
3055         <rdar://problem/49403417>
3056
3057         Reviewed by Joseph Pecoraro.
3058
3059         Ensure that all instrumentation hooks use `FAST_RETURN_IF_NO_FRONTENDS` or check that
3060         `developerExtrasEnabled`. There should be no activity to/from any inspector objects until
3061         developer extras are enabled.
3062
3063         * inspector/agents/InspectorConsoleAgent.cpp:
3064         (Inspector::InspectorConsoleAgent::startTiming):
3065         (Inspector::InspectorConsoleAgent::stopTiming):
3066         (Inspector::InspectorConsoleAgent::count):
3067         (Inspector::InspectorConsoleAgent::addConsoleMessage):
3068
3069 2019-03-29  Cathie Chen  <cathiechen@igalia.com>
3070
3071         Implement ResizeObserver.
3072         https://bugs.webkit.org/show_bug.cgi?id=157743
3073
3074         Reviewed by Simon Fraser.
3075
3076         Add ENABLE_RESIZE_OBSERVER.
3077
3078         * Configurations/FeatureDefines.xcconfig:
3079
3080 2019-03-28  Michael Saboff  <msaboff@apple.com>
3081
3082         [YARR] Precompute BMP / non-BMP status when constructing character classes
3083         https://bugs.webkit.org/show_bug.cgi?id=196296
3084
3085         Reviewed by Keith Miller.
3086
3087         Changed CharacterClass::m_hasNonBMPCharacters into a character width bit field which
3088         indicateis if the class includes characters from either BMP, non-BMP or both ranges.
3089         This allows the recognizing code to eliminate checks for the width of a matched
3090         characters when the class has only one width.  The character width is needed to
3091         determine if we advance 1 or 2 character.  Also, the pre-computed width of character
3092         classes that contains either all BMP or all non-BMP characters allows the parser to
3093         use fixed widths for terms using those character classes.  Changed both the code gen
3094         scripts and Yarr compiler to compute this bit field during the construction of
3095         character classes.
3096
3097         For JIT'ed code of character classes that contain either all BMP or all non-BMP
3098         characters, we can eliminate the generic check we were doing do compute how much
3099         to advance after sucessfully matching a character in the class.
3100
3101                 Generic isBMP check      BMP only            non-BMP only
3102                 --------------           --------------      --------------
3103                 inc %r9d                 inc %r9d            add $0x2, %r9d
3104                 cmp $0x10000, %eax
3105                 jl isBMP
3106                 cmp %edx, %esi
3107                 jz atEndOfString
3108                 inc %r9d
3109                 inc %esi
3110          isBMP:
3111
3112         For character classes that contained non-BMP characters, we were always generating
3113         the code in the left column.  The middle column is the code we generate for character
3114         classes that contain only BMP characters.  The right column is the code we now
3115         generate if the character class has only non-BMP characters.  In the fix width cases,
3116         we can eliminate both the isBMP check as well as the atEndOfString check.  The
3117         atEndOfstring check is eliminated since we know how many characters this character
3118         class requires and that check can be factored out to the beginning of the current
3119         alternative.  For character classes that contain both BMP and non-BMP characters,
3120         we still generate the generic left column.
3121
3122         This change is a ~8% perf progression on UniPoker and a ~2% improvement on RexBench
3123         as a whole.
3124
3125         * runtime/RegExp.cpp:
3126         (JSC::RegExp::matchCompareWithInterpreter):
3127         * runtime/RegExpInlines.h:
3128         (JSC::RegExp::matchInline):
3129         * yarr/YarrInterpreter.cpp:
3130         (JSC::Yarr::Interpreter::checkCharacterClassDontAdvanceInputForNonBMP):
3131         (JSC::Yarr::Interpreter::matchCharacterClass):
3132         * yarr/YarrJIT.cpp:
3133         (JSC::Yarr::YarrGenerator::optimizeAlternative):
3134         (JSC::Yarr::YarrGenerator::matchCharacterClass):
3135         (JSC::Yarr::YarrGenerator::advanceIndexAfterCharacterClassTermMatch):
3136         (JSC::Yarr::YarrGenerator::tryReadUnicodeCharImpl):
3137         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
3138         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
3139         (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy):
3140         (JSC::Yarr::YarrGenerator::backtrackCharacterClassGreedy):
3141         (JSC::Yarr::YarrGenerator::generateCharacterClassNonGreedy):
3142         (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy):
3143         (JSC::Yarr::YarrGenerator::generateEnter):
3144         (JSC::Yarr::YarrGenerator::YarrGenerator):
3145         (JSC::Yarr::YarrGenerator::compile):
3146         * yarr/YarrPattern.cpp:
3147         (JSC::Yarr::CharacterClassConstructor::CharacterClassConstructor):
3148         (JSC::Yarr::CharacterClassConstructor::reset):
3149         (JSC::Yarr::CharacterClassConstructor::charClass):
3150         (JSC::Yarr::CharacterClassConstructor::addSorted):
3151         (JSC::Yarr::CharacterClassConstructor::addSortedRange):
3152         (JSC::Yarr::CharacterClassConstructor::hasNonBMPCharacters):
3153         (JSC::Yarr::CharacterClassConstructor::characterWidths):
3154         (JSC::Yarr::PatternTerm::dump):
3155         (JSC::Yarr::anycharCreate):
3156         * yarr/YarrPattern.h:
3157         (JSC::Yarr::operator|):
3158         (JSC::Yarr::operator&):
3159         (JSC::Yarr::operator|=):
3160         (JSC::Yarr::CharacterClass::CharacterClass):
3161         (JSC::Yarr::CharacterClass::hasNonBMPCharacters):
3162         (JSC::Yarr::CharacterClass::hasOneCharacterSize):
3163         (JSC::Yarr::CharacterClass::hasOnlyNonBMPCharacters):
3164         (JSC::Yarr::PatternTerm::invert const):
3165         (JSC::Yarr::PatternTerm::invert): Deleted.
3166         * yarr/create_regex_tables:
3167         * yarr/generateYarrUnicodePropertyTables.py:
3168
3169 2019-03-28  Saam Barati  <sbarati@apple.com>
3170
3171         BackwardsGraph needs to consider back edges as the backward's root successor
3172         https://bugs.webkit.org/show_bug.cgi?id=195991
3173
3174         Reviewed by Filip Pizlo.
3175
3176         * b3/testb3.cpp:
3177         (JSC::B3::testInfiniteLoopDoesntCauseBadHoisting):
3178         (JSC::B3::run):
3179
3180 2019-03-28  Fujii Hironori  <Hironori.Fujii@sony.com>
3181
3182         Opcode.h(159,27): warning: adding 'unsigned int' to a string does not append to the string [-Wstring-plus-int]
3183         https://bugs.webkit.org/show_bug.cgi?id=196343
3184
3185         Reviewed by Saam Barati.
3186
3187         Clang reports a compilation warning and recommend '&PADDING_STRING[PADDING_STRING_LENGTH]'
3188         instead of 'PADDING_STRING + PADDING_STRING_LENGTH'.
3189
3190         * bytecode/Opcode.cpp:
3191         (JSC::padOpcodeName): Moved padOpcodeName from Opcode.h because
3192         this function is used only in Opcode.cpp. Changed macros
3193         PADDING_STRING and PADDING_STRING_LENGTH to simple variables.
3194         (JSC::compareOpcodePairIndices): Replaced pair with std::pair.
3195         * bytecode/Opcode.h:
3196         (JSC::padOpcodeName): Moved.
3197
3198 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
3199
3200         CodeBlock::jettison() should disallow repatching its own calls
3201         https://bugs.webkit.org/show_bug.cgi?id=196359
3202         <rdar://problem/48973663>
3203
3204         Reviewed by Saam Barati.
3205
3206         CodeBlock::jettison() calls CommonData::invalidate, which replaces the `hlt`
3207         instruction with the jump to OSR exit. However, if the `hlt` was immediately
3208         followed by a call to the CodeBlock being jettisoned, we would write over the
3209         OSR exit address while unlinking all the incoming CallLinkInfos later in
3210         CodeBlock::jettison().
3211
3212         Change it so that we set a flag, `clearedByJettison`, in all the CallLinkInfos
3213         owned by the CodeBlock being jettisoned. If the flag is set, we will avoid
3214         repatching the call during unlinking. This is safe because this call will never
3215         be reachable again after the CodeBlock is jettisoned.
3216
3217         * bytecode/CallLinkInfo.cpp:
3218         (JSC::CallLinkInfo::CallLinkInfo):
3219         (JSC::CallLinkInfo::setCallee):
3220         (JSC::CallLinkInfo::clearCallee):
3221         (JSC::CallLinkInfo::setCodeBlock):
3222         (JSC::CallLinkInfo::clearCodeBlock):
3223         * bytecode/CallLinkInfo.h:
3224         (JSC::CallLinkInfo::clearedByJettison):
3225         (JSC::CallLinkInfo::setClearedByJettison):
3226         * bytecode/CodeBlock.cpp:
3227         (JSC::CodeBlock::jettison):
3228         * jit/Repatch.cpp:
3229         (JSC::revertCall):
3230
3231 2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
3232
3233         [JSC] Drop VM and Context cache map in JavaScriptCore.framework
3234         https://bugs.webkit.org/show_bug.cgi?id=196341
3235
3236         Reviewed by Saam Barati.
3237
3238         Previously, we created Objective-C weak map to maintain JSVirtualMachine and JSContext wrappers corresponding to VM and JSGlobalObject.
3239         But Objective-C weak map is really memory costly. Even if the entry is only one, it consumes 2.5KB per weak map. Since we can modify
3240         JSC intrusively for JavaScriptCore.framework (and we already did it, like, holding JSWrapperMap in JSGlobalObject), we can just hold
3241         a pointer to a wrapper in VM and JSGlobalObject.
3242
3243         This patch adds void* members to VM and JSGlobalObject, which holds a non-strong reference to a wrapper. When a wrapper is gone, we
3244         clear this pointer too. This removes unnecessary two Objective-C weak maps, and save 5KB.
3245
3246         * API/JSContext.mm:
3247         (-[JSContext initWithVirtualMachine:]):
3248         (-[JSContext dealloc]):
3249         (-[JSContext initWithGlobalContextRef:]):
3250         (-[JSContext wrapperMap]):
3251         (+[JSContext contextWithJSGlobalContextRef:]):
3252         * API/JSVirtualMachine.mm:
3253         (-[JSVirtualMachine initWithContextGroupRef:]):
3254         (-[JSVirtualMachine dealloc]):
3255         (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
3256         (scanExternalObjectGraph):
3257         (scanExternalRememberedSet):
3258         (initWrapperCache): Deleted.
3259         (wrapperCache): Deleted.
3260         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]): Deleted.
3261         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]): Deleted.
3262         (-[JSVirtualMachine contextForGlobalContextRef:]): Deleted.
3263         (-[JSVirtualMachine addContext:forGlobalContextRef:]): Deleted.
3264         * API/JSVirtualMachineInternal.h:
3265         * runtime/JSGlobalObject.h:
3266         (JSC::JSGlobalObject::setAPIWrapper):
3267         (JSC::JSGlobalObject::apiWrapper const):
3268         * runtime/VM.h:
3269
3270 2019-03-28  Tadeu Zagallo  <tzagallo@apple.com>
3271
3272         In-memory code cache should not share bytecode across domains
3273         https://bugs.webkit.org/show_bug.cgi?id=196321
3274
3275         Reviewed by Geoffrey Garen.
3276
3277         Use the SourceProvider's URL to make sure that the hosts match for the
3278         two SourceCodeKeys in operator==.
3279
3280         * parser/SourceCodeKey.h:
3281         (JSC::SourceCodeKey::host const):
3282         (JSC::SourceCodeKey::operator== const):
3283
3284 2019-03-28  Víctor Manuel Jáquez Leal  <vjaquez@igalia.com>
3285
3286         Silence lot of warnings when compiling with clang
3287         https://bugs.webkit.org/show_bug.cgi?id=196310
3288
3289         Reviewed by Michael Catanzaro.
3290
3291         Initialize variable with default constructor.
3292
3293         * API/glib/JSCOptions.cpp:
3294         (jsc_options_foreach):
3295
3296 2019-03-27  Saam Barati  <sbarati@apple.com>
3297
3298         validateOSREntryValue with Int52 should box the value being checked into double format
3299         https://bugs.webkit.org/show_bug.cgi?id=196313
3300         <rdar://problem/49306703>
3301
3302         Reviewed by Yusuke Suzuki.
3303
3304         * dfg/DFGOSREntry.cpp:
3305         (JSC::DFG::prepareOSREntry):
3306         * ftl/FTLLowerDFGToB3.cpp:
3307         (JSC::FTL::DFG::LowerDFGToB3::validateAIState):
3308
3309 2019-03-27  Yusuke Suzuki  <ysuzuki@apple.com>
3310
3311         [JSC] Owner of watchpoints should validate at GC finalizing phase
3312         https://bugs.webkit.org/show_bug.cgi?id=195827
3313
3314         Reviewed by Filip Pizlo.
3315
3316         This patch fixes JSC's watchpoint liveness issue by the following two policies.
3317
3318         1. Watchpoint should have owner cell, and "fire" operation should be gaurded with owner cell's isLive check.
3319
3320         Watchpoints should hold its owner cell, and fire procedure should be guarded by `owner->isLive()`.
3321         When the owner cell is destroyed, these watchpoints are destroyed too. But this destruction can
3322</