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