[Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-03-06  Ross Kirsling  <ross.kirsling@sony.com>
2
3         [Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
4         https://bugs.webkit.org/show_bug.cgi?id=195346
5
6         Reviewed by Fujii Hironori.
7
8         * jsc.cpp:
9         (currentWorkingDirectory):
10         (fetchModuleFromLocalFileSystem):
11         * runtime/DateConversion.cpp:
12         (JSC::formatDateTime):
13         Use wchar helpers as needed.
14
15 2019-03-06  Mark Lam  <mark.lam@apple.com>
16
17         Fix incorrect handling of try-finally completion values.
18         https://bugs.webkit.org/show_bug.cgi?id=195131
19         <rdar://problem/46222079>
20
21         Reviewed by Saam Barati and Yusuke Suzuki.
22
23         Consider the following:
24
25             function foo() {                        // line 1
26                 try {
27                     return 42;                      // line 3
28                 } finally {
29                     for (var j = 0; j < 1; j++) {   // line 5
30                         try {
31                             throw '';               // line 7
32                         } finally {
33                             continue;               // line 9
34                         }
35                     }
36                 }                                   // line 11
37             }
38             var result = foo();
39
40         With the current (before fix) code base, result will be the exception object thrown
41         at line 7.  The expected result should be 42, returned at line 3.
42
43         The bug is that we were previously only using one set of completion type and
44         value registers for the entire function.  This is inadequate because the outer
45         try-finally needs to preserve its own completion type and value ({ Return, 42 }
46         in this case) in order to be able to complete correctly.
47
48         One might be deceived into thinking that the above example should complete with
49         the exception thrown at line 7.  However, according to Section 13.15.8 of the
50         ECMAScript spec, the 'continue' in the finally at line 9 counts as an abrupt
51         completion.  As a result, it overrides the throw from line 7.  After the continue,
52         execution resumes at the top of the loop at line 5, followed by a normal completion
53         at line 11.
54
55         Also according to Section 13.15.8, given that the completion type of the outer
56         finally is normal, the resultant completion of the outer try-finally should be
57         the completion of the outer try block i.e. { Return, 42 }.
58
59         This patch makes the following changes:
60         
61         1. Fix handling of finally completion to use a unique set of completion
62            type and value registers for each FinallyContext.
63
64         2. Move the setting of Throw completion type to the out of line exception handler.
65            This makes the mainline code slightly less branchy.
66
67         3. Introduce emitOutOfLineCatchHandler(), emitOutOfLineFinallyHandler(), and
68            emitOutOfLineExceptionHandler() to make it clearer that these are not emitting
69            bytecode inline.  Also, these make it clearer when we're emitting a handler
70            for a catch vs a finally.
71
72         4. Allocate the FinallyContext on the stack instead of as a member of the
73            heap allocated ControlFlowScope.  This simplifies its life-cycle management
74            and reduces the amount of needed copying.
75
76         5. Update emitFinallyCompletion() to propagate the completion type and value to
77            the outer FinallyContext when needed.
78
79         6. Fix emitJumpIf() to use the right order of operands.  Previously, we were
80            only using it to do op_stricteq and op_nstricteq comparisons.  So, the order
81            wasn't important.  We now use it to also do op_beloweq comparisons.  Hence,
82            the order needs to be corrected.
83
84         7. Remove the unused CompletionType::Break and Continue.  These are encoded with
85            the jumpIDs of the jump targets instead.
86
87         Relevant specifications:
88         Section 13.15.8: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-try-statement-runtime-semantics-evaluation
89         Section 6.3.2.4: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-updateempty
90
91         * bytecompiler/BytecodeGenerator.cpp:
92         (JSC::FinallyContext::FinallyContext):
93         (JSC::BytecodeGenerator::generate):
94         (JSC::BytecodeGenerator::BytecodeGenerator):
95         (JSC::BytecodeGenerator::pushFinallyControlFlowScope):
96         (JSC::BytecodeGenerator::popFinallyControlFlowScope):
97         (JSC::BytecodeGenerator::emitOutOfLineCatchHandler):
98         (JSC::BytecodeGenerator::emitOutOfLineFinallyHandler):
99         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
100         (JSC::BytecodeGenerator::emitEnumeration):
101         (JSC::BytecodeGenerator::emitJumpViaFinallyIfNeeded):
102         (JSC::BytecodeGenerator::emitReturnViaFinallyIfNeeded):
103         (JSC::BytecodeGenerator::emitFinallyCompletion):
104         (JSC::BytecodeGenerator::emitJumpIf):
105         (JSC::BytecodeGenerator::emitCatch): Deleted.
106         (JSC::BytecodeGenerator::allocateCompletionRecordRegisters): Deleted.
107         (JSC::BytecodeGenerator::releaseCompletionRecordRegisters): Deleted.
108         * bytecompiler/BytecodeGenerator.h:
109         (JSC::FinallyContext::completionTypeRegister const):
110         (JSC::FinallyContext::completionValueRegister const):
111         (JSC::ControlFlowScope::ControlFlowScope):
112         (JSC::BytecodeGenerator::emitLoad):
113         (JSC::BytecodeGenerator::CompletionRecordScope::CompletionRecordScope): Deleted.
114         (JSC::BytecodeGenerator::CompletionRecordScope::~CompletionRecordScope): Deleted.
115         (JSC::BytecodeGenerator::completionTypeRegister const): Deleted.
116         (JSC::BytecodeGenerator::completionValueRegister const): Deleted.
117         (JSC::BytecodeGenerator::emitSetCompletionType): Deleted.
118         (JSC::BytecodeGenerator::emitSetCompletionValue): Deleted.
119         * bytecompiler/NodesCodegen.cpp:
120         (JSC::TryNode::emitBytecode):
121
122 2019-03-06  Saam Barati  <sbarati@apple.com>
123
124         JSScript should keep the cache file locked for the duration of its existence and should truncate the cache when it is out of date
125         https://bugs.webkit.org/show_bug.cgi?id=195186
126
127         Reviewed by Keith Miller.
128
129         This patch makes it so that JSScript will keep its bytecode cache file
130         locked as long as the JSScript is alive. This makes it obvious that it's
131         safe to update that file, as it will only be used in a single VM, across
132         all processes, at a single time. We may be able to extend this in the future
133         if we can atomically update it across VMs/processes. However, we're choosing
134         more restricted semantics now as it's always easier to extend these semantics
135         in the future opposed to having to support the more flexible behavior
136         up front.
137         
138         This patch also:
139         - Adds error messages if writing the cache fails. We don't expect this to
140           fail, but previously we would say we cached it even if write() fails.
141         - Removes the unused m_moduleKey field.
142         - Makes calling cacheBytecodeWithError with an already non-empty cache file fail.
143           In the future, we should extend this to just fill in the parts of the cache
144           that are not present. But we don't have the ability to do that yet, so we
145           just result in an error for now.
146
147         * API/JSScript.mm:
148         (-[JSScript dealloc]):
149         (-[JSScript readCache]):
150         (-[JSScript init]):
151         (-[JSScript writeCache:]):
152         * API/JSScriptInternal.h:
153         * API/tests/testapi.mm:
154         (testCacheFileIsExclusive):
155         (testCacheFileFailsWhenItsAlreadyCached):
156         (testObjectiveCAPI):
157
158 2019-03-06  Christopher Reid  <chris.reid@sony.com>
159
160         Followups to (r242306): Use LockHolder instead of std::lock_guard on Remote Inspector Locks
161         https://bugs.webkit.org/show_bug.cgi?id=195381
162
163         Reviewed by Mark Lam.
164
165         Replacing std::lock_guard uses in Remote Inspector with WTF::LockHolder.
166         Also using `= { }` for struct initialization instead of memeset.
167
168         * inspector/remote/RemoteConnectionToTarget.cpp:
169         * inspector/remote/RemoteInspector.cpp:
170         * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm:
171         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
172         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm:
173         * inspector/remote/glib/RemoteInspectorGlib.cpp:
174         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp:
175         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp:
176         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp:
177         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp:
178
179 2019-03-06  Saam Barati  <sbarati@apple.com>
180
181         Air::reportUsedRegisters must padInterference
182         https://bugs.webkit.org/show_bug.cgi?id=195303
183         <rdar://problem/48270343>
184
185         Reviewed by Keith Miller.
186
187         reportUsedRegisters uses reg liveness to eliminate loads/moves into dead
188         registers. However, liveness can report incorrect results in certain 
189         scenarios when considering liveness at instruction boundaries. For example,
190         it can go wrong when an Inst has a LateUse of a register and the following
191         Inst has an EarlyDef of that same register. Such a scenario could lead us
192         to incorrectly say the register is not live-in to the first Inst. Pad
193         interference inserts Nops between such instruction boundaries that cause
194         this issue.
195         
196         The test with this patch fixes the issue in reportUsedRegisters. This patch
197         also conservatively makes it so that lowerAfterRegAlloc calls padInterference
198         since it also reasons about liveness.
199
200         * b3/air/AirLowerAfterRegAlloc.cpp:
201         (JSC::B3::Air::lowerAfterRegAlloc):
202         * b3/air/AirPadInterference.h:
203         * b3/air/AirReportUsedRegisters.cpp:
204         (JSC::B3::Air::reportUsedRegisters):
205         * b3/testb3.cpp:
206         (JSC::B3::testReportUsedRegistersLateUseNotDead):
207         (JSC::B3::run):
208
209 2019-03-06  Yusuke Suzuki  <ysuzuki@apple.com>
210
211         [JSC] AI should not propagate AbstractValue relying on constant folding phase
212         https://bugs.webkit.org/show_bug.cgi?id=195375
213
214         Reviewed by Saam Barati.
215
216         MakeRope rule in AI attempts to propagate the node, which will be produced after constant folding phase runs.
217         This is wrong since we do not guarantee that constant folding phase runs after AI runs (e.g. DFGSpeculativeJIT
218         and FTLLowerDFGToB3 run AI). This results in the bug that the value produced at runtime is different from the
219         proven constant value in AI. In the attached test, AI says the value is SpecStringIdent while the resulted value
220         at runtime is SpecStringVar, resulting in wrong MakeRope code. This patch removes the path propagating the node
221         relying on constant folding phase.
222
223         * dfg/DFGAbstractInterpreterInlines.h:
224         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
225
226 2019-03-05  Saam barati  <sbarati@apple.com>
227
228         op_switch_char broken for rope strings after JSRopeString layout rewrite
229         https://bugs.webkit.org/show_bug.cgi?id=195339
230         <rdar://problem/48592545>
231
232         Reviewed by Yusuke Suzuki.
233
234         When we did the JSString rewrite, we accidentally broke LLInt's switch_char
235         for rope strings. That change made it so that we always go to the slow path
236         for ropes. That's wrong. The slow path should only be taken when the rope
237         is of length 1. For lengths other than 1, we need to fall through to the
238         default case. This patch fixes this.
239
240         * llint/LowLevelInterpreter32_64.asm:
241         * llint/LowLevelInterpreter64.asm:
242         * runtime/JSString.h:
243
244 2019-03-05  Yusuke Suzuki  <ysuzuki@apple.com>
245
246         [JSC] Should check exception for JSString::toExistingAtomicString
247         https://bugs.webkit.org/show_bug.cgi?id=195337
248
249         Reviewed by Keith Miller, Saam Barati, and Mark Lam.
250
251         We missed the exception check for JSString::toExistingAtomicString while it can resolve
252         a rope and throw an OOM exception. This patch adds necessary exception checks. This patch
253         fixes test failures in debug build, reported in https://bugs.webkit.org/show_bug.cgi?id=194375#c93.
254
255         * dfg/DFGOperations.cpp:
256         * jit/JITOperations.cpp:
257         (JSC::getByVal):
258         * llint/LLIntSlowPaths.cpp:
259         (JSC::LLInt::getByVal):
260         * runtime/CommonSlowPaths.cpp:
261         (JSC::SLOW_PATH_DECL):
262
263 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
264
265         Unreviewed, build fix for debug builds after r242397
266
267         * runtime/JSString.h:
268
269 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
270
271         [JSC] Store bits for JSRopeString in 3 stores
272         https://bugs.webkit.org/show_bug.cgi?id=195234
273
274         Reviewed by Saam Barati.
275
276         This patch cleans up the initialization of JSRopeString fields in DFG and FTL.
277         Previously, we store some part of data separately. Instead, this patch calculates
278         the data first by bit operations and store calculated data with fewer stores.
279
280         This patch also cleans up is8Bit and isSubstring flags. We put them in lower bits
281         of the first fiber instead of the upper 16 bits. Since we only have 3 bit flags, (isRope, is8Bit, isSubstring),
282         we can put them into the lower 3 bits, they are always empty due to alignment.
283
284         * bytecode/AccessCase.cpp:
285         (JSC::AccessCase::generateImpl): A bit clean up of StringLength IC to give a chance of unnecessary mov removal.
286         * dfg/DFGSpeculativeJIT.cpp:
287         (JSC::DFG::SpeculativeJIT::canBeRope):
288         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
289         (JSC::DFG::SpeculativeJIT::compileMakeRope):
290         * dfg/DFGSpeculativeJIT.h:
291         * ftl/FTLAbstractHeapRepository.cpp:
292         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
293         * ftl/FTLAbstractHeapRepository.h:
294         * ftl/FTLLowerDFGToB3.cpp:
295         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
296         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
297         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
298         * runtime/JSString.cpp:
299         (JSC::JSString::visitChildren):
300         * runtime/JSString.h:
301         (JSC::JSString::is8Bit const):
302         (JSC::JSString::isSubstring const):
303         * tools/JSDollarVM.cpp:
304         (JSC::functionCreateNullRopeString):
305         (JSC::JSDollarVM::finishCreation):
306
307 2019-03-04  Joseph Pecoraro  <pecoraro@apple.com>
308
309         ITMLKit Inspector: Data Bindings / Associated Data for nodes
310         https://bugs.webkit.org/show_bug.cgi?id=195290
311         <rdar://problem/48304019>
312
313         Reviewed by Devin Rousso.
314
315         * inspector/protocol/DOM.json:
316
317 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
318
319         [JSC] Make Reflect lazily-allocated by dropping @Reflect references from builtin JS
320         https://bugs.webkit.org/show_bug.cgi?id=195250
321
322         Reviewed by Saam Barati.
323
324         By removing @Reflect from builtin JS, we can make Reflect object allocation lazy.
325         We move @ownKeys function from @Reflect to @Object to remove @Reflect reference.
326
327         We also remove m_intlObject field from JSGlobalObject since we no longer use it.
328
329         * builtins/BuiltinNames.h:
330         * builtins/GlobalOperations.js:
331         (globalPrivate.copyDataProperties):
332         (globalPrivate.copyDataPropertiesNoExclusions):
333         * runtime/JSGlobalObject.cpp:
334         (JSC::createReflectProperty):
335         (JSC::JSGlobalObject::init):
336         (JSC::JSGlobalObject::visitChildren):
337         * runtime/JSGlobalObject.h:
338         * runtime/ObjectConstructor.cpp:
339         (JSC::ObjectConstructor::finishCreation):
340         (JSC::objectConstructorOwnKeys):
341         * runtime/ReflectObject.cpp:
342         (JSC::ReflectObject::finishCreation):
343
344 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
345
346         [JSC] Offer @makeTypeError instead of exposing @TypeError
347         https://bugs.webkit.org/show_bug.cgi?id=193858
348
349         Reviewed by Mark Lam.
350
351         Instead of exposing @TypeError, we expose @makeTypeError function.
352         And we make TypeError and Error lazily-allocated objects in non JIT environment.
353         In JIT environment, only TypeError becomes lazily-allocated since WebAssembly errors
354         touch Error prototype anyway. But we can make them lazy in a subsequent patch.
355
356         * builtins/AsyncFromSyncIteratorPrototype.js:
357         * builtins/AsyncGeneratorPrototype.js:
358         (globalPrivate.asyncGeneratorEnqueue):
359         * builtins/BuiltinNames.h:
360         * builtins/PromiseOperations.js:
361         (globalPrivate.createResolvingFunctions.resolve):
362         * runtime/JSGlobalObject.cpp:
363         (JSC::JSGlobalObject::initializeErrorConstructor):
364         (JSC::JSGlobalObject::init):
365         (JSC::JSGlobalObject::visitChildren):
366         * runtime/JSGlobalObject.h:
367         (JSC::JSGlobalObject::errorPrototype const):
368         (JSC::JSGlobalObject::errorStructure const):
369         * runtime/JSGlobalObjectFunctions.cpp:
370         (JSC::globalFuncMakeTypeError):
371         * runtime/JSGlobalObjectFunctions.h:
372
373 2019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
374
375         [GLib] Returning G_TYPE_OBJECT from a constructor does not work
376         https://bugs.webkit.org/show_bug.cgi?id=195206
377
378         Reviewed by Žan Doberšek.
379
380         We are freeing the newly created object before returning from the constructor.
381
382         * API/glib/JSCCallbackFunction.cpp:
383         (JSC::JSCCallbackFunction::construct):
384
385 2019-03-02  Darin Adler  <darin@apple.com>
386
387         Retire legacy dtoa function and DecimalNumber class
388         https://bugs.webkit.org/show_bug.cgi?id=195253
389
390         Reviewed by Daniel Bates.
391
392         * runtime/NumberPrototype.cpp:
393         (JSC::numberProtoFuncToExponential): Removed dependency on NumberToStringBufferLength,
394         using NumberToStringBuffer instead. Also tweaked style of implementation a bit.
395
396 2019-03-01  Darin Adler  <darin@apple.com>
397
398         Finish removing String::format
399         https://bugs.webkit.org/show_bug.cgi?id=194893
400
401         Reviewed by Daniel Bates.
402
403         * bytecode/CodeBlock.cpp:
404         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
405         using the new "pad" function.
406
407 2019-03-01  Christopher Reid  <chris.reid@sony.com>
408
409         [PlayStation] Upstream playstation's remote inspector server
410         https://bugs.webkit.org/show_bug.cgi?id=193806
411
412         Reviewed by Joseph Pecoraro.
413
414         Upstreaming PlayStation's Remote Inspector implementation.
415         It is using a JSON RPC protocol over TCP sockets.
416         This inspector implementation is planned to also support running on a WinCairo Client and Server.
417
418         * PlatformPlayStation.cmake:
419         * SourcesGTK.txt:
420         * SourcesWPE.txt:
421         * inspector/remote/RemoteConnectionToTarget.cpp: Renamed from Source/JavaScriptCore/inspector/remote/glib/RemoteConnectionToTargetGlib.cpp.
422         * inspector/remote/RemoteInspector.h:
423         * inspector/remote/playstation/RemoteInspectorConnectionClient.h: Added.
424         * inspector/remote/playstation/RemoteInspectorConnectionClientPlayStation.cpp: Added.
425         * inspector/remote/playstation/RemoteInspectorMessageParser.h: Added.
426         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp: Added.
427         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp: Added.
428         * inspector/remote/playstation/RemoteInspectorServer.h: Added.
429         * inspector/remote/playstation/RemoteInspectorServerPlayStation.cpp: Added.
430         * inspector/remote/playstation/RemoteInspectorSocket.h: Added.
431         * inspector/remote/playstation/RemoteInspectorSocketClient.h: Added.
432         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp: Added.
433         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp: Added.
434         * inspector/remote/playstation/RemoteInspectorSocketServer.h: Added.
435         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp: Added.
436
437 2019-03-01  Saam Barati  <sbarati@apple.com>
438
439         Create SPI to crash if a JSC VM is created
440         https://bugs.webkit.org/show_bug.cgi?id=195231
441         <rdar://problem/47717990>
442
443         Reviewed by Mark Lam.
444
445         * API/JSVirtualMachine.mm:
446         (+[JSVirtualMachine setCrashOnVMCreation:]):
447         * API/JSVirtualMachinePrivate.h:
448         * runtime/VM.cpp:
449         (JSC::VM::VM):
450         (JSC::VM::setCrashOnVMCreation):
451         * runtime/VM.h:
452
453 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
454
455         [JSC] Fix FTL build on ARM32_64 by adding stubs for JSRopeString::offsetOfXXX
456         https://bugs.webkit.org/show_bug.cgi?id=195235
457
458         Reviewed by Saam Barati.
459
460         This is a workaround until https://bugs.webkit.org/show_bug.cgi?id=195234 is done.
461
462         * runtime/JSString.h:
463
464 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
465
466         [JSC] Use runtime calls for DFG MakeRope if !CPU(ADDRESS64)
467         https://bugs.webkit.org/show_bug.cgi?id=195221
468
469         Reviewed by Mark Lam.
470
471         ARM32_64 builds DFG 64bit, but the size of address is 32bit. Make DFG MakeRope a runtime call not only for DFG 32_64,
472         but also DFG 64 with !CPU(ADDRESS64). This patch unifies compileMakeRope again, and use a runtime call for !CPU(ADDRESS64).
473
474         * dfg/DFGSpeculativeJIT.cpp:
475         (JSC::DFG::SpeculativeJIT::compileMakeRope):
476         * dfg/DFGSpeculativeJIT32_64.cpp:
477         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
478         * dfg/DFGSpeculativeJIT64.cpp:
479         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
480
481 2019-03-01  Justin Fan  <justin_fan@apple.com>
482
483         [Web GPU] 32-bit builds broken by attempt to disable WebGPU on 32-bit
484         https://bugs.webkit.org/show_bug.cgi?id=195191
485
486         Rubber-stamped by Dean Jackson.
487
488         Dropping support for 32-bit entirely, so I'm intentionally leaving 32-bit broken.
489
490         * Configurations/FeatureDefines.xcconfig:
491
492 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
493
494         Fix debug builds with GCC
495         https://bugs.webkit.org/show_bug.cgi?id=195205
496
497         Unreviewed. Fix debug builds in GCC by removing
498         the constexpr-keyword for this function.
499
500         * runtime/CachedTypes.cpp:
501         (JSC::tagFromSourceCodeType):
502
503 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
504
505         [ARM] Fix assembler warnings in ctiMasmProbeTrampoline
506         https://bugs.webkit.org/show_bug.cgi?id=195164
507
508         Reviewed by Mark Lam.
509
510         Short branches in IT blocks are deprecated in AArch32. In addition the
511         the conditional branch was the only instruction in the IT block. Short
512         branches are able to encode the condition code themselves, the additional
513         IT instruction is not needed.
514
515         The assembler was also warning that writing into APSR without a bitmask
516         was deprecated. Therefore use APSR_nzcvq instead, this generates the same
517         instruction encoding.
518
519         * assembler/MacroAssemblerARMv7.cpp:
520
521 2019-02-28  Tadeu Zagallo  <tzagallo@apple.com>
522
523         Remove CachedPtr::m_isEmpty and CachedOptional::m_isEmpty fields
524         https://bugs.webkit.org/show_bug.cgi?id=194999
525
526         Reviewed by Saam Barati.
527
528         These fields are unnecessary, since we can just check that m_offset
529         has not been initialized (I added VariableLengthObject::isEmpty for
530         that). They also add 7-byte padding to these classes, which is pretty
531         bad given how frequently CachedPtr is used.
532
533         * runtime/CachedTypes.cpp:
534         (JSC::CachedObject::operator new[]):
535         (JSC::VariableLengthObject::allocate):
536         (JSC::VariableLengthObject::isEmpty const):
537         (JSC::CachedPtr::encode):
538         (JSC::CachedPtr::decode const):
539         (JSC::CachedPtr::get const):
540         (JSC::CachedOptional::encode):
541         (JSC::CachedOptional::decode const):
542         (JSC::CachedOptional::decodeAsPtr const):
543
544 2019-02-28  Yusuke Suzuki  <ysuzuki@apple.com>
545
546         [JSC] sizeof(JSString) should be 16
547         https://bugs.webkit.org/show_bug.cgi?id=194375
548
549         Reviewed by Saam Barati.
550
551         This patch reduces sizeof(JSString) from 24 to 16 to fit it into GC heap cell atom. And it also reduces sizeof(JSRopeString) from 48 to 32.
552         Both classes cut 16 bytes per instance in GC allocation. This new layout is used in 64bit architectures which has little endianess.
553
554         JSString no longer has length and flags directly. JSString has String, and we query information to this String instead of holding duplicate
555         information in JSString. We embed isRope bit into this String's pointer so that we can convert JSRopeString to JSString in an atomic manner.
556         We emit store-store fence before we put String pointer. This should exist even before this patch, so this patch also fixes one concurrency issue.
557
558         The old JSRopeString separately had JSString* fibers along with String. In this patch, we merge the first JSString* fiber and String pointer
559         storage into one to reduce the size of JSRopeString. JSRopeString has three pointer width storage. We pick 48bit effective address of JSString*
560         fibers to compress three fibers + length + flags into three pointer width storage.
561
562         In 64bit architecture, JSString and JSRopeString have the following memory layout to make sizeof(JSString) == 16 and sizeof(JSRopeString) == 32.
563         JSString has only one pointer. We use it for String. length() and is8Bit() queries go to StringImpl. In JSRopeString, we reuse the above pointer
564         place for the 1st fiber. JSRopeString has three fibers so its size is 48. To keep length and is8Bit flag information in JSRopeString, JSRopeString
565         encodes these information into the fiber pointers. is8Bit flag is encoded in the 1st fiber pointer. length is embedded directly, and two fibers
566         are compressed into 12bytes. isRope information is encoded in the first fiber's LSB.
567
568         Since length of JSRopeString should be frequently accessed compared to each fiber, we put length in contiguous 32byte field, and compress 2nd
569         and 3rd fibers into the following 80byte fields. One problem is that now 2nd and 3rd fibers are split. Storing and loading 2nd and 3rd fibers
570         are not one pointer load operation. To make concurrent collector work correctly, we must initialize 2nd and 3rd fibers at JSRopeString creation
571         and we must not modify these part later.
572
573                      0                        8        10               16                       32                                     48
574         JSString     [   ID      ][  header  ][   String pointer      0]
575         JSRopeString [   ID      ][  header  ][ flags ][ 1st fiber    1][  length  ][2nd lower32][2nd upper16][3rd lower16][3rd upper32]
576                                                                       ^
577                                                                    isRope bit
578
579         Since fibers in JSRopeString are not initialized in atomic pointer store manner, we must initialize all the fiber fields at JSRopeString creation.
580         To achieve this, we modify our JSRopeString::RopeBuilder implementation not to create half-baked JSRopeString.
581
582         This patch also makes an empty JSString singleton per VM. This makes evaluation of JSString in boolean context one pointer comparison. This is
583         critical in this change since this patch enlarges the code necessary to get length from JSString in JIT. Without this guarantee, our code of boolean
584         context evaluation is bloated. This patch hides all the JSString::create and JSRopeString::create in the private permission. JSString and JSRopeString
585         creation is only allowed from jsString and related helper functions and they return a singleton empty JSString if the length is zero. We also change
586         JSRopeString::RopeBuilder not to construct an empty JSRopeString.
587
588         This patch is performance neutral in Speedometer2 and JetStream2. And it improves RAMification by 2.7%.
589
590         * JavaScriptCore.xcodeproj/project.pbxproj:
591         * assembler/MacroAssemblerARM64.h:
592         (JSC::MacroAssemblerARM64::storeZero16):
593         * assembler/MacroAssemblerX86Common.h:
594         (JSC::MacroAssemblerX86Common::storeZero16):
595         (JSC::MacroAssemblerX86Common::store16):
596         * bytecode/AccessCase.cpp:
597         (JSC::AccessCase::generateImpl):
598         * bytecode/InlineAccess.cpp:
599         (JSC::InlineAccess::dumpCacheSizesAndCrash):
600         (JSC::linkCodeInline):
601         (JSC::InlineAccess::isCacheableStringLength):
602         (JSC::InlineAccess::generateStringLength):
603         * bytecode/InlineAccess.h:
604         (JSC::InlineAccess::sizeForPropertyAccess):
605         (JSC::InlineAccess::sizeForPropertyReplace):
606         (JSC::InlineAccess::sizeForLengthAccess):
607         * dfg/DFGOperations.cpp:
608         * dfg/DFGOperations.h:
609         * dfg/DFGSpeculativeJIT.cpp:
610         (JSC::DFG::SpeculativeJIT::compileStringSlice):
611         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
612         (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt):
613         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
614         (JSC::DFG::SpeculativeJIT::compileStringEquality):
615         (JSC::DFG::SpeculativeJIT::compileStringZeroLength):
616         (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther):
617         (JSC::DFG::SpeculativeJIT::emitStringBranch):
618         (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch):
619         (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage):
620         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
621         (JSC::DFG::SpeculativeJIT::emitPopulateSliceIndex):
622         (JSC::DFG::SpeculativeJIT::compileArraySlice):
623         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
624         (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage):
625         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
626         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
627         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
628         * dfg/DFGSpeculativeJIT.h:
629         * dfg/DFGSpeculativeJIT32_64.cpp:
630         (JSC::DFG::SpeculativeJIT::compile):
631         (JSC::DFG::SpeculativeJIT::compileMakeRope):
632         * dfg/DFGSpeculativeJIT64.cpp:
633         (JSC::DFG::SpeculativeJIT::compile):
634         (JSC::DFG::SpeculativeJIT::compileMakeRope):
635         * ftl/FTLAbstractHeapRepository.cpp:
636         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
637         * ftl/FTLAbstractHeapRepository.h:
638         * ftl/FTLLowerDFGToB3.cpp:
639         (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage):
640         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
641         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
642         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
643         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharCodeAt):
644         (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
645         (JSC::FTL::DFG::LowerDFGToB3::compileStringToUntypedStrictEquality):
646         (JSC::FTL::DFG::LowerDFGToB3::compileSwitch):
647         (JSC::FTL::DFG::LowerDFGToB3::mapHashString):
648         (JSC::FTL::DFG::LowerDFGToB3::compileMapHash):
649         (JSC::FTL::DFG::LowerDFGToB3::compileHasOwnProperty):
650         (JSC::FTL::DFG::LowerDFGToB3::compileStringSlice):
651         (JSC::FTL::DFG::LowerDFGToB3::compileToLowerCase):
652         (JSC::FTL::DFG::LowerDFGToB3::stringsEqual):
653         (JSC::FTL::DFG::LowerDFGToB3::boolify):
654         (JSC::FTL::DFG::LowerDFGToB3::switchString):
655         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
656         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
657         (JSC::FTL::DFG::LowerDFGToB3::speculateStringIdent):
658         * jit/AssemblyHelpers.cpp:
659         (JSC::AssemblyHelpers::emitConvertValueToBoolean):
660         (JSC::AssemblyHelpers::branchIfValue):
661         * jit/AssemblyHelpers.h:
662         (JSC::AssemblyHelpers::branchIfRopeStringImpl):
663         (JSC::AssemblyHelpers::branchIfNotRopeStringImpl):
664         * jit/JITInlines.h:
665         (JSC::JIT::emitLoadCharacterString):
666         * jit/Repatch.cpp:
667         (JSC::tryCacheGetByID):
668         * jit/ThunkGenerators.cpp:
669         (JSC::stringGetByValGenerator):
670         (JSC::stringCharLoad):
671         * llint/LowLevelInterpreter.asm:
672         * llint/LowLevelInterpreter32_64.asm:
673         * llint/LowLevelInterpreter64.asm:
674         * runtime/JSString.cpp:
675         (JSC::JSString::createEmptyString):
676         (JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
677         (JSC::JSString::dumpToStream):
678         (JSC::JSString::estimatedSize):
679         (JSC::JSString::visitChildren):
680         (JSC::JSRopeString::resolveRopeInternal8 const):
681         (JSC::JSRopeString::resolveRopeInternal8NoSubstring const):
682         (JSC::JSRopeString::resolveRopeInternal16 const):
683         (JSC::JSRopeString::resolveRopeInternal16NoSubstring const):
684         (JSC::JSRopeString::resolveRopeToAtomicString const):
685         (JSC::JSRopeString::convertToNonRope const):
686         (JSC::JSRopeString::resolveRopeToExistingAtomicString const):
687         (JSC::JSRopeString::resolveRopeWithFunction const):
688         (JSC::JSRopeString::resolveRope const):
689         (JSC::JSRopeString::resolveRopeSlowCase8 const):
690         (JSC::JSRopeString::resolveRopeSlowCase const):
691         (JSC::JSRopeString::outOfMemory const):
692         (JSC::JSRopeString::visitFibers): Deleted.
693         (JSC::JSRopeString::clearFibers const): Deleted.
694         * runtime/JSString.h:
695         (JSC::JSString::uninitializedValueInternal const):
696         (JSC::JSString::valueInternal const):
697         (JSC::JSString::JSString):
698         (JSC::JSString::finishCreation):
699         (JSC::JSString::create):
700         (JSC::JSString::offsetOfValue):
701         (JSC::JSString::isRope const):
702         (JSC::JSString::is8Bit const):
703         (JSC::JSString::length const):
704         (JSC::JSString::tryGetValueImpl const):
705         (JSC::JSString::toAtomicString const):
706         (JSC::JSString::toExistingAtomicString const):
707         (JSC::JSString::value const):
708         (JSC::JSString::tryGetValue const):
709         (JSC::JSRopeString::unsafeView const):
710         (JSC::JSRopeString::viewWithUnderlyingString const):
711         (JSC::JSString::unsafeView const):
712         (JSC::JSString::viewWithUnderlyingString const):
713         (JSC::JSString::offsetOfLength): Deleted.
714         (JSC::JSString::offsetOfFlags): Deleted.
715         (JSC::JSString::setIs8Bit const): Deleted.
716         (JSC::JSString::setLength): Deleted.
717         (JSC::JSString::string): Deleted.
718         (JSC::jsStringBuilder): Deleted.
719         * runtime/JSStringInlines.h:
720         (JSC::JSString::~JSString):
721         (JSC::JSString::equal const):
722         * runtime/ObjectPrototype.cpp:
723         (JSC::objectProtoFuncToString):
724         * runtime/RegExpMatchesArray.h:
725         (JSC::createRegExpMatchesArray):
726         * runtime/RegExpObjectInlines.h:
727         (JSC::collectMatches):
728         * runtime/RegExpPrototype.cpp:
729         (JSC::regExpProtoFuncSplitFast):
730         * runtime/SmallStrings.cpp:
731         (JSC::SmallStrings::initializeCommonStrings):
732         (JSC::SmallStrings::createEmptyString): Deleted.
733         * runtime/SmallStrings.h:
734         * runtime/StringPrototype.cpp:
735         (JSC::stringProtoFuncSlice):
736         * runtime/StringPrototypeInlines.h: Added.
737         (JSC::stringSlice):
738
739 2019-02-28  Saam barati  <sbarati@apple.com>
740
741         Unreviewed. Attempt windows build fix after r242239.
742
743         * runtime/CachedTypes.cpp:
744         (JSC::tagFromSourceCodeType):
745
746 2019-02-28  Mark Lam  <mark.lam@apple.com>
747
748         In cloop.rb, rename :int and :uint to :intptr and :uintptr.
749         https://bugs.webkit.org/show_bug.cgi?id=195183
750
751         Reviewed by Yusuke Suzuki.
752
753         Also changed intMemRef and uintMemRef to intptrMemRef and uintptrMemRef respectively.
754
755         * offlineasm/cloop.rb:
756
757 2019-02-28  Saam barati  <sbarati@apple.com>
758
759         Make JSScript:cacheBytecodeWithError update the cache when the script changes
760         https://bugs.webkit.org/show_bug.cgi?id=194912
761
762         Reviewed by Mark Lam.
763
764         Prior to this patch, the JSScript SPI would never check if its cached
765         bytecode were still valid. This would lead the cacheBytecodeWithError
766         succeeding even if the underlying cache were stale. This patch fixes
767         that by making JSScript check if the cache is still valid. If it's not,
768         we will cache bytecode when cacheBytecodeWithError is invoked.
769
770         * API/JSScript.mm:
771         (-[JSScript readCache]):
772         (-[JSScript writeCache:]):
773         * API/tests/testapi.mm:
774         (testBytecodeCacheWithSameCacheFileAndDifferentScript):
775         (testObjectiveCAPI):
776         * runtime/CachedTypes.cpp:
777         (JSC::Decoder::Decoder):
778         (JSC::VariableLengthObject::buffer const):
779         (JSC::CachedPtr::decode const):
780         (JSC::tagFromSourceCodeType):
781         (JSC::GenericCacheEntry::isUpToDate const):
782         (JSC::CacheEntry::isStillValid const):
783         (JSC::GenericCacheEntry::decode const):
784         (JSC::GenericCacheEntry::isStillValid const):
785         (JSC::encodeCodeBlock):
786         (JSC::decodeCodeBlockImpl):
787         (JSC::isCachedBytecodeStillValid):
788         * runtime/CachedTypes.h:
789         * runtime/CodeCache.cpp:
790         (JSC::sourceCodeKeyForSerializedBytecode):
791         (JSC::sourceCodeKeyForSerializedProgram):
792         (JSC::sourceCodeKeyForSerializedModule):
793         (JSC::serializeBytecode):
794         * runtime/CodeCache.h:
795         (JSC::CodeCacheMap::fetchFromDiskImpl):
796         * runtime/Completion.cpp:
797         (JSC::generateProgramBytecode):
798         (JSC::generateBytecode): Deleted.
799         * runtime/Completion.h:
800
801 2019-02-28  Mark Lam  <mark.lam@apple.com>
802
803         cloop.rb shift mask should depend on the word size being shifted.
804         https://bugs.webkit.org/show_bug.cgi?id=195181
805         <rdar://problem/48484164>
806
807         Reviewed by Yusuke Suzuki.
808
809         Previously, we're always masking the shift amount with 0x1f.  This is only correct
810         for 32-bit words.  For 64-bit words, the mask should be 0x3f.  For pointer sized
811         shifts, the mask depends on sizeof(uintptr_t).
812
813         * offlineasm/cloop.rb:
814
815 2019-02-28  Justin Fan  <justin_fan@apple.com>
816
817         [Web GPU] Enable Web GPU only on 64-bit
818         https://bugs.webkit.org/show_bug.cgi?id=195139
819
820         Because Metal is only supported on 64 bit apps.
821
822         Unreviewed build fix.
823
824         * Configurations/FeatureDefines.xcconfig:
825
826 2019-02-27  Mark Lam  <mark.lam@apple.com>
827
828         The parser is failing to record the token location of new in new.target.
829         https://bugs.webkit.org/show_bug.cgi?id=195127
830         <rdar://problem/39645578>
831
832         Reviewed by Yusuke Suzuki.
833
834         Also adjust the token location for the following to be as shown:
835
836             new.target
837             ^
838             super
839             ^
840             import.meta
841             ^
842
843         * parser/Parser.cpp:
844         (JSC::Parser<LexerType>::parseMemberExpression):
845
846 2019-02-27  Yusuke Suzuki  <ysuzuki@apple.com>
847
848         [JSC] mustHandleValues for dead bytecode locals should be ignored in DFG phases
849         https://bugs.webkit.org/show_bug.cgi?id=195144
850         <rdar://problem/47595961>
851
852         Reviewed by Mark Lam.
853
854         DFGMaximalFlushInsertionPhase inserts Flush for all the locals at the end of basic blocks. This enlarges the live ranges of
855         locals in DFG, and it sometimes makes DFG value live while it is dead in bytecode. The issue happens when we use mustHandleValues
856         to widen AbstractValue in CFAPhase. At that time, DFG tells "this value is live in DFG", but it may be dead in the bytecode level.
857         At that time, we attempt to merge AbstractValue with dead mustHandleValue, which is cleared as jsUndefined() in
858         DFG::Plan::cleanMustHandleValuesIfNecessary before start compilation, and crash because jsUndefined() may be irrelevant to the FlushFormat
859         in VariableAccessData.
860
861         This patch makes the type of mustHandleValues Operands<Optional<JSValue>>. We clear dead JSValues in DFG::Plan::cleanMustHandleValuesIfNecessary.
862         And we skip handling dead mustHandleValue in DFG phases.
863
864         * bytecode/Operands.h:
865         (JSC::Operands::isLocal const):
866         (JSC::Operands::isVariable const): Deleted.
867         * dfg/DFGCFAPhase.cpp:
868         (JSC::DFG::CFAPhase::injectOSR):
869         * dfg/DFGDriver.cpp:
870         (JSC::DFG::compileImpl):
871         (JSC::DFG::compile):
872         * dfg/DFGDriver.h:
873         * dfg/DFGJITCode.cpp:
874         (JSC::DFG::JITCode::reconstruct):
875         * dfg/DFGJITCode.h:
876         * dfg/DFGOperations.cpp:
877         * dfg/DFGPlan.cpp:
878         (JSC::DFG::Plan::Plan):
879         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
880         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
881         * dfg/DFGPlan.h:
882         (JSC::DFG::Plan::mustHandleValues const):
883         * dfg/DFGPredictionInjectionPhase.cpp:
884         (JSC::DFG::PredictionInjectionPhase::run):
885         * dfg/DFGTypeCheckHoistingPhase.cpp:
886         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
887         * ftl/FTLOSREntry.cpp:
888         (JSC::FTL::prepareOSREntry):
889         * jit/JITOperations.cpp:
890
891 2019-02-27  Simon Fraser  <simon.fraser@apple.com>
892
893         Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
894
895         * bytecode/CodeBlock.cpp:
896         (JSC::CodeBlock::nameForRegister):
897
898 2019-02-27  Robin Morisset  <rmorisset@apple.com>
899
900         DFG: Loop-invariant code motion (LICM) should not hoist dead code
901         https://bugs.webkit.org/show_bug.cgi?id=194945
902         <rdar://problem/48311657>
903
904         Reviewed by Saam Barati.
905
906         * dfg/DFGLICMPhase.cpp:
907         (JSC::DFG::LICMPhase::run):
908
909 2019-02-27  Antoine Quint  <graouts@apple.com>
910
911         Support Pointer Events on macOS
912         https://bugs.webkit.org/show_bug.cgi?id=195008
913         <rdar://problem/47454419>
914
915         Reviewed by Dean Jackson.
916
917         * Configurations/FeatureDefines.xcconfig:
918
919 2019-02-26  Mark Lam  <mark.lam@apple.com>
920
921         Remove poisons in JSCPoison and uses of them.
922         https://bugs.webkit.org/show_bug.cgi?id=195082
923
924         Reviewed by Yusuke Suzuki.
925
926         Also removed unused poisoning code in WriteBarrier, AssemblyHelpers,
927         DFG::SpeculativeJIT, FTLLowerDFGToB3, and FTL::Output.
928
929         * API/JSAPIWrapperObject.h:
930         (JSC::JSAPIWrapperObject::wrappedObject):
931         * API/JSCallbackFunction.h:
932         * API/JSCallbackObject.h:
933         * API/glib/JSAPIWrapperGlobalObject.h:
934         * CMakeLists.txt:
935         * JavaScriptCore.xcodeproj/project.pbxproj:
936         * Sources.txt:
937         * bytecode/AccessCase.cpp:
938         (JSC::AccessCase::generateWithGuard):
939         * dfg/DFGSpeculativeJIT.cpp:
940         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
941         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
942         (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon):
943         (JSC::DFG::SpeculativeJIT::compileGetExecutable):
944         (JSC::DFG::SpeculativeJIT::compileCreateThis):
945         * dfg/DFGSpeculativeJIT.h:
946         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): Deleted.
947         * ftl/FTLLowerDFGToB3.cpp:
948         (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable):
949         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
950         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
951         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
952         (JSC::FTL::DFG::LowerDFGToB3::weakPointer):
953         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted.
954         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted.
955         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted.
956         (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): Deleted.
957         * ftl/FTLOutput.h:
958         (JSC::FTL::Output::weakPoisonedPointer): Deleted.
959         * jit/AssemblyHelpers.cpp:
960         (JSC::AssemblyHelpers::emitDynamicPoison): Deleted.
961         (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): Deleted.
962         (JSC::AssemblyHelpers::emitDynamicPoisonOnType): Deleted.
963         * jit/AssemblyHelpers.h:
964         * jit/JITOpcodes.cpp:
965         (JSC::JIT::emit_op_create_this):
966         * jit/JITPropertyAccess.cpp:
967         (JSC::JIT::emitScopedArgumentsGetByVal):
968         * jit/Repatch.cpp:
969         (JSC::linkPolymorphicCall):
970         * jit/ThunkGenerators.cpp:
971         (JSC::virtualThunkFor):
972         (JSC::nativeForGenerator):
973         (JSC::boundThisNoArgsFunctionCallGenerator):
974         * parser/UnlinkedSourceCode.h:
975         * runtime/ArrayPrototype.h:
976         * runtime/CustomGetterSetter.h:
977         (JSC::CustomGetterSetter::getter const):
978         (JSC::CustomGetterSetter::setter const):
979         * runtime/InitializeThreading.cpp:
980         (JSC::initializeThreading):
981         * runtime/InternalFunction.cpp:
982         (JSC::InternalFunction::getCallData):
983         (JSC::InternalFunction::getConstructData):
984         * runtime/InternalFunction.h:
985         (JSC::InternalFunction::nativeFunctionFor):
986         * runtime/JSArrayBuffer.h:
987         * runtime/JSBoundFunction.h:
988         * runtime/JSCPoison.cpp: Removed.
989         * runtime/JSCPoison.h: Removed.
990         * runtime/JSFunction.h:
991         * runtime/JSGlobalObject.h:
992         * runtime/JSScriptFetchParameters.h:
993         * runtime/JSScriptFetcher.h:
994         * runtime/JSString.h:
995         * runtime/NativeExecutable.cpp:
996         (JSC::NativeExecutable::hashFor const):
997         * runtime/NativeExecutable.h:
998         * runtime/Options.h:
999         * runtime/ScopedArguments.h:
1000         * runtime/Structure.cpp:
1001         (JSC::StructureTransitionTable::setSingleTransition):
1002         * runtime/StructureTransitionTable.h:
1003         (JSC::StructureTransitionTable::map const):
1004         (JSC::StructureTransitionTable::weakImpl const):
1005         (JSC::StructureTransitionTable::setMap):
1006         * runtime/WriteBarrier.h:
1007         * wasm/WasmB3IRGenerator.cpp:
1008         * wasm/WasmInstance.h:
1009         * wasm/js/JSToWasm.cpp:
1010         (JSC::Wasm::createJSToWasmWrapper):
1011         * wasm/js/JSWebAssemblyCodeBlock.h:
1012         * wasm/js/JSWebAssemblyInstance.cpp:
1013         (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
1014         (JSC::JSWebAssemblyInstance::visitChildren):
1015         * wasm/js/JSWebAssemblyInstance.h:
1016         * wasm/js/JSWebAssemblyMemory.h:
1017         * wasm/js/JSWebAssemblyModule.h:
1018         * wasm/js/JSWebAssemblyTable.cpp:
1019         (JSC::JSWebAssemblyTable::JSWebAssemblyTable):
1020         (JSC::JSWebAssemblyTable::grow):
1021         (JSC::JSWebAssemblyTable::clearFunction):
1022         * wasm/js/JSWebAssemblyTable.h:
1023         * wasm/js/WasmToJS.cpp:
1024         (JSC::Wasm::materializeImportJSCell):
1025         (JSC::Wasm::handleBadI64Use):
1026         (JSC::Wasm::wasmToJS):
1027         * wasm/js/WebAssemblyFunctionBase.h:
1028         * wasm/js/WebAssemblyModuleRecord.cpp:
1029         (JSC::WebAssemblyModuleRecord::link):
1030         (JSC::WebAssemblyModuleRecord::evaluate):
1031         * wasm/js/WebAssemblyModuleRecord.h:
1032         * wasm/js/WebAssemblyToJSCallee.h:
1033         * wasm/js/WebAssemblyWrapperFunction.h:
1034
1035 2019-02-26  Mark Lam  <mark.lam@apple.com>
1036
1037         wasmToJS() should purify incoming NaNs.
1038         https://bugs.webkit.org/show_bug.cgi?id=194807
1039         <rdar://problem/48189132>
1040
1041         Reviewed by Saam Barati.
1042
1043         * runtime/JSCJSValue.h:
1044         (JSC::jsNumber):
1045         * runtime/TypedArrayAdaptors.h:
1046         (JSC::IntegralTypedArrayAdaptor::toJSValue):
1047         * wasm/js/WasmToJS.cpp:
1048         (JSC::Wasm::wasmToJS):
1049
1050 2019-02-26  Dominik Infuehr  <dinfuehr@igalia.com>
1051
1052         Fix warnings on ARM and MIPS
1053         https://bugs.webkit.org/show_bug.cgi?id=195049
1054
1055         Reviewed by Mark Lam.
1056
1057         Fix all warnings on ARM and MIPS.
1058
1059         * assembler/MacroAssemblerPrinter.cpp:
1060         (JSC::Printer::printMemory):
1061         * assembler/testmasm.cpp:
1062         (JSC::testProbeModifiesStackValues):
1063         * bytecode/InByIdStatus.cpp:
1064         (JSC::InByIdStatus::computeFor):
1065         * runtime/CachedTypes.cpp:
1066         (JSC::VariableLengthObject::buffer const):
1067         * runtime/JSBigInt.h:
1068         * tools/JSDollarVM.cpp:
1069         (JSC::codeBlockFromArg):
1070
1071 2019-02-26  Mark Lam  <mark.lam@apple.com>
1072
1073         Misc cleanup in StructureIDTable after r242096.
1074         https://bugs.webkit.org/show_bug.cgi?id=195063
1075
1076         Reviewed by Saam Barati.
1077
1078         * runtime/StructureIDTable.cpp:
1079         (JSC::StructureIDTable::allocateID):
1080         - RELEASE_ASSERT that the StructureID allocation will succeed.
1081
1082         * runtime/StructureIDTable.h:
1083         (JSC::StructureIDTable::decode):
1084         (JSC::StructureIDTable::encode):
1085         - Add back a comment that Yusuke requested but was lost when the patch was rolled
1086           out and relanded.
1087         - Applied bitwise_casts that Saam requested.
1088
1089 2019-02-26  Mark Lam  <mark.lam@apple.com>
1090
1091         Gardening: 32-bit build fix after r242096.
1092         https://bugs.webkit.org/show_bug.cgi?id=194989
1093
1094         Not reviewed.
1095
1096         * jit/AssemblyHelpers.cpp:
1097         (JSC::AssemblyHelpers::emitLoadStructure):
1098
1099 2019-02-26  Mark Lam  <mark.lam@apple.com>
1100
1101         Unpoison MacroAssemblerCodePtr, ClassInfo pointers, and a few other things.
1102         https://bugs.webkit.org/show_bug.cgi?id=195039
1103
1104         Reviewed by Saam Barati.
1105
1106         1. Unpoison MacroAssemblerCodePtrs, ReturnAddressPtr.
1107         2. Replace PoisonedClassInfoPtr with ClassInfo*.
1108         3. Replace PoisonedMasmPtr with const void*.
1109         4. Remove all references to CodeBlockPoison, JITCodePoison, and GlobalDataPoison.
1110
1111         * API/JSCallbackObject.h:
1112         * API/JSObjectRef.cpp:
1113         (classInfoPrivate):
1114         * assembler/MacroAssemblerCodeRef.h:
1115         (JSC::FunctionPtr::FunctionPtr):
1116         (JSC::FunctionPtr::executableAddress const):
1117         (JSC::FunctionPtr::retaggedExecutableAddress const):
1118         (JSC::ReturnAddressPtr::ReturnAddressPtr):
1119         (JSC::ReturnAddressPtr::value const):
1120         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
1121         (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
1122         (JSC::MacroAssemblerCodePtr:: const):
1123         (JSC::MacroAssemblerCodePtr::operator! const):
1124         (JSC::MacroAssemblerCodePtr::operator== const):
1125         (JSC::MacroAssemblerCodePtr::hash const):
1126         (JSC::MacroAssemblerCodePtr::emptyValue):
1127         (JSC::MacroAssemblerCodePtr::deletedValue):
1128         (JSC::FunctionPtr<tag>::FunctionPtr):
1129         (JSC::MacroAssemblerCodePtr::poisonedPtr const): Deleted.
1130         * b3/B3LowerMacros.cpp:
1131         * b3/testb3.cpp:
1132         (JSC::B3::testInterpreter):
1133         * dfg/DFGOSRExitCompilerCommon.h:
1134         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
1135         * dfg/DFGSpeculativeJIT.cpp:
1136         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
1137         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
1138         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
1139         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
1140         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
1141         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
1142         * dfg/DFGSpeculativeJIT.h:
1143         * ftl/FTLLowerDFGToB3.cpp:
1144         (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject):
1145         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
1146         * jit/AssemblyHelpers.h:
1147         (JSC::AssemblyHelpers::emitAllocateDestructibleObject):
1148         * jit/ThunkGenerators.cpp:
1149         (JSC::virtualThunkFor):
1150         (JSC::boundThisNoArgsFunctionCallGenerator):
1151         * runtime/JSCPoison.h:
1152         * runtime/JSDestructibleObject.h:
1153         (JSC::JSDestructibleObject::classInfo const):
1154         * runtime/JSSegmentedVariableObject.h:
1155         (JSC::JSSegmentedVariableObject::classInfo const):
1156         * runtime/Structure.h:
1157         * runtime/VM.h:
1158         * wasm/WasmB3IRGenerator.cpp:
1159         (JSC::Wasm::B3IRGenerator::addCall):
1160         (JSC::Wasm::B3IRGenerator::addCallIndirect):
1161         * wasm/WasmBinding.cpp:
1162         (JSC::Wasm::wasmToWasm):
1163
1164 2019-02-26  Mark Lam  <mark.lam@apple.com>
1165
1166         [Re-landing] Add some randomness into the StructureID.
1167         https://bugs.webkit.org/show_bug.cgi?id=194989
1168         <rdar://problem/47975563>
1169
1170         Reviewed by Yusuke Suzuki.
1171
1172         1. On 64-bit, the StructureID will now be encoded as:
1173
1174             ----------------------------------------------------------------
1175             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
1176             ----------------------------------------------------------------
1177
1178            The entropy bits are chosen at random and assigned when a StructureID is
1179            allocated.
1180
1181         2. Instead of Structure pointers, the StructureIDTable will now contain
1182            encodedStructureBits, which is encoded as such:
1183
1184             ----------------------------------------------------------------
1185             | 7 entropy bits |                   57 structure pointer bits |
1186             ----------------------------------------------------------------
1187
1188            The entropy bits here are the same 7 bits used in the encoding of the
1189            StructureID for this structure entry in the StructureIDTable.
1190
1191         3. Retrieval of the structure pointer given a StructureID is now computed as
1192            follows:
1193
1194                 index = structureID >> 7; // with arithmetic shift.
1195                 encodedStructureBits = structureIDTable[index];
1196                 structure = encodedStructureBits ^ (structureID << 57);
1197
1198             We use an arithmetic shift for the right shift because that will preserve
1199             the nuke bit in the high bit of the index if the StructureID was not
1200             decontaminated before use as expected.
1201
1202         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
1203
1204         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
1205            instead of always being the same as m_capacity.
1206
1207         6. Change StructureIDTable::s_unusedID's value to 0.
1208
1209            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
1210            StructureID on 64-bit.  Also, there was never any code that initializes unused
1211            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
1212            is the ID we'll get when the freelist is empty, prompting a resize of the
1213            structureIDTable.
1214
1215         This patch appears to be perf neutral on JetStream 2 run via the cli on a
1216         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
1217
1218         * ftl/FTLLowerDFGToB3.cpp:
1219         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
1220         * heap/SlotVisitor.cpp:
1221         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
1222         * jit/AssemblyHelpers.cpp:
1223         (JSC::AssemblyHelpers::emitLoadStructure):
1224         * jit/AssemblyHelpers.h:
1225         * jit/SpecializedThunkJIT.h:
1226         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
1227         * llint/LowLevelInterpreter.asm:
1228         * llint/LowLevelInterpreter64.asm:
1229         * runtime/StructureIDTable.cpp:
1230         (JSC::StructureIDTable::StructureIDTable):
1231         (JSC::StructureIDTable::makeFreeListFromRange):
1232         (JSC::StructureIDTable::resize):
1233         (JSC::StructureIDTable::allocateID):
1234         (JSC::StructureIDTable::deallocateID):
1235         * runtime/StructureIDTable.h:
1236         (JSC::StructureIDTable::decode):
1237         (JSC::StructureIDTable::encode):
1238         (JSC::StructureIDTable::get):
1239         (JSC::StructureIDTable::isValid):
1240
1241 2019-02-26  Ryan Haddad  <ryanhaddad@apple.com>
1242
1243         Unreviewed, rolling out r242071.
1244
1245         Breaks internal builds.
1246
1247         Reverted changeset:
1248
1249         "Add some randomness into the StructureID."
1250         https://bugs.webkit.org/show_bug.cgi?id=194989
1251         https://trac.webkit.org/changeset/242071
1252
1253 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
1254
1255         [JSC] Fix compilation on 32-bit platforms after r242071
1256         https://bugs.webkit.org/show_bug.cgi?id=195042
1257
1258         Reviewed by Carlos Garcia Campos.
1259
1260         * jit/AssemblyHelpers.cpp:
1261         (JSC::AssemblyHelpers::emitLoadStructure):
1262
1263 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
1264
1265         [JSC] Repeat string created from Array.prototype.join() take too much memory
1266         https://bugs.webkit.org/show_bug.cgi?id=193912
1267
1268         Reviewed by Saam Barati.
1269
1270         Added a fast case in Array.prototype.join when the array is
1271         uninitialized.
1272
1273         * runtime/ArrayPrototype.cpp:
1274         (JSC::canUseFastJoin):
1275         (JSC::fastJoin):
1276         * runtime/JSStringInlines.h:
1277         (JSC::repeatCharacter): moved from StringPrototype.cpp
1278         * runtime/StringPrototype.cpp:
1279
1280 2019-02-25  Mark Lam  <mark.lam@apple.com>
1281
1282         Add some randomness into the StructureID.
1283         https://bugs.webkit.org/show_bug.cgi?id=194989
1284         <rdar://problem/47975563>
1285
1286         Reviewed by Yusuke Suzuki.
1287
1288         1. On 64-bit, the StructureID will now be encoded as:
1289
1290             ----------------------------------------------------------------
1291             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
1292             ----------------------------------------------------------------
1293
1294            The entropy bits are chosen at random and assigned when a StructureID is
1295            allocated.
1296
1297         2. Instead of Structure pointers, the StructureIDTable will now contain
1298            encodedStructureBits, which is encoded as such:
1299
1300             ----------------------------------------------------------------
1301             | 7 entropy bits |                   57 structure pointer bits |
1302             ----------------------------------------------------------------
1303
1304            The entropy bits here are the same 7 bits used in the encoding of the
1305            StructureID for this structure entry in the StructureIDTable.
1306
1307         3. Retrieval of the structure pointer given a StructureID is now computed as
1308            follows:
1309
1310                 index = structureID >> 7; // with arithmetic shift.
1311                 encodedStructureBits = structureIDTable[index];
1312                 structure = encodedStructureBits ^ (structureID << 57);
1313
1314             We use an arithmetic shift for the right shift because that will preserve
1315             the nuke bit in the high bit of the index if the StructureID was not
1316             decontaminated before use as expected.
1317
1318         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
1319
1320         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
1321            instead of always being the same as m_capacity.
1322
1323         6. Change StructureIDTable::s_unusedID's value to 0.
1324
1325            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
1326            StructureID on 64-bit.  Also, there was never any code that initializes unused
1327            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
1328            is the ID we'll get when the freelist is empty, prompting a resize of the
1329            structureIDTable.
1330
1331         This patch appears to be perf neutral on JetStream 2 run via the cli on a
1332         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
1333
1334         * ftl/FTLLowerDFGToB3.cpp:
1335         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
1336         * heap/SlotVisitor.cpp:
1337         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
1338         * jit/AssemblyHelpers.cpp:
1339         (JSC::AssemblyHelpers::emitLoadStructure):
1340         * jit/AssemblyHelpers.h:
1341         * jit/SpecializedThunkJIT.h:
1342         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
1343         * llint/LowLevelInterpreter.asm:
1344         * llint/LowLevelInterpreter64.asm:
1345         * runtime/StructureIDTable.cpp:
1346         (JSC::StructureIDTable::StructureIDTable):
1347         (JSC::StructureIDTable::makeFreeListFromRange):
1348         (JSC::StructureIDTable::resize):
1349         (JSC::StructureIDTable::allocateID):
1350         (JSC::StructureIDTable::deallocateID):
1351         * runtime/StructureIDTable.h:
1352         (JSC::StructureIDTable::decode):
1353         (JSC::StructureIDTable::encode):
1354         (JSC::StructureIDTable::get):
1355         (JSC::StructureIDTable::isValid):
1356
1357 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1358
1359         [JSC] Revert r226885 to make SlotVisitor creation lazy
1360         https://bugs.webkit.org/show_bug.cgi?id=195013
1361
1362         Reviewed by Saam Barati.
1363
1364         We once changed SlotVisitor creation apriori to drop the lock. Also, it turns out that SlotVisitor is memory-consuming.
1365         We should defer SlotVisitor creation until it is actually required. This patch reverts r226885. Even with this patch,
1366         we still hold many SlotVisitors after we execute many parallel markers at least once. But recovering the feature of
1367         dynamically allocating SlotVisitors helps further memory optimizations in this area.
1368
1369         * heap/Heap.cpp:
1370         (JSC::Heap::Heap):
1371         (JSC::Heap::runBeginPhase):
1372         * heap/Heap.h:
1373         * heap/HeapInlines.h:
1374         (JSC::Heap::forEachSlotVisitor):
1375         (JSC::Heap::numberOfSlotVisitors):
1376         * heap/MarkingConstraintSolver.cpp:
1377         (JSC::MarkingConstraintSolver::didVisitSomething const):
1378         * heap/SlotVisitor.h:
1379
1380 2019-02-25  Saam Barati  <sbarati@apple.com>
1381
1382         testb3 and testair should test O0/O1/O2
1383         https://bugs.webkit.org/show_bug.cgi?id=194637
1384
1385         Reviewed by Mark Lam.
1386
1387         This patch makes it so that we run all tests in testair and testb3
1388         in O0, O1, and O2. However, some tests are invalid for O0 and O1.
1389         This patch makes it so we only run those tests in O2. These are
1390         often tests that assert certain optimizations have occurred. There
1391         are also a class of tests that rely on using patchpoints to stress 
1392         the register allocator into only a single valid allocation. The
1393         O0, and sometimes O1, register allocators are not always good enough
1394         to allocate such programs. To make these valid allocators to use, we rely
1395         on the FTL and Wasm to not emit such patchpoints.
1396
1397         * b3/air/testair.cpp:
1398         (main):
1399         * b3/testb3.cpp:
1400         (JSC::B3::compileProc):
1401         (JSC::B3::testAddLoadTwice):
1402         (JSC::B3::testMulLoadTwice):
1403         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
1404         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
1405         (JSC::B3::testPatchpointWithEarlyClobber):
1406         (JSC::B3::testSimpleCheck):
1407         (JSC::B3::testCheckFalse):
1408         (JSC::B3::testCheckTrue):
1409         (JSC::B3::testCheckLessThan):
1410         (JSC::B3::testCheckMegaCombo):
1411         (JSC::B3::testCheckTrickyMegaCombo):
1412         (JSC::B3::testCheckTwoMegaCombos):
1413         (JSC::B3::testCheckTwoNonRedundantMegaCombos):
1414         (JSC::B3::testCheckAddImm):
1415         (JSC::B3::testCheckAddImmCommute):
1416         (JSC::B3::testCheckAddImmSomeRegister):
1417         (JSC::B3::testCheckAdd):
1418         (JSC::B3::testCheckAdd64):
1419         (JSC::B3::testCheckAddFold):
1420         (JSC::B3::testCheckAddFoldFail):
1421         (JSC::B3::testCheckAddSelfOverflow64):
1422         (JSC::B3::testCheckAddSelfOverflow32):
1423         (JSC::B3::testCheckSubImm):
1424         (JSC::B3::testCheckSubBadImm):
1425         (JSC::B3::testCheckSub):
1426         (JSC::B3::testCheckSub64):
1427         (JSC::B3::testCheckSubFold):
1428         (JSC::B3::testCheckSubFoldFail):
1429         (JSC::B3::testCheckNeg):
1430         (JSC::B3::testCheckNeg64):
1431         (JSC::B3::testCheckMul):
1432         (JSC::B3::testCheckMulMemory):
1433         (JSC::B3::testCheckMul2):
1434         (JSC::B3::testCheckMul64):
1435         (JSC::B3::testCheckMulFold):
1436         (JSC::B3::testCheckMulFoldFail):
1437         (JSC::B3::testCheckMul64SShr):
1438         (JSC::B3::testLinearScanWithCalleeOnStack):
1439         (JSC::B3::testCheckSelect):
1440         (JSC::B3::testCheckSelectCheckSelect):
1441         (JSC::B3::testCheckSelectAndCSE):
1442         (JSC::B3::testLateRegister):
1443         (JSC::B3::testReduceStrengthCheckBottomUseInAnotherBlock):
1444         (JSC::B3::testSomeEarlyRegister):
1445         (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2):
1446         (JSC::B3::testPinRegisters):
1447         (JSC::B3::testX86LeaAddAddShlLeft):
1448         (JSC::B3::testX86LeaAddAddShlRight):
1449         (JSC::B3::testX86LeaAddAdd):
1450         (JSC::B3::testX86LeaAddShlRight):
1451         (JSC::B3::testX86LeaAddShlLeftScale1):
1452         (JSC::B3::testX86LeaAddShlLeftScale2):
1453         (JSC::B3::testX86LeaAddShlLeftScale4):
1454         (JSC::B3::testX86LeaAddShlLeftScale8):
1455         (JSC::B3::testLoadBaseIndexShift2):
1456         (JSC::B3::testOptimizeMaterialization):
1457         (JSC::B3::testLICMPure):
1458         (JSC::B3::testLICMPureSideExits):
1459         (JSC::B3::testLICMPureWritesPinned):
1460         (JSC::B3::testLICMPureWrites):
1461         (JSC::B3::testLICMReadsPinned):
1462         (JSC::B3::testLICMReads):
1463         (JSC::B3::testLICMPureNotBackwardsDominant):
1464         (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild):
1465         (JSC::B3::testLICMControlDependent):
1466         (JSC::B3::testLICMControlDependentNotBackwardsDominant):
1467         (JSC::B3::testLICMReadsWritesDifferentHeaps):
1468         (JSC::B3::testWasmBoundsCheck):
1469         (JSC::B3::run):
1470         (main):
1471
1472 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1473
1474         [JSC] stress/function-constructor-reading-from-global-lexical-environment.js fails in 32bit arch
1475         https://bugs.webkit.org/show_bug.cgi?id=195030
1476         <rdar://problem/48385088>
1477
1478         Reviewed by Saam Barati.
1479
1480         While LLInt64 has checkTDZInGlobalPutToScopeIfNecessary for op_put_to_scope GlobalLexicalVar to check the value in the variable slot is not empty,
1481         this check is missing in LLInt32_64. Previously, this check was subsumed accidentally by the WatchpointSet check in GlobalLexicalVar in `notifyWrite`:
1482         because no "put" attempt succeeds here, the status WatchpointSet was ClearWatchpoint, we always go to the slow path, and we always throw the TDZ error
1483         before configuring the WatchpointSet in the slow path. But after r241862, WatchpointSet is not used under non-JIT configuration. This skips WatchpointSet
1484         check and LLInt32_64 starts failing tests because of lack of checkTDZInGlobalPutToScopeIfNecessary. This patch adds checkTDZInGlobalPutToScopeIfNecessary
1485         in LLInt32_64 too. This patch fixes the following four failing tests.
1486
1487             stress/function-constructor-reading-from-global-lexical-environment.js.bytecode-cache
1488             stress/function-constructor-reading-from-global-lexical-environment.js.default
1489             stress/global-lexical-variable-tdz.js.bytecode-cache
1490             stress/global-lexical-variable-tdz.js.default
1491
1492         * llint/LowLevelInterpreter32_64.asm:
1493
1494 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1495
1496         [JSC] Make Intl fields lazily-allocated
1497         https://bugs.webkit.org/show_bug.cgi?id=195022
1498
1499         Reviewed by Mark Lam.
1500
1501         This patch makes the following memory footprint optimization in IntlObject.
1502
1503         1. Make IntlObject fields including Intl.Collator lazily-allocated because we already removed direct references from JS builtins to these constructors (@Collator etc.).
1504
1505         2. Move LazyProperty<IntlObject, Structure> structures from IntlObject to JSGlobalObject. This makes sizeof(IntlObject) the same to the other ones of usual runtime Objects,
1506            and drop one MarkedBlock.
1507
1508         * runtime/IntlCollatorConstructor.h:
1509         * runtime/IntlDateTimeFormatConstructor.h:
1510         * runtime/IntlNumberFormatConstructor.h:
1511         * runtime/IntlObject.cpp:
1512         (JSC::createCollatorConstructor):
1513         (JSC::createNumberFormatConstructor):
1514         (JSC::createDateTimeFormatConstructor):
1515         (JSC::createPluralRulesConstructor):
1516         (JSC::IntlObject::finishCreation):
1517         (JSC::IntlObject::visitChildren): Deleted.
1518         * runtime/IntlObject.h:
1519         * runtime/IntlPluralRulesConstructor.h:
1520         * runtime/JSGlobalObject.cpp:
1521         (JSC::JSGlobalObject::init):
1522         (JSC::JSGlobalObject::visitChildren):
1523         (JSC::JSGlobalObject::defaultCollator):
1524         * runtime/JSGlobalObject.h:
1525         (JSC::JSGlobalObject::collatorStructure):
1526         (JSC::JSGlobalObject::numberFormatStructure):
1527         (JSC::JSGlobalObject::dateTimeFormatStructure):
1528         (JSC::JSGlobalObject::pluralRulesStructure):
1529         (JSC::JSGlobalObject::intlObject const): Deleted.
1530         * runtime/JSGlobalObjectFunctions.cpp:
1531         (JSC::globalFuncDateTimeFormat):
1532         * runtime/NumberPrototype.cpp:
1533         (JSC::numberProtoFuncToLocaleString):
1534         * runtime/StringPrototype.cpp:
1535         (JSC::stringProtoFuncLocaleCompare):
1536
1537 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
1538
1539         Avoid hashing CompactVariableEnvironment when decoding CompactVariableMap::Handle
1540         https://bugs.webkit.org/show_bug.cgi?id=194937
1541
1542         Reviewed by Saam Barati.
1543
1544         Hashing the CompactVariableEnvironment is expensive and we could avoid it
1545         when decoding multiple handles to the same environment. This is sound because
1546         a pointer to the same CompactVariableEnvironment will hash the same.
1547
1548         * runtime/CachedTypes.cpp:
1549         (JSC::Decoder::handleForEnvironment const):
1550         (JSC::Decoder::setHandleForEnvironment):
1551         (JSC::CachedCompactVariableMapHandle::decode const):
1552
1553 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
1554
1555         Remove unnecessary WTF:: prefixes in CachedTypes
1556         https://bugs.webkit.org/show_bug.cgi?id=194936
1557
1558         Reviewed by Saam Barati.
1559
1560         Cleanup unnecessary prefixes from Optional, roundUpToMultipleOf and
1561         pageSize.
1562
1563         * runtime/CachedTypes.cpp:
1564         (JSC::Encoder::cachedOffsetForPtr):
1565         (JSC::Encoder::Page::malloc):
1566         (JSC::Encoder::allocateNewPage):
1567         (JSC::CachedPtr::encode):
1568         (JSC::CachedPtr::decode const):
1569         (JSC::CachedOptional::encode):
1570         (JSC::CachedOptional::decode const):
1571
1572 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
1573
1574         [JSC] Drop direct references to Intl constructors by rewriting Intl JS builtins in C++
1575         https://bugs.webkit.org/show_bug.cgi?id=194976
1576
1577         Reviewed by Michael Saboff.
1578
1579         This patch paves the way to making IntlObject allocation lazy by removing direct references
1580         to Intl constructors (Intl.Collator etc.) from builtin JS. To achieve that,
1581
1582         1. We implement String.prototype.toLocaleCompare and Number.prototype.toLocaleString in C++
1583            instead of JS builtins. Since these functions end up calling ICU C++ runtime, writing them in
1584            JS does not offer performance improvement.
1585
1586         2. We remove @DateTimeFormat constructor reference, and instead, exposing @dateTimeFormat function,
1587            which returns formatted string directly. We still have JS builtins for DateTimeFormat things
1588            because the initialization of its "options" JSObject involves many get_by_id / put_by_id things,
1589            which are efficient in JS. But we avoid exposing @DateTimeFormat directly, so that Intl constructors
1590            can be lazily allocated.
1591
1592         * CMakeLists.txt:
1593         * DerivedSources-input.xcfilelist:
1594         * DerivedSources.make:
1595         * JavaScriptCore.xcodeproj/project.pbxproj:
1596         * builtins/BuiltinNames.h:
1597         * builtins/DatePrototype.js:
1598         (toLocaleString):
1599         (toLocaleDateString):
1600         (toLocaleTimeString):
1601         * builtins/NumberPrototype.js: Removed.
1602         * builtins/StringPrototype.js:
1603         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
1604         (globalPrivate.getDefaultCollator): Deleted.
1605         * runtime/JSGlobalObject.cpp:
1606         (JSC::JSGlobalObject::init):
1607         (JSC::JSGlobalObject::visitChildren):
1608         (JSC::JSGlobalObject::defaultCollator):
1609         * runtime/JSGlobalObject.h:
1610         * runtime/JSGlobalObjectFunctions.cpp:
1611         (JSC::globalFuncDateTimeFormat):
1612         * runtime/JSGlobalObjectFunctions.h:
1613         * runtime/NumberPrototype.cpp:
1614         (JSC::NumberPrototype::finishCreation):
1615         (JSC::throwVMToThisNumberError):
1616         (JSC::numberProtoFuncToExponential):
1617         (JSC::numberProtoFuncToFixed):
1618         (JSC::numberProtoFuncToPrecision):
1619         (JSC::numberProtoFuncToString):
1620         (JSC::numberProtoFuncToLocaleString):
1621         (JSC::numberProtoFuncValueOf):
1622         * runtime/StringPrototype.cpp:
1623         (JSC::StringPrototype::finishCreation):
1624         (JSC::stringProtoFuncLocaleCompare):
1625
1626 2019-02-24  Devin Rousso  <drousso@apple.com>
1627
1628         Web Inspector: Change the InspectorOverlay to use native rather than canvas
1629         https://bugs.webkit.org/show_bug.cgi?id=105023
1630         <rdar://problem/13443692>
1631
1632         Reviewed by Brian Burg.
1633
1634         * inspector/protocol/OverlayTypes.json: Removed.
1635         Now that the overlay is entirely generated in C++, we no longer need the special prototol
1636         types for transferring data to a JavaScript context.
1637
1638         * inspector/protocol/Debugger.json:
1639         * inspector/agents/InspectorDebuggerAgent.h:
1640         * inspector/agents/InspectorDebuggerAgent.cpp:
1641         (Inspector::InspectorDebuggerAgent::setOverlayMessage): Deleted.
1642         Remove `Debugger.setOverlayMessage` command as it hasn't been used and is no longer supported.
1643
1644         * CMakeLists.txt:
1645         * DerivedSources-input.xcfilelist:
1646         * DerivedSources.make:
1647
1648 2019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
1649
1650         [JSC] Lazily create sentinel Map and Set buckets
1651         https://bugs.webkit.org/show_bug.cgi?id=194975
1652
1653         Reviewed by Saam Barati.
1654
1655         If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
1656         This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
1657         them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
1658
1659         * bytecode/BytecodeIntrinsicRegistry.cpp:
1660         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
1661         (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
1662         (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
1663         * bytecode/BytecodeIntrinsicRegistry.h:
1664         * dfg/DFGByteCodeParser.cpp:
1665         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
1666         * dfg/DFGOperations.cpp:
1667         * dfg/DFGSpeculativeJIT.cpp:
1668         (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
1669         * dfg/DFGSpeculativeJIT64.cpp:
1670         (JSC::DFG::SpeculativeJIT::compile):
1671         * ftl/FTLLowerDFGToB3.cpp:
1672         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
1673         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
1674         * runtime/MapConstructor.cpp:
1675         (JSC::mapPrivateFuncMapBucketNext):
1676         * runtime/SetConstructor.cpp:
1677         (JSC::setPrivateFuncSetBucketNext):
1678         * runtime/VM.cpp:
1679         (JSC::VM::VM):
1680         (JSC::VM::sentinelSetBucketSlow):
1681         (JSC::VM::sentinelMapBucketSlow):
1682         * runtime/VM.h:
1683         (JSC::VM::sentinelSetBucket):
1684         (JSC::VM::sentinelMapBucket):
1685
1686 2019-02-20  Darin Adler  <darin@apple.com>
1687
1688         Finish removing String::format
1689         https://bugs.webkit.org/show_bug.cgi?id=194893
1690
1691         Reviewed by Daniel Bates.
1692
1693         * bytecode/CodeBlock.cpp:
1694         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
1695         using the new "pad" function.
1696
1697 2019-02-23  Robin Morisset  <rmorisset@apple.com>
1698
1699         Remove dead code: AdjacencyList::justOneChild()
1700         https://bugs.webkit.org/show_bug.cgi?id=194965
1701
1702         Reviewed by Sam Weinig.
1703
1704         * dfg/DFGAdjacencyList.h:
1705         (JSC::DFG::AdjacencyList::justOneChild const): Deleted.
1706
1707 2019-02-23  Michael Catanzaro  <mcatanzaro@igalia.com>
1708
1709         Unreviewed, fix -Wunused-param warning
1710
1711         * jsc.cpp:
1712
1713 2019-02-23  Mark Lam  <mark.lam@apple.com>
1714
1715         Add an exception check and some assertions in StringPrototype.cpp.
1716         https://bugs.webkit.org/show_bug.cgi?id=194962
1717         <rdar://problem/48013416>
1718
1719         Reviewed by Yusuke Suzuki and Saam Barati.
1720
1721         * runtime/StringPrototype.cpp:
1722         (JSC::jsSpliceSubstrings):
1723         (JSC::jsSpliceSubstringsWithSeparators):
1724         (JSC::operationStringProtoFuncReplaceRegExpEmptyStr):
1725
1726 2019-02-23  Keith Miller  <keith_miller@apple.com>
1727
1728         Add new mac target numbers
1729         https://bugs.webkit.org/show_bug.cgi?id=194955
1730
1731         Reviewed by Tim Horton.
1732
1733         * Configurations/Base.xcconfig:
1734         * Configurations/DebugRelease.xcconfig:
1735
1736 2019-02-22  Robin Morisset  <rmorisset@apple.com>
1737
1738         DFGBytecodeParser should not declare that a node won't clobberExit if DFGFixupPhase can later declare it does clobberExit
1739         https://bugs.webkit.org/show_bug.cgi?id=194953
1740         <rdar://problem/47595253>
1741
1742         Reviewed by Saam Barati.
1743
1744         For each node that
1745         (a) may or may not clobberExit depending on their arrayMode
1746         (b) and get their arrayMode from profiling information in DFGBytecodeParser
1747         (c) and can have their arrayMode refined by DFGFixupPhase,
1748         We must make sure to be conservative in the DFGBytecodeParser and treat it as if it unconditionnally clobbered the exit.
1749         Otherwise we will hit a validation failure after fixup if the next node was marked ExitValid and exits to the same semantic origin.
1750
1751         The list of nodes that fit (a) is:
1752         - StringCharAt
1753         - HasIndexProperty
1754         - GetByVal
1755         - PutByValDirect
1756         - PutByVal
1757         - PutByValAlias
1758         - GetIndexedPropertyStorage
1759
1760         Out of these, the following also fit (b) and (c):
1761         - HasIndexedProperty
1762         - GetByVal
1763         - PutByValDirect
1764         - PutByVal
1765
1766         GetByVal already had "m_exitOK = false; // GetByVal must be treated as if it clobbers exit state, since FixupPhase may make it generic."
1767         So we just have to fix the other three the same way.
1768
1769         * dfg/DFGByteCodeParser.cpp:
1770         (JSC::DFG::ByteCodeParser::parseBlock):
1771         (JSC::DFG::ByteCodeParser::handlePutByVal):
1772
1773 2019-02-22  Robin Morisset  <rmorisset@apple.com>
1774
1775         B3ReduceStrength: missing peephole optimizations for binary operations
1776         https://bugs.webkit.org/show_bug.cgi?id=194252
1777
1778         Reviewed by Saam Barati.
1779
1780         Adds several sets of optimizations for BitAnd, BitOr and BitXor.
1781         Using BitAnd distributivity over BitOr and BitXor:
1782           Turn any of these (for Op == BitOr || Op == BitXor):
1783                 Op(BitAnd(x1, x2), BitAnd(x1, x3))
1784                 Op(BitAnd(x2, x1), BitAnd(x1, x3))
1785                 Op(BitAnd(x1, x2), BitAnd(x3, x1))
1786                 Op(BitAnd(x2, x1), BitAnd(x3, x1))
1787            Into this: BitAnd(Op(x2, x3), x1)
1788            And any of these:
1789                 Op(BitAnd(x1, x2), x1)
1790                 Op(BitAnd(x2, x1), x1)
1791                 Op(x1, BitAnd(x1, x2))
1792                 Op(x1, BitAnd(x2, x1))
1793            Into this: BitAnd(Op(x2, x1), x1)
1794            This second set is equivalent to doing x1 => BitAnd(x1, x1), and then applying the first set.
1795         Using de Morgan laws (we represent not as BitXor with allOnes):
1796           BitAnd(BitXor(x1, allOnes), BitXor(x2, allOnes)) => BitXor(BitOr(x1, x2), allOnes)
1797           BitOr(BitXor(x1, allOnes), BitXor(x2, allOnes) => BitXor(BitAnd(x1, x2), allOnes)
1798           BitOr(BitXor(x, allOnes), c) => BitXor(BitAnd(x, ~c), allOnes)
1799           BitAnd(BitXor(x, allOnes), c) => BitXor(BitOr(x, ~c), allOnes)
1800         The latter two are equivalent to doing c => BitXor(~c, allOnes), and then applying the former two.
1801
1802         All of these transformations either reduce the number of operations (which we always do when possible), or bring the expression closer to having:
1803           - BitXor with all ones at the outermost
1804           - then BitAnd
1805           - then other BitXor
1806           - then BitOr at the innermost.
1807         These transformations that don't directly reduce the number of operations are still useful for normalization (helping things like CSE), and also can enable
1808         more optimizations (for example BitXor with all ones can easily cancel each other once they are all at the outermost level).
1809
1810         * b3/B3ReduceStrength.cpp:
1811         * b3/testb3.cpp:
1812         (JSC::B3::testBitAndNotNot):
1813         (JSC::B3::testBitAndNotImm):
1814         (JSC::B3::testBitOrAndAndArgs):
1815         (JSC::B3::testBitOrAndSameArgs):
1816         (JSC::B3::testBitOrNotNot):
1817         (JSC::B3::testBitOrNotImm):
1818         (JSC::B3::testBitXorAndAndArgs):
1819         (JSC::B3::testBitXorAndSameArgs):
1820         (JSC::B3::run):
1821
1822 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1823
1824         [JSC] putNonEnumerable in JSWrapperMap is too costly
1825         https://bugs.webkit.org/show_bug.cgi?id=194935
1826
1827         Reviewed by Mark Lam.
1828
1829         When we convert Objective-C blocks to JS objects, we need to set up a corresponding function object correctly.
1830         During this allocation, we call [JSValue defineProperty:descriptor] to connect a "prototype" object and "constructor" object.
1831         The problem is that this API has a particularly costly implementation:
1832
1833             [[_context globalObject][@"Object"] invokeMethod:@"defineProperty" withArguments:@[ self, key, descriptor ]];
1834
1835         This wraps each JS objects appear in this code with Objective-C wrapper. And we convert a NSDictionary to JSObject, which
1836         has "writable", "enumerable", "configurable", "value" fields, and call the "defineProperty" JS function through Objective-C wrapper.
1837         This allocates many Objective-C wrappers and JS objects for descriptors. Since JSC has a direct C++ API "defineOwnProperty", we should
1838         bypass these Objective-C APIs and call JSC's code directly.
1839
1840         This patch changes `putNonEnumerable` implementation, from calling [JSValue defineProperty:descriptor] to calling JSC C++ code directly.
1841         We do not change [JSValue defineProperty:descriptor] implementation for now because of two reasons. (1) This is not used in our benchmarks
1842         except for this (converting an Objective-C block to a JS object) one path. And (2) even if we were to re-write [JSValue defineProperty:descriptor]
1843         to be more optimized, we would still want to call the JSC C++ version of defineProperty directly here to avoid NSDictionary allocation for a descriptor.
1844
1845         * API/APIUtils.h:
1846         (setException):
1847         * API/JSWrapperMap.mm:
1848         (putNonEnumerable):
1849         (copyMethodsToObject):
1850         (-[JSObjCClassInfo allocateConstructorAndPrototypeInContext:]):
1851         (-[JSObjCClassInfo wrapperForObject:inContext:]):
1852
1853 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1854
1855         Unreviewed, build fix after r241954
1856         https://bugs.webkit.org/show_bug.cgi?id=194939
1857
1858         Renaming setCanAccessHeap was incomplete.
1859
1860         * runtime/SmallStrings.cpp:
1861         (JSC::SmallStrings::initializeCommonStrings):
1862         * runtime/VM.cpp:
1863         (JSC::VM::~VM):
1864
1865 2019-02-22  Yusuke Suzuki  <ysuzuki@apple.com>
1866
1867         [JSC] SmallStringsStorage is unnecessary
1868         https://bugs.webkit.org/show_bug.cgi?id=194939
1869
1870         Reviewed by Mark Lam.
1871
1872         SmallStrings hold common small JSStrings. Their underlying StringImpl is also held by SmallStringsStorage.
1873         But it is duplicate since we can get StringImpl from small JSStrings. This patch removes SmallStringsStorage,
1874         and get StringImpls from JSStrings if necessary.
1875
1876         We also add m_canAccessHeap flag to SmallStrings. At the time of VM destruction, JSStrings are destroyed when
1877         VM's Heap is finalized. We must not touch JSStrings before VM's heap (and JSStrings in SmallStrings) is initialized,
1878         and after VM's Heap is destroyed. We add this m_canAccessHeap flag to allow users to get StringImpl during the
1879         this sensitive period. If m_canAccessHeap is false, we get StringImpl from AtomicStringImpl::add.
1880
1881         * runtime/SmallStrings.cpp:
1882         (JSC::SmallStrings::initializeCommonStrings):
1883         (JSC::SmallStrings::singleCharacterStringRep):
1884         (JSC::SmallStringsStorage::rep): Deleted.
1885         (JSC::SmallStringsStorage::SmallStringsStorage): Deleted.
1886         (JSC::SmallStrings::createSingleCharacterString): Deleted.
1887         * runtime/SmallStrings.h:
1888         (JSC::SmallStrings::setCanAccessHeap):
1889         * runtime/VM.cpp:
1890         (JSC::VM::VM):
1891         (JSC::VM::~VM):
1892
1893 2019-02-22  Tadeu Zagallo  <tzagallo@apple.com>
1894
1895         Cache CompactVariableMap::Handle instead of VariableEnvironment for UnlinkedFunctionExecutable
1896         https://bugs.webkit.org/show_bug.cgi?id=194706
1897
1898         Reviewed by Saam Barati.
1899
1900         In https://bugs.webkit.org/show_bug.cgi?id=194583 we started using a
1901         CompactVariableMap::Handle instead of VariableEnvironment for
1902         UnlinkedFunctionExecutables, but we were creating the full environment
1903         to encode the executable in the bytecode cache. This patch changes it so
1904         that we cache the handle instead of the environment. This avoids duplicating
1905         the VariableEnvironment whenever we have to cache two handles that point
1906         to the environment.
1907
1908         * bytecode/UnlinkedFunctionExecutable.h:
1909         * parser/VariableEnvironment.cpp:
1910         (JSC::CompactVariableMap::get):
1911         * parser/VariableEnvironment.h:
1912         * runtime/CachedTypes.cpp:
1913         (JSC::CachedCompactVariableEnvironment::encode):
1914         (JSC::CachedCompactVariableEnvironment::decode const):
1915         (JSC::CachedCompactVariableMapHandle::encode):
1916         (JSC::CachedCompactVariableMapHandle::decode const):
1917         (JSC::CachedFunctionExecutable::encode):
1918         (JSC::CachedFunctionExecutable::decode const):
1919         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
1920
1921 2019-02-21  Saam Barati  <sbarati@apple.com>
1922
1923         Update JSScript SPI based on feedback
1924         https://bugs.webkit.org/show_bug.cgi?id=194517
1925
1926         Reviewed by Keith Miller.
1927
1928         This patch updates the JSScript SPI in the following ways:
1929         - JSScript can now represent both modules and programs. This is a property
1930         of the script determined during creation.
1931         - JSScript now takes a sourceURL during construction. For modules, this acts
1932         as the module identifier.
1933         - JSScript now has SPI for writing the cache out to disk. We don't do this
1934         automatically.
1935         - JSScript will load the bytecode cache on creation if it exists.
1936         - We retrofit these new requirements on the prior JSScript SPI that
1937         we're going to remove as soon as we can: https://bugs.webkit.org/show_bug.cgi?id=194909.
1938         Previous SPI assumes all JSScripts are modules. Previous SPI also assigns
1939         a sourceURL to the JSScript based on what the module loader decided the
1940         identifier should be. We'll remove this once we remove the old SPI.
1941         
1942         This patch also adds SPI to JSContext to evaluate a JSScript. For modules,
1943         this is like returning the result of doing dynamic import. For programs,
1944         this does normal program evaluation.
1945         
1946         This patch also fixes a bug in generateBytecode/generateModuleBytecode where
1947         we would try to cache the bytecode even if recursivelyGenerateUnlinkedCodeBlock
1948         returned null. E.g, if the script had a syntax error.
1949         
1950         When writing tests, I also discovered that someone previously broke
1951         testapi. This patch also fixes those failures. They were broken when
1952         we switched to using a testapiScripts directory to hold our test .js
1953         scripts. 
1954
1955         * API/JSAPIGlobalObject.h:
1956         * API/JSAPIGlobalObject.mm:
1957         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
1958         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
1959         (JSC::JSAPIGlobalObject::loadAndEvaluateJSScriptModule):
1960         * API/JSBase.cpp:
1961         (JSEvaluateScriptInternal):
1962         (JSEvaluateScript):
1963         * API/JSBaseInternal.h: Added.
1964         * API/JSContext.mm:
1965         (-[JSContext evaluateScript:withSourceURL:]):
1966         (-[JSContext evaluateJSScript:]):
1967         * API/JSContextPrivate.h:
1968         * API/JSScript.h:
1969         * API/JSScript.mm:
1970         (+[JSScript scriptWithSource:inVirtualMachine:]):
1971         (+[JSScript scriptFromASCIIFile:inVirtualMachine:withCodeSigning:andBytecodeCache:]):
1972         (createError):
1973         (+[JSScript scriptOfType:inVirtualMachine:withSourceURL:andSource:andBytecodeCache:error:]):
1974         (+[JSScript scriptOfType:inVirtualMachine:memoryMappedFromASCIIFile:withSourceURL:andBytecodeCache:error:]):
1975         (-[JSScript cacheBytecodeWithError:]):
1976         (-[JSScript sourceURL]):
1977         (-[JSScript type]):
1978         (-[JSScript jsSourceCode]):
1979         (-[JSScript writeCache:]):
1980         (-[JSScript setSourceURL:]):
1981         (-[JSScript forceRecreateJSSourceCode]):
1982         (-[JSScript writeCache]): Deleted.
1983         (-[JSScript jsSourceCode:]): Deleted.
1984         * API/JSScriptInternal.h:
1985         * API/tests/FunctionOverridesTest.cpp:
1986         (testFunctionOverrides):
1987         * API/tests/testapi.c:
1988         (main):
1989         * API/tests/testapi.mm:
1990         (tempFile):
1991         (testModuleBytecodeCache):
1992         (testProgramBytecodeCache):
1993         (testBytecodeCacheWithSyntaxError):
1994         (testProgramJSScriptException):
1995         (testLoadBasicFileLegacySPI):
1996         (+[JSContextMemoryMappedLoaderDelegate newContext]):
1997         (-[JSContextMemoryMappedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
1998         (testLoadBasicFile):
1999         (+[JSContextAugmentedLoaderDelegate newContext]):
2000         (-[JSContextAugmentedLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
2001         (testJSScriptURL):
2002         (testObjectiveCAPI):
2003         (testBytecodeCache): Deleted.
2004         * API/tests/testapiScripts/foo.js: Added.
2005         * JavaScriptCore.xcodeproj/project.pbxproj:
2006         * runtime/Completion.cpp:
2007         (JSC::generateBytecode):
2008         (JSC::generateModuleBytecode):
2009
2010 2019-02-21  Mark Lam  <mark.lam@apple.com>
2011
2012         Add more doesGC() assertions.
2013         https://bugs.webkit.org/show_bug.cgi?id=194911
2014         <rdar://problem/48285723>
2015
2016         Reviewed by Saam Barati and Yusuke Suzuki.
2017
2018         * dfg/DFGOSRExit.cpp:
2019         (JSC::DFG::OSRExit::compileOSRExit):
2020         - Set expectDoesGC here because we no longer have to worry about missing store
2021           barriers in optimized code after this point.  This will prevent false positive
2022           assertion failures arising from functions called beneath compileOSRExit().
2023
2024         (JSC::DFG::OSRExit::compileExit):
2025         - Add a comment to explain why the generated ramp needs to set expectDoesGC even
2026           though compileOSRExit() also sets it.  Reason: compileOSRExit() is only called
2027           for the first OSR from this code origin, the generated ramp is called for many
2028           subsequents OSR exits from this code origin.
2029
2030         * ftl/FTLOSRExitCompiler.cpp:
2031         (JSC::FTL::compileStub):
2032         - Added a comment for the equivalent reason to the one above.
2033
2034         (JSC::FTL::compileFTLOSRExit):
2035         - Set expectDoesGC here because we no longer have to worry about missing store
2036           barriers in optimized code after this point.  This will prevent false positive
2037           assertion failures arising from functions called beneath compileFTLOSRExit().
2038
2039         * heap/CompleteSubspace.cpp:
2040         (JSC::CompleteSubspace::tryAllocateSlow):
2041         * heap/CompleteSubspaceInlines.h:
2042         (JSC::CompleteSubspace::allocateNonVirtual):
2043         - assert expectDoesGC.
2044
2045         * heap/DeferGC.h:
2046         (JSC::DeferGC::~DeferGC):
2047         - assert expectDoesGC.
2048         - Also added WTF_FORBID_HEAP_ALLOCATION to DeferGC, DeferGCForAWhile, and DisallowGC
2049           because all 3 should be stack allocated RAII objects.
2050
2051         * heap/GCDeferralContext.h:
2052         * heap/GCDeferralContextInlines.h:
2053         (JSC::GCDeferralContext::~GCDeferralContext):
2054         - Added WTF_FORBID_HEAP_ALLOCATION.
2055         - assert expectDoesGC.
2056
2057         * heap/Heap.cpp:
2058         (JSC::Heap::collectNow):
2059         (JSC::Heap::collectAsync):
2060         (JSC::Heap::collectSync):
2061         (JSC::Heap::stopIfNecessarySlow):
2062         (JSC::Heap::collectIfNecessaryOrDefer):
2063         * heap/HeapInlines.h:
2064         (JSC::Heap::acquireAccess):
2065         (JSC::Heap::stopIfNecessary):
2066         * heap/LargeAllocation.cpp:
2067         (JSC::LargeAllocation::tryCreate):
2068         * heap/LocalAllocatorInlines.h:
2069         (JSC::LocalAllocator::allocate):
2070         - conservatively assert expectDoesGC on these functions that may trigger a GC
2071           though they don't always do.
2072
2073         * runtime/DisallowScope.h:
2074         - DisallowScope should be stack allocated because it's an RAII object.
2075
2076         * runtime/JSCellInlines.h:
2077         (JSC::tryAllocateCellHelper):
2078         - Remove the expectDoesGC assertion because it is now covered by assertions in
2079           CompleteSubspace, LargeAllocation, and LocalAllocator.
2080
2081         * runtime/RegExpMatchesArray.h:
2082         (JSC::createRegExpMatchesArray):
2083         - assert expectDoesGC.
2084
2085 2019-02-21  Yusuke Suzuki  <ysuzuki@apple.com>
2086
2087         [JSC] Use Fast Malloc as much as possible
2088         https://bugs.webkit.org/show_bug.cgi?id=194316
2089
2090         Reviewed by Mark Lam.
2091
2092         We should use Fast Malloc as much as possible to offer the whole memory view to bmalloc.
2093
2094         * inspector/scripts/codegen/cpp_generator_templates.py:
2095         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
2096         * inspector/scripts/tests/generic/expected/enum-values.json-result:
2097         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
2098         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
2099         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
2100         * jit/ExecutableAllocator.h:
2101         * jsc.cpp:
2102         * runtime/JSRunLoopTimer.h:
2103         * tools/VMInspector.h:
2104         * wasm/WasmThunks.h:
2105
2106 2019-02-20  Yusuke Suzuki  <ysuzuki@apple.com>
2107
2108         [JSC] Remove WatchpointSet creation for SymbolTable entries if VM::canUseJIT() returns false
2109         https://bugs.webkit.org/show_bug.cgi?id=194891
2110
2111         Reviewed by Geoffrey Garen.
2112
2113         WatchpointSet in SymbolTable is used to fold the value into a constant in JIT tiers. And it is
2114         not useful under the non-JIT mode. This patch avoids creation of WatchpointSet in SymbolTable
2115         if VM::canUseJIT() returns false.
2116
2117         * llint/LowLevelInterpreter32_64.asm:
2118         * llint/LowLevelInterpreter64.asm:
2119         * runtime/SymbolTable.cpp:
2120         (JSC::SymbolTableEntry::addWatchpoint): Deleted.
2121         * runtime/SymbolTable.h:
2122         (JSC::SymbolTableEntry::isWatchable const):
2123         (JSC::SymbolTableEntry::watchpointSet):
2124
2125 2019-02-20  Mark Lam  <mark.lam@apple.com>
2126
2127         Add code to validate expected GC activity modelled by doesGC() against what the runtime encounters.
2128         https://bugs.webkit.org/show_bug.cgi?id=193938
2129         <rdar://problem/47616277>
2130
2131         Reviewed by Michael Saboff, Saam Barati, and Robin Morisset.
2132
2133         In DFG::SpeculativeJIT::compile() and FTL::LowerDFGToB3::compileNode(), before
2134         emitting code / B3IR for each DFG node, we emit a write to set Heap::m_expectDoesGC
2135         to the value returned by doesGC() for that node.  In the runtime (i.e. in allocateCell()
2136         and functions that can resolve a rope), we assert that Heap::m_expectDoesGC is
2137         true.
2138
2139         This validation code is currently only enabled for debug builds.  It is disabled
2140         for release builds by default, but it can easily be made to run on release builds
2141         as well by forcing ENABLE_DFG_DOES_GC_VALIDATION to 1 in Heap.h.
2142
2143         To allow this validation code to run on release builds as well, the validation uses
2144         RELEASE_ASSERT instead of ASSERT.
2145
2146         To ensure that Heap.h is #include'd for all files that needs to do this validation
2147         (so that the validation code is accidentally disabled), we guard the validation
2148         code with an if conditional on constexpr bool validateDFGDoesGC (instead of using
2149         a #if ENABLE(DFG_DOES_GC_VALIDATION)).  This way, if Heap.h isn't #include'd, the
2150         validation code will fail to build (no silent failures).
2151
2152         Currently, all JSC tests and Layout tests should pass with this validation enabled
2153         in debug builds.  We'll only see new failures if there's a regression or if new
2154         tests reveal a previously untested code path that has an undetected issue.
2155
2156         * dfg/DFGOSRExit.cpp:
2157         (JSC::DFG::OSRExit::executeOSRExit):
2158         (JSC::DFG::OSRExit::compileExit):
2159         * dfg/DFGSpeculativeJIT64.cpp:
2160         (JSC::DFG::SpeculativeJIT::compile):
2161         * ftl/FTLLowerDFGToB3.cpp:
2162         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
2163         * ftl/FTLOSRExitCompiler.cpp:
2164         (JSC::FTL::compileStub):
2165         * heap/Heap.h:
2166         (JSC::Heap::expectDoesGC const):
2167         (JSC::Heap::setExpectDoesGC):
2168         (JSC::Heap::addressOfExpectDoesGC):
2169         * jit/JITArithmetic.cpp:
2170         (JSC::JIT::emit_compareAndJump):
2171         * runtime/JSCellInlines.h:
2172         (JSC::tryAllocateCellHelper):
2173         * runtime/JSString.h:
2174         (JSC::jsSingleCharacterString):
2175         (JSC::JSString::toAtomicString const):
2176         (JSC::JSString::toExistingAtomicString const):
2177         (JSC::JSString::value const):
2178         (JSC::JSString::tryGetValue const):
2179         (JSC::JSRopeString::unsafeView const):
2180         (JSC::JSRopeString::viewWithUnderlyingString const):
2181         (JSC::JSString::unsafeView const):
2182
2183 2019-02-20  Andy Estes  <aestes@apple.com>
2184
2185         [Xcode] Add SDKVariant.xcconfig to various Xcode projects
2186         https://bugs.webkit.org/show_bug.cgi?id=194869
2187
2188         Rubber-stamped by Jer Noble.
2189
2190         * JavaScriptCore.xcodeproj/project.pbxproj:
2191
2192 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
2193
2194         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
2195         https://bugs.webkit.org/show_bug.cgi?id=172848
2196         <rdar://problem/25709212>
2197
2198         Reviewed by Mark Lam.
2199
2200         * heap/HeapSnapshotBuilder.h:
2201         * heap/HeapSnapshotBuilder.cpp:
2202         Update the snapshot version. Change the node's 0 | 1 internal value
2203         to be a 32bit bit flag. This is nice in that it is both compatible
2204         with the previous snapshot version and the same size. We can use more
2205         flags in the future.
2206
2207         (JSC::HeapSnapshotBuilder::json):
2208         In cases where the classInfo gives us "Object" check for a better
2209         class name by checking (o).__proto__.constructor.name. We avoid this
2210         check in cases where (o).hasOwnProperty("constructor") which is the
2211         case for most Foo.prototype objects. Otherwise this would get the
2212         name of the Foo superclass for the Foo.prototype object.
2213
2214         * runtime/JSObject.cpp:
2215         (JSC::JSObject::calculatedClassName):
2216         Handle some possible edge cases that were not handled before, such as
2217         a JSObject without a GlobalObject or an object which doesn't
2218         have a default getPrototype. Try to make the code a little clearer.
2219
2220 2019-02-19  Truitt Savell  <tsavell@apple.com>
2221
2222         Unreviewed, rolling out r241784.
2223
2224         Broke all OpenSource builds.
2225
2226         Reverted changeset:
2227
2228         "Web Inspector: Improve ES6 Class instances in Heap Snapshot
2229         instances view"
2230         https://bugs.webkit.org/show_bug.cgi?id=172848
2231         https://trac.webkit.org/changeset/241784
2232
2233 2019-02-19  Joseph Pecoraro  <pecoraro@apple.com>
2234
2235         Web Inspector: Improve ES6 Class instances in Heap Snapshot instances view
2236         https://bugs.webkit.org/show_bug.cgi?id=172848
2237         <rdar://problem/25709212>
2238
2239         Reviewed by Mark Lam.
2240
2241         * heap/HeapSnapshotBuilder.h:
2242         * heap/HeapSnapshotBuilder.cpp:
2243         Update the snapshot version. Change the node's 0 | 1 internal value
2244         to be a 32bit bit flag. This is nice in that it is both compatible
2245         with the previous snapshot version and the same size. We can use more
2246         flags in the future.
2247
2248         (JSC::HeapSnapshotBuilder::json):
2249         In cases where the classInfo gives us "Object" check for a better
2250         class name by checking (o).__proto__.constructor.name. We avoid this
2251         check in cases where (o).hasOwnProperty("constructor") which is the
2252         case for most Foo.prototype objects. Otherwise this would get the
2253         name of the Foo superclass for the Foo.prototype object.
2254
2255         * runtime/JSObject.cpp:
2256         (JSC::JSObject::calculatedClassName):
2257         Handle some possible edge cases that were not handled before, such as
2258         a JSObject without a GlobalObject or an object which doesn't
2259         have a default getPrototype. Try to make the code a little clearer.
2260
2261 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2262
2263         B3-O2 incorrectly optimizes this subtest
2264         https://bugs.webkit.org/show_bug.cgi?id=194625
2265
2266         Reviewed by Saam Barati.
2267
2268         Trivial fix. Instead of doing
2269             if (!cond) foo else bar => if (cond) bar else foo
2270         B3LowerToAir was doing
2271             if (x^C) foo else bar => if (cond) bar else foo whenever C&1, even if C was for example 3.
2272
2273         * b3/B3LowerToAir.cpp:
2274         * b3/testb3.cpp:
2275         (JSC::B3::testBitNotOnBooleanAndBranch32):
2276         (JSC::B3::testNotOnBooleanAndBranch32): Added.
2277
2278 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2279
2280         CachedCall should not consider it UNLIKELY that it will not stack overflow
2281         https://bugs.webkit.org/show_bug.cgi?id=194831
2282
2283         Reviewed by Mark Lam.
2284
2285         * interpreter/CachedCall.h:
2286         (JSC::CachedCall::CachedCall):
2287
2288 2019-02-19  Mark Lam  <mark.lam@apple.com>
2289
2290         Fix DFG doesGC() for TryGetById and ProfileType nodes.
2291         https://bugs.webkit.org/show_bug.cgi?id=194821
2292         <rdar://problem/48206690>
2293
2294         Reviewed by Saam Barati.
2295
2296         Fix doesGC() for the following nodes:
2297
2298             ProfileType:
2299                 calls operationProcessTypeProfilerLogDFG(), which can calculatedClassName(),
2300                 which can call JSString::tryGetValue(), which can resolve a rope.
2301
2302             TryGetById:
2303                 calls operationTryGetByIdOptimize(), which can startWatchingPropertyForReplacements()
2304                 on a structure, which can allocate StructureRareData.
2305
2306         * dfg/DFGDoesGC.cpp:
2307         (JSC::DFG::doesGC):
2308
2309 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
2310
2311         [JSC] Introduce JSNonDestructibleProxy for JavaScriptCore.framework's GlobalThis
2312         https://bugs.webkit.org/show_bug.cgi?id=194799
2313
2314         Reviewed by Saam Barati.
2315
2316         JSProxy is destructible one because we have JSWindowProxy which has ref counted object.
2317         However, JavaScriptCore.framework's JSProxy for GlobalThis does not need to be destructible.
2318         This is important since we need to separate Heap subspaces between destructible and non-destructible objects.
2319         If we can put more and more objects in non-destructible status, we can get rid of low-usage MarkedBlock.
2320         This patch adds JSNonDestructibleProxy, which is not destructible JSProxy. While it inherits JSDestructibleObject,
2321         we can make the subclass still non-destructible thanks to Subspace mechanism. This drops one more low-usage MarkedBlock.
2322
2323         * CMakeLists.txt:
2324         * JavaScriptCore.xcodeproj/project.pbxproj:
2325         * Sources.txt:
2326         * runtime/JSGlobalObject.cpp:
2327         (JSC::JSGlobalObject::resetPrototype):
2328         (JSC::JSGlobalObject::finishCreation):
2329         * runtime/JSNonDestructibleProxy.cpp: Added.
2330         * runtime/JSNonDestructibleProxy.h: Added.
2331         (JSC::JSNonDestructibleProxy::subspaceFor):
2332         (JSC::JSNonDestructibleProxy::create):
2333         (JSC::JSNonDestructibleProxy::createStructure):
2334         (JSC::JSNonDestructibleProxy::JSNonDestructibleProxy):
2335         * runtime/JSProxy.h:
2336         (JSC::JSProxy::JSProxy):
2337
2338 2019-02-19  Robin Morisset  <rmorisset@apple.com>
2339
2340         B3ReduceStrength::simplifyCFG() could do a lot more on each iteration
2341         https://bugs.webkit.org/show_bug.cgi?id=194475
2342
2343         Reviewed by Saam Barati.
2344
2345         B3ReduceStrength::simplifyCFG() does three optimizations (which I will call A, B and C):
2346         - A makes any terminal that points to a block that is empty except for a jump point to that jump's target instead.
2347         - B transforms any branch or switch that points to a single block into a jump
2348         - C finds blocks ending with jumps, whose successor has a single predecessor, and inline that successor block in place of the jump
2349
2350         It currently is limited in the following way:
2351         - A and C can only fire once per block per iteration
2352         - B can create jumps that would trigger A, but they may not be seen until the next iteration
2353
2354         Both problems are mitigated by going through the blocks in post-order, so that when a block is optimized most of its successors have already been optimized.
2355         In a sense it is the symmetric of the peephole optimizer that goes in pre-order so that when an instruction is optimized most of its children have already been optimized.
2356
2357         On JetStream2 it reduces the average number of iterations from 3.35 to 3.24.
2358
2359         * b3/B3ReduceStrength.cpp:
2360
2361 2019-02-19  Tadeu Zagallo  <tzagallo@apple.com>
2362
2363         Move bytecode cache-related filesystem code out of CodeCache
2364         https://bugs.webkit.org/show_bug.cgi?id=194675
2365
2366         Reviewed by Saam Barati.
2367
2368         The code is only used for the bytecode-cache tests, so it should live in
2369         jsc.cpp rather than in the CodeCache. The logic now lives in ShellSourceProvider,
2370         which overrides the a virtual method in SourceProvider, `cacheBytecode`,
2371         in order to write the cache to disk.
2372
2373         * jsc.cpp:
2374         (ShellSourceProvider::create):
2375         (ShellSourceProvider::~ShellSourceProvider):
2376         (ShellSourceProvider::cachePath const):
2377         (ShellSourceProvider::loadBytecode):
2378         (ShellSourceProvider::ShellSourceProvider):
2379         (jscSource):
2380         (GlobalObject::moduleLoaderFetch):
2381         (functionDollarEvalScript):
2382         (runWithOptions):
2383         * parser/SourceProvider.h:
2384         (JSC::SourceProvider::cacheBytecode const):
2385         * runtime/CodeCache.cpp:
2386         (JSC::writeCodeBlock):
2387         * runtime/CodeCache.h:
2388         (JSC::CodeCacheMap::fetchFromDiskImpl):
2389
2390 2019-02-18  Dominik Infuehr  <dinfuehr@igalia.com>
2391
2392         [ARM] Fix crash with sampling profiler
2393         https://bugs.webkit.org/show_bug.cgi?id=194772
2394
2395         Reviewed by Mark Lam.
2396
2397         sampling-profiler-richards.js was crashing with an enabled sampling profiler. add32
2398         did not update the stack pointer in a single instruction. The src register was first
2399         moved into the stack pointer, the immediate imm was added in a subsequent instruction.
2400
2401         This was problematic when a signal handler was invoked before applying the immediate,
2402         when the stack pointer is still set to the temporary value. Avoid this by calculating src+imm in
2403         a temporary register and then move it in one go into the stack pointer.
2404
2405         * assembler/MacroAssemblerARMv7.h:
2406         (JSC::MacroAssemblerARMv7::add32):
2407
2408 2019-02-18  Mark Lam  <mark.lam@apple.com>
2409
2410         Fix DFG doesGC() for CompareEq/Less/LessEq/Greater/GreaterEq and CompareStrictEq nodes.
2411         https://bugs.webkit.org/show_bug.cgi?id=194800
2412         <rdar://problem/48183773>
2413
2414         Reviewed by Yusuke Suzuki.
2415
2416         Fix doesGC() for the following nodes:
2417
2418             CompareEq:
2419             CompareLess:
2420             CompareLessEq:
2421             CompareGreater:
2422             CompareGreaterEq:
2423             CompareStrictEq:
2424                 Only return false (i.e. does not GC) for child node use kinds that have
2425                 been vetted to not do anything that can GC.  For all other use kinds
2426                 (including StringUse and BigIntUse), we return true (i.e. does GC).
2427
2428         * dfg/DFGDoesGC.cpp:
2429         (JSC::DFG::doesGC):
2430
2431 2019-02-16  Darin Adler  <darin@apple.com>
2432
2433         Continue reducing use of String::format, now focusing on hex: "%p", "%x", etc.
2434         https://bugs.webkit.org/show_bug.cgi?id=194752
2435
2436         Reviewed by Daniel Bates.
2437
2438         * heap/HeapSnapshotBuilder.cpp:
2439         (JSC::HeapSnapshotBuilder::json): Added back the "0x" that was removed when changing
2440         this file to use appendUnsignedAsHex instead of "%p". The intent at that time was to
2441         keep behavior the same, so let's do that.
2442
2443         * parser/Lexer.cpp:
2444         (JSC::Lexer<T>::invalidCharacterMessage const): Use makeString and hex instead of
2445         String::format and "%04x".
2446
2447 2019-02-18  Yusuke Suzuki  <ysuzuki@apple.com>
2448
2449         [JSC] Add LazyClassStructure::getInitializedOnMainThread
2450         https://bugs.webkit.org/show_bug.cgi?id=194784
2451         <rdar://problem/48154820>
2452
2453         Reviewed by Mark Lam.
2454
2455         LazyClassStructure::get and LazyProperty::get functions do not allow compiler threads to call them. But for booleanPrototype, numberPrototype and symbolPrototype cases,
2456         we would like to call them from compiler threads. We eagerly initialize them if VM::canUseJIT() is true, so that compiler threads can safely call LazyClassStructure::get
2457         and LazyProperty::get for booleanPrototype, numberPrototype and symbolPrototype. But still assertion hits because the assertion requires that these functions need to be
2458         called in non compiler threads. Calling `getConcurrently()` is not possible since symbolPrototype() function is called from both the main thread and compiler threads,
2459         and we would like to lazily initialize SymbolPrototype object if it is called from the main thread, which can happen with non-JIT configuration.
2460
2461         This patch adds `getInitializedOnMainThread()`. Compiler threads can call it only when we know that the value is already initialized on the main thread. The main thread
2462         can call it at anytime and this function lazily initializes the value. This is useful to make some of prototypes lazy with non-JIT configuration: With non-JIT configuration,
2463         this function is always called from the main thread and it initializes the value lazily. Non-JIT configuration does not care about compiler threads since they do not exist.
2464         With JIT configuration, we eagerly initialize them in JSGlobalObject::init so that `getInitializedOnMainThread()` always succeeds.
2465
2466         Basically, `getInitializedOnMainThread()` is `get` with different assertion location: While `get` always crashes if it is called from compiler threads, `getInitializedOnMainThread()`
2467         crashes only when actual initialization happens on compiler threads. We do not merge them since `get` is still useful to find accidental initialization from compiler threads.
2468
2469         * runtime/JSGlobalObject.h:
2470         (JSC::JSGlobalObject::booleanPrototype const):
2471         (JSC::JSGlobalObject::numberPrototype const):
2472         (JSC::JSGlobalObject::symbolPrototype const):
2473         * runtime/LazyClassStructure.h:
2474         (JSC::LazyClassStructure::getInitializedOnMainThread const):
2475         (JSC::LazyClassStructure::prototypeInitializedOnMainThread const):
2476         (JSC::LazyClassStructure::constructorInitializedOnMainThread const):
2477         * runtime/LazyProperty.h:
2478         (JSC::LazyProperty::get const):
2479         (JSC::LazyProperty::getInitializedOnMainThread const):
2480
2481 2019-02-18  Joseph Pecoraro  <pecoraro@apple.com>
2482
2483         Web Inspector: Better categorize CPU usage per-thread / worker
2484         https://bugs.webkit.org/show_bug.cgi?id=194564
2485
2486         Reviewed by Devin Rousso.
2487
2488         * inspector/protocol/CPUProfiler.json:
2489         Add additional properties per-Event, and new per-Thread object info.
2490
2491 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
2492
2493         Bytecode cache should a have a boot-specific validation
2494         https://bugs.webkit.org/show_bug.cgi?id=194769
2495         <rdar://problem/48149509>
2496
2497         Reviewed by Keith Miller.
2498
2499         Add the boot UUID to the cached bytecode to enforce that it is not reused
2500         across reboots.
2501
2502         * runtime/CachedTypes.cpp:
2503         (JSC::Encoder::malloc):
2504         (JSC::GenericCacheEntry::GenericCacheEntry):
2505         (JSC::GenericCacheEntry::tag const):
2506         (JSC::CacheEntry::CacheEntry):
2507         (JSC::CacheEntry::decode const):
2508         (JSC::GenericCacheEntry::decode const):
2509         (JSC::encodeCodeBlock):
2510
2511 2019-02-18  Eric Carlson  <eric.carlson@apple.com>
2512
2513         Add MSE logging configuration
2514         https://bugs.webkit.org/show_bug.cgi?id=194719
2515         <rdar://problem/48122151>
2516
2517         Reviewed by Joseph Pecoraro.
2518
2519         * inspector/ConsoleMessage.cpp:
2520         (Inspector::messageSourceValue):
2521         * inspector/protocol/Console.json:
2522         * inspector/scripts/codegen/generator.py:
2523         * runtime/ConsoleTypes.h:
2524
2525 2019-02-18  Tadeu Zagallo  <tzagallo@apple.com>
2526
2527         Add version number to cached bytecode
2528         https://bugs.webkit.org/show_bug.cgi?id=194768
2529         <rdar://problem/48147968>
2530
2531         Reviewed by Saam Barati.
2532
2533         Add a version number to the bytecode cache that should be unique per build.
2534
2535         * CMakeLists.txt:
2536         * DerivedSources-output.xcfilelist:
2537         * DerivedSources.make:
2538         * runtime/CachedTypes.cpp:
2539         (JSC::Encoder::malloc):
2540         (JSC::GenericCacheEntry::GenericCacheEntry):
2541         (JSC::CacheEntry::CacheEntry):
2542         (JSC::CacheEntry::encode):
2543         (JSC::CacheEntry::decode const):
2544         (JSC::GenericCacheEntry::decode const):
2545         (JSC::decodeCodeBlockImpl):
2546         * runtime/CodeCache.h:
2547         (JSC::CodeCacheMap::fetchFromDiskImpl):
2548
2549 2019-02-17  Saam Barati  <sbarati@apple.com>
2550
2551         WasmB3IRGenerator models some effects incorrectly
2552         https://bugs.webkit.org/show_bug.cgi?id=194038
2553
2554         Reviewed by Keith Miller.
2555
2556         * wasm/WasmB3IRGenerator.cpp:
2557         (JSC::Wasm::B3IRGenerator::restoreWasmContextInstance):
2558         (JSC::Wasm::B3IRGenerator::restoreWebAssemblyGlobalState):
2559         These two functions were using global state instead of the
2560         arguments passed into the function.
2561
2562         (JSC::Wasm::B3IRGenerator::addOp<F64ConvertUI64>):
2563         (JSC::Wasm::B3IRGenerator::addOp<OpType::F32ConvertUI64>):
2564         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF64>):
2565         (JSC::Wasm::B3IRGenerator::addOp<OpType::I64TruncUF32>):
2566         Any patchpoint that allows scratch register usage must
2567         also say that it clobbers the scratch registers.
2568
2569 2019-02-17  Saam Barati  <sbarati@apple.com>
2570
2571         Deadlock when adding a Structure property transition and then doing incremental marking
2572         https://bugs.webkit.org/show_bug.cgi?id=194767
2573
2574         Reviewed by Mark Lam.
2575
2576         This can happen in the following scenario:
2577         
2578         You have a Structure S. S is on the mark stack. Then:
2579         1. S grabs its lock
2580         2. S adds a new property transition
2581         3. We find out we need to do some incremental marking
2582         4. We mark S
2583         5. visitChildren on S will try to grab its lock
2584         6. We are now in a deadlock
2585
2586         * heap/Heap.cpp:
2587         (JSC::Heap::performIncrement):
2588         * runtime/Structure.cpp:
2589         (JSC::Structure::addNewPropertyTransition):
2590
2591 2019-02-17  David Kilzer  <ddkilzer@apple.com>
2592
2593         Unreviewed, rolling out r241620.
2594
2595         "Causes use-after-free crashes running layout tests with ASan and GuardMalloc."
2596         (Requested by ddkilzer on #webkit.)
2597
2598         Reverted changeset:
2599
2600         "[WTF] Add environment variable helpers"
2601         https://bugs.webkit.org/show_bug.cgi?id=192405
2602         https://trac.webkit.org/changeset/241620
2603
2604 2019-02-17  Commit Queue  <commit-queue@webkit.org>
2605
2606         Unreviewed, rolling out r241612.
2607         https://bugs.webkit.org/show_bug.cgi?id=194762
2608
2609         "It regressed JetStream2 parsing tests by ~40%" (Requested by
2610         saamyjoon on #webkit).
2611
2612         Reverted changeset:
2613
2614         "Move bytecode cache-related filesystem code out of CodeCache"
2615         https://bugs.webkit.org/show_bug.cgi?id=194675
2616         https://trac.webkit.org/changeset/241612
2617
2618 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
2619
2620         [JSC] JSWrapperObject should not be destructible
2621         https://bugs.webkit.org/show_bug.cgi?id=194743
2622
2623         Reviewed by Saam Barati.
2624
2625         JSWrapperObject should be just a wrapper object for JSValue, thus, it should not be a JSDestructibleObject.
2626         Currently it is destructible object because DateInstance uses it. This patch changes Base of DateInstance from
2627         JSWrapperObject to JSDestructibleObject, and makes JSWrapperObject non-destructible.
2628
2629         * runtime/BigIntObject.cpp:
2630         (JSC::BigIntObject::BigIntObject):
2631         * runtime/BooleanConstructor.cpp:
2632         (JSC::BooleanConstructor::finishCreation):
2633         * runtime/BooleanObject.cpp:
2634         (JSC::BooleanObject::BooleanObject):
2635         * runtime/BooleanObject.h:
2636         * runtime/DateInstance.cpp:
2637         (JSC::DateInstance::DateInstance):
2638         (JSC::DateInstance::finishCreation):
2639         * runtime/DateInstance.h:
2640         * runtime/DatePrototype.cpp:
2641         (JSC::dateProtoFuncGetTime):
2642         (JSC::dateProtoFuncSetTime):
2643         (JSC::setNewValueFromTimeArgs):
2644         (JSC::setNewValueFromDateArgs):
2645         (JSC::dateProtoFuncSetYear):
2646         * runtime/JSCPoison.h:
2647         * runtime/JSWrapperObject.h:
2648         (JSC::JSWrapperObject::JSWrapperObject):
2649         * runtime/NumberObject.cpp:
2650         (JSC::NumberObject::NumberObject):
2651         * runtime/NumberObject.h:
2652         * runtime/StringConstructor.cpp:
2653         (JSC::StringConstructor::finishCreation):
2654         * runtime/StringObject.cpp:
2655         (JSC::StringObject::StringObject):
2656         * runtime/StringObject.h:
2657         (JSC::StringObject::internalValue const):
2658         * runtime/SymbolObject.cpp:
2659         (JSC::SymbolObject::SymbolObject):
2660         * runtime/SymbolObject.h:
2661
2662 2019-02-16  Yusuke Suzuki  <ysuzuki@apple.com>
2663
2664         [JSC] Shrink UnlinkedFunctionExecutable
2665         https://bugs.webkit.org/show_bug.cgi?id=194733
2666
2667         Reviewed by Mark Lam.
2668
2669         UnlinkedFunctionExecutable has sourceURLDirective and sourceMappingURLDirective. These
2670         directives can be found in the comment of non typical function's source code (Program,
2671         Eval code, and Global function from function constructor etc.), and tricky thing is that
2672         SourceProvider's directives are updated by Parser. The reason why we have these fields in
2673         UnlinkedFunctionExecutable is that we need to update the SourceProvider's directives even
2674         if we skip parsing by using CodeCache. These fields are effective only if (1)
2675         UnlinkedFunctionExecutable is for non typical function things, and (2) it has sourceURLDirective
2676         or sourceMappingURLDirective. This is rare enough to purge them to a separated
2677         UnlinkedFunctionExecutable::RareData to make UnlinkedFunctionExecutable small.
2678         sizeof(UnlinkedFunctionExecutable) is very important since it is super frequently allocated
2679         cell. Furthermore, the current JSC allocates two MarkedBlocks for UnlinkedFunctionExecutable
2680         in JSGlobalObject initialization, but the usage of the second MarkedBlock is quite low (8%).
2681         If we can reduce the size of UnlinkedFunctionExecutable, we can make them one MarkedBlock.
2682         Since UnlinkedFunctionExecutable is allocated from IsoSubspace, we do not need to fit it to
2683         one of size class.
2684
2685         This patch adds RareData to UnlinkedFunctionExecutable and move some rare datas into RareData.
2686         And kill one MarkedBlock allocation in JSC initialization phase.
2687
2688         * bytecode/UnlinkedFunctionExecutable.cpp:
2689         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2690         (JSC::UnlinkedFunctionExecutable::ensureRareDataSlow):
2691         * bytecode/UnlinkedFunctionExecutable.h:
2692         * debugger/DebuggerLocation.cpp:
2693         (JSC::DebuggerLocation::DebuggerLocation):
2694         * inspector/ScriptDebugServer.cpp:
2695         (Inspector::ScriptDebugServer::dispatchDidParseSource):
2696         * parser/Lexer.h:
2697         (JSC::Lexer::sourceURLDirective const):
2698         (JSC::Lexer::sourceMappingURLDirective const):
2699         (JSC::Lexer::sourceURL const): Deleted.
2700         (JSC::Lexer::sourceMappingURL const): Deleted.
2701         * parser/Parser.h:
2702         (JSC::Parser<LexerType>::parse):
2703         * parser/SourceProvider.h:
2704         (JSC::SourceProvider::sourceURLDirective const):
2705         (JSC::SourceProvider::sourceMappingURLDirective const):
2706         (JSC::SourceProvider::setSourceURLDirective):
2707         (JSC::SourceProvider::setSourceMappingURLDirective):
2708         (JSC::SourceProvider::sourceURL const): Deleted. We rename it from sourceURL to sourceURLDirective
2709         since it is the correct name.
2710         (JSC::SourceProvider::sourceMappingURL const): Deleted. We rename it from sourceMappingURL to
2711         sourceMappingURLDirective since it is the correct name.
2712         * runtime/CachedTypes.cpp:
2713         (JSC::CachedSourceProviderShape::encode):
2714         (JSC::CachedFunctionExecutableRareData::encode):
2715         (JSC::CachedFunctionExecutableRareData::decode const): CachedFunctionExecutable did not have
2716         sourceMappingURL to sourceMappingURLDirective. So this patch keeps the same logic.
2717         (JSC::CachedFunctionExecutable::rareData const):
2718         (JSC::CachedFunctionExecutable::encode):
2719         (JSC::CachedFunctionExecutable::decode const):
2720         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2721         * runtime/CodeCache.cpp:
2722         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
2723         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
2724         * runtime/CodeCache.h:
2725         (JSC::generateUnlinkedCodeBlockImpl):
2726         * runtime/FunctionExecutable.h:
2727         * runtime/SamplingProfiler.cpp:
2728         (JSC::SamplingProfiler::StackFrame::url):
2729
2730 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2731
2732         [JSC] Remove unused global private variables
2733         https://bugs.webkit.org/show_bug.cgi?id=194741
2734
2735         Reviewed by Joseph Pecoraro.
2736
2737         There are some private functions and constants that are no longer referenced from builtin JS code.
2738         This patch cleans up them.
2739
2740         * builtins/BuiltinNames.h:
2741         * builtins/ObjectConstructor.js:
2742         (entries):
2743         * runtime/JSGlobalObject.cpp:
2744         (JSC::JSGlobalObject::init):
2745
2746 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2747
2748         [JSC] Lazily create empty RegExp
2749         https://bugs.webkit.org/show_bug.cgi?id=194735
2750
2751         Reviewed by Keith Miller.
2752
2753         Some scripts do not have any RegExp. In that case, allocating MarkedBlock for RegExp is costly.
2754         Previously, there was always one RegExp, "empty RegExp". This patch lazily creates it and drop
2755         one MarkedBlock.
2756
2757         * runtime/JSGlobalObject.cpp:
2758         (JSC::JSGlobalObject::init):
2759         * runtime/RegExpCache.cpp:
2760         (JSC::RegExpCache::ensureEmptyRegExpSlow):
2761         (JSC::RegExpCache::initialize): Deleted.
2762         * runtime/RegExpCache.h:
2763         (JSC::RegExpCache::ensureEmptyRegExp):
2764         (JSC::RegExpCache::emptyRegExp const): Deleted.
2765         * runtime/RegExpCachedResult.cpp:
2766         (JSC::RegExpCachedResult::lastResult):
2767         * runtime/RegExpCachedResult.h:
2768         * runtime/VM.cpp:
2769         (JSC::VM::VM):
2770
2771 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2772
2773         [JSC] Make builtin objects more lazily initialized under non-JIT mode
2774         https://bugs.webkit.org/show_bug.cgi?id=194727
2775
2776         Reviewed by Saam Barati.
2777
2778         Boolean, Symbol, and Number constructors and prototypes are initialized eagerly, but this is largely
2779         because concurrent compiler can touch NumberPrototype etc. when traversing object's prototypes. This
2780         means that eager initialization is not necessary under non-JIT mode. While we can investigate all the
2781         accesses to these prototypes from the concurrent compiler threads, this "lazily initialize under non-JIT"
2782         is safe and beneficial to non-JIT mode. This patch lazily initializes them under non-JIT mode, and
2783         drop some @Number references to avoid eager initialization. This removes some object allocations and 1
2784         MarkedBlock allocation just for Symbols.
2785
2786         * runtime/JSGlobalObject.cpp:
2787         (JSC::JSGlobalObject::init):
2788         (JSC::JSGlobalObject::visitChildren):
2789         * runtime/JSGlobalObject.h:
2790         (JSC::JSGlobalObject::numberToStringWatchpoint):
2791         (JSC::JSGlobalObject::booleanPrototype const):
2792         (JSC::JSGlobalObject::numberPrototype const):
2793         (JSC::JSGlobalObject::symbolPrototype const):
2794         (JSC::JSGlobalObject::booleanObjectStructure const):
2795         (JSC::JSGlobalObject::symbolObjectStructure const):
2796         (JSC::JSGlobalObject::numberObjectStructure const):
2797         (JSC::JSGlobalObject::stringObjectStructure const):
2798
2799 2019-02-15  Michael Saboff  <msaboff@apple.com>
2800
2801         RELEASE_ASSERT at com.apple.JavaScriptCore: JSC::jsSubstringOfResolved
2802         https://bugs.webkit.org/show_bug.cgi?id=194558
2803
2804         Reviewed by Saam Barati.
2805
2806         Added an in bounds check before the read of the next character for Unicode regular expressions
2807         for pattern generation that didn't already have such checks.
2808
2809         * yarr/YarrJIT.cpp:
2810         (JSC::Yarr::YarrGenerator::generatePatternCharacterOnce):
2811         (JSC::Yarr::YarrGenerator::generatePatternCharacterFixed):
2812         (JSC::Yarr::YarrGenerator::generateCharacterClassOnce):
2813         (JSC::Yarr::YarrGenerator::generateCharacterClassFixed):
2814
2815 2019-02-15  Dean Jackson  <dino@apple.com>
2816
2817         Allow emulation of user gestures from Web Inspector console
2818         https://bugs.webkit.org/show_bug.cgi?id=194725
2819         <rdar://problem/48126604>
2820
2821         Reviewed by Joseph Pecoraro and Devin Rousso.
2822
2823         * inspector/agents/InspectorRuntimeAgent.cpp: Add a new optional parameter, emulateUserGesture,
2824         to the evaluate function, and mark the function as override so that PageRuntimeAgent
2825         can change the behaviour.
2826         (Inspector::InspectorRuntimeAgent::evaluate):
2827         * inspector/agents/InspectorRuntimeAgent.h:
2828         * inspector/protocol/Runtime.json:
2829
2830 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2831
2832         [JSC] Do not initialize Wasm related data if Wasm is not enabled
2833         https://bugs.webkit.org/show_bug.cgi?id=194728
2834
2835         Reviewed by Mark Lam.
2836
2837         Under non-JIT mode, these data structures are unnecessary. Should not allocate extra memory for that.
2838
2839         * runtime/InitializeThreading.cpp:
2840         (JSC::initializeThreading):
2841         * runtime/JSLock.cpp:
2842         (JSC::JSLock::didAcquireLock):
2843
2844 2019-02-15  Ross Kirsling  <ross.kirsling@sony.com>
2845
2846         [WTF] Add environment variable helpers
2847         https://bugs.webkit.org/show_bug.cgi?id=192405
2848
2849         Reviewed by Michael Catanzaro.
2850
2851         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2852         (Inspector::RemoteInspector::RemoteInspector):
2853         (Inspector::RemoteInspector::start):
2854         * jsc.cpp:
2855         (startTimeoutThreadIfNeeded):
2856         * runtime/Options.cpp:
2857         (JSC::overrideOptionWithHeuristic):
2858         (JSC::Options::overrideAliasedOptionWithHeuristic):
2859         (JSC::Options::initialize):
2860         * runtime/VM.cpp:
2861         (JSC::enableAssembler):
2862         (JSC::VM::VM):
2863         * tools/CodeProfiling.cpp:
2864         (JSC::CodeProfiling::notifyAllocator):
2865         Utilize WTF::Environment where possible.
2866
2867 2019-02-15  Mark Lam  <mark.lam@apple.com>
2868
2869         SamplingProfiler::stackTracesAsJSON() should escape strings.
2870         https://bugs.webkit.org/show_bug.cgi?id=194649
2871         <rdar://problem/48072386>
2872
2873         Reviewed by Saam Barati.
2874
2875         Ditto for TypeSet::toJSONString() and TypeSet::toJSONString().
2876
2877         * runtime/SamplingProfiler.cpp:
2878         (JSC::SamplingProfiler::stackTracesAsJSON):
2879         * runtime/TypeSet.cpp:
2880         (JSC::TypeSet::toJSONString const):
2881         (JSC::StructureShape::toJSONString const):
2882
2883 2019-02-15  Robin Morisset  <rmorisset@apple.com>
2884
2885         CodeBlock::jettison should clear related watchpoints
2886         https://bugs.webkit.org/show_bug.cgi?id=194544
2887
2888         Reviewed by Mark Lam.
2889
2890         * bytecode/CodeBlock.cpp:
2891         (JSC::CodeBlock::jettison):
2892         * dfg/DFGCommonData.h:
2893         (JSC::DFG::CommonData::clearWatchpoints): Added.
2894         * dfg/CommonData.cpp:
2895         (JSC::DFG::CommonData::clearWatchpoints): Added.
2896
2897 2019-02-15  Tadeu Zagallo  <tzagallo@apple.com>
2898
2899         Move bytecode cache-related filesystem code out of CodeCache
2900         https://bugs.webkit.org/show_bug.cgi?id=194675
2901
2902         Reviewed by Saam Barati.
2903
2904         That code is only used for the bytecode-cache tests, so it should live in
2905         jsc.cpp rather than in the CodeCache.
2906
2907         * jsc.cpp:
2908         (CliSourceProvider::create):
2909         (CliSourceProvider::~CliSourceProvider):
2910         (CliSourceProvider::cachePath const):
2911         (CliSourceProvider::loadBytecode):
2912         (CliSourceProvider::CliSourceProvider):
2913         (jscSource):
2914         (GlobalObject::moduleLoaderFetch):
2915         (functionDollarEvalScript):
2916         (runWithOptions):
2917         * parser/SourceProvider.h:
2918         (JSC::SourceProvider::cacheBytecode const):
2919         * runtime/CodeCache.cpp:
2920         (JSC::writeCodeBlock):
2921         * runtime/CodeCache.h:
2922         (JSC::CodeCacheMap::fetchFromDiskImpl):
2923
2924 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2925
2926         [JSC] DFG, FTL, and Wasm worklist creation should be fenced
2927         https://bugs.webkit.org/show_bug.cgi?id=194714
2928
2929         Reviewed by Mark Lam.
2930
2931         Let's consider about the following extreme case.
2932
2933         1. VM (A) is created.
2934         2. Another VM (B) is created on a different thread.
2935         3. (A) is being destroyed. It calls DFG::existingWorklistForIndexOrNull in a destructor.
2936         4. At the same time, (B) starts using DFG Worklist and it is instantiated in call_once.
2937         5. But (A) reads the pointer directly through DFG::existingWorklistForIndexOrNull.
2938         6. (A) sees the half-baked worklist, which may be in the middle of creation.
2939
2940         This patch puts store-store fence just before putting a pointer to a global variable.
2941         This fence is executed only three times at most, for DFG, FTL, and Wasm worklist initializations.
2942
2943         * dfg/DFGWorklist.cpp:
2944         (JSC::DFG::ensureGlobalDFGWorklist):
2945         (JSC::DFG::ensureGlobalFTLWorklist):
2946         * wasm/WasmWorklist.cpp:
2947         (JSC::Wasm::ensureWorklist):
2948
2949 2019-02-15  Commit Queue  <commit-queue@webkit.org>
2950
2951         Unreviewed, rolling out r241559 and r241566.
2952         https://bugs.webkit.org/show_bug.cgi?id=194710
2953
2954         Causes layout test crashes under GuardMalloc (Requested by
2955         ryanhaddad on #webkit).
2956
2957         Reverted changesets:
2958
2959         "[WTF] Add environment variable helpers"
2960         https://bugs.webkit.org/show_bug.cgi?id=192405
2961         https://trac.webkit.org/changeset/241559
2962
2963         "Unreviewed build fix for WinCairo Debug after r241559."
2964         https://trac.webkit.org/changeset/241566
2965
2966 2019-02-15  Yusuke Suzuki  <ysuzuki@apple.com>
2967
2968         [JSC] Do not even allocate JIT worklists in non-JIT mode
2969         https://bugs.webkit.org/show_bug.cgi?id=194693
2970
2971         Reviewed by Mark Lam.
2972
2973         Heap always allocates JIT worklists for Baseline, DFG, and FTL. While they do not have actual threads, Worklist itself already allocates some memory.
2974         And we do not perform any GC operations that are only meaningful in JIT environment.
2975
2976         1. We add VM::canUseJIT() check in Heap's ensureXXXWorklist things to prevent them from being allocated.
2977         2. We remove DFG marking constraint in non-JIT mode.
2978         3. We do not gather conservative roots from scratch buffers under the non-JIT mode (BTW, # of scratch buffers are always zero in non-JIT mode)
2979         4. We do not visit JITStubRoutineSet.
2980         5. Align JITWorklist function names to the other worklists.
2981
2982         * dfg/DFGOSRExitPreparation.cpp:
2983         (JSC::DFG::prepareCodeOriginForOSRExit):
2984         * dfg/DFGPlan.h:
2985         * dfg/DFGWorklist.cpp:
2986         (JSC::DFG::markCodeBlocks): Deleted.
2987         * dfg/DFGWorklist.h:
2988         * heap/Heap.cpp:
2989         (JSC::Heap::completeAllJITPlans):
2990         (JSC::Heap::iterateExecutingAndCompilingCodeBlocks):
2991         (JSC::Heap::gatherScratchBufferRoots):
2992         (JSC::Heap::removeDeadCompilerWorklistEntries):
2993         (JSC::Heap::stopThePeriphery):
2994         (JSC::Heap::suspendCompilerThreads):
2995         (JSC::Heap::resumeCompilerThreads):
2996         (JSC::Heap::addCoreConstraints):
2997         * jit/JITWorklist.cpp:
2998         (JSC::JITWorklist::existingGlobalWorklistOrNull):
2999         (JSC::JITWorklist::ensureGlobalWorklist):
3000         (JSC::JITWorklist::instance): Deleted.
3001         * jit/JITWorklist.h:
3002         * llint/LLIntSlowPaths.cpp:
3003         (JSC::LLInt::jitCompileAndSetHeuristics):
3004         * runtime/VM.cpp:
3005         (JSC::VM::~VM):
3006         (JSC::VM::gatherScratchBufferRoots):
3007         (JSC::VM::gatherConservativeRoots): Deleted.
3008         * runtime/VM.h:
3009
3010 2019-02-15  Saam barati  <sbarati@apple.com>
3011
3012         [WebAssembly] Write a new register allocator for Air O0 and make BBQ use it
3013         https://bugs.webkit.org/show_bug.cgi?id=194036
3014
3015         Reviewed by Yusuke Suzuki.
3016
3017         This patch adds a new Air-O0 backend. Air-O0 runs fewer passes and doesn't
3018         use linear scan for register allocation. Instead of linear scan, Air-O0 does
3019         mostly block-local register allocation, and it does this as it's emitting
3020         code directly. The register allocator uses liveness analysis to reduce
3021         the number of spills. Doing register allocation as we're emitting code
3022         allows us to skip editing the IR to insert spills, which saves a non trivial
3023         amount of compile time. For stack allocation, we give each Tmp its own slot.
3024         This is less than ideal. We probably want to do some trivial live range analysis
3025         in the future. The reason this isn't a deal breaker for Wasm is that this patch
3026         makes it so that we reuse Tmps as we're generating Air IR in the AirIRGenerator.
3027         Because Wasm is a stack machine, we trivially know when we kill a stack value (its last use).
3028         
3029         This patch is another 25% Wasm startup time speedup. It seems to be worth
3030         another 1% on JetStream2.
3031
3032         * JavaScriptCore.xcodeproj/project.pbxproj:
3033         * Sources.txt:
3034         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.cpp: Added.
3035         (JSC::B3::Air::GenerateAndAllocateRegisters::GenerateAndAllocateRegisters):
3036         (JSC::B3::Air::GenerateAndAllocateRegisters::buildLiveRanges):
3037         (JSC::B3::Air::GenerateAndAllocateRegisters::insertBlocksForFlushAfterTerminalPatchpoints):
3038         (JSC::B3::Air::callFrameAddr):
3039         (JSC::B3::Air::GenerateAndAllocateRegisters::flush):
3040         (JSC::B3::Air::GenerateAndAllocateRegisters::spill):
3041         (JSC::B3::Air::GenerateAndAllocateRegisters::alloc):
3042         (JSC::B3::Air::GenerateAndAllocateRegisters::freeDeadTmpsIfNeeded):
3043         (JSC::B3::Air::GenerateAndAllocateRegisters::assignTmp):
3044         (JSC::B3::Air::GenerateAndAllocateRegisters::isDisallowedRegister):
3045         (JSC::B3::Air::GenerateAndAllocateRegisters::prepareForGeneration):
3046         (JSC::B3::Air::GenerateAndAllocateRegisters::generate):
3047         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h: Added.
3048         * b3/air/AirCode.cpp:
3049         * b3/air/AirCode.h:
3050         * b3/air/AirGenerate.cpp:
3051         (JSC::B3::Air::prepareForGeneration):
3052         (JSC::B3::Air::generateWithAlreadyAllocatedRegisters):
3053         (JSC::B3::Air::generate):
3054         * b3/air/AirHandleCalleeSaves.cpp:
3055         (JSC::B3::Air::handleCalleeSaves):
3056         * b3/air/AirHandleCalleeSaves.h:
3057         * b3/air/AirTmpMap.h:
3058         * runtime/Options.h:
3059         * wasm/WasmAirIRGenerator.cpp:
3060         (JSC::Wasm::AirIRGenerator::didKill):
3061         (JSC::Wasm::AirIRGenerator::newTmp):
3062         (JSC::Wasm::AirIRGenerator::AirIRGenerator):
3063         (JSC::Wasm::parseAndCompileAir):
3064         (JSC::Wasm::AirIRGenerator::addOp<OpType::I64TruncUF64>):
3065         (JSC::Wasm::AirIRGenerator::addOp<OpType::I64TruncUF32>):
3066         * wasm/WasmAirIRGenerator.h:
3067         * wasm/WasmB3IRGenerator.cpp:
3068         (JSC::Wasm::B3IRGenerator::didKill):
3069         * wasm/WasmBBQPlan.cpp:
3070         (JSC::Wasm::BBQPlan::compileFunctions):
3071         * wasm/WasmFunctionParser.h:
3072         (JSC::Wasm::FunctionParser<Context>::parseBody):
3073         (JSC::Wasm::FunctionParser<Context>::parseExpression):
3074         * wasm/WasmValidate.cpp:
3075         (JSC::Wasm::Validate::didKill):
3076
3077 2019-02-14  Saam barati  <sbarati@apple.com>
3078
3079         lowerStackArgs should lower Lea32/64 on ARM64 to Add
3080         https://bugs.webkit.org/show_bug.cgi?id=194656
3081
3082         Reviewed by Yusuke Suzuki.
3083
3084         On arm64, Lea is just implemented as an add. However, Air treats it as an
3085         address with a given width. Because of this width, we were incorrectly
3086         computing whether or not this immediate could fit into the instruction itself
3087         or it needed to be explicitly put into a register. This patch makes
3088         AirLowerStackArgs lower Lea to Add on arm64.
3089
3090         * b3/air/AirLowerStackArgs.cpp:
3091         (JSC::B3::Air::lowerStackArgs):
3092         * b3/air/AirOpcode.opcodes:
3093         * b3/air/testair.cpp:
3094
3095 2019-02-14  Saam Barati  <sbarati@apple.com>
3096
3097         Cache the results of BytecodeGenerator::getVariablesUnderTDZ
3098         https://bugs.webkit.org/show_bug.cgi?id=194583
3099         <rdar://problem/48028140>
3100
3101         Reviewed by Yusuke Suzuki.
3102
3103         This patch makes it so that getVariablesUnderTDZ caches a result of
3104         CompactVariableMap::Handle. getVariablesUnderTDZ is costly when
3105         it's called in an environment where there are a lot of variables.
3106         This patch makes it so we cache its results. This is profitable when
3107         getVariablesUnderTDZ is called repeatedly with the same environment
3108         state. This is common since we call this every time we encounter a
3109         function definition/expression node.
3110
3111         * builtins/BuiltinExecutables.cpp:
3112         (JSC::BuiltinExecutables::createExecutable):
3113         * bytecode/UnlinkedFunctionExecutable.cpp:
3114         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
3115         * bytecode/UnlinkedFunctionExecutable.h:
3116         * bytecompiler/BytecodeGenerator.cpp:
3117         (JSC::BytecodeGenerator::popLexicalScopeInternal):
3118         (JSC::BytecodeGenerator::liftTDZCheckIfPossible):
3119         (JSC::BytecodeGenerator::pushTDZVariables):
3120         (JSC::BytecodeGenerator::getVariablesUnderTDZ):
3121         (JSC::BytecodeGenerator::restoreTDZStack):
3122         * bytecompiler/BytecodeGenerator.h:
3123         (JSC::BytecodeGenerator::makeFunction):
3124         * parser/VariableEnvironment.cpp:
3125         (JSC::CompactVariableMap::Handle::Handle):
3126         (JSC::CompactVariableMap::Handle::operator=):
3127         * parser/VariableEnvironment.h:
3128         (JSC::CompactVariableMap::Handle::operator bool const):
3129         * runtime/CodeCache.cpp:
3130         (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
3131
3132 2019-02-14  Yusuke Suzuki  <ysuzuki@apple.com>
3133
3134         [JSC] Non-JIT entrypoints should share NativeJITCode per entrypoint type
3135         https://bugs.webkit.org/show_bug.cgi?id=194659
3136
3137         Reviewed by Mark Lam.
3138
3139         Non-JIT entrypoints create NativeJITCode every time it is called. But it is meaningless since these entry point code are identical.
3140         We should create one per entrypoint type (for function, we should have CodeForCall and CodeForConstruct) and continue to use them.
3141         And we use NativeJITCode instead of DirectJITCode if it does not have difference between usual entrypoint and arity check entrypoint.
3142
3143         * dfg/DFGJITCode.h:
3144         * dfg/DFGJITFinalizer.cpp:
3145         (JSC::DFG::JITFinalizer::finalize):
3146         (JSC::DFG::JITFinalizer::finalizeFunction):
3147         * jit/JITCode.cpp:
3148         (JSC::DirectJITCode::initializeCodeRefForDFG):
3149         (JSC::DirectJITCode::initializeCodeRef): Deleted.
3150         (JSC::NativeJITCode::initializeCodeRef): Deleted.
3151         * jit/JITCode.h:
3152         * llint/LLIntEntrypoint.cpp:
3153         (JSC::LLInt::setFunctionEntrypoint):
3154         (JSC::LLInt::setEvalEntrypoint):
3155         (JSC::LLInt::setProgramEntrypoint):
3156         (JSC::LLInt::setModuleProgramEntrypoint): Retagged is removed since the tag is the same.
3157
3158 2019-02-14  Ross Kirsling  <ross.kirsling@sony.com>
3159
3160         [WTF] Add environment variable helpers
3161         https://bugs.webkit.org/show_bug.cgi?id=192405
3162
3163         Reviewed by Michael Catanzaro.
3164
3165         * inspector/remote/glib/RemoteInspectorGlib.cpp:
3166         (Inspector::RemoteInspector::RemoteInspector):
3167         (Inspector::RemoteInspector::start):
3168         * jsc.cpp:
3169         (startTimeoutThreadIfNeeded):
3170         * runtime/Options.cpp:
3171         (JSC::overrideOptionWithHeuristic):
3172         (JSC::Options::overrideAliasedOptionWithHeuristic):
3173         (JSC::Options::initialize):
3174         * runtime/VM.cpp:
3175         (JSC::enableAssembler):
3176         (JSC::VM::VM):
3177         * tools/CodeProfiling.cpp:
3178         (JSC::CodeProfiling::notifyAllocator):
3179         Utilize WTF::Environment where possible.
3180
3181 2019-02-14  Yusuke Suzuki  <ysuzuki@apple.com>
3182
3183         [JSC] Should have default NativeJITCode
3184         https://bugs.webkit.org/show_bug.cgi?id=194634
3185
3186         Reviewed by Mark Lam.
3187
3188         In JSC_useJIT=false mode, we always create identical NativeJITCode for call and construct when we create NativeExecutable.
3189         This is meaningless since we do not modify NativeJITCode after the creation. This patch adds singleton used as a default one.
3190         Since NativeJITCode (& JITCode) is ThreadSafeRefCounted, we can just share it in a whole process level. This removes 446 NativeJITCode
3191         allocations, which takes 14KB.
3192
3193         * runtime/VM.cpp:
3194         (JSC::jitCodeForCallTrampoline):
3195         (JSC::jitCodeForConstructTrampoline):
3196         (JSC::VM::getHostFunction):
3197
3198 2019-02-14  Tadeu Zagallo  <tzagallo@apple.com>
3199
3200         generateUnlinkedCodeBlockForFunctions shouldn't need to create a FunctionExecutable just to get its source code
3201         https://bugs.webkit.org/show_bug.cgi?id=194576
3202
3203         Reviewed by Saam Barati.
3204
3205         Extract a new function, `linkedSourceCode` from UnlinkedFunctionExecutable::link
3206         and use it in `generateUnlinkedCodeBlockForFunctions` instead.
3207
3208         * bytecode/UnlinkedFunctionExecutable.cpp:
3209         (JSC::UnlinkedFunctionExecutable::linkedSourceCode const):
3210         (JSC::UnlinkedFunctionExecutable::link):
3211         * bytecode/UnlinkedFunctionExecutable.h:
3212         * runtime/CodeCache.cpp:
3213         (JSC::generateUnlinkedCodeBlockForFunctions):
3214
3215 2019-02-14  Tadeu Zagallo  <tzagallo@apple.com>
3216
3217         CachedBitVector's size must be converted from bits to bytes
3218         https://bugs.webkit.org/show_bug.cgi?id=194441
3219
3220         Reviewed by Saam Barati.
3221
3222         CachedBitVector used its size in bits for memcpy. That didn't cause any
3223         issues when encoding, since the size in bits was also used in the allocation,
3224         but would overflow the actual BitVector buffer when decoding.
3225
3226         * runtime/CachedTypes.cpp:
3227         (JSC::CachedBitVector::encode):
3228         (JSC::CachedBitVector::decode const):
3229
3230 2019-02-13  Brian Burg  <bburg@apple.com>
3231
3232         Web Inspector: don't include accessibility role in DOM.Node object payloads
3233         https://bugs.webkit.org/show_bug.cgi?id=194623
3234         <rdar://problem/36384037>
3235
3236         Reviewed by Devin Rousso.
3237
3238         Remove property of DOM.Node that is no longer being sent.
3239
3240         * inspector/protocol/DOM.json:
3241
3242 2019-02-13  Keith Miller  <keith_miller@apple.com> and Yusuke Suzuki  <ysuzuki@apple.com>
3243
3244         We should only make rope strings when concatenating strings long enough.
3245         https://bugs.webkit.org/show_bug.cgi?id=194465
3246
3247         Reviewed by Mark Lam.
3248
3249         This patch stops us from allocating a rope string if the resulting
3250         rope would be smaller than the size of the JSRopeString object we
3251         would need to allocate.
3252
3253         This patch also adds paths so that we don't unnecessarily allocate
3254         JSString cells for primitives we are going to concatenate with a
3255         string anyway.
3256
3257         The important change from the previous one is that we do not apply
3258         the above rule to JSRopeStrings generated by JSStrings. If we convert
3259         it to JSString, comparison of memory consumption becomes the following,
3260         because JSRopeString does not have StringImpl until it is resolved.
3261
3262             sizeof(JSRopeString) v.s. sizeof(JSString) + sizeof(StringImpl) + content
3263
3264         Since sizeof(JSString) + sizeof(StringImpl) is larger than sizeof(JSRopeString),
3265         resolving eagerly increases memory footprint. The point is that we need to
3266         account newly created JSString and JSRopeString from the operands. This is the
3267         reason why this patch adds different thresholds for each jsString functions.
3268
3269         This patch also avoids concatenation for ropes conservatively. Many ropes are
3270         temporary cells. So we do not resolve eagerly if one of operands is already a
3271         rope.
3272
3273         In CLI execution, this change is performance neutral in JetStream2 (run 6 times, 1 for warming up and average in latter 5.).
3274
3275             Before: 159.3778
3276             After:  160.72340000000003
3277
3278         * dfg/DFGOperations.cpp:
3279         * runtime/CommonSlowPaths.cpp:
3280         (JSC::SLOW_PATH_DECL):
3281         * runtime/JSString.h:
3282         (JSC::JSString::isRope const):
3283         * runtime/Operations.cpp:
3284         (JSC::jsAddSlowCase):
3285         * runtime/Operations.h:
3286         (JSC::jsString):
3287         (JSC::jsAddNonNumber):
3288         (JSC::jsAdd):
3289
3290 2019-02-13  Saam Barati  <sbarati@apple.com>
3291
3292         AirIRGenerator::addSwitch switch patchpoint needs to model clobbering the scratch register
3293         https://bugs.webkit.org/show_bug.cgi?id=194610
3294
3295         Reviewed by Michael Saboff.
3296
3297         BinarySwitch might use the scratch register. We must model the
3298         effects of that properly. This is already caught by our br-table
3299         tests on arm64.
3300
3301         * wasm/WasmAirIRGenerator.cpp:
3302         (JSC::Wasm::AirIRGenerator::addSwitch):
3303
3304 2019-02-13  Mark Lam  <mark.lam@apple.com>
3305
3306         Create a randomized free list for new StructureIDs on StructureIDTable resize.
3307         https://bugs.webkit.org/show_bug.cgi?id=194566
3308         <rdar://problem/47975502>
3309
3310         Reviewed by Michael Saboff.
3311
3312         Also isolate 32-bit implementation of StructureIDTable out more so the 64-bit
3313         implementation is a little easier to read.
3314
3315         This patch appears to be perf neutral on JetStream2 (as run from the command line).
3316
3317         * runtime/StructureIDTable.cpp:
3318         (JSC::StructureIDTable::StructureIDTable):
3319         (JSC::StructureIDTable::makeFreeListFromRange):
3320         (JSC::StructureIDTable::resize):
3321         (JSC::StructureIDTable::allocateID):
3322         (JSC::StructureIDTable::deallocateID):
3323         * runtime/StructureIDTable.h:
3324         (JSC::StructureIDTable::get):
3325         (JSC::StructureIDTable::deallocateID):
3326         (JSC::StructureIDTable::allocateID):
3327         (JSC::StructureIDTable::flushOldTables):
3328
3329 2019-02-13  Tadeu Zagallo  <tzagallo@apple.com>
3330
3331         VariableLengthObject::allocate<T> should initialize objects
3332         https://bugs.webkit.org/show_bug.cgi?id=194534