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