c292b9fef64837fba94ac0a33174edaeb09a3c4d
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2020-03-24  Ross Kirsling  <ross.kirsling@sony.com>
2
3         Introduce @tryGetByIdWithWellKnownSymbol instead of repurposing @tryGetById itself
4         https://bugs.webkit.org/show_bug.cgi?id=209524
5
6         Reviewed by Saam Barati and Yusuke Suzuki.
7
8         r258865 allowed @tryGetById to take any ResolveNode, such that a built-in could pass a well-known symbol.
9         This is much more permissive than necessary, since we shouldn't really need a ResolveNode in the first place; 
10         instead, let's make a new bytecode intrinsic function @tryGetByIdWithWellKnownSymbol for this purpose.
11
12         * builtins/RegExpPrototype.js:
13         (globalPrivate.hasObservableSideEffectsForRegExpSplit):
14         * bytecode/BytecodeIntrinsicRegistry.h:
15         * bytecompiler/NodesCodegen.cpp:
16         (JSC::BytecodeIntrinsicNode::emit_intrinsic_tryGetById): Revert change from r258865.
17         (JSC::BytecodeIntrinsicNode::emit_intrinsic_tryGetByIdWithWellKnownSymbol): Added.
18
19 2020-03-24  Tadeu Zagallo  <tzagallo@apple.com>
20
21         LLIntGenerator must link switch jumps to otherwise redundant labels
22         https://bugs.webkit.org/show_bug.cgi?id=209333
23         <rdar://problem/60827987>
24
25         Reviewed by Saam Barati.
26
27         The LLIntGenerator optimizes jumps at the end of blocks. It does so when a block ends, by checking if
28         the last instruction emitted was a jump, if it pointed to the end of the current block and if it was
29         the only jump that pointed there. If all those conditions are satisfied, the jump is removed and it's
30         not necessary to emit the label at the end of block, since the only jump that pointed to it was removed.
31         However, switches (br_table) are handled specially by the LLIntGenerator and therefore are not counted
32         in Label::unresolvedJumps, which was used to check whether we could skip emitting the label.
33         The end result is that we might skip linking a switch jump if it points to a block that ends with a jump.
34
35
36         * wasm/WasmLLIntGenerator.cpp:
37         (JSC::Wasm::LLIntGenerator::addEndToUnreachable):
38         (JSC::Wasm::LLIntGenerator::linkSwitchTargets):
39         (JSC::GenericLabel<Wasm::GeneratorTraits>::setLocation):
40
41 2020-03-24  Saam Barati  <sbarati@apple.com>
42
43         Memory::fastMappedBytes() is wrong
44         https://bugs.webkit.org/show_bug.cgi?id=209488
45
46         Reviewed by Mark Lam.
47
48         * wasm/WasmMemory.cpp:
49         (JSC::Wasm::Memory::fastMappedBytes):
50
51 2020-03-24  Keith Miller  <keith_miller@apple.com>
52
53         Fix isEmpty AssemblyHelpers function and add isNotEmpty
54         https://bugs.webkit.org/show_bug.cgi?id=209507
55
56         Reviewed by Saam Barati.
57
58         This fixes the 32 version of my HasIndexedProperty patch as well
59         as properly names the functions for what they do.
60
61         * dfg/DFGSpeculativeJIT.cpp:
62         (JSC::DFG::SpeculativeJIT::compileHasIndexedProperty):
63         * jit/AssemblyHelpers.h:
64         (JSC::AssemblyHelpers::isEmpty):
65         (JSC::AssemblyHelpers::isNotEmpty):
66
67 2020-03-23  Keith Miller  <keith_miller@apple.com>
68
69         HasIndexedProperty should know about sane chain
70         https://bugs.webkit.org/show_bug.cgi?id=209457
71
72         Reviewed by Saam Barati.
73
74         This patch makes it so HasIndexedProperty is aware of
75         sane chain. This is useful because, most of the time we do an
76         indexed in it is on an array. If the array has a sane chain (i.e.
77         no indexed properties on it's prototypes and has the default
78         prototype chain) then we can just test for the index being a hole.
79
80         Note, we could also just convert OOB indices into false but that
81         should happen in another patch.
82         https://bugs.webkit.org/show_bug.cgi?id=209456
83
84         I didn't add any tests because it turns out we already have a ton.
85         I know this because I broke most of them repeatedly... >.>
86
87         * dfg/DFGAbstractInterpreterInlines.h:
88         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
89         * dfg/DFGClobberize.h:
90         (JSC::DFG::clobberize):
91         * dfg/DFGFixupPhase.cpp:
92         (JSC::DFG::FixupPhase::fixupNode):
93         (JSC::DFG::FixupPhase::setSaneChainIfPossible):
94         (JSC::DFG::FixupPhase::convertToHasIndexedProperty):
95         * dfg/DFGNodeType.h:
96         * dfg/DFGSpeculativeJIT.cpp:
97         (JSC::DFG::SpeculativeJIT::compileHasIndexedProperty):
98         * ftl/FTLLowerDFGToB3.cpp:
99         (JSC::FTL::DFG::LowerDFGToB3::compileHasIndexedProperty):
100         (JSC::FTL::DFG::LowerDFGToB3::speculateAndJump):
101         * jit/AssemblyHelpers.h:
102         (JSC::AssemblyHelpers::isEmpty):
103
104 2020-03-23  Yusuke Suzuki  <ysuzuki@apple.com>
105
106         [JSC] Caller of Delete IC should emit write-barrier onto owner
107         https://bugs.webkit.org/show_bug.cgi?id=209392
108         <rdar://problem/60683173>
109
110         Reviewed by Saam Barati.
111
112         DeleteIC can change Structure of the owner cell in the fast path. However it is not emitting write-barrier,
113         while we are writing a Structure cell id into a JSObject's header.
114         In this patch,
115
116             1. Emit write-barrier in baseline. Be careful about when emitting write-barrier since it clobbers registers.
117             2. DFG and FTL recognize DeleteById / DeleteByVal in DFGStoreBarrierInsertionPhase.
118             3. DFGStoreBarrierInsertionPhase only accepts nodes which base is speculated as a Cell. Current DeleteById / DeleteByVal
119                can have UntypedUse base value, but we miss emitting write-barrier DeleteById / DeleteByVal with UntypedUse in the fast path.
120                In this patch, we optimize DeleteById / DeleteByVal only when we speculate child1 as a cell. We can take the further
121                steps after fixing this bug, e.g. (1) accepting UntypedUse in store-barrier-insertion[1] or (2) emitting write-barrier
122                if child1's speculation is UntypedUse. For now, we fix the bug by taking a generic path when child1 is not speculated
123                as a cell. And we can optimize it in a separate change[2].
124
125         This is following the design of PutIC.
126         Currently, we use ShouldFilterBase for emitWriteBarrier. But we could use UnconditionalWriteBarrier here since
127         we already filter non-cells in Baseline's hot path. I filed it as a separate bug in [3].
128
129         [1]: https://bugs.webkit.org/show_bug.cgi?id=209396
130         [2]: https://bugs.webkit.org/show_bug.cgi?id=209397
131         [3]: https://bugs.webkit.org/show_bug.cgi?id=209395
132
133         * dfg/DFGFixupPhase.cpp:
134         (JSC::DFG::FixupPhase::fixupNode):
135         * dfg/DFGSpeculativeJIT64.cpp:
136         (JSC::DFG::SpeculativeJIT::compileDeleteById):
137         (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
138         * dfg/DFGStoreBarrierInsertionPhase.cpp:
139         * ftl/FTLLowerDFGToB3.cpp:
140         (JSC::FTL::DFG::LowerDFGToB3::compileDeleteById):
141         (JSC::FTL::DFG::LowerDFGToB3::compileDeleteByVal):
142         * jit/JIT.h:
143         * jit/JITPropertyAccess.cpp:
144         (JSC::JIT::emitPutByValWithCachedId):
145         (JSC::JIT::emit_op_del_by_id):
146         (JSC::JIT::emit_op_del_by_val):
147         (JSC::JIT::emit_op_put_by_id):
148         (JSC::JIT::emitWriteBarrier):
149         * jit/JITPropertyAccess32_64.cpp:
150         (JSC::JIT::emitPutByValWithCachedId):
151         (JSC::JIT::emit_op_put_by_id):
152
153 2020-03-23  Yusuke Suzuki  <ysuzuki@apple.com>
154
155         [JSC] DFG OSR exit cannot find StructureStubInfo for put_by_val if CodeBlock is once converved from Baseline to LLInt
156         https://bugs.webkit.org/show_bug.cgi?id=209327
157         <rdar://problem/60631061>
158
159         Reviewed by Saam Barati.
160
161         DFG compiles op_put_by_val as PutById and inlines SetterCall only when DFG found StructureStubInfo for this op_put_by_val.
162         However, it is still possible that DFG OSR exit cannot find StructureStubInfo for SetterCall generated by op_put_by_val.
163         Let's consider the following scenario.
164
165             1. Baseline CodeBlock (A) is compiled.
166             2. (A) gets DFG (B).
167             3. Since (A) collects enough information for put_by_val, (B) can get StructureStubInfo from (A) and compile it as inlined Setter call.
168             4. (A)'s JITData is destroyed since it is not executed. Then, (A) becomes LLInt.
169             5. The CodeBlock inlining (A) gets OSR exit. So (A) is executed and (A) eventually gets Baseline CodeBlock again.
170             6. (B) gets OSR exit. (B) attempts to search for StructureStubInfo in (A) for PutById (originally, put_by_val). But it does not exist since (A)'s JITData is cleared once.
171
172         We should just link to doneTarget of ByValInfo when the SetterCall is generated by `op_put_by_val`. ByValInfo and its doneTarget always exists per op_put_by_val.
173
174         * bytecode/ByValInfo.h:
175         (JSC::ByValInfo::ByValInfo):
176         * bytecode/CodeBlock.cpp:
177         (JSC::CodeBlock::findByValInfo):
178         * bytecode/CodeBlock.h:
179         * dfg/DFGOSRExitCompilerCommon.cpp:
180         (JSC::DFG::callerReturnPC):
181         * jit/JITOpcodes.cpp:
182         (JSC::JIT::privateCompileHasIndexedProperty):
183         * jit/JITOpcodes32_64.cpp:
184         (JSC::JIT::privateCompileHasIndexedProperty):
185         * jit/JITPropertyAccess.cpp:
186         (JSC::JIT::privateCompilePutByVal):
187         (JSC::JIT::privateCompilePutByValWithCachedId):
188
189 2020-03-23  Ross Kirsling  <ross.kirsling@sony.com>
190
191         Unreviewed, address Yusuke's feedback on r258801.
192
193         * builtins/RegExpPrototype.js:
194         (globalPrivate.hasObservableSideEffectsForRegExpSplit):
195         * bytecompiler/NodesCodegen.cpp:
196         (JSC::BytecodeIntrinsicNode::emit_intrinsic_tryGetById):
197
198 2020-03-23  Ross Kirsling  <ross.kirsling@sony.com>
199
200         Catch parameters must not be lexically redeclared
201         https://bugs.webkit.org/show_bug.cgi?id=208976
202
203         Reviewed by Keith Miller.
204
205         From https://tc39.es/ecma262/#sec-try-statement-static-semantics-early-errors:
206           Catch : catch ( CatchParameter ) Block
207             It is a Syntax Error if any element of the BoundNames of CatchParameter
208             also occurs in the LexicallyDeclaredNames of Block.
209
210         In other words, let/const/class/function declarations in the immediate catch block scope
211         must not shadow catch parameters.
212
213         * parser/Parser.cpp:
214         (JSC::Parser<LexerType>::parseTryStatement):
215         (JSC::Parser<LexerType>::parseBlockStatement):
216         * parser/Parser.h:
217         (JSC::Scope::Scope):
218         (JSC::Scope::setIsCatchBlockScope): Added.
219         (JSC::Scope::isCatchBlockScope): Added.
220         (JSC::Parser::declareVariable):
221         (JSC::Parser::declareFunction):
222
223 2020-03-23  Michael Catanzaro  <mcatanzaro@gnome.org>
224
225         REGRESSION(r249808): [GTK] Crash in JSC Config::permanentlyFreeze() on architecture ppc64el
226         https://bugs.webkit.org/show_bug.cgi?id=209236
227
228         Reviewed by Mark Lam.
229
230         * heap/MarkedBlock.h: Use new CeilingOnPageSize.
231         * runtime/JSCConfig.cpp:
232         (JSC::Config::permanentlyFreeze): Use pageSize instead of vmPageSize.
233         * runtime/JSCConfig.h: Use new CeilingOnPageSize.
234
235 2020-03-22  Yusuke Suzuki  <ysuzuki@apple.com>
236
237         Unreviewed, rename keepAlive to ensureStillAliveHere
238         https://bugs.webkit.org/show_bug.cgi?id=209398
239
240         Based on Geoff and Mark's feedback, renaming keepAlive to ensureStillAliveHere
241         to make the effect of keepAlive clear.
242
243         * ftl/FTLLowerDFGToB3.cpp:
244         (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsReadModifyWrite):
245         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
246         (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
247         (JSC::FTL::DFG::LowerDFGToB3::compileArraySlice):
248         (JSC::FTL::DFG::LowerDFGToB3::ensureStillAliveHere):
249         (JSC::FTL::DFG::LowerDFGToB3::keepAlive): Deleted.
250         * heap/HeapCell.cpp:
251         (JSC::ensureStillAliveHere):
252         (JSC::keepAlive): Deleted.
253         * heap/HeapCell.h:
254         (JSC::ensureStillAliveHere):
255         (JSC::HeapCell::use const):
256         (JSC::keepAlive): Deleted.
257         * runtime/JSCJSValue.cpp:
258         (JSC::ensureStillAliveHere):
259         (JSC::keepAlive): Deleted.
260         * runtime/JSCJSValue.h:
261         (JSC::ensureStillAliveHere):
262         (JSC::keepAlive): Deleted.
263         * wasm/js/WebAssemblyModuleRecord.cpp:
264         (JSC::WebAssemblyModuleRecord::link):
265
266 2020-03-22  Yusuke Suzuki  <ysuzuki@apple.com>
267
268         [JSC] Add JSC::keepAlive(JSValue)
269         https://bugs.webkit.org/show_bug.cgi?id=209398
270
271         Reviewed by Mark Lam.
272
273         Add JSC::keepAlive(JSValue). This is useful to make some JSValue variable alive from GC.
274
275         * heap/HeapCell.cpp:
276         * runtime/JSCJSValue.cpp:
277         (JSC::keepAlive):
278         * runtime/JSCJSValue.h:
279         (JSC::keepAlive):
280
281 2020-03-20  Ross Kirsling  <ross.kirsling@sony.com>
282
283         hasObservableSideEffectsForRegExpSplit doesn't check for @@match override
284         https://bugs.webkit.org/show_bug.cgi?id=209363
285
286         Reviewed by Michael Saboff.
287
288         Our RegExp.prototype[@@split] implementation has a fast path for unadultered RegExp objects,
289         but we're using that fast path even when @@match has been overridden.
290
291         This is illegitimate because the RegExp species constructor calls IsRegExp, which hits the @@match getter.
292
293         * builtins/BuiltinNames.h:
294         * builtins/RegExpPrototype.js:
295         (globalPrivate.hasObservableSideEffectsForRegExpSplit):
296         * bytecode/LinkTimeConstant.h:
297         * runtime/JSGlobalObject.cpp:
298         (JSC::JSGlobalObject::init):
299
300 2020-03-20  Ross Kirsling  <ross.kirsling@sony.com>
301
302         RegExp.prototype[@@replace] doesn't coerce result index to integer
303         https://bugs.webkit.org/show_bug.cgi?id=209323
304
305         Reviewed by Yusuke Suzuki.
306
307         From https://tc39.es/ecma262/#sec-regexp.prototype-@@replace:
308           21.2.5.10 RegExp.prototype [ @@replace ] ( string, replaceValue )
309             ...
310             14. For each result in results, do
311               ...
312               e. Let position be ? ToInteger(? Get(result, "index")).
313               f. Set position to max(min(position, lengthS), 0).
314
315         result.index may be undefined, so it doesn't suffice to coerce it with comparison operators.
316
317         * builtins/RegExpPrototype.js:
318
319 2020-03-20  Justin Michaud  <justin@justinmichaud.com>
320
321         Fix JSCOnly build without unified sources
322         https://bugs.webkit.org/show_bug.cgi?id=209343
323
324         Reviewed by Keith Miller.
325
326         I managed to get clangd to work for code completion using the following command:
327
328         ./Tools/Scripts/build-webkit --jsc-only --cmakeargs="-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DENABLE_UNIFIED_BUILDS=OFF" && compdb -p WebKitBuild/Release/ list > compile_commands.json
329
330         This patch fixes the build for non-unified sources, and adds some extra clangd files to .gitignore.
331
332         * API/MarkedJSValueRefArray.h:
333         * jit/JITPropertyAccess.cpp:
334
335 2020-03-20  Tim Horton  <timothy_horton@apple.com>
336
337         Upstream a variety of Cocoa-platform HAVE and ENABLE macros
338         https://bugs.webkit.org/show_bug.cgi?id=209307
339
340         Reviewed by Andy Estes.
341
342         * Configurations/FeatureDefines.xcconfig:
343
344 2020-03-20  Jacob Uphoff  <jacob_uphoff@apple.com>
345
346         Unreviewed, reverting r258748.
347
348         This commit broke the Catalina build
349
350         Reverted changeset:
351
352         "Upstream a variety of Cocoa-platform HAVE and ENABLE macros"
353         https://bugs.webkit.org/show_bug.cgi?id=209307
354         https://trac.webkit.org/changeset/258748
355
356 2020-03-19  Tim Horton  <timothy_horton@apple.com>
357
358         Upstream a variety of Cocoa-platform HAVE and ENABLE macros
359         https://bugs.webkit.org/show_bug.cgi?id=209307
360
361         Reviewed by Andy Estes.
362
363         * Configurations/FeatureDefines.xcconfig:
364
365 2020-03-19  Yusuke Suzuki  <ysuzuki@apple.com>
366
367         [JSC] StructureStubInfo::bufferedStructures should not ref/deref UniquedStringImpl
368         https://bugs.webkit.org/show_bug.cgi?id=209266
369         <rdar://problem/60508312>
370
371         Reviewed by Saam Barati.
372
373         StructureStubInfo::bufferedStructures includes RefPtr<UniquedStringImpl>. So destroying StructureStubInfo in
374         CodeBlock::finalizeUnconditionally can access to AtomStringTable, and get nullptr AtomStringTable since
375         CodeBlock::finalizeUnconditionally can be executed in heap-thread.
376
377         Temporarily setting AtomStringTable in the heap-thread when executing GC End phase is dangerous: Web worker's
378         JSC VM is releasing heapAccess when waiting for the next message in the RunLoop. This potentially means that
379         Web worker's main thread can run concurrently with Web worker's JSC VM's End phase heap-thread until the web
380         worker takes JSLock. (This is not a problem in WebCore since WebCore JSC VM never releases heapAccess. We cannot
381         take the same design since we would like to run End phase even if web worker is not getting any messages).
382
383         And removing resetJITData in CodeBlock::finalizeUnconditionally does not fix as well since CodeBlock::finalizeUnconditionally
384         calls StructureStubInfo::visitWeakReferences, and it removes some of entries of StructureStubInfo::bufferedStructures after
385         ByVal extension is introduced into StructureStubInfo.
386
387         This patch uses CacheableIdentifier for bufferedStructures. We make BufferedStructure class which holds Structure and CacheableIdentifier.
388         And StructureStubInfo holds HashSet<BufferedStructure>. We also visit CacheableIdentifier in StructureStubInfo::visitAggregate. To allow
389         concurrent collector to run this, we introduce m_bufferedStructuresLock in StructureStubInfo to guard m_bufferedStructures.
390
391         * bytecode/StructureStubInfo.cpp:
392         (JSC::StructureStubInfo::StructureStubInfo):
393         (JSC::StructureStubInfo::addAccessCase):
394         (JSC::StructureStubInfo::reset):
395         (JSC::StructureStubInfo::visitAggregate):
396         (JSC::StructureStubInfo::visitWeakReferences):
397         * bytecode/StructureStubInfo.h:
398         (JSC::StructureStubInfo::considerCaching):
399         (JSC::StructureStubInfo::getByIdSelfIdentifier):
400         (JSC::StructureStubInfo::cacheType const):
401         (JSC::StructureStubInfo::clearBufferedStructures):
402         (JSC::StructureStubInfo::BufferedStructure::BufferedStructure):
403         (JSC::StructureStubInfo::BufferedStructure::isHashTableDeletedValue const):
404         (JSC::StructureStubInfo::BufferedStructure::hash const):
405         (JSC::StructureStubInfo::BufferedStructure::operator==):
406         (JSC::StructureStubInfo::BufferedStructure::operator!=):
407         (JSC::StructureStubInfo::BufferedStructure::Hash::hash):
408         (JSC::StructureStubInfo::BufferedStructure::Hash::equal):
409         (JSC::StructureStubInfo::BufferedStructure::structure const):
410         (JSC::StructureStubInfo::BufferedStructure::byValId const):
411         * jit/JITOperations.cpp:
412         * runtime/CacheableIdentifier.h:
413         (JSC::CacheableIdentifier::hash const):
414
415 2020-03-19  Yusuke Suzuki  <ysuzuki@apple.com>
416
417         Unreviewed, build fix after r258717
418         https://bugs.webkit.org/show_bug.cgi?id=199295
419
420         * llint/LowLevelInterpreter.asm:
421
422 2020-03-18  Yusuke Suzuki  <ysuzuki@apple.com>
423
424         sanitizeStackForVMImpl writes below stack pointer, triggers huge warning spam from valgrind
425         https://bugs.webkit.org/show_bug.cgi?id=199295
426
427         Reviewed by Mark Lam.
428
429         During sanitizeStackForVMImpl, we should not access to the region beyond the stack-pointer.
430         This patch changes stack-pointer while sanitizeStackForVMImpl is zero-filling the old stack region.
431
432         * llint/LowLevelInterpreter.asm:
433
434 2020-03-19  Charlie Turner  <cturner@igalia.com>
435
436         Fix many warnings with Clang 7.0 on GTK x86-64 in Debug.
437         https://bugs.webkit.org/show_bug.cgi?id=209146
438
439         Reviewed by Darin Adler.
440
441         * runtime/JSCellInlines.h:
442         (JSC::CallFrame::deprecatedVM const): A reference may not be NULL, so
443         this ASSERT() can never trip.
444
445 2020-03-18  Yusuke Suzuki  <ysuzuki@apple.com>
446
447         Add a way to mark a rejected promise as handled
448         https://bugs.webkit.org/show_bug.cgi?id=209241
449
450         Reviewed by Michael Saboff.
451
452         Some of WebCore promise implementations (WebAnimation etc.) want to reject promise
453         as handled state to suppress UnhandledPromiseRejection tracking. For example, a
454         lot of WebCore implementations expose Promise DOM attributes which will be rejected
455         at some conditions. But we do not want to force users setting a handler for each such an
456         attribute.
457
458         This patch adds `JSPromise::rejectAsHandled` C++ function. This simply sets isHandledFlag
459         before executing `JSPromise::reject` if we are not calling a reject function yet.
460
461         * runtime/JSPromise.cpp:
462         (JSC::JSPromise::rejectAsHandled):
463         * runtime/JSPromise.h:
464         * tools/JSDollarVM.cpp:
465         (JSC::functionRejectPromiseAsHandled):
466         (JSC::JSDollarVM::finishCreation):
467
468 2020-03-17  Yusuke Suzuki  <ysuzuki@apple.com>
469
470         [JSC] DeleteIC patchpoint in FTL should require tag and mask registers
471         https://bugs.webkit.org/show_bug.cgi?id=209197
472         <rdar://problem/60531308>
473
474         Reviewed by Tadeu Zagallo and Saam Barati.
475
476         DeleteIC patchpoint is emitting `branchIfNotCell` machine code. This requires a mask register
477         while we are not reserving them when creating a patchpoint.
478
479         In general, our IC code is assuming usual CCallHelpers environment which provides macro-assembler
480         scratch, tag, and mask registers. We should offer them even if IC is emitted from FTL. In this
481         patch, we offer tag and mask registers for Delete IC even if this IC is not currently using tag
482         register.
483
484         * ftl/FTLLowerDFGToB3.cpp:
485         (JSC::FTL::DFG::LowerDFGToB3::compileDelBy):
486
487 2020-03-17  Tadeu Zagallo  <tzagallo@apple.com>
488
489         AccessCase::canReplace should allow a Getter to replace an IntrinsicGetter
490         https://bugs.webkit.org/show_bug.cgi?id=209158
491         <rdar://problem/59222012>
492
493         Reviewed by Saam Barati.
494
495         When we override an intrinsic getter with a user defined getter, we might end up with the
496         same offset and attributes. In which case, an inline cache that contained an entry for the
497         intrisic getter will believe that it is still valid, and add a new getter access case,
498         leading to duplicate entries for the same structure.
499
500         * bytecode/AccessCase.cpp:
501         (JSC::AccessCase::canReplace const):
502
503 2020-03-16  Yusuke Suzuki  <ysuzuki@apple.com>
504
505         [JSC] JSMapIterator and JSSetIterator are CellType
506         https://bugs.webkit.org/show_bug.cgi?id=209168
507         <rdar://problem/59705631>
508
509         Reviewed by Saam Barati.
510
511         They are JSCell, not JSObject since they are not used as a user-observable set/map iterators in JSC.
512         However, their JSType is ObjectType. They should use CellType instead.
513
514         * runtime/JSMapIterator.h:
515         * runtime/JSSetIterator.h:
516
517 2020-03-16  Keith Miller  <keith_miller@apple.com>
518
519         JavaScript identifier grammar supports unescaped astral symbols, but JSC doesn’t
520         https://bugs.webkit.org/show_bug.cgi?id=208998
521
522         Reviewed by Michael Saboff.
523
524         This patch fixes a bug in the parser that allows for surrogate pairs when parsing identifiers.
525         It also makes a few other changes to the parser:
526
527         1) When looking for keywords we just need to check that subsequent
528         character cannot be a identifier part or an escape start.
529
530         2) The only time we call parseIdentifierSlowCase is when we hit an
531         escape start or a surrogate pair so we can optimize that to just
532         copy everything up slow character into our buffer.
533
534         3) We shouldn't allow for asking if a UChar is an identifier start/part.
535
536         * KeywordLookupGenerator.py:
537         (Trie.printSubTreeAsC):
538         (Trie.printAsC):
539         * parser/Lexer.cpp:
540         (JSC::isNonLatin1IdentStart):
541         (JSC::isIdentStart):
542         (JSC::isSingleCharacterIdentStart):
543         (JSC::cannotBeIdentStart):
544         (JSC::isIdentPart):
545         (JSC::isSingleCharacterIdentPart):
546         (JSC::cannotBeIdentPartOrEscapeStart):
547         (JSC::Lexer<LChar>::currentCodePoint const):
548         (JSC::Lexer<UChar>::currentCodePoint const):
549         (JSC::Lexer<LChar>::parseIdentifier):
550         (JSC::Lexer<UChar>::parseIdentifier):
551         (JSC::Lexer<CharacterType>::parseIdentifierSlowCase):
552         (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
553         (JSC::Lexer<T>::scanRegExp):
554         (JSC::isIdentPartIncludingEscapeTemplate): Deleted.
555         (JSC::isIdentPartIncludingEscape): Deleted.
556         * parser/Lexer.h:
557         (JSC::Lexer::setOffsetFromSourcePtr): Deleted.
558         * parser/Parser.cpp:
559         (JSC::Parser<LexerType>::printUnexpectedTokenText):
560         * parser/ParserTokens.h:
561
562 2020-03-13  Sergio Villar Senin  <svillar@igalia.com>
563
564         [WebXR] IDLs, stubs and build configuration for WPE
565         https://bugs.webkit.org/show_bug.cgi?id=208702
566
567         Reviewed by Dean Jackson.
568
569         * Configurations/FeatureDefines.xcconfig: Added ENABLE_WEBXR, off by default.
570
571 2020-03-15  Yusuke Suzuki  <ysuzuki@apple.com>
572
573         reportZappedCellAndCrash should handle PreciseAllocation in IsoSubspace
574         https://bugs.webkit.org/show_bug.cgi?id=209042
575
576         Reviewed by Mark Lam.
577
578         This patch adds support of PreciseAllocation cells to reportZappedCellAndCrash, since now it is frequently used
579         as a lower-tier cells in IsoSubspace.
580
581         * heap/IsoSubspace.h:
582         * heap/IsoSubspaceInlines.h:
583         (JSC::IsoSubspace::forEachLowerTierFreeListedPreciseAllocation):
584         * runtime/JSCell.cpp:
585         (JSC::reportZappedCellAndCrash):
586
587 2020-03-15  Yusuke Suzuki  <ysuzuki@apple.com>
588
589         Should not use variable-length-array (VLA)
590         https://bugs.webkit.org/show_bug.cgi?id=209043
591
592         Reviewed by Mark Lam.
593
594         This patch disables variable-length-array (VLA). If this feature uses user-input, user can
595         control the stack height consumed by C++ code. This patch avoids using VLA. To achieve that,
596
597             1. We set `-Wvla` warning option to trigger warnings if it is used.
598             2. Introduce MarkedJSValueRefArray for API. This replaces `JSValueRef arguments[variableLength]` use case.
599                MarkedJSValueRefArray registers itself to JSC GC so that GC can mark it as a strong root.
600
601         * API/JSContext.mm:
602         (+[JSContext currentArguments]):
603         * API/JSValue.mm:
604         (-[JSValue callWithArguments:]):
605         (-[JSValue constructWithArguments:]):
606         (-[JSValue invokeMethod:withArguments:]):
607         * API/MarkedJSValueRefArray.cpp: Added.
608         (JSC::MarkedJSValueRefArray::MarkedJSValueRefArray):
609         (JSC::MarkedJSValueRefArray::~MarkedJSValueRefArray):
610         (JSC::MarkedJSValueRefArray::visitAggregate):
611         * API/MarkedJSValueRefArray.h: Added.
612         * API/tests/minidom.c:
613         (print):
614         * API/tests/testapi.cpp:
615         (TestAPI::markedJSValueArrayAndGC):
616         (testCAPIViaCpp):
617         * Configurations/Base.xcconfig:
618         * JavaScriptCore.xcodeproj/project.pbxproj:
619         * Sources.txt:
620         * heap/Heap.cpp:
621         (JSC::Heap::addCoreConstraints):
622         (JSC::Heap::addMarkedJSValueRefArray):
623         * heap/Heap.h:
624         * heap/MarkedSpace.h:
625         (JSC::MarkedSpace::activeWeakSetsBegin): Deleted.
626         (JSC::MarkedSpace::activeWeakSetsEnd): Deleted.
627         (JSC::MarkedSpace::newActiveWeakSetsBegin): Deleted.
628         (JSC::MarkedSpace::newActiveWeakSetsEnd): Deleted.
629         * runtime/ArgList.h:
630
631 2020-03-14  Saam Barati  <sbarati@apple.com>
632
633         Unreviewed. Fix windows build by making configSizeToProtect stay 4KB.
634
635         * runtime/JSCConfig.h:
636
637 2020-03-13  Saam Barati  <sbarati@apple.com>
638
639         configSizeToProtect should be 16KB
640         https://bugs.webkit.org/show_bug.cgi?id=209068
641
642         Reviewed by Keith Miller.
643
644         * runtime/JSCConfig.h:
645
646 2020-03-13  Yusuke Suzuki  <ysuzuki@apple.com>
647
648         Unreviewed, fix JSC / test262 tests
649         https://bugs.webkit.org/show_bug.cgi?id=209033
650         <rdar://problem/58946936>
651
652         Follow-up change for DisallowGC causes crash because CodeBlock is nullptr when function call is non JS calls.
653
654         * interpreter/Interpreter.cpp:
655         (JSC::Interpreter::executeCall):
656         (JSC::Interpreter::executeConstruct):
657
658 2020-03-13  Tadeu Zagallo  <tzagallo@apple.com>
659
660         Missing arithMode for ArithAbs and ArithNegate in DFGClobberize
661         https://bugs.webkit.org/show_bug.cgi?id=208685
662         <rdar://problem/60115088>
663
664         Reviewed by Saam Barati.
665
666         In the pure case of ArithNegate and ArithAbs in DFGClobberize, their PureValues did not include their
667         respective ArithMode. That means that e.g. a CheckOverflow ArithNegate/Abs could be considered equivalent
668         to an Unchecked version of the same node.
669
670         Thanks to Samuel Groß of Google Project Zero for identifying this bug.
671
672         * dfg/DFGClobberize.h:
673         (JSC::DFG::clobberize):
674
675 2020-03-13  Myles C. Maxfield  <mmaxfield@apple.com>
676
677         [Cocoa] Push applicationSDKVersion() down from WebCore into WTF
678         https://bugs.webkit.org/show_bug.cgi?id=209030
679
680         Reviewed by Simon Fraser.
681
682         dyld_get_program_sdk_version() gives you the wrong answer in the Web Process (or at least
683         not the answer you actually want). There are already facilities for the UI Process to tell
684         the Web Process what the real value is, but those functions are currently in WebCore,
685         which is inaccessible to WTF. This patch is in preparation for
686         https://bugs.webkit.org/show_bug.cgi?id=208969 which needs to know this information in WTF.
687
688         I also found a few places which were calling dyld_get_program_sdk_version() in JavaScriptCore
689         and WebCore (which is wrong because those libraries exist in the Web Process), and have fixed
690         them up to use applicationSDKVersion() instead.
691
692         * API/JSWrapperMap.mm:
693         (supportsInitMethodConstructors):
694
695 2020-03-13  Yusuke Suzuki  <ysuzuki@apple.com>
696
697         [JSC] Reload CodeBlock or suppress GC while setting up calls
698         https://bugs.webkit.org/show_bug.cgi?id=209033
699         <rdar://problem/58946936>
700
701         Reviewed by Saam Barati.
702
703         The sequence of Interpreter::execute is the following.
704
705             1. Getting CodeBlock from Executable
706             2. Doing a lot of setups
707             3. Setting (1)'s CodeBlock to ProtoFrame
708             4. Calling code through Executable
709
710         During (2), it would be possible that GC happens and it replaces CodeBlock in Executable.
711         Then, when executing JITCode with CodeBlock in (4), we use new JITCode with old CodeBlock.
712
713         In this patch,
714
715         For ProgramExecutable, FunctionExecutable, ModuleProgramExecutable, we ensure that no GC happens
716         after getting CodeBlock by placing DisallowGC. For EvalExecutable, we reload CodeBlock after setting
717         up environment. It is possible that FunctionExecutable* stored in CodeBlock can be different when
718         executing a new CodeBlock, but this is OK since this different does not appear and we do not rely on
719         this: we are touching `name` of FunctionExecutable* which is retrieved from CodeBlock. But this name
720         will not be changed since this is derived from UnlinkedFunctionExecutable which is shared by multiple
721         CodeBlocks. And FunctionExecutable* generation ordering must be the same for every CodeBlock generation
722         from the same UnlinkedCodeBlock.
723
724         * bytecode/CodeBlock.h:
725         (JSC::ScriptExecutable::prepareForExecution):
726         * interpreter/Interpreter.cpp:
727         (JSC::Interpreter::executeProgram):
728         (JSC::Interpreter::executeCall):
729         (JSC::Interpreter::executeConstruct):
730         (JSC::Interpreter::execute):
731         (JSC::Interpreter::executeModuleProgram):
732         * interpreter/InterpreterInlines.h:
733         (JSC::Interpreter::execute):
734         * runtime/DisallowScope.h:
735         (JSC::DisallowScope::disable):
736         * runtime/StringPrototype.cpp:
737
738 2020-03-12  Yusuke Suzuki  <ysuzuki@apple.com>
739
740         [JSC] Delete IC creation should check mayNeedToCheckCell/canCacheDeleteIC regardless of Structure::outOfLineCapacity
741         https://bugs.webkit.org/show_bug.cgi?id=209027
742
743         Reviewed by Saam Barati.
744
745         Delete IC code generation assumes that mayNeedToCheckCell (it is replaced with canCacheDeleteIC) is false
746         while we are looking into this status only if Structure::outOfLineCapacity meets a certain condition. We should avoid
747         create Delete IC when mayNeedToCheckCell/canCacheDeleteIC is true regardless of Structure::outOfLineCapacity
748
749         * bytecode/AccessCase.cpp:
750         (JSC::AccessCase::createDelete):
751         (JSC::AccessCase::generateImpl):
752         * runtime/Structure.h:
753         * runtime/StructureInlines.h:
754         (JSC::Structure::mayHaveIndexingHeader const):
755         (JSC::Structure::canCacheDeleteIC const):
756
757 2020-03-13  Alexey Shvayka  <shvaikalesh@gmail.com>
758
759         Bound functions should pass correct NewTarget value
760         https://bugs.webkit.org/show_bug.cgi?id=209057
761
762         Reviewed by Keith Miller.
763
764         This change implements steps 5-6 of bound function's [[Construct]] method [1],
765         fixing bound function subclasses and aligning JSC with V8 and SpiderMonkey.
766
767         [1]: https://tc39.es/ecma262/#sec-bound-function-exotic-objects-construct-argumentslist-newtarget
768
769         * runtime/JSBoundFunction.cpp:
770         (JSC::boundThisNoArgsFunctionConstruct):
771         (JSC::boundFunctionConstruct):
772
773 2020-03-13  Yusuke Suzuki  <ysuzuki@apple.com>
774
775         Unreviewed, change ASSERT to ASSERT_WITH_SECURITY_IMPLICATION since it is now enabled under ENABLE(SECURITY_ASSERTIONS)
776         https://bugs.webkit.org/show_bug.cgi?id=209041
777         <rdar://problem/59705631>
778
779         * runtime/JSCast.h:
780         (JSC::jsCast):
781
782 2020-03-12  Yusuke Suzuki  <ysuzuki@apple.com>
783
784         Report crashed cell in jsCast in debug builds
785         https://bugs.webkit.org/show_bug.cgi?id=209041
786         <rdar://problem/59705631>
787
788         Reviewed by Mark Lam.
789
790         To collect more information when crashing with jsCast, we attempt to use reportZappedCellAndCrash.
791         If it succeeds, we can get more information in registers. We enable this only for ASSERT_ENABLED
792         build. For non ASSERT_ENABLED, we keep the original assertion since this assertion can be enabled
793         via ENABLE(SECURITY_ASSERTIONS).
794
795         * heap/SlotVisitor.cpp:
796         (JSC::SlotVisitor::appendToMarkStack):
797         (JSC::SlotVisitor::visitChildren):
798         (JSC::SlotVisitor::reportZappedCellAndCrash): Deleted.
799         * heap/SlotVisitor.h:
800         * runtime/JSCast.h:
801         (JSC::jsCast):
802         * runtime/JSCell.cpp:
803         (JSC::reportZappedCellAndCrash):
804         * runtime/JSCell.h:
805
806 2020-03-12  Keith Miller  <keith_miller@apple.com>
807
808         DFG nodes that take a TypedArray's storage need to keepAlive the TypedArray
809         https://bugs.webkit.org/show_bug.cgi?id=209035
810
811         Reviewed by Saam Barati.
812
813         It might be possible to produce a graph where the last reference to a TypedArray
814         is via a GetByVal or PutByVal. Since those nodes don't create any reference to the
815         TypedArray in B3 we may end up not keeping the TypedArray alive until after the
816         storage access.
817
818         * ftl/FTLLowerDFGToB3.cpp:
819         (JSC::FTL::DFG::LowerDFGToB3::compileAtomicsReadModifyWrite):
820         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
821         (JSC::FTL::DFG::LowerDFGToB3::compilePutByVal):
822
823 2020-03-12  Yusuke Suzuki  <ysuzuki@apple.com>
824
825         [JSC] Use CacheableIdentifier in ByValInfo
826         https://bugs.webkit.org/show_bug.cgi?id=208978
827
828         Reviewed by Saam Barati.
829
830         CodeBlock::finalizeUnconditionally discards JITData. And this includes ByValInfo, which holds Identifier.
831         However, finalizeUnconditionally is only guaranteeing that the main thread is not working. It can be invoked
832         in the heap thread, and it is not not setting the AtomStringTable for this heap thread. If Identifier destroys
833         AtomStringImpl, which fails to unregister itself from the table.
834
835         In this patch,
836
837             1. We explicitly set nullptr for the current AtomStringTable to catch the bug as soon as possible in GC end phase.
838             2. We use CacheableIdentifier in ByValInfo to avoid destroying Identifier in CodeBlock::finalizeUnconditionally.
839
840         * CMakeLists.txt:
841         * JavaScriptCore.xcodeproj/project.pbxproj:
842         * Sources.txt:
843         * bytecode/ByValInfo.cpp: Added.
844         (JSC::ByValInfo::visitAggregate):
845         * bytecode/ByValInfo.h:
846         * bytecode/CodeBlock.cpp:
847         (JSC::CodeBlock::stronglyVisitStrongReferences):
848         * bytecode/CodeBlock.h:
849         * dfg/DFGByteCodeParser.cpp:
850         (JSC::DFG::ByteCodeParser::handlePutByVal):
851         * heap/Heap.cpp:
852         (JSC::Heap::runEndPhase):
853         * jit/JIT.h:
854         * jit/JITOperations.cpp:
855         * jit/JITPropertyAccess.cpp:
856         (JSC::JIT::emitByValIdentifierCheck):
857         * runtime/CacheableIdentifier.h:
858
859 2020-03-11  Keith Miller  <keith_miller@apple.com>
860
861         Test262-runner should always consider crashes as new failures
862         https://bugs.webkit.org/show_bug.cgi?id=208943
863
864         Reviewed by Yusuke Suzuki.
865
866         BigInt.asUintN() / BigInt.asIntN() should not crash when called even if we have
867         not implemented them yet...
868
869         * runtime/BigIntConstructor.cpp:
870         (JSC::bigIntConstructorFuncAsUintN):
871         (JSC::bigIntConstructorFuncAsIntN):
872
873 2020-03-11  Keith Miller  <keith_miller@apple.com>
874
875         Throws incorrectly a syntax error when declaring a top level catch variable the same as a parameter
876         https://bugs.webkit.org/show_bug.cgi?id=189914
877
878         Reviewed by Saam Barati.
879
880         When we are parsing catch block parameters we should increment the statement depth so we don't think
881         we are trying to shadow top level lexical variables in the same statement depth.
882
883         * parser/Parser.cpp:
884         (JSC::Parser<LexerType>::parseTryStatement):
885
886 2020-03-10  Yusuke Suzuki  <ysuzuki@apple.com>
887
888         [JSC] Fix iso-subspace static_assert for JSJavaScriptCallFramePrototype
889         https://bugs.webkit.org/show_bug.cgi?id=208874
890
891         Reviewed by Saam Barati.
892
893         This static_assert should ensure the condition for JSJavaScriptCallFramePrototype, not for JSInjectedScriptHostPrototype.
894
895         * inspector/JSJavaScriptCallFramePrototype.h:
896
897 2020-03-09  Don Olmstead  <don.olmstead@sony.com>
898
899         Remove obsolete feature flags
900         https://bugs.webkit.org/show_bug.cgi?id=208830
901
902         Reviewed by Alex Christensen.
903
904         Remove ENABLE_CUSTOM_SCHEME_HANDLER and ENABLE_MAC_VIDEO_TOOLBOX since they
905         are no longer used.
906
907         * Configurations/FeatureDefines.xcconfig:
908
909 2020-03-09  Alexey Shvayka  <shvaikalesh@gmail.com>
910
911         @putByValDirect does not perform [[DefineOwnProperty]] correctly
912         https://bugs.webkit.org/show_bug.cgi?id=208708
913
914         Reviewed by Yusuke Suzuki.
915
916         This change adds inSparseIndexingMode() check to canDoFastPutDirectIndex(), fixing slow path
917         of @putByValDirect() to perform [[DefineOwnProperty]] according to spec [1] and aligning JSC
918         with V8 and SpiderMonkey.
919
920         This patch preserves existing behavior for Arguments exotic objects (thus the checks order)
921         and aligns slow path checks in JSObject::putDirectIndexSlowOrBeyondVectorLength
922         with JSObject::defineOwnIndexedProperty.
923
924         JetStream2 benchmark is neutral.
925
926         [1]: https://tc39.es/ecma262/#sec-validateandapplypropertydescriptor
927
928         * runtime/JSObject.cpp:
929         (JSC::canDoFastPutDirectIndex):
930
931 2020-03-09  Antoine Quint  <graouts@apple.com>
932
933         Remove the compile-time flag for Pointer Events
934         https://bugs.webkit.org/show_bug.cgi?id=208821
935         <rdar://problem/60223471>
936
937         Reviewed by Dean Jackson.
938
939         * Configurations/FeatureDefines.xcconfig:
940
941 2020-03-09  Caio Lima  <ticaiolima@gmail.com>
942
943         Tail calls are broken on ARM_THUMB2 and MIPS
944         https://bugs.webkit.org/show_bug.cgi?id=197797
945
946         Reviewed by Yusuke Suzuki.
947
948         `prepareForTailCall` operation expects that header size + parameters
949         size is aligned with stack (alignment is 16-bytes for every architecture).
950         This means that headerSizeInBytes + argumentsIncludingThisInBytes needs
951         to be multiple of 16. This was not being preserved during getter IC code
952         for 32-bits. The code generated was taking in account only
953         headerSizeInRegisters (it is 4 on 32-bits) and argumentsIncludingThis
954         (that is always 1 for getters) and allocating 32-bytes when applying
955         operation `(headerSize + argumentsIncludingThis) * 8 - sizeof(CallerFrameAndPC)`.
956         This results in a stack frame with size of 40 bytes (after we push
957         `lr` and `sp`). Since `prepareForTailCall` expects frames to be
958         16-bytes aligned, it will then calculate the top of such frame
959         considering it is 48 bytes, cloberring values of previous frame and
960         causing unexpected behavior. This patch is fixing how this IC code
961         calculates the stack frame using `roundArgumentCountToAlignFrame(numberOfParameters)`
962         aligning with what we do on code without IC installed.
963         This was not a problem for getter and setter IC on 64-bits because
964         `roundArgumentCountToAlignFrame(1) == 1` and `roundArgumentCountToAlignFrame(2) == 3`
965         while it is `roundArgumentCountToAlignFrame(1) == 2` and
966         `roundArgumentCountToAlignFrame(2) == 2` for MIPS and ARMv7.
967
968         * bytecode/AccessCase.cpp:
969         (JSC::AccessCase::generateImpl):
970
971 2020-03-08  Brady Eidson  <beidson@apple.com>
972
973         Remember completed subranges during incremental PDF loading.
974         https://bugs.webkit.org/show_bug.cgi?id=208785
975
976         Reviewed by Tim Horton.
977
978         Move 'using WTF::Range' from the WTF/Range.h header to these JSC users.
979         
980         The alternative to making these 3 changes was to make over 20 changes up in the WebCore/WebKits
981         to resolve the conflict with WebCore::Range.
982         
983         * b3/B3HeapRange.h:
984         * b3/air/AirAllocateRegistersAndStackByLinearScan.cpp:
985         * heap/JITStubRoutineSet.h:
986
987 2020-03-07  Alexey Shvayka  <shvaikalesh@gmail.com>
988
989         REGRESSION (r258049): Unchecked JS exception in jsc::Stringifier::toJSON
990         https://bugs.webkit.org/show_bug.cgi?id=208766
991
992         Reviewed by Yusuke Suzuki.
993
994         * runtime/JSONObject.cpp:
995         (JSC::Stringifier::toJSON): Add missing RELEASE_AND_RETURN.
996
997 2020-03-07  Mark Lam  <mark.lam@apple.com>
998
999         Remove bad assertion in FTLLowerDFGToB3's compileDelBy().
1000         https://bugs.webkit.org/show_bug.cgi?id=208764
1001         <rdar://problem/59940095>
1002
1003         Reviewed by Keith Miller.
1004
1005         The assertion ASSERT(base.gpr() != params[2].gpr()) is wrong because it is legal
1006         JS to pass in the same value as the base and subscript.  The runtime will handle
1007         it properly.
1008
1009         * ftl/FTLLowerDFGToB3.cpp:
1010         (JSC::FTL::DFG::LowerDFGToB3::compileDelBy):
1011
1012 2020-03-05  Sam Weinig  <weinig@apple.com>
1013
1014         Move JavaScriptCore related feature defines from FeatureDefines.xcconfig to PlatformEnableCocoa.h
1015         https://bugs.webkit.org/show_bug.cgi?id=207436
1016         <rdar://problem/59296762>
1017
1018         Reviewed by Darin Adler.
1019
1020         * Configurations/FeatureDefines.xcconfig:
1021         Remove JSC related defines.
1022
1023 2020-03-06  Yusuke Suzuki  <ysuzuki@apple.com>
1024
1025         [JSC] Enable public class fields
1026         https://bugs.webkit.org/show_bug.cgi?id=208756
1027
1028         Reviewed by Mark Lam.
1029
1030         This patch turns public-class-fields feature on, implemented in r254653.
1031         To separate from private-class-fields, this patch renames the flag from useClassFields to usePublicClassFields,
1032         and first enable public-class-fields feature.
1033
1034         * bytecompiler/BytecodeGenerator.cpp:
1035         (JSC::BytecodeGenerator::BytecodeGenerator):
1036         * bytecompiler/NodesCodegen.cpp:
1037         (JSC::FunctionCallValueNode::emitBytecode):
1038         * parser/Parser.cpp:
1039         (JSC::Parser<LexerType>::parseClass):
1040         * runtime/OptionsList.h:
1041
1042 2020-03-06  Mark Lam  <mark.lam@apple.com>
1043
1044         Add "AndOrdered" to the names of ordered DoubleConditions.
1045         https://bugs.webkit.org/show_bug.cgi?id=208736
1046
1047         Reviewed by Keith Miller.
1048
1049         Renamed the following:
1050             DoubleEqual ==> DoubleEqualAndOrdered
1051             DoubleNotEqual ==> DoubleNotEqualAndOrdered
1052             DoubleGreaterThan ==> DoubleGreaterThanAndOrdered
1053             DoubleGreaterThanOrEqual ==> DoubleGreaterThanOrEqualAndOrdered
1054             DoubleLessThan ==> DoubleLessThanAndOrdered
1055             DoubleLessThanOrEqual ==> DoubleLessThanOrEqualAndOrdered
1056
1057         The comment for these enums in MacroAssemblerARM64.h says:
1058             // These conditions will only evaluate to true if the comparison is ordered - i.e. neither operand is NaN.
1059
1060         Adding "AndOrdered" to their names makes this property explicit.
1061
1062         From reading the original names, one might intuitively think that these conditions
1063         map directly to the C++ double comparisons.  This intuition is incorrect.
1064         Consider the DoubleNotEqual case: let's compare 2 doubles, a and b:
1065
1066             result = (a != b);
1067
1068         For C++, if either a or b are NaNs, then a != b will actually return true.
1069         This is contrary to the behavior documented in the MacroAssemblerARM64.h comment
1070         above about how DoubleNotEqual should behave.  In our code, DoubleNotEqual actually
1071         means DoubleNotEqualAndOrdered.  The C++ != behavior actually matches our
1072         DoubleNotEqualOrUnordered condition instead.
1073
1074         The tendency to want to associate DoubleNotEqual with the behavior of the C++
1075         != operator is precisely why we should give these conditions better names.
1076         Adding the "AndOperand" name make the expected behavior explicit in the name, and
1077         leave no room for confusion with C++ double comparison semantics.
1078
1079         * assembler/MacroAssembler.cpp:
1080         (WTF::printInternal):
1081         * assembler/MacroAssembler.h:
1082         (JSC::MacroAssembler::invert):
1083         * assembler/MacroAssemblerARM64.h:
1084         (JSC::MacroAssemblerARM64::moveConditionallyAfterFloatingPointCompare):
1085         (JSC::MacroAssemblerARM64::moveDoubleConditionallyAfterFloatingPointCompare):
1086         (JSC::MacroAssemblerARM64::jumpAfterFloatingPointCompare):
1087         (JSC::MacroAssemblerARM64::floatingPointCompare):
1088         * assembler/MacroAssemblerARMv7.h:
1089         (JSC::MacroAssemblerARMv7::branchDouble):
1090         * assembler/MacroAssemblerMIPS.h:
1091         (JSC::MacroAssemblerMIPS::branchDouble):
1092         (JSC::MacroAssemblerMIPS::branchDoubleNonZero):
1093         * assembler/MacroAssemblerX86Common.h:
1094         (JSC::MacroAssemblerX86Common::branchDoubleNonZero):
1095         (JSC::MacroAssemblerX86Common::moveConditionallyDouble):
1096         (JSC::MacroAssemblerX86Common::invert):
1097         (JSC::MacroAssemblerX86Common::floatingPointCompare):
1098         (JSC::MacroAssemblerX86Common::jumpAfterFloatingPointCompare):
1099         (JSC::MacroAssemblerX86Common::moveConditionallyAfterFloatingPointCompare):
1100         * assembler/MacroAssemblerX86_64.h:
1101         (JSC::MacroAssemblerX86_64::truncateDoubleToUint64):
1102         (JSC::MacroAssemblerX86_64::truncateFloatToUint64):
1103         * assembler/testmasm.cpp:
1104         (JSC::testCompareDouble):
1105         (JSC::testCompareDoubleSameArg):
1106         (JSC::testMoveConditionallyFloatingPoint):
1107         (JSC::testMoveDoubleConditionallyDouble):
1108         (JSC::testMoveDoubleConditionallyDoubleDestSameAsThenCase):
1109         (JSC::testMoveDoubleConditionallyDoubleDestSameAsElseCase):
1110         (JSC::testMoveDoubleConditionallyFloat):
1111         (JSC::testMoveDoubleConditionallyFloatDestSameAsThenCase):
1112         (JSC::testMoveDoubleConditionallyFloatDestSameAsElseCase):
1113         (JSC::testMoveConditionallyFloatingPointSameArg):
1114         (JSC::run):
1115         * b3/B3LowerToAir.cpp:
1116         * dfg/DFGSpeculativeJIT.cpp:
1117         (JSC::DFG::compileClampDoubleToByte):
1118         (JSC::DFG::SpeculativeJIT::compileArithRounding):
1119         (JSC::DFG::SpeculativeJIT::compileArithMinMax):
1120         (JSC::DFG::SpeculativeJIT::compileArithPow):
1121         (JSC::DFG::SpeculativeJIT::compileStrictEq):
1122         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
1123         (JSC::DFG::SpeculativeJIT::compileNormalizeMapKey):
1124         * dfg/DFGSpeculativeJIT32_64.cpp:
1125         (JSC::DFG::SpeculativeJIT::compile):
1126         * dfg/DFGSpeculativeJIT64.cpp:
1127         (JSC::DFG::SpeculativeJIT::compile):
1128         * ftl/FTLLowerDFGToB3.cpp:
1129         (JSC::FTL::DFG::LowerDFGToB3::compileNumberIsInteger):
1130         * jit/AssemblyHelpers.h:
1131         (JSC::AssemblyHelpers::branchIfNotNaN):
1132         * jit/JITArithmetic.cpp:
1133         (JSC::JIT::emitSlow_op_jless):
1134         (JSC::JIT::emitSlow_op_jlesseq):
1135         (JSC::JIT::emitSlow_op_jgreater):
1136         (JSC::JIT::emitSlow_op_jgreatereq):
1137         * jit/JITArithmetic32_64.cpp:
1138         (JSC::JIT::emitBinaryDoubleOp):
1139         * jit/ThunkGenerators.cpp:
1140         (JSC::floorThunkGenerator):
1141         (JSC::roundThunkGenerator):
1142         * wasm/WasmAirIRGenerator.cpp:
1143         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Le>):
1144         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Lt>):
1145         (JSC::Wasm::AirIRGenerator::addFloatingPointMinOrMax):
1146         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Gt>):
1147         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Ge>):
1148         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Lt>):
1149         (JSC::Wasm::AirIRGenerator::addOp<OpType::F64Eq>):
1150         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Le>):
1151         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Ge>):
1152         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Eq>):
1153         (JSC::Wasm::AirIRGenerator::addOp<OpType::F32Gt>):
1154
1155 2020-03-06  David Kilzer  <ddkilzer@apple.com>
1156
1157         REGRESSION (r258038): Build failure on Windows 10 bots
1158         <https://bugs.webkit.org/show_bug.cgi?id=208731>
1159         <rdar://problem/59222568>
1160
1161         * assembler/testmasm.cpp:
1162         (JSC::testCompareDouble):
1163         (JSC::testCompareDoubleSameArg):
1164         (JSC::testMoveConditionallyFloatingPoint):
1165         (JSC::testMoveConditionallyFloatingPointSameArg):
1166         - Add RELEASE_ASSERT_NOT_REACHED() statements to try to fix the
1167           bots.
1168
1169 2020-03-06  Yusuke Suzuki  <ysuzuki@apple.com>
1170
1171         Put remaining fixed-sized cells into IsoSubspace
1172         https://bugs.webkit.org/show_bug.cgi?id=208754
1173
1174         Reviewed by Keith Miller.
1175
1176         Put remaining fixed-sized cells into IsoSubspace. Now all the fixed-sized cells have their own IsoSubspaces.
1177
1178         1. JSArray (We need to care about RAMification number, or compensate RAMification regression with improvements).
1179         2. Inspector's objects
1180         3. All prototype objects have one IsoSubspace since they are plain objects.
1181
1182         * inspector/JSInjectedScriptHost.cpp:
1183         (Inspector::JSInjectedScriptHost::JSInjectedScriptHost):
1184         * inspector/JSInjectedScriptHost.h:
1185         * inspector/JSInjectedScriptHostPrototype.h:
1186         * inspector/JSJavaScriptCallFrame.cpp:
1187         (Inspector::JSJavaScriptCallFrame::JSJavaScriptCallFrame):
1188         * inspector/JSJavaScriptCallFrame.h:
1189         * inspector/JSJavaScriptCallFramePrototype.h:
1190         * jsc.cpp:
1191         (JSC::Masquerader::subspaceFor):
1192         (JSCMemoryFootprint::subspaceFor):
1193         * runtime/ArrayIteratorPrototype.h:
1194         * runtime/ArrayPrototype.h:
1195         * runtime/AsyncFromSyncIteratorPrototype.h:
1196         * runtime/AsyncFunctionPrototype.h:
1197         * runtime/AsyncGeneratorFunctionPrototype.h:
1198         * runtime/AsyncGeneratorPrototype.h:
1199         * runtime/AsyncIteratorPrototype.h:
1200         * runtime/AtomicsObject.h:
1201         * runtime/BigIntPrototype.h:
1202         * runtime/ConsoleObject.h:
1203         * runtime/DatePrototype.h:
1204         * runtime/ErrorPrototype.h:
1205         * runtime/ExceptionHelpers.h:
1206         * runtime/GeneratorFunctionPrototype.h:
1207         * runtime/GeneratorPrototype.h:
1208         * runtime/InspectorInstrumentationObject.h:
1209         * runtime/IntlCollatorPrototype.h:
1210         * runtime/IntlDateTimeFormatPrototype.h:
1211         * runtime/IntlNumberFormatPrototype.h:
1212         * runtime/IntlObject.h:
1213         * runtime/IntlPluralRulesPrototype.h:
1214         * runtime/IteratorPrototype.h:
1215         * runtime/JSArray.h:
1216         (JSC::JSArray::subspaceFor):
1217         * runtime/JSArrayBufferPrototype.h:
1218         * runtime/JSDataViewPrototype.h:
1219         * runtime/JSDestructibleObject.h:
1220         (JSC::JSDestructibleObject::subspaceFor): Deleted.
1221         * runtime/JSGenericTypedArrayViewPrototype.h:
1222         * runtime/JSModuleLoader.h:
1223         * runtime/JSONObject.h:
1224         * runtime/JSObject.h:
1225         * runtime/JSObjectInlines.h:
1226         (JSC::JSFinalObject::subspaceFor):
1227         (JSC::JSObject::subspaceFor): Deleted.
1228         * runtime/JSPromisePrototype.h:
1229         (JSC::JSPromisePrototype::subspaceFor):
1230         * runtime/JSTypedArrayViewPrototype.h:
1231         * runtime/MapIteratorPrototype.h:
1232         * runtime/MapPrototype.h:
1233         * runtime/MathObject.h:
1234         * runtime/NativeErrorPrototype.h:
1235         * runtime/ObjectPrototype.h:
1236         * runtime/ReflectObject.h:
1237         * runtime/RegExpPrototype.h:
1238         * runtime/RegExpStringIteratorPrototype.h:
1239         * runtime/SetIteratorPrototype.h:
1240         * runtime/SetPrototype.h:
1241         * runtime/StringIteratorPrototype.h:
1242         * runtime/SymbolPrototype.h:
1243         * runtime/VM.cpp:
1244         (JSC::VM::VM):
1245         * runtime/VM.h:
1246         * runtime/WeakMapPrototype.h:
1247         * runtime/WeakObjectRefPrototype.h:
1248         * runtime/WeakSetPrototype.h:
1249         * tools/JSDollarVM.cpp:
1250         * tools/JSDollarVM.h:
1251         * wasm/js/JSWebAssembly.h:
1252         * wasm/js/WebAssemblyCompileErrorPrototype.h:
1253         * wasm/js/WebAssemblyGlobalPrototype.h:
1254         * wasm/js/WebAssemblyInstancePrototype.h:
1255         * wasm/js/WebAssemblyLinkErrorPrototype.h:
1256         * wasm/js/WebAssemblyMemoryPrototype.h:
1257         * wasm/js/WebAssemblyModulePrototype.h:
1258         * wasm/js/WebAssemblyRuntimeErrorPrototype.h:
1259         * wasm/js/WebAssemblyTablePrototype.h:
1260
1261 2020-03-06  Alexey Shvayka  <shvaikalesh@gmail.com>
1262
1263         JSON.stringify should call replacer on deleted properties
1264         https://bugs.webkit.org/show_bug.cgi?id=208725
1265
1266         Reviewed by Ross Kirsling.
1267
1268         This change removes extra `hasProperty` check from `appendNextProperty` as
1269         it does not exist in the spec [1], aligning JSC with V8 and SpiderMonkey.
1270
1271         This patch also replaces 3 usages of `getPropertySlot` with semantically
1272         equivalent (yet more concise) `get` and inlines `toJSONImpl` (this change
1273         is performance-neutral).
1274
1275         [1]: https://tc39.es/ecma262/#sec-serializejsonobject (steps 6, 8.a)
1276
1277         * runtime/JSONObject.cpp:
1278         (JSC::Stringifier::toJSON):
1279         (JSC::Stringifier::Holder::appendNextProperty):
1280         (JSC::Stringifier::toJSONImpl): Deleted.
1281
1282 2020-03-06  Mark Lam  <mark.lam@apple.com>
1283
1284         Fix some issues in the ARM64 moveConditionallyAfterFloatingPointCompare() and moveDoubleConditionallyAfterFloatingPointCompare().
1285         https://bugs.webkit.org/show_bug.cgi?id=208731
1286         <rdar://problem/59222568>
1287
1288         Reviewed by Saam Barati.
1289
1290         Both the ARM64 moveConditionallyAfterFloatingPointCompare() and
1291         moveDoubleConditionallyAfterFloatingPointCompare() had the following issues:
1292
1293         1. For the DoubleNotEqual condition, they fail to set the result register if
1294            one or both of the comparison operands is a NaN.
1295
1296         2. For the DoubleEqualOrUnordered condition, they can clobber the else case
1297            input register if one of the comparison operands is a NaN.
1298
1299         This patch fixes both of these, and exhaustive testmasm test cases for affected
1300         MacroAssembler instruction emitters using these functions.
1301
1302         * assembler/MacroAssemblerARM64.h:
1303         (JSC::MacroAssemblerARM64::moveConditionallyAfterFloatingPointCompare):
1304         (JSC::MacroAssemblerARM64::moveDoubleConditionallyAfterFloatingPointCompare):
1305         * assembler/testmasm.cpp:
1306         (JSC::testCompareDouble):
1307         (JSC::testCompareDoubleSameArg):
1308         (JSC::testMoveConditionallyFloatingPoint):
1309         (JSC::testMoveConditionallyDouble2):
1310         (JSC::testMoveConditionallyDouble3):
1311         (JSC::testMoveConditionallyDouble3DestSameAsThenCase):
1312         (JSC::testMoveConditionallyDouble3DestSameAsElseCase):
1313         (JSC::testMoveConditionallyFloat2):
1314         (JSC::testMoveConditionallyFloat3):
1315         (JSC::testMoveConditionallyFloat3DestSameAsThenCase):
1316         (JSC::testMoveConditionallyFloat3DestSameAsElseCase):
1317         (JSC::testMoveDoubleConditionallyDouble):
1318         (JSC::testMoveDoubleConditionallyDoubleDestSameAsThenCase):
1319         (JSC::testMoveDoubleConditionallyDoubleDestSameAsElseCase):
1320         (JSC::testMoveDoubleConditionallyFloat):
1321         (JSC::testMoveDoubleConditionallyFloatDestSameAsThenCase):
1322         (JSC::testMoveDoubleConditionallyFloatDestSameAsElseCase):
1323         (JSC::testMoveConditionallyFloatingPointSameArg):
1324         (JSC::testMoveConditionallyDouble2SameArg):
1325         (JSC::testMoveConditionallyDouble3SameArg):
1326         (JSC::testMoveConditionallyFloat2SameArg):
1327         (JSC::testMoveConditionallyFloat3SameArg):
1328         (JSC::testMoveDoubleConditionallyDoubleSameArg):
1329         (JSC::testMoveDoubleConditionallyFloatSameArg):
1330         (JSC::run):
1331
1332 2020-03-05  Paulo Matos  <pmatos@igalia.com>
1333
1334         [JSCOnly] 32-bits warning on memset of JSValue
1335         https://bugs.webkit.org/show_bug.cgi?id=204411
1336
1337         Reviewed by Mark Lam.
1338
1339         Fixes warning on 32bit builds. This is required because GCC knows
1340         it is not safe to use memset on non-POD types and warns against its use.
1341
1342         * heap/GCMemoryOperations.h:
1343         (JSC::gcSafeZeroMemory):
1344
1345 2020-03-04  Mark Lam  <mark.lam@apple.com>
1346
1347         Handle an out of memory error while constructing the BytecodeGenerator.
1348         https://bugs.webkit.org/show_bug.cgi?id=208622
1349         <rdar://problem/59341136>
1350
1351         Reviewed by Saam Barati.
1352
1353         Added the ability to handle out of memory errors encountered during the
1354         construction of the BytecodeGenerator.  Currently, we only use this for the
1355         case where we fail to instantiate a ScopedArgumentsTable.
1356
1357         * bytecompiler/BytecodeGenerator.cpp:
1358         (JSC::BytecodeGenerator::generate):
1359         (JSC::BytecodeGenerator::BytecodeGenerator):
1360         * bytecompiler/BytecodeGeneratorBase.h:
1361         * runtime/ScopedArgumentsTable.cpp:
1362         (JSC::ScopedArgumentsTable::tryCreate):
1363         * runtime/ScopedArgumentsTable.h:
1364         * runtime/SymbolTable.h:
1365
1366 2020-03-04  Paulo Matos  <pmatos@igalia.com>
1367
1368         JSC 32bits broken in debug mode by r257399
1369         https://bugs.webkit.org/show_bug.cgi?id=208439
1370
1371         Reviewed by Carlos Alberto Lopez Perez.
1372
1373         Use uses() method call instead of gpr() on assert to that it
1374         works for both 64 and 32 bits.
1375
1376         * bytecode/AccessCase.cpp:
1377         (JSC::AccessCase::generateImpl):
1378
1379 2020-03-03  Saam Barati  <sbarati@apple.com>
1380
1381         Refactor FixedVMPoolExecutableAllocator to not have member functions which are really just helper functions
1382         https://bugs.webkit.org/show_bug.cgi?id=208537
1383
1384         Reviewed by Mark Lam.
1385
1386         There were a few member functions in FixedVMPoolExecutableAllocator that were
1387         essentially helper functions. I've factored them out, and made FixedVMPoolExecutableAllocator
1388         call them directly. This refactoring is needed when I implement the 1GB
1389         executable pool on arm64 since the implementation of that will create split
1390         implementations of something like FixedVMPoolExecutableAllocator.
1391
1392         * jit/ExecutableAllocator.cpp:
1393         (JSC::jitWriteThunkGenerator):
1394         (JSC::genericWriteToJITRegion):
1395         (JSC::initializeSeparatedWXHeaps):
1396         (JSC::initializeJITPageReservation):
1397         (JSC::ExecutableAllocator::isValid const):
1398         (JSC::ExecutableAllocator::underMemoryPressure):
1399         (JSC::ExecutableAllocator::memoryPressureMultiplier):
1400         (JSC::ExecutableAllocator::allocate):
1401         (JSC::ExecutableAllocator::isValidExecutableMemory):
1402         (JSC::ExecutableAllocator::getLock const):
1403         (JSC::ExecutableAllocator::committedByteCount):
1404         (JSC::ExecutableAllocator::dumpProfile):
1405         (JSC::startOfFixedExecutableMemoryPoolImpl):
1406         (JSC::endOfFixedExecutableMemoryPoolImpl):
1407         (JSC::isJITPC):
1408
1409 2020-03-03  Ross Kirsling  <ross.kirsling@sony.com>
1410
1411         Introduce JSRemoteInspectorServerStart API for socket-based RWI.
1412         https://bugs.webkit.org/show_bug.cgi?id=208349
1413
1414         Reviewed by Joseph Pecoraro.
1415
1416         * API/JSRemoteInspectorServer.cpp: Added.
1417         (JSRemoteInspectorServerStart):
1418         * API/JSRemoteInspectorServer.h: Added.
1419         * CMakeLists.txt:
1420
1421 2020-03-03  Basuke Suzuki  <basuke.suzuki@sony.com>
1422
1423         [WinCairo][PlayStation] Add interface to get listening port of RemoteInspectorServer
1424         https://bugs.webkit.org/show_bug.cgi?id=208391
1425
1426         Reviewed by Don Olmstead.
1427
1428         When passing zero as a port argument, system will pick an available port for it.
1429         Without this method, client cannot get which port is listening.
1430
1431         * inspector/remote/socket/RemoteInspectorServer.cpp:
1432         (Inspector::RemoteInspectorServer::start):
1433         (Inspector::RemoteInspectorServer::getPort):
1434         * inspector/remote/socket/RemoteInspectorServer.h:
1435
1436 2020-03-03  Yusuke Suzuki  <ysuzuki@apple.com>
1437
1438         [JSC] @hasOwnLengthProperty returns wrong value if "length" is attempted to be modified
1439         https://bugs.webkit.org/show_bug.cgi?id=208497
1440         <rdar://problem/59913544>
1441
1442         Reviewed by Mark Lam.
1443
1444         When "length" of JSFunction is attempted to be modified, we put a flag. And @hasOwnLengthProperty
1445         does not correctly use this flag to return a value for the fast path. This affects on "length"
1446         property of bound functions. For example,
1447
1448             function userFunction(a) { }
1449             userFunction.length = 20; // This field is read-only. So, it is not changed.
1450             userFunction.bind().length; // Should be 1, but it returns 0.
1451
1452         1. We rename m_hasModifiedLength to m_hasModifiedLengthForNonHostFunction and m_hasModifiedName
1453            to m_hasModifiedNameForNonHostFunction since we are not tracking these states for host-functions
1454            which can eagerly initialize them.
1455         2. We rename areNameAndLengthOriginal to canAssumeNameAndLengthAreOriginal to allow it to return
1456            "false" for host functions. If it returns true, we go to the fast path.
1457         3. Correctly use canAssumeNameAndLengthAreOriginal information in @hasOwnLengthProperty.
1458
1459         * runtime/FunctionRareData.cpp:
1460         (JSC::FunctionRareData::FunctionRareData):
1461         * runtime/FunctionRareData.h:
1462         * runtime/JSFunction.cpp:
1463         (JSC::JSFunction::put):
1464         (JSC::JSFunction::deleteProperty):
1465         (JSC::JSFunction::defineOwnProperty):
1466         * runtime/JSFunction.h:
1467         * runtime/JSFunctionInlines.h:
1468         (JSC::JSFunction::canAssumeNameAndLengthAreOriginal):
1469         (JSC::JSFunction::areNameAndLengthOriginal): Deleted.
1470         * runtime/JSGlobalObject.cpp:
1471         (JSC::hasOwnLengthProperty):
1472         * tools/JSDollarVM.cpp:
1473         (JSC::functionHasOwnLengthProperty):
1474
1475 2020-03-02  Alan Coon  <alancoon@apple.com>
1476
1477         Add new Mac target numbers
1478         https://bugs.webkit.org/show_bug.cgi?id=208398
1479
1480         Reviewed by Alexey Proskuryakov.
1481
1482         * Configurations/Base.xcconfig:
1483         * Configurations/DebugRelease.xcconfig:
1484         * Configurations/Version.xcconfig:
1485         * Configurations/WebKitTargetConditionals.xcconfig:
1486
1487 2020-03-02  Justin Michaud  <justin_michaud@apple.com>
1488
1489         Delete by val caching does not keep the subscript alive
1490         https://bugs.webkit.org/show_bug.cgi?id=208393
1491
1492         Reviewed by Yusuke Suzuki.
1493
1494         Before, the provided test case crashed with asan because we did not keep deleteByVal
1495         subscripts alive. This patch changes CacheableIdentifier to make this mistake harder
1496         to make again, by making the constructor calls more explicit when CacheableIdentifier
1497         will not keep an Identifier alive.
1498
1499         * jit/JITOperations.cpp:
1500         * jit/Repatch.cpp:
1501         (JSC::tryCachePutByID):
1502         (JSC::tryCacheDeleteBy):
1503         (JSC::repatchDeleteBy):
1504         (JSC::tryCacheInByID):
1505         (JSC::tryCacheInstanceOf):
1506         (JSC::tryCacheDelBy): Deleted.
1507         (JSC::repatchDelBy): Deleted.
1508         * jit/Repatch.h:
1509         * runtime/CacheableIdentifier.h:
1510         * runtime/CacheableIdentifierInlines.h:
1511         (JSC::CacheableIdentifier::createFromIdentifierOwnedByCodeBlock):
1512         (JSC::CacheableIdentifier::createFromCell):
1513
1514 2020-03-02  Paulo Matos  <pmatos@igalia.com>
1515
1516         Fix JSC 32bit alignment increase gcc warning
1517         https://bugs.webkit.org/show_bug.cgi?id=208445
1518
1519         Reviewed by Yusuke Suzuki.
1520
1521         Use reinterpret_cast_ptr<>() instead of reinterpret_cast<>() to
1522         avoid GCC warning about increase in alignment requirement for cast
1523         target type.
1524
1525         * dfg/DFGOSRExit.cpp:
1526         (JSC::DFG::OSRExit::compileExit):
1527
1528 2020-03-02  Yusuke Suzuki  <ysuzuki@apple.com>
1529
1530         Unreviewed, fix wrong assertion
1531         https://bugs.webkit.org/show_bug.cgi?id=208404
1532         <rdar://problem/59956592>
1533
1534         * runtime/CachedTypes.cpp:
1535         (JSC::CachedUniquedStringImplBase::decode const):
1536
1537 2020-03-01  Charles Turner  <cturner@igalia.com>
1538
1539         undefined reference to `JSC::ExecutableBase::hasJITCodeForCall() const'
1540         https://bugs.webkit.org/show_bug.cgi?id=207890
1541
1542         Reviewed by Yusuke Suzuki.
1543
1544         Encountered on arm-buildroot-linux-gnueabihf with GCC 9.2.0.
1545
1546         * runtime/NativeExecutable.cpp: Inclusion of
1547         ExecutableBaseInlines.h resolves the issue for me.
1548
1549 2020-02-29  Yusuke Suzuki  <ysuzuki@apple.com>
1550
1551         Remove std::lock_guard
1552         https://bugs.webkit.org/show_bug.cgi?id=206451
1553
1554         Reviewed by Anders Carlsson.
1555
1556         * API/JSVirtualMachine.mm:
1557         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]):
1558         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]):
1559         * API/glib/JSCVirtualMachine.cpp:
1560         (addWrapper):
1561         (removeWrapper):
1562         * heap/HeapSnapshotBuilder.cpp:
1563         (JSC::HeapSnapshotBuilder::analyzeNode):
1564         (JSC::HeapSnapshotBuilder::analyzeEdge):
1565         (JSC::HeapSnapshotBuilder::analyzePropertyNameEdge):
1566         (JSC::HeapSnapshotBuilder::analyzeVariableNameEdge):
1567         (JSC::HeapSnapshotBuilder::analyzeIndexEdge):
1568         (JSC::HeapSnapshotBuilder::setOpaqueRootReachabilityReasonForCell):
1569         * heap/MachineStackMarker.cpp:
1570         (JSC::MachineThreads::tryCopyOtherThreadStacks):
1571         * runtime/JSRunLoopTimer.cpp:
1572         (JSC::JSRunLoopTimer::timerDidFire):
1573
1574 2020-02-28  Yusuke Suzuki  <ysuzuki@apple.com>
1575
1576         [JSC] BuiltinNames' HashMap should be small
1577         https://bugs.webkit.org/show_bug.cgi?id=208404
1578
1579         Reviewed by Mark Lam.
1580
1581         This patch converts public-to-private-name-map from HashMap<RefPtr<UniquedStringImpl>, SymbolImpl*> to HashSet<String> to save half of memory.
1582         The key is that private names have the same string content to the public names. We can just query with string content to the HashSet of
1583         private names, and we can get private names.
1584
1585         The problem is that we also have a hack inserting string <-> non-private well-known Symbol mappings into this table. These symbols do not have
1586         the same content to the public string. So the above assumption is broken.
1587
1588         To make the above assumption valid, we have a separate small HashMap which holds string <-> non-private well-known Symbol mappings. Since # of
1589         well-known Symbols are only 13, this new HashMap is taking at most 512B for entries, which is much smaller compared to the saved memory by
1590         converting HashMap to HashSet for private names (32KB).
1591
1592         To allow it, we introduce new well-known Symbol identifier syntax to builtin JS, which is "@@iterator" format. If there is two "@", we parse this
1593         identifier as a well-known Symbol.
1594
1595         * builtins/ArrayConstructor.js:
1596         (from.wrapper.iterator):
1597         (from):
1598         (from.wrapper.iteratorSymbol): Deleted.
1599         * builtins/ArrayPrototype.js:
1600         (globalPrivate.concatSlowPath):
1601         (concat):
1602         * builtins/BuiltinNames.cpp:
1603         (JSC::BuiltinNames::BuiltinNames):
1604         (JSC::CharBufferSeacher::hash):
1605         (JSC::CharBufferSeacher::equal):
1606         (JSC::lookUpPrivateNameImpl):
1607         (JSC::lookUpWellKnownSymbolImpl):
1608         (JSC::BuiltinNames::lookUpPrivateName const):
1609         (JSC::BuiltinNames::lookUpWellKnownSymbol const):
1610         * builtins/BuiltinNames.h:
1611         (JSC::BuiltinNames::lookUpPrivateName const):
1612         (JSC::BuiltinNames::lookUpWellKnownSymbol const):
1613         (JSC::BuiltinNames::checkPublicToPrivateMapConsistency):
1614         (JSC::BuiltinNames::appendExternalName):
1615         (JSC::BuiltinNames::getPublicName const): Deleted.
1616         * builtins/GlobalOperations.js:
1617         (globalPrivate.speciesConstructor):
1618         * builtins/IteratorHelpers.js:
1619         (performIteration):
1620         * builtins/StringPrototype.js:
1621         (match):
1622         (matchAll):
1623         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
1624         (replaceAll):
1625         (search):
1626         (split):
1627         * builtins/TypedArrayConstructor.js:
1628         (from.wrapper.iterator):
1629         (from):
1630         (from.wrapper.iteratorSymbol): Deleted.
1631         * builtins/TypedArrayPrototype.js:
1632         (globalPrivate.typedArraySpeciesConstructor):
1633         (map):
1634         (filter):
1635         * bytecompiler/NodesCodegen.cpp:
1636         (JSC::BytecodeIntrinsicNode::emit_intrinsic_getByIdDirectPrivate):
1637         (JSC::BytecodeIntrinsicNode::emit_intrinsic_putByIdDirectPrivate):
1638         * parser/Lexer.cpp:
1639         (JSC::Lexer<LChar>::parseIdentifier):
1640         (JSC::Lexer<UChar>::parseIdentifier):
1641         * runtime/CachedTypes.cpp:
1642         (JSC::CachedUniquedStringImplBase::encode):
1643         (JSC::CachedUniquedStringImplBase::decode const):
1644         * runtime/CommonIdentifiers.cpp:
1645         (JSC::CommonIdentifiers::CommonIdentifiers):
1646         (JSC::CommonIdentifiers::lookUpPrivateName const): Deleted.
1647         (JSC::CommonIdentifiers::getPublicName const): Deleted.
1648         * runtime/CommonIdentifiers.h:
1649         * tools/JSDollarVM.cpp:
1650         (JSC::functionGetPrivateProperty):
1651
1652 2020-02-28  Saam Barati  <sbarati@apple.com>
1653
1654         Clean up code with how we choose Gigacage sizes and whether or not to use Wasm fast memory
1655         https://bugs.webkit.org/show_bug.cgi?id=208392
1656
1657         Reviewed by Yusuke Suzuki.
1658
1659         * runtime/OptionsList.h:
1660
1661 2020-02-27  Saam Barati  <sbarati@apple.com>
1662
1663         Fix debug arm64 Wasm tests
1664         https://bugs.webkit.org/show_bug.cgi?id=208362
1665
1666         Reviewed by Yusuke Suzuki.
1667
1668         * wasm/WasmAirIRGenerator.cpp:
1669         (JSC::Wasm::AirIRGenerator::emitChecksForModOrDiv):
1670
1671         We were assuming that "-1" is a valid imm on arm64, but it's not, we need
1672         to use big imm.
1673
1674 2020-02-27  Justin Michaud  <justin_michaud@apple.com>
1675
1676         Poly proto should work with property delete transitions
1677         https://bugs.webkit.org/show_bug.cgi?id=208261
1678
1679         Reviewed by Saam Barati.
1680
1681         This patch fixes a bug where the combination of inline caching
1682         and poly proto cause us to cache a setter call along a prototype chain that 
1683         is no longer the correct setter to call. This is exposed as a result of
1684         https://bugs.webkit.org/show_bug.cgi?id=206430 since DefineOwnProperty used 
1685         to transition to uncacheable dictionary.
1686
1687         The case looks like this:
1688         A - setter for x redefines x
1689         |
1690         B
1691         |
1692         C
1693
1694         We set (new C).x
1695
1696         Right now, we first call A's setter, then we try to figure out what the state of things
1697         were before it was called in order to cache it. We just assume that A's setter still exists, and we cache it
1698         without ever checking, In this patch, we ensure that the property exists and the attributes match in order to prevent crashing. 
1699
1700         In the code, A = target, C = base.
1701
1702         Get is correct because it collects caching information before any calls.
1703
1704         The bug https://bugs.webkit.org/show_bug.cgi?id=208337 tracks the remaining semantic bugs around this code.
1705
1706         * jit/Repatch.cpp:
1707         (JSC::tryCachePutByID):
1708
1709 2020-02-27  Basuke Suzuki  <basuke.suzuki@sony.com>
1710
1711         [WinCairo] Fix RemoteInspector reconnect issue
1712         https://bugs.webkit.org/show_bug.cgi?id=208256
1713
1714         Reviewed by Devin Rousso.
1715
1716         Call target's disconnection sequence asynchronously to avoid deadlock.
1717
1718         * inspector/remote/RemoteConnectionToTarget.cpp:
1719         (Inspector::RemoteConnectionToTarget::close):
1720         * inspector/remote/socket/RemoteInspectorSocketEndpoint.cpp:
1721         (Inspector::RemoteInspectorSocketEndpoint::workerThread):
1722
1723 2020-02-26  Mark Lam  <mark.lam@apple.com>
1724
1725         Enhance JSObjectGetProperty() to mitigate against null object pointers.
1726         https://bugs.webkit.org/show_bug.cgi?id=208275
1727         <rdar://problem/59826325>
1728
1729         Reviewed by Robin Morisset.
1730
1731         * API/JSObjectRef.cpp:
1732         (JSObjectGetProperty):
1733
1734 2020-02-26  Saam Barati  <sbarati@apple.com>
1735
1736         Make testair pass on arm64
1737         https://bugs.webkit.org/show_bug.cgi?id=208258
1738
1739         Reviewed by Tadeu Zagallo.
1740
1741         testElideMoveThenRealloc and testElideSimpleMove were never tested
1742         on arm64. This patch makes those tests work. 
1743         - testElideMoveThenRealloc was using a BitImm that is invalid on arm64
1744         - testElideSimpleMove was testing for the wrong disassembly
1745
1746         * b3/air/testair.cpp:
1747
1748 2020-02-26  Don Olmstead  <don.olmstead@sony.com>
1749
1750         Allow setting of stack sizes for threads
1751         https://bugs.webkit.org/show_bug.cgi?id=208223
1752
1753         Reviewed by Yusuke Suzuki.
1754
1755         Specify ThreadType at the Thread::create callsite.
1756
1757         * heap/Heap.cpp:
1758         (JSC::Heap::notifyIsSafeToCollect):
1759
1760 2020-02-26  Caio Lima  <ticaiolima@gmail.com>
1761
1762         [JSC][MIPS] Adding support to Checkpoints
1763         https://bugs.webkit.org/show_bug.cgi?id=208196
1764
1765         Reviewed by Yusuke Suzuki.
1766
1767         This patch is adding changes to properly support OSR to
1768         checkpoints on MIPS. It required fixes on JIT probe and some
1769         adjustment on Offlineasm to correct generate `$gp` load when executing 
1770         `checkpoint_osr_exit_from_inlined_call_trampoline`.
1771
1772         * assembler/MacroAssemblerMIPS.cpp:
1773
1774         Probe trampoline needs to allocate 16 bytes for 4 arguments to
1775         properly follow C calling conventions. This space is used by callee
1776         when the JSC is compiled with `-O0` flags
1777         (Check "DEFAULT C CALLING CONVENTION (O32)" section on
1778         https://www.mips.com/downloads/mips32-instruction-set-quick-reference-v1-01).
1779
1780         * llint/LowLevelInterpreter.asm:
1781
1782         As we need to do on ARMv7, 64-bits arguments needs to be passed in
1783         register pairs `$a1:$a0` or `$a3:$a2` (little-endian mode). Since `$a0`
1784         contais `CallFrame*`, we need to pass `EncodedJSValue` on `$a3:$a2`
1785         pair.
1786
1787         * offlineasm/mips.rb:
1788
1789         Following the same reason for return locations on OSR to LLInt, we
1790         need to adjust `$gp` using `$ra` instead of `$t9` on
1791         `checkpoint_osr_exit_from_inlined_call_trampoline`, given it is only
1792         reachable through `ret` operations. For detailed explanation, check
1793         ChangeLog of https://trac.webkit.org/changeset/252713.
1794
1795 2020-02-25  Devin Rousso  <drousso@apple.com>
1796
1797         Web Inspector: safari app extension isolated worlds and injected files use the extension's identifier instead of its name
1798         https://bugs.webkit.org/show_bug.cgi?id=206911
1799         <rdar://problem/58026635>
1800
1801         Reviewed by Brian Burg.
1802
1803         * inspector/protocol/Browser.json: Added.
1804         Add a `Browser` agent that can communicate with the inspected page's containing browser. It
1805         lives in the UIProcess alongside the `Target` agent (meaning there should only be one per
1806         debuggable rather than one per target) and as such is not routed through the `Target` agent.
1807
1808         * CMakeLists.txt:
1809         * DerivedSources-input.xcfilelist:
1810         * DerivedSources.make:
1811
1812 2020-02-25  Justin Michaud  <justin_michaud@apple.com>
1813
1814         Inline Cache delete by id/val
1815         https://bugs.webkit.org/show_bug.cgi?id=207522
1816
1817         Reviewed by Keith Miller and Filip Pizlo.
1818
1819         We add inline caching for deleteById/val for baseline only. We also fix a concurrency bug in ICStats used for testing.
1820         We add three new access cases (no inline code is emitted at this time): 
1821         - Delete is a cached delete of an existing property
1822         - DeleteMiss is a delete of a property that does not exist
1823         - DeleteNonConfigurable is a delete of a property that exists, but should not be deleted.
1824         There are no conditions required for these caches, since the structure id must change and the prototype does not matter.
1825         This gives the following microbenchmark results:
1826
1827         delete-property-keeps-cacheable-structure (neutral)
1828         delete-property-inline-cache              definitely 3.9096x faster
1829         delete-property-inline-cache-polymorphic  definitely 1.5239x faster
1830         delete-property-from-prototype-chain      (neutral)
1831
1832         * API/JSCallbackObject.h:
1833         * API/JSCallbackObjectFunctions.h:
1834         (JSC::JSCallbackObject<Parent>::deleteProperty):
1835         (JSC::JSCallbackObject<Parent>::deletePropertyByIndex):
1836         * API/JSObjectRef.cpp:
1837         (JSObjectDeletePropertyForKey):
1838         (JSObjectDeleteProperty):
1839         * CMakeLists.txt:
1840         * JavaScriptCore.xcodeproj/project.pbxproj:
1841         * bytecode/AccessCase.cpp:
1842         (JSC::AccessCase::create):
1843         (JSC::AccessCase::createTransition):
1844         (JSC::AccessCase::createDelete):
1845         (JSC::AccessCase::requiresIdentifierNameMatch const):
1846         (JSC::AccessCase::requiresInt32PropertyCheck const):
1847         (JSC::AccessCase::needsScratchFPR const):
1848         (JSC::AccessCase::forEachDependentCell const):
1849         (JSC::AccessCase::doesCalls const):
1850         (JSC::AccessCase::canReplace const):
1851         (JSC::AccessCase::dump const):
1852         (JSC::AccessCase::propagateTransitions const):
1853         (JSC::AccessCase::generateImpl):
1854         * bytecode/AccessCase.h:
1855         (JSC::AccessCase::structure const):
1856         (JSC::AccessCase::newStructure const):
1857         * bytecode/PolymorphicAccess.cpp:
1858         (WTF::printInternal):
1859         * bytecode/StructureStubInfo.cpp:
1860         (JSC::StructureStubInfo::reset):
1861         * bytecode/StructureStubInfo.h:
1862         * debugger/DebuggerScope.cpp:
1863         (JSC::DebuggerScope::deleteProperty):
1864         * debugger/DebuggerScope.h:
1865         * dfg/DFGFixupPhase.cpp:
1866         (JSC::DFG::FixupPhase::fixupNode):
1867         * dfg/DFGJITCompiler.cpp:
1868         (JSC::DFG::JITCompiler::link):
1869         * dfg/DFGJITCompiler.h:
1870         (JSC::DFG::JITCompiler::addDelById):
1871         (JSC::DFG::JITCompiler::addDelByVal):
1872         * dfg/DFGSpeculativeJIT.cpp:
1873         (JSC::DFG::SpeculativeJIT::compileDeleteById): Deleted.
1874         (JSC::DFG::SpeculativeJIT::compileDeleteByVal): Deleted.
1875         * dfg/DFGSpeculativeJIT32_64.cpp:
1876         (JSC::DFG::SpeculativeJIT::compileDeleteById):
1877         (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
1878         * dfg/DFGSpeculativeJIT64.cpp:
1879         (JSC::DFG::SpeculativeJIT::compileDeleteById):
1880         (JSC::DFG::SpeculativeJIT::compileDeleteByVal):
1881         * ftl/FTLLowerDFGToB3.cpp:
1882         (JSC::FTL::DFG::LowerDFGToB3::compileDelBy):
1883         (JSC::FTL::DFG::LowerDFGToB3::compileDeleteById):
1884         (JSC::FTL::DFG::LowerDFGToB3::compileDeleteByVal):
1885         * jit/ICStats.h:
1886         * jit/JIT.cpp:
1887         (JSC::JIT::privateCompileSlowCases):
1888         (JSC::JIT::link):
1889         * jit/JIT.h:
1890         * jit/JITInlineCacheGenerator.cpp:
1891         (JSC::JITDelByValGenerator::JITDelByValGenerator):
1892         (JSC::JITDelByValGenerator::generateFastPath):
1893         (JSC::JITDelByValGenerator::finalize):
1894         (JSC::JITDelByIdGenerator::JITDelByIdGenerator):
1895         (JSC::JITDelByIdGenerator::generateFastPath):
1896         (JSC::JITDelByIdGenerator::finalize):
1897         * jit/JITInlineCacheGenerator.h:
1898         (JSC::JITDelByValGenerator::JITDelByValGenerator):
1899         (JSC::JITDelByValGenerator::slowPathJump const):
1900         (JSC::JITDelByIdGenerator::JITDelByIdGenerator):
1901         (JSC::JITDelByIdGenerator::slowPathJump const):
1902         * jit/JITOperations.cpp:
1903         * jit/JITOperations.h:
1904         * jit/JITPropertyAccess.cpp:
1905         (JSC::JIT::emit_op_del_by_id):
1906         (JSC::JIT::emitSlow_op_del_by_id):
1907         (JSC::JIT::emit_op_del_by_val):
1908         (JSC::JIT::emitSlow_op_del_by_val):
1909         * jit/JITPropertyAccess32_64.cpp:
1910         (JSC::JIT::emit_op_del_by_id):
1911         (JSC::JIT::emit_op_del_by_val):
1912         (JSC::JIT::emitSlow_op_del_by_val):
1913         (JSC::JIT::emitSlow_op_del_by_id):
1914         * jit/Repatch.cpp:
1915         (JSC::tryCachePutByID):
1916         (JSC::tryCacheDelBy):
1917         (JSC::repatchDelBy):
1918         (JSC::resetPutByID):
1919         (JSC::resetDelBy):
1920         * jit/Repatch.h:
1921         * llint/LLIntSlowPaths.cpp:
1922         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1923         * runtime/CacheableIdentifierInlines.h:
1924         (JSC::CacheableIdentifier::CacheableIdentifier):
1925         * runtime/ClassInfo.h:
1926         * runtime/ClonedArguments.cpp:
1927         (JSC::ClonedArguments::deleteProperty):
1928         * runtime/ClonedArguments.h:
1929         * runtime/CommonSlowPaths.cpp:
1930         (JSC::SLOW_PATH_DECL):
1931         * runtime/DeletePropertySlot.h: Added.
1932         (JSC::DeletePropertySlot::DeletePropertySlot):
1933         (JSC::DeletePropertySlot::setConfigurableMiss):
1934         (JSC::DeletePropertySlot::setNonconfigurable):
1935         (JSC::DeletePropertySlot::setHit):
1936         (JSC::DeletePropertySlot::isCacheableDelete const):
1937         (JSC::DeletePropertySlot::isDeleteHit const):
1938         (JSC::DeletePropertySlot::isConfigurableDeleteMiss const):
1939         (JSC::DeletePropertySlot::isNonconfigurable const):
1940         (JSC::DeletePropertySlot::cachedOffset const):
1941         (JSC::DeletePropertySlot::disableCaching):
1942         (JSC::DeletePropertySlot::isCacheable const):
1943         * runtime/ErrorConstructor.cpp:
1944         (JSC::ErrorConstructor::deleteProperty):
1945         * runtime/ErrorConstructor.h:
1946         * runtime/ErrorInstance.cpp:
1947         (JSC::ErrorInstance::deleteProperty):
1948         * runtime/ErrorInstance.h:
1949         * runtime/GenericArguments.h:
1950         * runtime/GenericArgumentsInlines.h:
1951         (JSC::GenericArguments<Type>::put):
1952         (JSC::GenericArguments<Type>::deleteProperty):
1953         * runtime/GetterSetter.h:
1954         * runtime/JSArray.cpp:
1955         (JSC::JSArray::deleteProperty):
1956         * runtime/JSArray.h:
1957         * runtime/JSCJSValue.h:
1958         * runtime/JSCell.cpp:
1959         (JSC::JSCell::deleteProperty):
1960         * runtime/JSCell.h:
1961         * runtime/JSDataView.cpp:
1962         (JSC::JSDataView::deleteProperty):
1963         * runtime/JSDataView.h:
1964         * runtime/JSFunction.cpp:
1965         (JSC::JSFunction::deleteProperty):
1966         * runtime/JSFunction.h:
1967         * runtime/JSGenericTypedArrayView.h:
1968         * runtime/JSGenericTypedArrayViewInlines.h:
1969         (JSC::JSGenericTypedArrayView<Adaptor>::deleteProperty):
1970         (JSC::JSGenericTypedArrayView<Adaptor>::deletePropertyByIndex):
1971         * runtime/JSGlobalObject.cpp:
1972         (JSC::JSGlobalObject::addFunction):
1973         * runtime/JSLexicalEnvironment.cpp:
1974         (JSC::JSLexicalEnvironment::deleteProperty):
1975         * runtime/JSLexicalEnvironment.h:
1976         * runtime/JSModuleEnvironment.cpp:
1977         (JSC::JSModuleEnvironment::deleteProperty):
1978         * runtime/JSModuleEnvironment.h:
1979         * runtime/JSModuleNamespaceObject.cpp:
1980         (JSC::JSModuleNamespaceObject::deleteProperty):
1981         * runtime/JSModuleNamespaceObject.h:
1982         * runtime/JSONObject.cpp:
1983         (JSC::Walker::walk):
1984         * runtime/JSObject.cpp:
1985         (JSC::JSObject::deleteProperty):
1986         (JSC::JSObject::deletePropertyByIndex):
1987         (JSC::validateAndApplyPropertyDescriptor):
1988         * runtime/JSObject.h:
1989         * runtime/JSProxy.cpp:
1990         (JSC::JSProxy::deleteProperty):
1991         * runtime/JSProxy.h:
1992         * runtime/JSSymbolTableObject.cpp:
1993         (JSC::JSSymbolTableObject::deleteProperty):
1994         * runtime/JSSymbolTableObject.h:
1995         * runtime/ProxyObject.cpp:
1996         (JSC::ProxyObject::deleteProperty):
1997         * runtime/ProxyObject.h:
1998         * runtime/RegExpObject.cpp:
1999         (JSC::RegExpObject::deleteProperty):
2000         * runtime/RegExpObject.h:
2001         * runtime/StrictEvalActivation.cpp:
2002         (JSC::StrictEvalActivation::deleteProperty):
2003         * runtime/StrictEvalActivation.h:
2004         * runtime/StringObject.cpp:
2005         (JSC::StringObject::deleteProperty):
2006         * runtime/StringObject.h:
2007         * runtime/Structure.cpp:
2008         (JSC::Structure::removePropertyTransition):
2009         (JSC::Structure::removePropertyTransitionFromExistingStructureImpl):
2010         (JSC::Structure::removePropertyTransitionFromExistingStructure):
2011         (JSC::Structure::removePropertyTransitionFromExistingStructureConcurrently):
2012         (JSC::Structure::removeNewPropertyTransition):
2013         (JSC::Structure::dump const):
2014         * runtime/Structure.h:
2015         * runtime/StructureInlines.h:
2016         (JSC::Structure::hasIndexingHeader const):
2017         (JSC::Structure::mayHaveIndexingHeader const):
2018         * tools/JSDollarVM.cpp:
2019         (JSC::functionHasOwnLengthProperty):
2020         (JSC::JSDollarVM::finishCreation):
2021
2022 2020-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
2023
2024         [WTF] Attach WARN_UNUSED_RETURN to makeScopeExit and fix existing wrong usage
2025         https://bugs.webkit.org/show_bug.cgi?id=208162
2026
2027         Reviewed by Robin Morisset.
2028
2029         * parser/Parser.cpp:
2030         (JSC::Parser<LexerType>::parseUnaryExpression):
2031
2032 2020-02-24  Keith Miller  <keith_miller@apple.com>
2033
2034         LLInt should fast path for jtrue/false on Symbols and Objects
2035         https://bugs.webkit.org/show_bug.cgi?id=208151
2036
2037         Reviewed by Yusuke Suzuki.
2038
2039         64-bit interpreter can fast path the case where an object or symbol
2040         is passed to a jtrue or jfalse opcode. This is because these values
2041         are always truthy.
2042
2043         Also, fix some weird indentation in LowLevelInterpreter.asm.
2044
2045         * llint/LowLevelInterpreter.asm:
2046         * llint/LowLevelInterpreter32_64.asm:
2047         * llint/LowLevelInterpreter64.asm:
2048         * runtime/JSType.h:
2049
2050 2020-02-24  Caio Lima  <ticaiolima@gmail.com>
2051
2052         [JSC] 32-bits debug build broken after r257212
2053         https://bugs.webkit.org/show_bug.cgi?id=208149
2054
2055         Reviewed by Yusuke Suzuki.
2056
2057         Changing `Structure::setCachedPrototypeChain` to use
2058         `m_cachedPrototypeChainOrRareData.setMayBeNull`, since `chain` may be
2059         null.
2060
2061         * runtime/StructureInlines.h:
2062         (JSC::Structure::setCachedPrototypeChain):
2063
2064 2020-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
2065
2066         Unreviewed, fix watchOS build
2067         https://bugs.webkit.org/show_bug.cgi?id=207827
2068
2069         While watchOS does not use FTL at all, it still compiles.
2070
2071         * ftl/FTLLowerDFGToB3.cpp:
2072         (JSC::FTL::DFG::LowerDFGToB3::compileObjectKeys):
2073         (JSC::FTL::DFG::LowerDFGToB3::compileCreatePromise):
2074         (JSC::FTL::DFG::LowerDFGToB3::compileCreateInternalFieldObject):
2075         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
2076         (JSC::FTL::DFG::LowerDFGToB3::loadStructureClassInfo):
2077         (JSC::FTL::DFG::LowerDFGToB3::loadStructureCachedPrototypeChainOrRareData):
2078
2079 2020-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
2080
2081         Unreviewed, build fix for 32bit pointer architectures
2082         https://bugs.webkit.org/show_bug.cgi?id=207827
2083
2084         * runtime/Structure.h:
2085
2086 2020-02-23  Yusuke Suzuki  <ysuzuki@apple.com>
2087
2088         [JSC] Shrink Structure
2089         https://bugs.webkit.org/show_bug.cgi?id=207827
2090
2091         Reviewed by Saam Barati.
2092
2093         This patch shrinks sizeof(Structure) from 112 to 96 (16 bytes) in architectures using 64 bit pointers.
2094         Structure is one of the most frequently allocated JSCell in JSC. So it is worth doing
2095         all the sort of bit hacks to make it compact as much as possible.
2096
2097             1. Put outOfLineTypeFlags, maxOffset and transitionOffset into highest bits of m_propertyTableUnsafe,
2098                m_cachedPrototypeChain, m_classInfo, and m_transitionPropertyName. Do not use PackedPtr here since
2099                some of them are concurrently accessed by GC.
2100             2. Put m_inlineCapacity into lower 8 bits of m_propertyHash.
2101             3. Remove m_lock, and use Structure::cellLock() instead.
2102             4. Remove m_cachedPrototypeChain clearing from the concurrent collector since it is dead code, it was old code.
2103                We were setting m_cachedPrototypeChain only if Structure is for JSObject. Clearing happened only if it was not
2104                a Structure for JSObject.
2105             5. Previous Structure is held as StructureID m_previous. And m_previousOrRareData becomes m_cachedPrototypeChainOrRareData.
2106
2107         Many pairs are using CompactPointerTuple to make code clean.
2108         Combining all of the above techniques saves us 16 bytes.
2109
2110         * bytecode/AccessCase.cpp:
2111         (JSC::AccessCase::create):
2112         (JSC::AccessCase::propagateTransitions const):
2113         * bytecode/AccessCase.h:
2114         (JSC::AccessCase::structure const):
2115         * dfg/DFGSpeculativeJIT.cpp:
2116         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
2117         (JSC::DFG::SpeculativeJIT::compileObjectKeys):
2118         (JSC::DFG::SpeculativeJIT::compileCreateThis):
2119         (JSC::DFG::SpeculativeJIT::compileCreatePromise):
2120         (JSC::DFG::SpeculativeJIT::compileCreateInternalFieldObject):
2121         * ftl/FTLAbstractHeapRepository.h:
2122         * ftl/FTLLowerDFGToB3.cpp:
2123         (JSC::FTL::DFG::LowerDFGToB3::compileObjectKeys):
2124         (JSC::FTL::DFG::LowerDFGToB3::compileCreatePromise):
2125         (JSC::FTL::DFG::LowerDFGToB3::compileCreateInternalFieldObject):
2126         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
2127         * jit/AssemblyHelpers.h:
2128         (JSC::AssemblyHelpers::emitLoadClassInfoFromStructure):
2129         * jit/JITOpcodes.cpp:
2130         (JSC::JIT::emit_op_create_this):
2131         * jit/JITOpcodes32_64.cpp:
2132         (JSC::JIT::emit_op_create_this):
2133         * jit/Repatch.cpp:
2134         (JSC::tryCachePutByID):
2135         * llint/LLIntSlowPaths.cpp:
2136         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2137         * runtime/ClonedArguments.cpp:
2138         (JSC::ClonedArguments::createStructure):
2139         * runtime/ConcurrentJSLock.h:
2140         (JSC::ConcurrentJSLockerBase::ConcurrentJSLockerBase):
2141         (JSC::GCSafeConcurrentJSLockerImpl::GCSafeConcurrentJSLockerImpl):
2142         (JSC::GCSafeConcurrentJSLockerImpl::~GCSafeConcurrentJSLockerImpl):
2143         (JSC::ConcurrentJSLockerImpl::ConcurrentJSLockerImpl):
2144         (JSC::GCSafeConcurrentJSLocker::GCSafeConcurrentJSLocker): Deleted.
2145         (JSC::GCSafeConcurrentJSLocker::~GCSafeConcurrentJSLocker): Deleted.
2146         (JSC::ConcurrentJSLocker::ConcurrentJSLocker): Deleted.
2147         * runtime/JSCell.h:
2148         * runtime/JSObject.cpp:
2149         (JSC::JSObject::deleteProperty):
2150         (JSC::JSObject::shiftButterflyAfterFlattening):
2151         * runtime/JSObject.h:
2152         (JSC::JSObject::getDirectConcurrently const):
2153         * runtime/JSObjectInlines.h:
2154         (JSC::JSObject::prepareToPutDirectWithoutTransition):
2155         * runtime/JSType.cpp:
2156         (WTF::printInternal):
2157         * runtime/JSType.h:
2158         * runtime/Structure.cpp:
2159         (JSC::StructureTransitionTable::contains const):
2160         (JSC::StructureTransitionTable::get const):
2161         (JSC::StructureTransitionTable::add):
2162         (JSC::Structure::dumpStatistics):
2163         (JSC::Structure::Structure):
2164         (JSC::Structure::create):
2165         (JSC::Structure::findStructuresAndMapForMaterialization):
2166         (JSC::Structure::materializePropertyTable):
2167         (JSC::Structure::addPropertyTransitionToExistingStructureImpl):
2168         (JSC::Structure::addPropertyTransitionToExistingStructureConcurrently):
2169         (JSC::Structure::addNewPropertyTransition):
2170         (JSC::Structure::removeNewPropertyTransition):
2171         (JSC::Structure::changePrototypeTransition):
2172         (JSC::Structure::attributeChangeTransition):
2173         (JSC::Structure::toDictionaryTransition):
2174         (JSC::Structure::takePropertyTableOrCloneIfPinned):
2175         (JSC::Structure::nonPropertyTransitionSlow):
2176         (JSC::Structure::flattenDictionaryStructure):
2177         (JSC::Structure::pin):
2178         (JSC::Structure::pinForCaching):
2179         (JSC::Structure::allocateRareData):
2180         (JSC::Structure::ensurePropertyReplacementWatchpointSet):
2181         (JSC::Structure::copyPropertyTableForPinning):
2182         (JSC::Structure::add):
2183         (JSC::Structure::remove):
2184         (JSC::Structure::visitChildren):
2185         (JSC::Structure::canCachePropertyNameEnumerator const):
2186         * runtime/Structure.h:
2187         * runtime/StructureInlines.h:
2188         (JSC::Structure::get):
2189         (JSC::Structure::ruleOutUnseenProperty const):
2190         (JSC::Structure::seenProperties const):
2191         (JSC::Structure::addPropertyHashAndSeenProperty):
2192         (JSC::Structure::forEachPropertyConcurrently):
2193         (JSC::Structure::transitivelyTransitionedFrom):
2194         (JSC::Structure::cachedPrototypeChain const):
2195         (JSC::Structure::setCachedPrototypeChain):
2196         (JSC::Structure::prototypeChain const):
2197         (JSC::Structure::propertyReplacementWatchpointSet):
2198         (JSC::Structure::checkOffsetConsistency const):
2199         (JSC::Structure::add):
2200         (JSC::Structure::remove):
2201         (JSC::Structure::removePropertyWithoutTransition):
2202         (JSC::Structure::setPropertyTable):
2203         (JSC::Structure::clearPropertyTable):
2204         (JSC::Structure::setOutOfLineTypeFlags):
2205         (JSC::Structure::setInlineCapacity):
2206         (JSC::Structure::setClassInfo):
2207         (JSC::Structure::setPreviousID):
2208         (JSC::Structure::clearPreviousID):
2209         * runtime/StructureRareData.cpp:
2210         (JSC::StructureRareData::createStructure):
2211         (JSC::StructureRareData::create):
2212         (JSC::StructureRareData::StructureRareData):
2213         (JSC::StructureRareData::visitChildren):
2214         * runtime/StructureRareData.h:
2215         * runtime/StructureRareDataInlines.h:
2216         (JSC::StructureRareData::setCachedPrototypeChain):
2217         (JSC::StructureRareData::setPreviousID): Deleted.
2218         (JSC::StructureRareData::clearPreviousID): Deleted.
2219         * tools/JSDollarVM.cpp:
2220         (JSC::JSDollarVMHelper::functionGetStructureTransitionList):
2221         * wasm/js/WebAssemblyFunction.cpp:
2222         (JSC::WebAssemblyFunction::jsCallEntrypointSlow):
2223
2224 2020-02-20  Mark Lam  <mark.lam@apple.com>
2225
2226         Make support for bytecode caching more robust against file corruption.
2227         https://bugs.webkit.org/show_bug.cgi?id=207972
2228         <rdar://problem/59260595>
2229
2230         Reviewed by Yusuke Suzuki.
2231
2232         If a bytecode cache file is corrupted, we currently will always crash every time
2233         we try to read it (in perpetuity as long as the corrupted cache file continues to
2234         exist on disk).  To guard against this, we'll harden the bytecode caching mechanism
2235         as follows:
2236
2237         1. Modify the writeCache operation to always write the cache file in a transactional
2238            manner i.e. we'll first write to a .tmp file, and then rename the .tmp file to
2239            the cache file only if the entire file has been written in completeness.
2240
2241            This ensures that we won't get corrupted cache files due to interrupted writes.
2242
2243         2. Modify the writeCache operation to also compute a SHA1 hash of the cache file
2244            and append the hash at end of the file.  Modify the readCache operation to
2245            first authenticate the SHA1 hash before allowing the cache file to be used.
2246            If the hash does not match, the file is bad, and we'll just delete it.
2247
2248            This ensures that we won't be crashing while decoding a corrupted cache file.
2249
2250         Manually tested with the following scenarios and ensuring that the client recovers
2251         with no crashes:
2252
2253         1. no cache file on disk.
2254         2. a 0-sized cache file on a disk.
2255         3. a truncated cache file on disk.
2256         4. a corrupted cache file on disk.
2257         5. an uncorrupted cache file on disk.
2258
2259         Also added some static_asserts in CachedTypes.cpp to document some invariants that
2260         the pre-existing code is dependent on.
2261
2262         * API/JSScript.mm:
2263         (-[JSScript readCache]):
2264         (-[JSScript writeCache:]):
2265         * runtime/CachedTypes.cpp:
2266
2267 2020-02-19  Ross Kirsling  <ross.kirsling@sony.com>
2268
2269         Computed Properties with increment sometimes produces incorrect results
2270         https://bugs.webkit.org/show_bug.cgi?id=170934
2271
2272         Reviewed by Yusuke Suzuki.
2273
2274         When the key and value of a computed property each have side effects, the eval order should be key-before-value.
2275         Not only have we had this backwards, we've also been giving them both the same target register.
2276
2277         * bytecompiler/NodesCodegen.cpp:
2278         (JSC::PropertyListNode::emitPutConstantProperty):
2279
2280 2020-02-19  Keith Miller  <keith_miller@apple.com>
2281
2282         Disable Wasm reference types by default
2283         https://bugs.webkit.org/show_bug.cgi?id=207952
2284
2285         Reviewed by Mark Lam.
2286
2287         * runtime/OptionsList.h:
2288
2289 2020-02-19  Stephan Szabo  <stephan.szabo@sony.com>
2290
2291         [PlayStation] Get jsc test wrappers using find_package
2292         https://bugs.webkit.org/show_bug.cgi?id=207914
2293
2294         Reviewed by Ross Kirsling.
2295
2296         * shell/PlatformPlayStation.cmake:
2297
2298 2020-02-18  Keith Miller  <keith_miller@apple.com>
2299
2300         Add an os_log PrintStream
2301         https://bugs.webkit.org/show_bug.cgi?id=207898
2302
2303         Reviewed by Mark Lam.
2304
2305         Add jsc option to write dataLogs to os_log.
2306
2307         * runtime/Options.cpp:
2308         (JSC::Options::initialize):
2309         * runtime/OptionsList.h:
2310
2311 2020-02-18  Paulo Matos  <pmatos@igalia.com>
2312
2313         Fix order (in MIPS) under which CS-registers are saved/restored
2314         https://bugs.webkit.org/show_bug.cgi?id=207752
2315
2316         Reviewed by Keith Miller.
2317
2318         This has been causing several segfaults on MIPS with JIT enabled
2319         because during an OSR to baseline, the order in which LLInt was
2320         saving the registers was not in sync with the way baseline was
2321         restoring them.
2322
2323         * llint/LowLevelInterpreter.asm:
2324
2325 2020-02-18  Ross Kirsling  <ross.kirsling@sony.com>
2326
2327         [JSC] Computed function properties compute their keys twice
2328         https://bugs.webkit.org/show_bug.cgi?id=207297
2329
2330         Reviewed by Keith Miller.
2331
2332         If a pseudo-String is used as the key of a computed function property,
2333         any side effects from resolving the string value occur in duplicate.
2334
2335         The cause has two parts:
2336           - We aren't ensuring that the string value is resolved before doing SetFunctionName and PutByVal.
2337           - Our implementation of SetFunctionName (https://tc39.es/ecma262/#sec-setfunctionname)
2338             calls toString on a non-symbol argument, instead of assuming the type is a string.
2339
2340         * bytecompiler/BytecodeGenerator.cpp:
2341         (JSC::BytecodeGenerator::shouldSetFunctionName): Added.
2342         (JSC::BytecodeGenerator::emitSetFunctionName): Added.
2343         (JSC::BytecodeGenerator::emitSetFunctionNameIfNeededImpl): Deleted.
2344         (JSC::BytecodeGenerator::emitSetFunctionNameIfNeeded): Deleted.
2345         * bytecompiler/BytecodeGenerator.h:
2346         Split the "if needed" logic out into its own function.
2347
2348         * bytecompiler/NodesCodegen.cpp:
2349         (JSC::PropertyListNode::emitBytecode):
2350         (JSC::PropertyListNode::emitPutConstantProperty):
2351         (JSC::DefineFieldNode::emitBytecode):
2352         Never emit OpSetFunctionName for a name of unknown type.
2353         (But also, don't perform a needless ToPropertyKey for non-function computed property keys.)
2354
2355         * runtime/JSFunction.cpp:
2356         (JSC::JSFunction::setFunctionName):
2357         Don't call toString, assert isString.
2358
2359 2020-02-17  Yusuke Suzuki  <ysuzuki@apple.com>
2360
2361         [JSC] JITThunk should be HashSet<Weak<NativeExecutable>> with appropriate GC weakness handling
2362         https://bugs.webkit.org/show_bug.cgi?id=207715
2363
2364         Reviewed by Darin Adler.
2365
2366         This patch refines JITThunks GC-aware Weak hash map for NativeExecutable. Previously, we have
2367         HashMap<std::tuple<TaggedNativeFunction, TaggedNativeFunction, String>, Weak<NativeExecutable>> table.
2368         But this is not good because the first tuple's information is already in NativeExecutable.
2369         But we were using this design since Weak<NativeExecutable> can be nullified because of Weak<>. If this
2370         happens, we could have invalid Entry in HashMap which does not have corresponding values. This will
2371         cause crash when rehasing requires hash code for this entry.
2372
2373         But this HashMap is very bad in terms of memory usage. Each entry has 32 bytes, and this table gets enough
2374         large. We identified that this table is consuming much memory in Membuster. So it is worth designing
2375         carefully crafted data structure which only holds Weak<NativeExecutable> by leveraging the deep interaction
2376         with our GC implementation.
2377
2378         This patch implements new design of JITThunks, which uses HashSet<Weak<NativeExecutable>> and carefully crafted
2379         HashTraits / KeyTraits to handle Weak<> well.
2380
2381         1. Each Weak should have finalizer, and this finalizer should remove dead Weak<NativeExecutable> from HashSet.
2382
2383             This is ensuring that all the keys in HashSet is, even if Weak<> is saying it is Dead, it still has an way
2384             to access content of NativeExecutable if the content is not a JS objects. For example, we can get function
2385             pointer from dead Weak<NativeExecutable> if it is not yet finalized. Since we remove all finalized Weak<>
2386             from the table, this finalizer mechanism allows us to access function pointers etc. from Weak<NativeExecutable>
2387             so long as it is held in this table.
2388
2389         2. Getting NativeExecutable* from JITThunks should have special protocol.
2390
2391             When getting NativeExecutable* from JITThunks, we do the following,
2392
2393             1. First, we check we have an Entry in JITThunks. If it does not exist, we should insert it anyway.
2394                 1.1. If it exists, we should check whether this Weak<NativeExecutable> is dead or not. It is possible that
2395                      dead one is still in the table because "dead" does not mean that it is "finalized". Until finalizing happens (and
2396                      it can be delayed by incremental-sweeper), Weak<NativeExecutable> can be dead but still accessible. So the table
2397                      is still holding dead one. If we get dead one, we should insert a new one.
2398                 1.2. If it is not dead, we return it.
2399             2. Second, we create a new NativeExecutable and insert it. In that case, it is possible that the table already has Weak<NativeExecutable>,
2400                but it is dead. In that case, we need to explicitly replace it with newly created one since old one is holding old content. If we
2401                replaced, finalizer of Weak<> will not be invoked since it immediately deallocates Weak<>. So, it does not happen that this newly
2402                inserted NativeExecutable* is removed by the finalizer registered by the old Weak<>.
2403
2404         This change makes memory usage of JITThunks table 1/4.
2405
2406         * heap/Weak.cpp:
2407         (JSC::weakClearSlowCase):
2408         * heap/Weak.h:
2409         (JSC::Weak::Weak):
2410         (JSC::Weak::isHashTableEmptyValue const):
2411         (JSC::Weak::unsafeImpl const):
2412         (WTF::HashTraits<JSC::Weak<T>>::isEmptyValue):
2413         * heap/WeakInlines.h:
2414         (JSC::Weak<T>::Weak):
2415         * jit/JITThunks.cpp:
2416         (JSC::JITThunks::JITThunks):
2417         (JSC::JITThunks::WeakNativeExecutableHash::hash):
2418         (JSC::JITThunks::WeakNativeExecutableHash::equal):
2419         (JSC::JITThunks::HostKeySearcher::hash):
2420         (JSC::JITThunks::HostKeySearcher::equal):
2421         (JSC::JITThunks::NativeExecutableTranslator::hash):
2422         (JSC::JITThunks::NativeExecutableTranslator::equal):
2423         (JSC::JITThunks::NativeExecutableTranslator::translate):
2424         (JSC::JITThunks::finalize):
2425         (JSC::JITThunks::hostFunctionStub):
2426         (JSC::JITThunks::clearHostFunctionStubs): Deleted.
2427         * jit/JITThunks.h:
2428         * runtime/NativeExecutable.h:
2429         * tools/JSDollarVM.cpp:
2430         (JSC::functionGCSweepAsynchronously):
2431         (JSC::functionCreateEmptyFunctionWithName):
2432         (JSC::JSDollarVM::finishCreation):
2433
2434 2020-02-17  Tadeu Zagallo  <tzagallo@apple.com>
2435
2436         [Wasm] REGRESSION(r256665): Wasm->JS call IC needs to save memory size register
2437         https://bugs.webkit.org/show_bug.cgi?id=207849
2438
2439         Reviewed by Mark Lam.
2440
2441         When generating the call IC, we should select the callee saves using BoundsChecking mode in order
2442         to obey to the calling conventions described in r256665. Currently, we won't restore the memory size
2443         register when calling the Wasm LLInt through the call IC.
2444
2445         * wasm/js/WebAssemblyFunction.cpp:
2446         (JSC::WebAssemblyFunction::calleeSaves const):
2447
2448 2020-02-17  Per Arne Vollan  <pvollan@apple.com>
2449
2450         Mach lookup to com.apple.webinspector should not be allowed in WebKit's WebContent process
2451         https://bugs.webkit.org/show_bug.cgi?id=203214
2452
2453         Reviewed by Brent Fulgham.
2454
2455         Add static flag in RemoteInspector to indicate whether a sandbox extension is needed. The remote inspector will only be
2456         started if the sandbox extension is not needed. Only the WebContent process will need a sandbox extension, since this
2457         patch removes mach access to 'com.apple.webinspector' for this process. Also add name and domain for the
2458         'Enable Remote Inspector' setting, since this will be used in the UI process.
2459
2460         * inspector/remote/RemoteInspector.cpp:
2461         * inspector/remote/RemoteInspector.h:
2462         * inspector/remote/RemoteInspectorConstants.h:
2463         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
2464         (Inspector::RemoteInspector::singleton):
2465
2466 2020-02-16  Fujii Hironori  <Hironori.Fujii@sony.com>
2467
2468         Remove remaining WTF_EXPORT and WTF_IMPORT by replacing them with WTF_EXPORT_DECLARATION and WTF_IMPORT_DECLARATION
2469         https://bugs.webkit.org/show_bug.cgi?id=207746
2470
2471         Reviewed by Don Olmstead.
2472
2473         * runtime/JSExportMacros.h:
2474
2475 2020-02-16  Paulo Matos  <pmatos@igalia.com>
2476
2477         Remove nonArgGPR1 for ARMv7 and ARM64 (unused)
2478         https://bugs.webkit.org/show_bug.cgi?id=207753
2479
2480         Reviewed by Darin Adler.
2481
2482         Cleanup commit - nonArgGPR1 is unused for both ARMv7
2483         and ARM64.
2484
2485         * jit/GPRInfo.h:
2486
2487 2020-02-14  Tadeu Zagallo  <tzagallo@apple.com> and Michael Saboff  <msaboff@apple.com>
2488
2489         [WASM] Wasm interpreter's calling convention doesn't match Wasm JIT's convention.
2490         https://bugs.webkit.org/show_bug.cgi?id=207727
2491
2492         Reviewed by Mark Lam.
2493
2494         The Wasm JIT has unusual calling conventions, which were further complicated by the addition
2495         of the interpreter, and the interpreter did not correctly follow these conventions (by incorrectly
2496         saving and restoring the callee save registers used for the memory base and size). Here's a summary
2497         of the calling convention:
2498
2499         - When entering Wasm from JS, the wrapper must:
2500             - Preserve the base and size when entering LLInt regardless of the mode. (Prior to this
2501               patch we only preserved the base in Signaling mode)
2502             - Preserve the memory base in either mode, and the size for BoundsChecking.
2503         - Both tiers must preserve every *other* register they use. e.g. the LLInt must preserve PB
2504           and wasmInstance, but must *not* preserve memoryBase and memorySize.
2505         - Changes to memoryBase and memorySize are visible to the caller. This means that:
2506             - Intra-module calls can assume these registers are up-to-date even if the memory was
2507               resized. The only exception here is if the LLInt calls a signaling JIT, in which case
2508               the JIT will not update the size register, since it won't be using it.
2509             - Inter-module and JS calls require the caller to reload these registers. These calls may
2510               result in memory changes (e.g. the callee may call memory.grow).
2511             - A Signaling JIT caller must be aware that the LLInt may trash the size register, since
2512               it always bounds checks.
2513
2514         * llint/WebAssembly.asm:
2515         * wasm/WasmAirIRGenerator.cpp:
2516         (JSC::Wasm::AirIRGenerator::addCall):
2517         * wasm/WasmB3IRGenerator.cpp:
2518         (JSC::Wasm::B3IRGenerator::addCall):
2519         * wasm/WasmCallee.cpp:
2520         (JSC::Wasm::LLIntCallee::calleeSaveRegisters):
2521         * wasm/WasmCallingConvention.h:
2522         * wasm/WasmLLIntPlan.cpp:
2523         (JSC::Wasm::LLIntPlan::didCompleteCompilation):
2524         * wasm/WasmMemoryInformation.cpp:
2525         (JSC::Wasm::PinnedRegisterInfo::get):
2526         (JSC::Wasm::getPinnedRegisters): Deleted.
2527
2528 2020-02-13  Stephan Szabo  <stephan.szabo@sony.com>
2529
2530         [PlayStation] Make special udis86 C file handling only happen for Visual Studio
2531         https://bugs.webkit.org/show_bug.cgi?id=207729
2532
2533         Reviewed by Don Olmstead.
2534
2535         * PlatformPlayStation.cmake:
2536
2537 2020-02-13  Caio Lima  <ticaiolima@gmail.com>
2538
2539         [ESNext][BigInt] We don't support BigInt literal as PropertyName
2540         https://bugs.webkit.org/show_bug.cgi?id=206888
2541
2542         Reviewed by Ross Kirsling.
2543
2544         According to spec (https://tc39.es/ecma262/#prod-PropertyName),
2545         BigInt literals are valid property names. Given that, we should not
2546         throw a SyntaxError when using BigInt literals on destructuring
2547         pattern, method declaration, object literals, etc.
2548         This patch is adding BigInt literal as a valid syntax to PropertyName.
2549
2550         * parser/Parser.cpp:
2551         (JSC::Parser<LexerType>::parseDestructuringPattern):
2552         (JSC::Parser<LexerType>::parseClass):
2553         (JSC::Parser<LexerType>::parseInstanceFieldInitializerSourceElements):
2554         (JSC::Parser<LexerType>::parseProperty):
2555         (JSC::Parser<LexerType>::parseGetterSetter):
2556         * parser/ParserArena.cpp:
2557         (JSC::IdentifierArena::makeBigIntDecimalIdentifier):
2558         * parser/ParserArena.h:
2559
2560 2020-02-12  Mark Lam  <mark.lam@apple.com>
2561
2562         Add options for debugging WASM code.
2563         https://bugs.webkit.org/show_bug.cgi?id=207677
2564         <rdar://problem/59411390>
2565
2566         Reviewed by Yusuke Suzuki.
2567
2568         Specifically ...
2569
2570             JSC_useBBQJIT                            - allows the BBQ JIT to be used if true
2571             JSC_useOMGJIT                            - allows the OMG JIT to be used if true
2572             JSC_useWasmLLIntPrologueOSR              - allows prologue OSR from Wasm LLInt if true
2573             JSC_useWasmLLIntLoopOSR                  - allows loop OSR from Wasm LLInt if true
2574             JSC_useWasmLLIntEpilogueOSR              - allows epilogue OSR from Wasm LLInt if true
2575             JSC_wasmFunctionIndexRangeToCompile=N:M  - wasm function index range to allow compilation on, e.g. 1:100
2576
2577         * JavaScriptCore.xcodeproj/project.pbxproj:
2578         * runtime/Options.cpp:
2579         (JSC::Options::ensureOptionsAreCoherent):
2580         * runtime/OptionsList.h:
2581         * wasm/WasmBBQPlan.cpp:
2582         (JSC::Wasm::BBQPlan::BBQPlan):
2583         * wasm/WasmOMGForOSREntryPlan.cpp:
2584         (JSC::Wasm::OMGForOSREntryPlan::OMGForOSREntryPlan):
2585         * wasm/WasmOMGPlan.cpp:
2586         (JSC::Wasm::OMGPlan::OMGPlan):
2587         * wasm/WasmOperations.cpp:
2588         (JSC::Wasm::shouldJIT):
2589         (JSC::Wasm::operationWasmTriggerOSREntryNow):
2590         (JSC::Wasm::operationWasmTriggerTierUpNow):
2591         * wasm/WasmSlowPaths.cpp:
2592         (JSC::LLInt::shouldJIT):
2593         (JSC::LLInt::WASM_SLOW_PATH_DECL):
2594
2595 2020-02-12  Yusuke Suzuki  <ysuzuki@apple.com>
2596
2597         [JSC] Compact JITCodeMap by storing BytecodeIndex and CodeLocation separately
2598         https://bugs.webkit.org/show_bug.cgi?id=207673
2599
2600         Reviewed by Mark Lam.
2601
2602         While BytecodeIndex is 4 bytes, CodeLocation is 8 bytes. So the tuple of them "JITCodeMap::Entry"
2603         becomes 16 bytes because it adds 4 bytes padding. We should store BytecodeIndex and CodeLocation separately
2604         to avoid this padding.
2605
2606         This patch introduces JITCodeMapBuilder. We use this to build JITCodeMap data structure as a immutable final result.
2607
2608         * jit/JIT.cpp:
2609         (JSC::JIT::link):
2610         * jit/JITCodeMap.h:
2611         (JSC::JITCodeMap::JITCodeMap):
2612         (JSC::JITCodeMap::find const):
2613         (JSC::JITCodeMap::operator bool const):
2614         (JSC::JITCodeMap::codeLocations const):
2615         (JSC::JITCodeMap::indexes const):
2616         (JSC::JITCodeMapBuilder::append):
2617         (JSC::JITCodeMapBuilder::finalize):
2618         (JSC::JITCodeMap::Entry::Entry): Deleted.
2619         (JSC::JITCodeMap::Entry::bytecodeIndex const): Deleted.
2620         (JSC::JITCodeMap::Entry::codeLocation): Deleted.
2621         (JSC::JITCodeMap::append): Deleted.
2622         (JSC::JITCodeMap::finish): Deleted.
2623
2624 2020-02-12  Pavel Feldman  <pavel.feldman@gmail.com>
2625
2626         Web Inspector: encode binary web socket frames using base64
2627         https://bugs.webkit.org/show_bug.cgi?id=207448
2628         
2629         Previous representation of binary frames is lossy using fromUTF8WithLatin1Fallback,
2630         this patch consistently encodes binary data using base64.
2631
2632         Reviewed by Timothy Hatcher.
2633
2634         * inspector/protocol/Network.json:
2635
2636 2020-02-12  Simon Fraser  <simon.fraser@apple.com>
2637
2638         Remove CSS_DEVICE_ADAPTATION
2639         https://bugs.webkit.org/show_bug.cgi?id=203479
2640
2641         Reviewed by Tim Horton.
2642
2643         CSS Working Group resolved to remove @viewport <https://github.com/w3c/csswg-drafts/issues/4766>,
2644         so remove the code.
2645
2646         * Configurations/FeatureDefines.xcconfig:
2647
2648 2020-02-12  Yusuke Suzuki  <ysuzuki@apple.com>
2649
2650         [JSC] Compact StructureTransitionTable
2651         https://bugs.webkit.org/show_bug.cgi?id=207616
2652
2653         Reviewed by Mark Lam.
2654
2655         Some of StructureTransitionTable are shown as very large HashMap and we can compact it by encoding key.
2656         We leverage 48bit pointers and 8byte alignment of UniquedStringImpl* to encode other parameters into it.
2657
2658         * runtime/Structure.cpp:
2659         (JSC::StructureTransitionTable::contains const):
2660         (JSC::StructureTransitionTable::get const):
2661         (JSC::StructureTransitionTable::add):
2662         * runtime/Structure.h:
2663         * runtime/StructureTransitionTable.h:
2664         (JSC::StructureTransitionTable::Hash::Key::Key):
2665         (JSC::StructureTransitionTable::Hash::Key::isHashTableDeletedValue const):
2666         (JSC::StructureTransitionTable::Hash::Key::impl const):
2667         (JSC::StructureTransitionTable::Hash::Key::isAddition const):
2668         (JSC::StructureTransitionTable::Hash::Key::attributes const):
2669         (JSC::StructureTransitionTable::Hash::Key::operator==):
2670         (JSC::StructureTransitionTable::Hash::Key::operator!=):
2671         (JSC::StructureTransitionTable::Hash::hash):
2672         (JSC::StructureTransitionTable::Hash::equal):
2673
2674 2020-02-12  Yusuke Suzuki  <ysuzuki@apple.com>
2675
2676         [JSC] Make RegExpCache small
2677         https://bugs.webkit.org/show_bug.cgi?id=207619
2678
2679         Reviewed by Mark Lam.
2680
2681         We can compact RegExpKey by using PackedRefPtr, so that we can shrink memory consumption of RegExpCache.
2682
2683         * runtime/RegExpKey.h:
2684
2685 2020-02-10  Mark Lam  <mark.lam@apple.com>
2686
2687         Placate exception check validator in GenericArguments<Type>::put().
2688         https://bugs.webkit.org/show_bug.cgi?id=207485
2689         <rdar://problem/59302535>
2690
2691         Reviewed by Robin Morisset.
2692
2693         * runtime/GenericArgumentsInlines.h:
2694         (JSC::GenericArguments<Type>::put):
2695
2696 2020-02-10  Mark Lam  <mark.lam@apple.com>
2697
2698         Missing exception check in GenericArguments<Type>::deletePropertyByIndex().
2699         https://bugs.webkit.org/show_bug.cgi?id=207483
2700         <rdar://problem/59302616>
2701
2702         Reviewed by Yusuke Suzuki.
2703
2704         * runtime/GenericArgumentsInlines.h:
2705         (JSC::GenericArguments<Type>::deletePropertyByIndex):
2706
2707 2020-02-10  Truitt Savell  <tsavell@apple.com>
2708
2709         Unreviewed, rolling out r256091.
2710
2711         Broke internal builds
2712
2713         Reverted changeset:
2714
2715         "Move trivial definitions from FeatureDefines.xcconfig to
2716         PlatformEnableCocoa.h"
2717         https://bugs.webkit.org/show_bug.cgi?id=207155
2718         https://trac.webkit.org/changeset/256091
2719
2720 2020-02-10  Truitt Savell  <tsavell@apple.com>
2721
2722         Unreviewed, rolling out r256103.
2723
2724         This patch is blocking the rollout of r256091
2725
2726         Reverted changeset:
2727
2728         "Move JavaScriptCore related feature defines from
2729         FeatureDefines.xcconfig to PlatformEnableCocoa.h"
2730         https://bugs.webkit.org/show_bug.cgi?id=207436
2731         https://trac.webkit.org/changeset/256103
2732
2733 2020-02-09  Keith Rollin  <krollin@apple.com>
2734
2735         Re-enable LTO for ARM builds
2736         https://bugs.webkit.org/show_bug.cgi?id=207402
2737         <rdar://problem/49190767>
2738
2739         Reviewed by Sam Weinig.
2740
2741         Bug 190758 re-enabled LTO for Production builds for x86-family CPUs.
2742         Enabling it for ARM was left out due to a compiler issue. That issue
2743         has been fixed, and so now we can re-enable LTO for ARM.
2744
2745         * Configurations/Base.xcconfig:
2746
2747 2020-02-08  Sam Weinig  <weinig@apple.com>
2748
2749         Move JavaScriptCore related feature defines from FeatureDefines.xcconfig to PlatformEnableCocoa.h
2750         https://bugs.webkit.org/show_bug.cgi?id=207436
2751
2752         Reviewed by Tim Horton.
2753
2754         * Configurations/FeatureDefines.xcconfig:
2755         Remove ENABLE_FAST_JIT_PERMISSIONS and ENABLE_FTL_JIT.
2756
2757 2020-02-08  Sam Weinig  <weinig@apple.com>
2758
2759         Move trivial definitions from FeatureDefines.xcconfig to PlatformEnableCocoa.h
2760         https://bugs.webkit.org/show_bug.cgi?id=207155
2761
2762         Reviewed by Tim Horton.
2763         
2764         Move all trivial definitions (just ENABLE_FOO = ENABLE_FOO; or ENABLE_BAR = ;)
2765         from the FeatureDefines.xcconfigs to PlatformEnableCocoa.h, ensuring each one
2766         also has a default value in PlatformEnable.h
2767
2768         To support the move, DerivedSources.make has been updated to generate the list
2769         of ENABLE_* features by directly from preprocessing Platform.h, rather than 
2770         just getting the partial list from the xcconfig file.
2771
2772         * Configurations/FeatureDefines.xcconfig:
2773         * DerivedSources.make:
2774
2775 2020-02-07  Robin Morisset  <rmorisset@apple.com>
2776
2777         Throw OutOfMemory exception instead of crashing if DirectArguments/ScopedArguments can't be created
2778         https://bugs.webkit.org/show_bug.cgi?id=207423
2779
2780         Reviewed by Mark Lam.
2781
2782         AllocationFailureMode::Assert is problematic because fuzzers keep producing spurious error reports when they generate code that tries allocating infinite amount of memory.
2783         The right approach is to use AllocationFailureMode::ReturnNull, and throw a JS exception upon receiving null.
2784
2785         In this patch I fixed two functions that were using AllocationFailureMode::Assert:
2786             DirectArguments::DirectArguments::overrideThings
2787             GenericArguments<Type>::initModifiedArgumentsDescriptor
2788
2789         No test added, because the only test we have is highly non-deterministic/flaky (only triggers about 10 to 20% of the time even before the fix).
2790
2791         * runtime/DirectArguments.h:
2792         * runtime/GenericArguments.h:
2793         * runtime/GenericArgumentsInlines.h:
2794         (JSC::GenericArguments<Type>::deletePropertyByIndex):
2795         (JSC::GenericArguments<Type>::defineOwnProperty):
2796         (JSC::GenericArguments<Type>::initModifiedArgumentsDescriptor):
2797         (JSC::GenericArguments<Type>::initModifiedArgumentsDescriptorIfNecessary):
2798         (JSC::GenericArguments<Type>::setModifiedArgumentDescriptor):
2799         * runtime/ScopedArguments.h:
2800
2801 2020-02-07  Ryan Haddad  <ryanhaddad@apple.com>
2802
2803         Unreviewed, rolling out r256051.
2804
2805         Broke internal builds.
2806
2807         Reverted changeset:
2808
2809         "Move trivial definitions from FeatureDefines.xcconfig to
2810         PlatformEnableCocoa.h"
2811         https://bugs.webkit.org/show_bug.cgi?id=207155
2812         https://trac.webkit.org/changeset/256051
2813
2814 2020-02-07  Sam Weinig  <weinig@apple.com>
2815
2816         Move trivial definitions from FeatureDefines.xcconfig to PlatformEnableCocoa.h
2817         https://bugs.webkit.org/show_bug.cgi?id=207155
2818
2819         Reviewed by Tim Horton.
2820         
2821         Move all trivial definitions (just ENABLE_FOO = ENABLE_FOO; or ENABLE_BAR = ;)
2822         from the FeatureDefines.xcconfigs to PlatformEnableCocoa.h, ensuring each one
2823         also has a default value in PlatformEnable.h
2824
2825         To support the move, DerivedSources.make has been updated to generate the list
2826         of ENABLE_* features by directly from preprocessing Platform.h, rather than 
2827         just getting the partial list from the xcconfig file.
2828
2829         * Configurations/FeatureDefines.xcconfig:
2830         * DerivedSources.make:
2831
2832 2020-02-07  Yusuke Suzuki  <ysuzuki@apple.com>
2833
2834         [JSC] CodeBlock::shrinkToFit should shrink m_constantRegisters and m_constantsSourceCodeRepresentation in 64bit architectures
2835         https://bugs.webkit.org/show_bug.cgi?id=207356
2836
2837         Reviewed by Mark Lam.
2838
2839         Only 32bit architectures are using m_constantRegisters's address. 64bit architectures are not relying on m_constantRegisters's address.
2840         This patches fixes the thing so that CodeBlock::shrinkToFit will shrink m_constantRegisters and m_constantsSourceCodeRepresentation
2841         regardless of whether this is EarlyShrink or not. We also move DFG/FTL's LateShrink call to the place after calling DFGCommon reallyAdd
2842         since they can add more constant registers.
2843
2844         Relanding it by fixing dead-lock.
2845
2846         * bytecode/CodeBlock.cpp:
2847         (JSC::CodeBlock::shrinkToFit):
2848         * bytecode/CodeBlock.h:
2849         * dfg/DFGJITCompiler.cpp:
2850         (JSC::DFG::JITCompiler::compile):
2851         (JSC::DFG::JITCompiler::compileFunction):
2852         * dfg/DFGJITFinalizer.cpp:
2853         (JSC::DFG::JITFinalizer::finalizeCommon):
2854         * dfg/DFGPlan.cpp:
2855         (JSC::DFG::Plan::compileInThreadImpl):
2856         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
2857         * jit/JIT.cpp:
2858         (JSC::JIT::link):
2859         * jit/JIT.h:
2860         * jit/JITInlines.h:
2861         (JSC::JIT::emitLoadDouble):
2862         (JSC::JIT::emitLoadInt32ToDouble): Deleted.
2863
2864 2020-02-06  Robin Morisset  <rmorisset@apple.com>
2865
2866         Most of B3 and Air does not need to include CCallHelpers.h
2867         https://bugs.webkit.org/show_bug.cgi?id=206975
2868
2869         Reviewed by Mark Lam.
2870
2871         They only do to use CCallHelpers::Jump or CCallHelpers::Label.
2872         But CCallHelpers inherit those from MacroAssembler. And MacroAssembler.h is dramatically cheaper to include (since CCallHelpers includes AssemblyHelpers which includes CodeBlock.h which includes roughly the entire runtime).
2873
2874         * b3/B3CheckSpecial.cpp:
2875         * b3/B3CheckSpecial.h:
2876         * b3/B3LowerMacros.cpp:
2877         * b3/B3PatchpointSpecial.cpp:
2878         (JSC::B3::PatchpointSpecial::generate):
2879         * b3/B3PatchpointSpecial.h:
2880         * b3/B3StackmapGenerationParams.cpp:
2881         (JSC::B3::StackmapGenerationParams::successorLabels const):
2882         * b3/B3StackmapGenerationParams.h:
2883         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h:
2884         * b3/air/AirCCallSpecial.cpp:
2885         * b3/air/AirCCallSpecial.h:
2886         * b3/air/AirCode.cpp:
2887         * b3/air/AirCode.h:
2888         (JSC::B3::Air::Code::entrypointLabel const):
2889         * b3/air/AirCustom.cpp:
2890         (JSC::B3::Air::CCallCustom::generate):
2891         (JSC::B3::Air::ShuffleCustom::generate):
2892         (JSC::B3::Air::WasmBoundsCheckCustom::generate):
2893         * b3/air/AirCustom.h:
2894         (JSC::B3::Air::PatchCustom::generate):
2895         (JSC::B3::Air::EntrySwitchCustom::generate):
2896         * b3/air/AirDisassembler.cpp:
2897         (JSC::B3::Air::Disassembler::addInst):
2898         * b3/air/AirDisassembler.h:
2899         * b3/air/AirGenerationContext.h:
2900         * b3/air/AirInst.h:
2901         * b3/air/AirPrintSpecial.cpp:
2902         (JSC::B3::Air::PrintSpecial::generate):
2903         * b3/air/AirPrintSpecial.h:
2904         * b3/air/AirSpecial.h:
2905         * b3/air/AirValidate.cpp:
2906         * b3/air/opcode_generator.rb:
2907
2908 2020-02-06  Commit Queue  <commit-queue@webkit.org>
2909
2910         Unreviewed, rolling out r255987.
2911         https://bugs.webkit.org/show_bug.cgi?id=207369
2912
2913         JSTests failures (Requested by yusukesuzuki on #webkit).
2914
2915         Reverted changeset:
2916
2917         "[JSC] CodeBlock::shrinkToFit should shrink
2918         m_constantRegisters and m_constantsSourceCodeRepresentation in
2919         64bit architectures"
2920         https://bugs.webkit.org/show_bug.cgi?id=207356
2921         https://trac.webkit.org/changeset/255987
2922
2923 2020-02-06  Yusuke Suzuki  <ysuzuki@apple.com>
2924
2925         [JSC] CodeBlock::shrinkToFit should shrink m_constantRegisters and m_constantsSourceCodeRepresentation in 64bit architectures
2926         https://bugs.webkit.org/show_bug.cgi?id=207356
2927
2928         Reviewed by Mark Lam.
2929
2930         Only 32bit architectures are using m_constantRegisters's address. 64bit architectures are not relying on m_constantRegisters's address.
2931         This patches fixes the thing so that CodeBlock::shrinkToFit will shrink m_constantRegisters and m_constantsSourceCodeRepresentation
2932         regardless of whether this is EarlyShrink or not. We also move DFG/FTL's LateShrink call to the place after calling DFGCommon reallyAdd
2933         since they can add more constant registers.
2934
2935         * bytecode/CodeBlock.cpp:
2936         (JSC::CodeBlock::shrinkToFit):
2937         * bytecode/CodeBlock.h:
2938         * dfg/DFGJITCompiler.cpp:
2939         (JSC::DFG::JITCompiler::compile):
2940         (JSC::DFG::JITCompiler::compileFunction):
2941         * dfg/DFGJITFinalizer.cpp:
2942         (JSC::DFG::JITFinalizer::finalizeCommon):
2943         * dfg/DFGPlan.cpp:
2944         (JSC::DFG::Plan::compileInThreadImpl):
2945         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
2946         * jit/JIT.cpp:
2947         (JSC::JIT::link):
2948         * jit/JIT.h:
2949         * jit/JITInlines.h:
2950         (JSC::JIT::emitLoadDouble):
2951         (JSC::JIT::emitLoadInt32ToDouble): Deleted.
2952
2953 2020-02-05  Don Olmstead  <don.olmstead@sony.com>
2954
2955         [PlayStation] Build a shared JavaScriptCore
2956         https://bugs.webkit.org/show_bug.cgi?id=198446
2957
2958         Reviewed by Fujii Hironori.
2959
2960         Add TARGET_OBJECTS for bmalloc and WTF so JavaScriptCore links. Add bmalloc and
2961         WTF compile definitions so exports are exposed.
2962
2963         * PlatformPlayStation.cmake:
2964
2965 2020-02-05  Justin Michaud  <justin_michaud@apple.com>
2966
2967         Deleting a property should not turn structures into uncacheable dictionaries
2968         https://bugs.webkit.org/show_bug.cgi?id=206430
2969
2970         Reviewed by Yusuke Suzuki.
2971
2972         Right now, deleteProperty/removePropertyTransition causes a structure transition to uncacheable dictionary. Instead, we should allow it to transition to a new regular structure like adding a property does. This means that we have to:
2973
2974         1) Break the assumption that structure transition offsets increase monotonically
2975
2976         We add a new flag to tell that a structure has deleted its property, and update materializePropertyTable to use it.
2977
2978         2) Add a new transition map and transition kind for deletes
2979
2980         We cache the delete transition. We will not transition back to a previous structure if you add then immediately remove a property.
2981
2982         3) Find some heuristic for when we should actually transition to uncacheable dictionary.
2983
2984         Since deleting properties is expected to be rare, we just walk the structure list and count its size on removal. 
2985
2986         This patch also fixes a related bug in addProperty, where we did not use a GCSafeConcurrentJSLocker, and adds an option to trigger the bug. Finally, we add some helper methods to dollarVM to test.
2987
2988         This gives a 24x speedup on delete-property-keeps-cacheable-structure.js, and is neutral on delete-property-from-prototype-chain.js (which was already generating code using the inline cache).
2989
2990         * heap/HeapInlines.h:
2991         (JSC::Heap::decrementDeferralDepthAndGCIfNeeded):
2992         * runtime/JSObject.cpp:
2993         (JSC::JSObject::deleteProperty):
2994         * runtime/OptionsList.h:
2995         * runtime/PropertyMapHashTable.h:
2996         (JSC::PropertyTable::get):
2997         (JSC::PropertyTable::add):
2998         (JSC::PropertyTable::addDeletedOffset):
2999         (JSC::PropertyTable::reinsert):
3000         * runtime/Structure.cpp:
3001         (JSC::StructureTransitionTable::contains const):
3002         (JSC::StructureTransitionTable::get const):
3003         (JSC::StructureTransitionTable::add):
3004         (JSC::Structure::Structure):
3005         (JSC::Structure::materializePropertyTable):
3006         (JSC::Structure::addNewPropertyTransition):
3007         (JSC::Structure::removePropertyTransition):
3008         (JSC::Structure::removePropertyTransitionFromExistingStructure):
3009         (JSC::Structure::removeNewPropertyTransition):
3010         (JSC::Structure::toUncacheableDictionaryTransition):
3011         (JSC::Structure::remove):
3012         (JSC::Structure::visitChildren):
3013         * runtime/Structure.h:
3014         * runtime/StructureInlines.h:
3015         (JSC::Structure::forEachPropertyConcurrently):
3016         (JSC::Structure::add):
3017         (JSC::Structure::remove):
3018         (JSC::Structure::removePropertyWithoutTransition):
3019         * runtime/StructureTransitionTable.h:
3020         (JSC::StructureTransitionTable::Hash::hash):
3021         * tools/JSDollarVM.cpp:
3022         (JSC::JSDollarVMHelper::functionGetStructureTransitionList):
3023         (JSC::functionGetConcurrently):
3024         (JSC::JSDollarVM::finishCreation):
3025
3026 2020-02-05  Devin Rousso  <drousso@apple.com>
3027
3028         Web Inspector: Sources: add a special breakpoint for controlling whether `debugger` statements pause
3029         https://bugs.webkit.org/show_bug.cgi?id=206818
3030
3031         Reviewed by Timothy Hatcher.
3032
3033         * inspector/protocol/Debugger.json:
3034         * inspector/agents/InspectorDebuggerAgent.h:
3035         * inspector/agents/InspectorDebuggerAgent.cpp:
3036         (Inspector::InspectorDebuggerAgent::setPauseOnDebuggerStatements): Added.
3037
3038         * bytecompiler/NodesCodegen.cpp:
3039         (JSC::DebuggerStatementNode::emitBytecode):
3040         * bytecode/CodeBlock.cpp:
3041         (JSC::CodeBlock::finishCreation):
3042         * bytecode/UnlinkedCodeBlock.cpp:
3043         (JSC::dumpLineColumnEntry):
3044         * interpreter/Interpreter.h:
3045         * interpreter/Interpreter.cpp:
3046         (JSC::Interpreter::debug):
3047         (WTF::printInternal):
3048         * debugger/Debugger.h:
3049         (JSC::Debugger::setPauseOnDebuggerStatements): Added.
3050         * debugger/Debugger.cpp:
3051         (JSC::Debugger::didReachDebuggerStatement): Added.
3052         (JSC::Debugger::didReachBreakpoint): Deleted.
3053         Replace `DebugHookType::DidReachBreakpoint` with `DebugHookType::DidReachDebuggerStatement`,
3054         as it is only actually used for `debugger;` statements, not breakpoints.
3055
3056 2020-02-04  Yusuke Suzuki  <ysuzuki@apple.com>
3057
3058         [JSC] Structure::setMaxOffset and setTransitionOffset are racy
3059         https://bugs.webkit.org/show_bug.cgi?id=207249
3060
3061         Reviewed by Mark Lam.
3062
3063         We hit crash in JSTests/stress/array-slice-osr-exit-2.js. The situation is following.
3064
3065             1. The mutator thread (A) is working.
3066             2. The concurrent collector (B) is working.
3067             3. A attempts to set m_maxOffset in StructureRareData by allocating it. First, A sets Structure::m_maxOffset to useRareDataFlag.
3068             3. B is in JSObject::visitButterflyImpl, and executing Structure::maxOffset().
3069             4. B detects that m_maxOffset is useRareDataFlag.
3070             5. B attempts to load rareData, but this is not a StructureRareData since A is just now setting up StructureRareData.
3071             6. B crashes.
3072
3073         Set useRareDataFlag after StructureRareData is set. Ensuring this store-order by using storeStoreFence.
3074
3075         * runtime/Structure.h:
3076
3077 2020-02-04  Adrian Perez de Castro  <aperez@igalia.com>
3078
3079         Non-unified build fixes early February 2020 edition
3080         https://bugs.webkit.org/show_bug.cgi?id=207227
3081
3082         Reviewed by Don Olmstead.
3083
3084         * bytecode/PolyProtoAccessChain.h: Add missing inclusions of StructureIDTable.h and VM.h
3085
3086 2020-02-04  Alex Christensen  <achristensen@webkit.org>
3087
3088         Fix Mac CMake build
3089         https://bugs.webkit.org/show_bug.cgi?id=207231
3090
3091         * PlatformMac.cmake:
3092
3093 2020-02-04  Yusuke Suzuki  <ysuzuki@apple.com>
3094
3095         [JSC] Use PackedRefPtr in UnlinkedCodeBlock
3096         https://bugs.webkit.org/show_bug.cgi?id=207229
3097
3098         Reviewed by Mark Lam.
3099
3100         Use PackedRefPtr in UnlinkedCodeBlock to compact it from 168 to 160, which saves 16 bytes (10%) per UnlinkedCodeBlock since
3101         we have 16 bytes alignment for GC cells.
3102
3103         * bytecode/UnlinkedCodeBlock.h:
3104         (JSC::UnlinkedCodeBlock::sourceURLDirective const):
3105         (JSC::UnlinkedCodeBlock::sourceMappingURLDirective const):
3106         (JSC::UnlinkedCodeBlock::setSourceURLDirective):
3107         (JSC::UnlinkedCodeBlock::setSourceMappingURLDirective):
3108         * runtime/CachedTypes.cpp:
3109         (JSC::CachedCodeBlock::sourceURLDirective const):
3110         (JSC::CachedCodeBlock::sourceMappingURLDirective const):
3111         (JSC::CachedCodeBlock<CodeBlockType>::encode):
3112         * runtime/CodeCache.cpp:
3113         (JSC::CodeCache::getUnlinkedGlobalCodeBlock):
3114
3115 2020-02-04  Alexey Shvayka  <shvaikalesh@gmail.com>
3116
3117         Quantifiers after lookahead assertions should be syntax errors in Unicode patterns only
3118         https://bugs.webkit.org/show_bug.cgi?id=206988
3119
3120         Reviewed by Darin Adler and Ross Kirsling.
3121
3122         This change adds SyntaxError for quantifiable assertions in Unicode patterns,
3123         aligning JSC with V8 and SpiderMonkey.
3124
3125         Grammar: https://tc39.es/ecma262/#prod-annexB-Term
3126         (/u flag precludes the use of QuantifiableAssertion)
3127
3128         Return value of parseParenthesesEnd() now matches with parseEscape() and
3129         parseAtomEscape().
3130
3131         * yarr/YarrParser.h:
3132         (JSC::Yarr::Parser::parseParenthesesBegin):
3133         (JSC::Yarr::Parser::parseParenthesesEnd):
3134         (JSC::Yarr::Parser::parseTokens):
3135
3136 2020-02-04  Yusuke Suzuki  <ysuzuki@apple.com>
3137
3138         [JSC] Introduce UnlinkedCodeBlockGenerator and reduce sizeof(UnlinkedCodeBlock)
3139         https://bugs.webkit.org/show_bug.cgi?id=207087
3140
3141         Reviewed by Tadeu Zagallo.
3142
3143         While UnlinkedCodeBlock is immutable once it is created from BytecodeGenerator, it has many mutable Vectors.
3144         This is because we are using UnlinkedCodeBlock as a builder of UnlinkedCodeBlock itself too in BytecodeGenerator.
3145         Since Vector takes 16 bytes to allow efficient expansions, it is nice if we can use RefCountedArray instead when
3146         we know this Vector is immutable.
3147
3148         In this patch, we introduce UnlinkedCodeBlockGenerator wrapper. BytecodeGenerator, BytecodeRewriter, BytecodeDumper,
3149         and BytecodeGeneratorification interact with UnlinkedCodeBlockGenerator instead of UnlinkedCodeBlock. And UnlinkedCodeBlockGenerator
3150         will generate the finalized UnlinkedCodeBlock. This design allows us to use RefCountedArray for data in UnlinkedCodeBlock,
3151         which is (1) smaller and (2) doing shrinkToFit operation when creating it from Vector.
3152
3153         This patch reduces sizeof(UnlinkedCodeBlock) from 256 to 168, 88 bytes reduction.
3154
3155         * JavaScriptCore.xcodeproj/project.pbxproj:
3156         * Sources.txt:
3157         * bytecode/BytecodeBasicBlock.cpp:
3158         (JSC::BytecodeBasicBlock::compute):
3159         * bytecode/BytecodeBasicBlock.h:
3160         * bytecode/BytecodeDumper.cpp:
3161         * bytecode/BytecodeGeneratorification.cpp:
3162         (JSC::BytecodeGeneratorification::BytecodeGeneratorification):
3163         (JSC::GeneratorLivenessAnalysis::run):
3164         (JSC::BytecodeGeneratorification::run):
3165         (JSC::performGeneratorification):
3166         * bytecode/BytecodeGeneratorification.h:
3167         * bytecode/BytecodeRewriter.h:
3168         (JSC::BytecodeRewriter::BytecodeRewriter):
3169         * bytecode/CodeBlock.cpp:
3170         (JSC::CodeBlock::finishCreation):
3171         (JSC::CodeBlock::setConstantIdentifierSetRegisters):
3172         (JSC::CodeBlock::setConstantRegisters):
3173         (JSC::CodeBlock::handlerForIndex):
3174         (JSC::CodeBlock::insertBasicBlockBoundariesForControlFlowProfiler):
3175         * bytecode/CodeBlock.h:
3176         (JSC::CodeBlock::numberOfSwitchJumpTables const):
3177         (JSC::CodeBlock::numberOfStringSwitchJumpTables const):
3178         (JSC::CodeBlock::addSwitchJumpTable): Deleted.
3179         (JSC::CodeBlock::addStringSwitchJumpTable): Deleted.
3180         * bytecode/HandlerInfo.h:
3181         (JSC::HandlerInfoBase::handlerForIndex):
3182         * bytecode/JumpTable.h:
3183         (JSC::SimpleJumpTable::add): Deleted.
3184         * bytecode/PreciseJumpTargets.cpp:
3185         (JSC::computePreciseJumpTargets):
3186         (JSC::recomputePreciseJumpTargets):
3187         (JSC::findJumpTargetsForInstruction):
3188         * bytecode/PreciseJumpTargets.h:
3189         * bytecode/UnlinkedCodeBlock.cpp:
3190         (JSC::UnlinkedCodeBlock::UnlinkedCodeBlock):
3191         (JSC::UnlinkedCodeBlock::visitChildren):
3192         (JSC::UnlinkedCodeBlock::dumpExpressionRangeInfo):
3193         (JSC::UnlinkedCodeBlock::expressionRangeForBytecodeIndex const):
3194         (JSC::UnlinkedCodeBlock::handlerForIndex):
3195         (JSC::UnlinkedCodeBlock::addExpressionInfo): Deleted.
3196         (JSC::UnlinkedCodeBlock::addTypeProfilerExpressionInfo): Deleted.
3197         (JSC::UnlinkedCodeBlock::setInstructions): Deleted.
3198         (JSC::UnlinkedCodeBlock::applyModification): Deleted.
3199         (JSC::UnlinkedCodeBlock::shrinkToFit): Deleted.
3200         (JSC::UnlinkedCodeBlock::addOutOfLineJumpTarget): Deleted.
3201         * bytecode/UnlinkedCodeBlock.h:
3202         (JSC::UnlinkedCodeBlock::expressionInfo):
3203         (JSC::UnlinkedCodeBlock::setNumParameters):
3204         (JSC::UnlinkedCodeBlock::numberOfIdentifiers const):
3205         (JSC::UnlinkedCodeBlock::identifiers const):
3206         (JSC::UnlinkedCodeBlock::bitVector):
3207         (JSC::UnlinkedCodeBlock::constantRegisters):
3208         (JSC::UnlinkedCodeBlock::constantsSourceCodeRepresentation):
3209         (JSC::UnlinkedCodeBlock::constantIdentifierSets):
3210         (JSC::UnlinkedCodeBlock::numberOfJumpTargets const):
3211         (JSC::UnlinkedCodeBlock::numberOfSwitchJumpTables const):
3212         (JSC::UnlinkedCodeBlock::numberOfStringSwitchJumpTables const):
3213         (JSC::UnlinkedCodeBlock::numberOfFunctionDecls):
3214         (JSC::UnlinkedCodeBlock::numberOfExceptionHandlers const):
3215         (JSC::UnlinkedCodeBlock::opProfileControlFlowBytecodeOffsets const):
3216         (JSC::UnlinkedCodeBlock::createRareDataIfNecessary):
3217         (JSC::UnlinkedCodeBlock::addParameter): Deleted.
3218         (JSC::UnlinkedCodeBlock::addIdentifier): Deleted.
3219         (JSC::UnlinkedCodeBlock::addBitVector): Deleted.
3220         (JSC::UnlinkedCodeBlock::addSetConstant): Deleted.
3221         (JSC::UnlinkedCodeBlock::addConstant): Deleted.
3222         (JSC::UnlinkedCodeBlock::addJumpTarget): Deleted.
3223         (JSC::UnlinkedCodeBlock::addSwitchJumpTable): Deleted.
3224         (JSC::UnlinkedCodeBlock::addStringSwitchJumpTable): Deleted.
3225         (JSC::UnlinkedCodeBlock::addFunctionDecl): Deleted.
3226         (JSC::UnlinkedCodeBlock::addFunctionExpr): Deleted.
3227         (JSC::UnlinkedCodeBlock::addExceptionHandler): Deleted.
3228         (JSC::UnlinkedCodeBlock::addOpProfileControlFlowBytecodeOffset): Deleted.
3229         (JSC::UnlinkedCodeBlock::replaceOutOfLineJumpTargets): Deleted.
3230         * bytecode/UnlinkedCodeBlockGenerator.cpp: Added.
3231         (JSC::UnlinkedCodeBlockGenerator::getLineAndColumn const):
3232         (JSC::UnlinkedCodeBlockGenerator::addExpressionInfo):
3233         (JSC::UnlinkedCodeBlockGenerator::addTypeProfilerExpressionInfo):
3234         (JSC::UnlinkedCodeBlockGenerator::finalize):
3235         (JSC::UnlinkedCodeBlockGenerator::handlerForBytecodeIndex):
3236         (JSC::UnlinkedCodeBlockGenerator::handlerForIndex):
3237         (JSC::UnlinkedCodeBlockGenerator::applyModification):
3238         (JSC::UnlinkedCodeBlockGenerator::addOutOfLineJumpTarget):
3239         (JSC::UnlinkedCodeBlockGenerator::outOfLineJumpOffset):
3240         (JSC::UnlinkedCodeBlockGenerator::dump const):
3241         * bytecode/UnlinkedCodeBlockGenerator.h: Added.
3242         (JSC::UnlinkedCodeBlockGenerator::UnlinkedCodeBlockGenerator):
3243         (JSC::UnlinkedCodeBlockGenerator::vm):
3244         (JSC::UnlinkedCodeBlockGenerator::isConstructor const):
3245         (JSC::UnlinkedCodeBlockGenerator::constructorKind const):
3246         (JSC::UnlinkedCodeBlockGenerator::superBinding const):
3247         (JSC::UnlinkedCodeBlockGenerator::scriptMode const):
3248         (JSC::UnlinkedCodeBlockGenerator::needsClassFieldInitializer const):
3249         (JSC::UnlinkedCodeBlockGenerator::isStrictMode const):
3250         (JSC::UnlinkedCodeBlockGenerator::usesEval const):
3251         (JSC::UnlinkedCodeBlockGenerator::parseMode const):
3252         (JSC::UnlinkedCodeBlockGenerator::isArrowFunction):
3253         (JSC::UnlinkedCodeBlockGenerator::derivedContextType const):
3254         (JSC::UnlinkedCodeBlockGenerator::evalContextType const):
3255         (JSC::UnlinkedCodeBlockGenerator::isArrowFunctionContext const):
3256         (JSC::UnlinkedCodeBlockGenerator::isClassContext const):
3257         (JSC::UnlinkedCodeBlockGenerator::numCalleeLocals const):
3258         (JSC::UnlinkedCodeBlockGenerator::numVars const):
3259         (JSC::UnlinkedCodeBlockGenerator::numParameters const):
3260         (JSC::UnlinkedCodeBlockGenerator::thisRegister const):
3261         (JSC::UnlinkedCodeBlockGenerator::scopeRegister const):
3262         (JSC::UnlinkedCodeBlockGenerator::wasCompiledWithDebuggingOpcodes const):
3263         (JSC::UnlinkedCodeBlockGenerator::hasCheckpoints const):
3264         (JSC::UnlinkedCodeBlockGenerator::hasTailCalls const):
3265         (JSC::UnlinkedCodeBlockGenerator::setHasCheckpoints):
3266         (JSC::UnlinkedCodeBlockGenerator::setHasTailCalls):
3267         (JSC::UnlinkedCodeBlockGenerator::setNumCalleeLocals):
3268         (JSC::UnlinkedCodeBlockGenerator::setNumVars):
3269         (JSC::UnlinkedCodeBlockGenerator::setThisRegister):
3270         (JSC::UnlinkedCodeBlockGenerator::setScopeRegister):
3271         (JSC::UnlinkedCodeBlockGenerator::setNumParameters):
3272         (JSC::UnlinkedCodeBlockGenerator::metadata):
3273         (JSC::UnlinkedCodeBlockGenerator::addOpProfileControlFlowBytecodeOffset):
3274         (JSC::UnlinkedCodeBlockGenerator::numberOfJumpTargets const):
3275         (JSC::UnlinkedCodeBlockGenerator::addJumpTarget):
3276         (JSC::UnlinkedCodeBlockGenerator::jumpTarget const):
3277         (JSC::UnlinkedCodeBlockGenerator::lastJumpTarget const):
3278         (JSC::UnlinkedCodeBlockGenerator::numberOfSwitchJumpTables const):
3279         (JSC::UnlinkedCodeBlockGenerator::addSwitchJumpTable):
3280         (JSC::UnlinkedCodeBlockGenerator::switchJumpTable):
3281         (JSC::UnlinkedCodeBlockGenerator::numberOfStringSwitchJumpTables const):
3282         (JSC::UnlinkedCodeBlockGenerator::addStringSwitchJumpTable):
3283         (JSC::UnlinkedCodeBlockGenerator::stringSwitchJumpTable):
3284         (JSC::UnlinkedCodeBlockGenerator::numberOfExceptionHandlers const):
3285         (JSC::UnlinkedCodeBlockGenerator::exceptionHandler):
3286         (JSC::UnlinkedCodeBlockGenerator::addExceptionHandler):
3287         (JSC::UnlinkedCodeBlockGenerator::bitVector):
3288         (JSC::UnlinkedCodeBlockGenerator::addBitVector):
3289         (JSC::UnlinkedCodeBlockGenerator::numberOfConstantIdentifierSets const):
3290         (JSC::UnlinkedCodeBlockGenerator::constantIdentifierSets):
3291         (JSC::UnlinkedCodeBlockGenerator::addSetConstant):
3292         (JSC::UnlinkedCodeBlockGenerator::constantRegister const):
3293         (JSC::UnlinkedCodeBlockGenerator::constantRegisters):
3294         (JSC::UnlinkedCodeBlockGenerator::getConstant const):
3295         (JSC::UnlinkedCodeBlockGenerator::constantsSourceCodeRepresentation):
3296         (JSC::UnlinkedCodeBlockGenerator::addConstant):
3297         (JSC::UnlinkedCodeBlockGenerator::addFunctionDecl):
3298         (JSC::UnlinkedCodeBlockGenerator::addFunctionExpr):
3299         (JSC::UnlinkedCodeBlockGenerator::numberOfIdentifiers const):
3300         (JSC::UnlinkedCodeBlockGenerator::identifier const):
3301         (JSC::UnlinkedCodeBlockGenerator::addIdentifier):
3302         (JSC::UnlinkedCodeBlockGenerator::outOfLineJumpOffset):
3303         (JSC::UnlinkedCodeBlockGenerator::replaceOutOfLineJumpTargets):
3304         (JSC::UnlinkedCodeBlockGenerator::metadataSizeInBytes):
3305         * bytecompiler/BytecodeGenerator.cpp:
3306         (JSC::BytecodeGenerator::generate):
3307         (JSC::BytecodeGenerator::BytecodeGenerator):
3308         (JSC::BytecodeGenerator::initializeNextParameter):
3309         (JSC::BytecodeGenerator::emitPushFunctionNameScope):
3310         (JSC::prepareJumpTableForSwitch):
3311         (JSC::ForInContext::finalize):
3312         (JSC::StructureForInContext::finalize):
3313         (JSC::IndexedForInContext::finalize):
3314         * bytecompiler/BytecodeGenerator.h:
3315         * bytecompiler/BytecodeGeneratorBaseInlines.h:
3316         (JSC::BytecodeGeneratorBase<Traits>::newRegister):
3317         (JSC::BytecodeGeneratorBase<Traits>::addVar):
3318         * runtime/CachedTypes.cpp:
3319         (JSC::CachedVector::encode):
3320         (JSC::CachedVector::decode const):
3321         * wasm/WasmFunctionCodeBlock.h:
3322         (JSC::Wasm::FunctionCodeBlock::setNumVars):
3323         (JSC::Wasm::FunctionCodeBlock::setNumCalleeLocals):
3324
3325 2020-02-04  Devin Rousso  <drousso@apple.com>
3326
3327         Web Inspector: REGRESSION(r248287): Console: function objects saved to a $n will be invoked instead of just referenced when evaluating in the Console
3328         https://bugs.webkit.org/show_bug.cgi?id=207180
3329         <rdar://problem/58860268>
3330
3331         Reviewed by Joseph Pecoraro.
3332
3333         * inspector/InjectedScriptSource.js:
3334         (CommandLineAPI):
3335         Instead of deciding whether to wrap the value given for a `$n` getter based on if the value
3336         is already a function, always wrap getter values in a function so that if the value being
3337         stored in the getter is already a function, it isn't used as the callback for the getter and
3338         therefore invoked when the getter is referenced.
3339
3340 2020-02-03  Yusuke Suzuki  <ysuzuki@apple.com>
3341
3342         [JSC] Use PackedPtr for VariableEnvironment
3343         https://bugs.webkit.org/show_bug.cgi?id=207172
3344
3345         Reviewed by Mark Lam.
3346
3347         Since VariableEnvironment's KeyValue is key: pointer + value: 2 byte, using PackedPtr can make it 8 bytes, 50% reduction.
3348
3349         * parser/VariableEnvironment.h:
3350         * runtime/CachedTypes.cpp:
3351         (JSC::CachedRefPtr::encode):
3352         (JSC::CachedRefPtr::decode const): CachedTypes should handle PackedPtr too since VariableEnvironment starts using it.
3353
3354 2020-02-03  Alexey Shvayka  <shvaikalesh@gmail.com>
3355
3356         \0 identity escapes should be syntax errors in Unicode patterns only
3357         https://bugs.webkit.org/show_bug.cgi?id=207114
3358
3359         Reviewed by Darin Adler.
3360
3361         This change adds a separate check for null character because `strchr`
3362         always returns a non-null pointer when called with '\0' as second argument.
3363
3364         Grammar: https://tc39.es/ecma262/#prod-annexB-IdentityEscape
3365         (/u flag precludes the use of SourceCharacterIdentityEscape)
3366
3367         * yarr/YarrParser.h:
3368         (JSC::Yarr::Parser::isIdentityEscapeAnError):
3369
3370 2020-02-01  Alexey Shvayka  <shvaikalesh@gmail.com>
3371
3372         Non-alphabetical \c escapes should be syntax errors in Unicode patterns only
3373         https://bugs.webkit.org/show_bug.cgi?id=207091
3374
3375         Reviewed by Darin Adler.
3376
3377         This change adds SyntaxError for non-alphabetical and identity \c escapes
3378         in Unicode patterns, aligning JSC with V8 and SpiderMonkey.
3379
3380         Grammar: https://tc39.es/ecma262/#prod-annexB-ClassEscape
3381         (/u flag precludes the use of ClassControlLetter)
3382
3383         * yarr/YarrErrorCode.cpp:
3384         (JSC::Yarr::errorMessage):
3385         (JSC::Yarr::errorToThrow):
3386         * yarr/YarrErrorCode.h:
3387         * yarr/YarrParser.h:
3388         (JSC::Yarr::Parser::parseEscape):
3389
3390 2020-01-31  Yusuke Suzuki  <ysuzuki@apple.com>
3391
3392         [JSC] Hold StructureID instead of Structure* in PolyProtoAccessChain and DFG::CommonData
3393         https://bugs.webkit.org/show_bug.cgi?id=207086
3394
3395         Reviewed by Mark Lam.
3396
3397         PolyProtoAccessChain and DFG::CommonData are kept alive so long as associated AccessCase / DFG/FTL CodeBlock
3398         is alive. They hold Vector<Structure*> / Vector<WriteBarrier<Structure*>>, but access frequency is low. And
3399         We should hold Vector<StructureID> instead to cut 50% of the size.
3400
3401         * bytecode/AccessCase.cpp:
3402         (JSC::AccessCase::commit):
3403         (JSC::AccessCase::forEachDependentCell const):
3404         (JSC::AccessCase::doesCalls const):
3405         (JSC::AccessCase::visitWeak const):
3406         (JSC::AccessCase::propagateTransitions const):
3407         (JSC::AccessCase::generateWithGuard):
3408         * bytecode/AccessCase.h:
3409         * bytecode/CodeBlock.cpp:
3410         (JSC::CodeBlock::propagateTransitions):
3411         (JSC::CodeBlock::determineLiveness):
3412         (JSC::CodeBlock::stronglyVisitWeakReferences):
3413         * bytecode/GetByStatus.cpp:
3414         (JSC::GetByStatus::computeForStubInfoWithoutExitSiteFeedback):
3415         * bytecode/InByIdStatus.cpp:
3416         (JSC::InByIdStatus::computeFor):
3417         (JSC::InByIdStatus::computeForStubInfo):
3418         (JSC::InByIdStatus::computeForStubInfoWithoutExitSiteFeedback):
3419         * bytecode/InByIdStatus.h:
3420         * bytecode/InstanceOfStatus.cpp:
3421         (JSC::InstanceOfStatus::computeFor):
3422         (JSC::InstanceOfStatus::computeForStubInfo):
3423         * bytecode/InstanceOfStatus.h:
3424         * bytecode/PolyProtoAccessChain.cpp:
3425         (JSC::PolyProtoAccessChain::create):
3426         (JSC::PolyProtoAccessChain::needImpurePropertyWatchpoint const):
3427         (JSC::PolyProtoAccessChain::dump const):
3428         * bytecode/PolyProtoAccessChain.h:
3429         (JSC::PolyProtoAccessChain::chain const):
3430         (JSC::PolyProtoAccessChain::forEach const):
3431         (JSC::PolyProtoAccessChain::slotBaseStructure const):
3432         (JSC::PolyProtoAccessChain:: const): Deleted.
3433         * bytecode/PolymorphicAccess.cpp:
3434         (JSC::PolymorphicAccess::regenerate):
3435         * bytecode/PutByIdStatus.cpp:
3436         (JSC::PutByIdStatus::computeForStubInfo):
3437         * bytecode/StructureStubInfo.cpp:
3438         (JSC::StructureStubInfo::summary const):
3439         (JSC::StructureStubInfo::summary):
3440         * bytecode/StructureStubInfo.h:
3441         * dfg/DFGCommonData.h:
3442         * dfg/DFGDesiredWeakReferences.cpp:
3443         (JSC::DFG::DesiredWeakReferences::reallyAdd):
3444         * dfg/DFGPlan.cpp:
3445         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
3446         * jit/Repatch.cpp:
3447         (JSC::tryCacheGetBy):
3448         (JSC::tryCachePutByID):
3449         (JSC::tryCacheInByID):
3450
3451 2020-01-31  Yusuke Suzuki  <ysuzuki@apple.com>
3452
3453         [JSC] ShrinkToFit some vectors kept by JIT data structures
3454         https://bugs.webkit.org/show_bug.cgi?id=207085
3455
3456         Reviewed by Mark Lam.
3457
3458         1. We are allocating RareCaseProfile by using SegmentedVector since JIT code is directly accessing to RareCaseProfile*. But when creating RareCaseProfile, we can know
3459            how many RareCaseProfiles should we create: RareCaseProfile is created per slow paths of Baseline JIT bytecode. Since we already scan bytecode for the main paths,
3460            we can count it and use this number when creating RareCaseProfile.
3461         2. Vectors held by PolymorphicAccess and PolymorphicCallStubRoutine should be kept small by calling shrinkToFit.
3462
3463         * bytecode/CodeBlock.cpp:
3464         (JSC::CodeBlock::setRareCaseProfiles):
3465         (JSC::CodeBlock::shrinkToFit):
3466         (JSC::CodeBlock::addRareCaseProfile): Deleted.
3467         * bytecode/CodeBlock.h:
3468         * bytecode/PolyProtoAccessChain.cpp:
3469         (JSC::PolyProtoAccessChain::create):
3470         * bytecode/PolymorphicAccess.cpp:
3471         (JSC::PolymorphicAccess::regenerate):
3472         * bytecode/ValueProfile.h:
3473         (JSC::RareCaseProfile::RareCaseProfile):
3474         * jit/JIT.cpp:
3475         (JSC::JIT::privateCompileMainPass):
3476         (JSC::JIT::privateCompileSlowCases):
3477         * jit/JIT.h:
3478         * jit/PolymorphicCallStubRoutine.cpp:
3479         (JSC::PolymorphicCallStubRoutine::PolymorphicCallStubRoutine):
3480
3481 2020-01-31  Yusuke Suzuki  <ysuzuki@apple.com>
3482
3483         [JSC] DFG::CommonData::shrinkToFit called before DFG::Plan::reallyAdd is called
3484         https://bugs.webkit.org/show_bug.cgi?id=207083
3485
3486         Reviewed by Mark Lam.
3487
3488         We are calling DFG::CommonData::shrinkToFit, but calling this too early: we execute
3489         DFG::Plan::reallyAdd(DFG::CommonData*) after that, and this adds many entries to
3490         DFG::CommonData*. We should call DFG::CommonData::shrinkToFit after calling DFG::Plan::reallyAdd.
3491
3492         To implement it, we make DFG::JITCode::shrinkToFit virtual function in JSC::JITCode. Then, we
3493         can also implement FTL::JITCode::shrinkToFit which was previously not implemented.
3494
3495         * dfg/DFGJITCode.cpp:
3496         (JSC::DFG::JITCode::shrinkToFit):
3497         * dfg/DFGJITCode.h:
3498         * dfg/DFGJITCompiler.cpp:
3499         (JSC::DFG::JITCompiler::compile):
3500         (JSC::DFG::JITCompiler::compileFunction):
3501         * dfg/DFGPlan.cpp:
3502         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
3503         * ftl/FTLJITCode.cpp:
3504         (JSC::FTL::JITCode::shrinkToFit):
3505         * ftl/FTLJITCode.h:
3506         * jit/JITCode.cpp:
3507         (JSC::JITCode::shrinkToFit):
3508         * jit/JITCode.h:
3509
3510 2020-01-31  Saam Barati  <sbarati@apple.com>
3511
3512         GetButterfly should check if the input value is an object in safe to execute
3513         https://bugs.webkit.org/show_bug.cgi?id=207082
3514
3515         Reviewed by Mark Lam.
3516
3517         We can only hoist GetButterfly when we know the incoming value is an object.
3518         We might want to reconsider making GetButterfly use ObjectUse as its edge
3519         kind, but that's out of the scope of this patch. Currently, we use CellUse
3520         for GetButterfly node's child1.
3521
3522         * dfg/DFGSafeToExecute.h:
3523         (JSC::DFG::safeToExecute):
3524
3525 2020-01-31  Saam Barati  <sbarati@apple.com>
3526
3527         safe to execute should return false when we know code won't be moved
3528         https://bugs.webkit.org/show_bug.cgi?id=207074
3529
3530         Reviewed by Yusuke Suzuki.
3531
3532         We use safeToExecute to determine inside LICM whether it's safe to execute
3533         a node somewhere else in the program. We were returning true for nodes
3534         we knew would never be moved, because they were effectful. Things like Call
3535         and GetById. This patch makes those nodes return false now, since we want
3536         to make it easier to audit the nodes that return true. This makes that audit
3537         easier, since it gets rid of the obvious things that will never be hoisted.
3538
3539         * dfg/DFGSafeToExecute.h:
3540         (JSC::DFG::safeToExecute):
3541
3542 2020-01-31  Saam Barati  <sbarati@apple.com>
3543
3544         GetGetterSetterByOffset and GetGetter/GetSetter are not always safe to execute
3545         https://bugs.webkit.org/show_bug.cgi?id=206805
3546         <rdar://problem/58898161>
3547
3548         Reviewed by Yusuke Suzuki.
3549
3550         This patch fixes two bugs. The first is GetGetterSetterByOffset. Previously,
3551         we were just checking that we could load the value safely. However, because
3552         GetGetterSetterByOffset returns a GetterSetter object, we can only safely
3553         move this node into a context where it's guaranteed that the offset loaded
3554         will return a GetterSetter.
3555         
3556         The second fix is GetGetter/GetSetter were both always marked as safe to execute.
3557         However, they're only safe to execute when the incoming value to load from
3558         is a GetterSetter object.
3559
3560         * dfg/DFGSafeToExecute.h:
3561         (JSC::DFG::safeToExecute):
3562
3563 2020-01-31  Alexey Shvayka  <shvaikalesh@gmail.com>
3564
3565         Unmatched ] or } brackets should be syntax errors in Unicode patterns only
3566         https://bugs.webkit.org/show_bug.cgi?id=207023
3567
3568         Reviewed by Darin Adler.
3569
3570         This change adds SyntaxError for Unicode patterns, aligning JSC with
3571         V8 and SpiderMonkey.
3572
3573         Grammar: https://tc39.es/ecma262/#prod-annexB-Term
3574         (/u flag precludes the use of ExtendedAtom and thus ExtendedPatternCharacter)
3575
3576         * yarr/YarrErrorCode.cpp:
3577         (JSC::Yarr::errorMessage):
3578         (JSC::Yarr::errorToThrow):
3579         * yarr/YarrErrorCode.h:
3580         * yarr/YarrParser.h:
3581         (JSC::Yarr::Parser::parseTokens):
3582
3583 2020-01-31  Don Olmstead  <don.olmstead@sony.com>
3584
3585         [CMake] Add _PRIVATE_LIBRARIES to framework
3586         https://bugs.webkit.org/show_bug.cgi?id=207004
3587
3588         Reviewed by Konstantin Tokarev.
3589
3590         Move uses of PRIVATE within _LIBRARIES to _PRIVATE_LIBRARIES. Any _LIBRARIES appended
3591         afterwards will have that visibility set erroneously.
3592
3593         * PlatformFTW.cmake:
3594
3595 2020-01-30  Mark Lam  <mark.lam@apple.com>
3596
3597         Some improvements to DFG and FTL dumps to improve readability and searchability.
3598         https://bugs.webkit.org/show_bug.cgi?id=207024
3599
3600         Reviewed by Saam Barati.
3601
3602         This patch applies the following changes:
3603
3604         1. Prefix Air and B2 dumps with a tierName prefix.
3605            The tierName prefix strings are as follows:
3606
3607                "FTL ", "DFG ", "b3  ", "Air ", "asm "
3608
3609            The choice to use a lowercase "b3" and "asm" with upper case "Air" is
3610            deliberate because I found this combination to be easier to read and scan as
3611            prefixes of the dump lines.  See dump samples below.
3612
3613         2. Make DFG node IDs consistently expressed as D@<node index> e.g. D@104.
3614            The definition of the node will be the id followed by a colon e.g. D@104:
3615            This makes it easy to search references to this node anywhere in the dump.
3616
3617            Make B3 nodes expressed as b@<node index> e.g. b@542.
3618            This also makes it searchable since there's now no ambiguity between b@542 and
3619            D@542.
3620
3621            The choice to use a lowercase "b" and an uppercase "D" is intentional because
3622            "b@542" and "d@542" looks too similar, and I prefer to not use too much
3623            uppercase.  Plus this makes the node consistent in capitalization with the
3624            tierName prefixes above of "b3  " and "DFG " respectively.
3625
3626         Here's a sample of what the dumps now look like:
3627
3628         DFG graph dump:
3629         <code>
3630             ...
3631                  6 55:   <-- foo#DFndCW:<0x62d0000b8140, bc#65, Call, known callee: Object: 0x62d000035920 with butterfly 0x0 (Structure %AN:Function), StructureID: 12711, numArgs+this = 1, numFixup = 0, stackOffset = -16 (loc0 maps to loc16)>
3632               3  6 55:   D@79:< 3:->    ArithAdd(Int32:Kill:D@95, Int32:D@42, Int32|PureNum|UseAsOther, Int32, CheckOverflow, Exits, bc#71, ExitValid)
3633               4  6 55:    D@3:<!0:->    KillStack(MustGen, loc7, W:Stack(loc7), ClobbersExit, bc#71, ExitInvalid)
3634               5  6 55:   D@85:<!0:->    MovHint(Check:Untyped:D@79, MustGen, loc7, W:SideState, ClobbersExit, bc#71, ExitInvalid)
3635               6  6 55:  D@102:< 1:->    CompareLess(Int32:D@79, Int32:D@89, Boolean|UseAsOther, Bool, Exits, bc#74, ExitValid)
3636               7  6 55:  D@104:<!0:->    Branch(KnownBoolean:Kill:D@102, MustGen, T:#1/w:10.000000, F:#7/w:1.000000, W:SideState, bc#74, ExitInvalid)
3637             ...
3638         </code>
3639
3640         B3 graph dump:
3641         <code>
3642             ...
3643             b3  BB#14: ; frequency = 10.000000
3644             b3    Predecessors: #13
3645             b3      Int32 b@531 = CheckAdd(b@10:WarmAny, $1(b@1):WarmAny, b@64:ColdAny, b@10:ColdAny, generator = 0x606000022e80, earlyClobbered = [], lateClobbered = [], usedRegisters = [], ExitsSideways|Reads:Top, D@79)
3646             b3      Int32 b@539 = LessThan(b@531, $100(b@578), D@102)
3647             b3      Void b@542 = Branch(b@539, Terminal, D@104)
3648             b3    Successors: Then:#2, Else:#15
3649             ...
3650         </code>
3651
3652         Air graph dump:
3653         <code>
3654             ...
3655             Air BB#5: ; frequency = 10.000000
3656             Air   Predecessors: #4
3657             Air     Move -96(%rbp), %rax, b@531
3658             Air     Patch &BranchAdd32(3,ForceLateUseUnlessRecoverable)3, Overflow, $1, %rax, -104(%rbp), -96(%rbp), b@531
3659             Air     Branch32 LessThan, %rax, $100, b@542
3660             Air   Successors: #1, #6
3661             ...
3662         </code>
3663
3664         FTL disassembly dump:
3665         <code>
3666             ...
3667             Air BB#5: ; frequency = 10.000000
3668             Air   Predecessors: #4
3669             DFG       D@42:< 2:->   JSConstant(JS|PureInt, Int32, Int32: 1, bc#0, ExitInvalid)
3670             DFG       D@79:< 3:->   ArithAdd(Int32:Kill:D@95, Int32:D@42, Int32|PureNum|UseAsOther, Int32, CheckOverflow, Exits, bc#71, ExitValid)
3671             b3            Int32 b@1 = Const32(1)
3672             b3            Int32 b@531 = CheckAdd(b@10:WarmAny, $1(b@1):WarmAny, b@64:ColdAny, b@10:ColdAny, generator = 0x606000022e80, earlyClobbered = [], lateClobbered = [], usedRegisters = [%rax, %rbx, %rbp, %r12], ExitsSideways|Reads:Top, D@79)
3673             Air               Move -96(%rbp), %rax, b@531
3674             asm                   0x4576b9c04712: mov -0x60(%rbp), %rax
3675             Air               Patch &BranchAdd32(3,ForceLateUseUnlessRecoverable)3, Overflow, $1, %rax, -104(%rbp), -96(%rbp), b@531
3676             asm                   0x4576b9c04716: inc %eax
3677             asm                   0x4576b9c04718: jo 0x4576b9c04861
3678             DFG       D@89:< 1:->   JSConstant(JS|PureNum|UseAsOther, NonBoolInt32, Int32: 100, bc#0, ExitInvalid)
3679             DFG      D@102:< 1:->   CompareLess(Int32:D@79, Int32:D@89, Boolean|UseAsOther, Bool, Exits, bc#74, ExitValid)
3680             DFG      D@104:<!0:->   Branch(KnownBoolean:Kill:D@102, MustGen, T:#1/w:10.000000, F:#7/w:1.000000, W:SideState, bc#74, ExitInvalid)
3681             b3            Int32 b@578 = Const32(100, D@89)
3682             b3            Int32 b@539 = LessThan(b@531, $100(b@578), D@102)
3683             b3            Void b@542 = Branch(b@539, Terminal, D@104)
3684             Air               Branch32 LessThan, %rax, $100, b@542
3685             asm                   0x4576b9c0471e: cmp $0x64, %eax
3686             asm                   0x4576b9c04721: jl 0x4576b9c0462f
3687             Air   Successors: #1, #6
3688             ...
3689         </code>
3690
3691         * b3/B3BasicBlock.cpp:
3692         (JSC::B3::BasicBlock::deepDump const):
3693         * b3/B3Common.cpp:
3694         * b3/B3Common.h:
3695         * b3/B3Generate.cpp:
3696         (JSC::B3::generateToAir):
3697         * b3/B3Procedure.cpp:
3698         (JSC::B3::Procedure::dump const):
3699         * b3/B3Value.cpp:
3700         * b3/air/AirBasicBlock.cpp:
3701         (JSC::B3::Air::BasicBlock::deepDump const):
3702         (JSC::B3::Air::BasicBlock::dumpHeader const):
3703         (JSC::B3::Air::BasicBlock::dumpFooter const):
3704         * b3/air/AirCode.cpp:
3705         (JSC::B3::Air::Code::dump const):
3706         * b3/air/AirCode.h:
3707         * b3/air/AirDisassembler.cpp:
3708         (JSC::B3::Air::Disassembler::dump):
3709         * b3/air/AirGenerate.cpp:
3710         (JSC::B3::Air::prepareForGeneration):
3711         * dfg/DFGCommon.cpp:
3712         * dfg/DFGCommon.h:
3713         * dfg/DFGGraph.cpp:
3714         (JSC::DFG::Graph::dump):
3715         (JSC::DFG::Graph::dumpBlockHeader):
3716         * dfg/DFGNode.cpp:
3717         (WTF::printInternal):
3718         * ftl/FTLCompile.cpp:
3719         (JSC::FTL::compile):
3720         * ftl/FTLCompile.h:
3721         * ftl/FTLState.cpp:
3722         (JSC::FTL::State::State):
3723
3724 2020-01-30  Yusuke Suzuki  <ysuzuki@apple.com>
3725
3726         [WTF] Remove PackedIntVector
3727         https://bugs.webkit.org/show_bug.cgi?id=207018
3728
3729         Reviewed by Mark Lam.
3730
3731         * bytecode/BytecodeBasicBlock.h:
3732
3733 2020-01-30  Yusuke Suzuki  <ysuzuki@apple.com>
3734
3735         [JSC] Remove unnecessary allocations in BytecodeBasicBlock
3736         https://bugs.webkit.org/show_bug.cgi?id=206986
3737
3738         Reviewed by Mark Lam.
3739
3740         We know that BytecodeBasicBlock itself takes 2MB in Gmail. And each BytecodeBasicBlock has Vector<unsigned>
3741         and Vector<BytecodeBasicBlock*>.
3742
3743         BytecodeBasicBlock holds all the offset per bytecode as unsigned in m_offsets. But this offset is
3744         only used when reverse iterating a bytecode in a BytecodeBasicBlock. We can hold a length of each
3745         bytecode instead, which is much smaller (unsigned v.s. uint8_t).
3746
3747         Since each BytecodeBasicBlock has index, we should hold successors in Vector<unsigned> instead of Vector<BytecodeBasicBlock*>.
3748
3749         We are also allocating BytecodeBasicBlock in makeUnique<> and having them in Vector<std::unique_ptr<BytecodeBasicBlock>>.
3750         But this is not necessary since only BytecodeBasicBlock::compute can modify this vector. We should generate Vector<BytecodeBasicBlock>
3751         from BytecodeBasicBlock::compute.
3752
3753         We are also planning purging BytecodeBasicBlock in UnlinkedCodeBlock if it is not used so much. But this will be done in a separate patch.
3754
3755         * bytecode/BytecodeBasicBlock.cpp:
3756         (JSC::BytecodeBasicBlock::BytecodeBasicBlock):
3757         (JSC::BytecodeBasicBlock::addLength):
3758         (JSC::BytecodeBasicBlock::shrinkToFit):
3759         (JSC::BytecodeBasicBlock::computeImpl):
3760         (JSC::BytecodeBasicBlock::compute):
3761         * bytecode/BytecodeBasicBlock.h:
3762         (JSC::BytecodeBasicBlock::delta const):
3763         (JSC::BytecodeBasicBlock::successors const):
3764         (JSC::BytecodeBasicBlock::operator bool const):
3765         (JSC::BytecodeBasicBlock::addSuccessor):
3766         (JSC::BytecodeBasicBlock::offsets const): Deleted.
3767         (JSC::BytecodeBasicBlock:: const): Deleted.
3768         (JSC::BytecodeBasicBlock::BytecodeBasicBlock): Deleted.
3769         (JSC::BytecodeBasicBlock::addLength): Deleted.
3770         * bytecode/BytecodeGeneratorification.cpp:
3771         (JSC::BytecodeGeneratorification::BytecodeGeneratorification):
3772         * bytecode/BytecodeGraph.h:
3773         (JSC::BytecodeGraph::blockContainsBytecodeOffset):
3774         (JSC::BytecodeGraph::findBasicBlockForBytecodeOffset):
3775         (JSC::BytecodeGraph::findBasicBlockWithLeaderOffset):
3776         (JSC::BytecodeGraph::at const):
3777         (JSC::BytecodeGraph::operator[] const):
3778         (JSC::BytecodeGraph::begin):
3779         (JSC::BytecodeGraph::end):
3780         (JSC::BytecodeGraph::first):
3781         (JSC::BytecodeGraph::last):
3782         (JSC::BytecodeGraph::BytecodeGraph):
3783         (JSC::BytecodeGraph::begin const): Deleted.
3784         (JSC::BytecodeGraph::end const): Deleted.
3785         * bytecode/BytecodeLivenessAnalysis.cpp:
3786         (JSC::BytecodeLivenessAnalysis::getLivenessInfoAtBytecodeIndex):
3787         (JSC::BytecodeLivenessAnalysis::computeFullLiveness):
3788         (JSC::BytecodeLivenessAnalysis::computeKills):
3789         (JSC::BytecodeLivenessAnalysis::dumpResults):
3790         * bytecode/BytecodeLivenessAnalysis.h:
3791         * bytecode/BytecodeLivenessAnalysisInlines.h:
3792         (JSC::BytecodeLivenessPropagation::computeLocalLivenessForBytecodeIndex):
3793         (JSC::BytecodeLivenessPropagation::computeLocalLivenessForBlock):
3794         (JSC::BytecodeLivenessPropagation::getLivenessInfoAtBytecodeIndex):
3795         (JSC::BytecodeLivenessPropagation::runLivenessFixpoint):
3796         * bytecode/InstructionStream.h:
3797         (JSC::InstructionStream::MutableRef::operator-> const):
3798         (JSC::InstructionStream::MutableRef::ptr const):
3799         (JSC::InstructionStream::MutableRef::unwrap const):
3800         * bytecode/Opcode.h:
3801         * generator/Section.rb:
3802         * jit/JIT.cpp:
3803         (JSC::JIT::privateCompileMainPass):
3804         * llint/LLIntData.cpp:
3805         (JSC::LLInt::initialize):
3806         * llint/LowLevelInterpreter.cpp:
3807         (JSC::CLoop::execute):
3808
3809 2020-01-30  Alexey Shvayka  <shvaikalesh@gmail.com>
3810
3811         Incomplete braced quantifiers should be banned in Unicode patterns only
3812         https://bugs.webkit.org/show_bug.cgi?id=206776
3813
3814         Reviewed by Darin Adler.
3815
3816         This change adds SyntaxError for Unicode patterns, aligning JSC with
3817         V8 and SpiderMonkey, and also capitalizes "Unicode" in error messages.
3818
3819         Grammar: https://tc39.es/ecma262/#prod-annexB-Term
3820         (/u flag precludes the use of ExtendedAtom and thus InvalidBracedQuantifier)
3821
3822         * yarr/YarrErrorCode.cpp:
3823         (JSC::Yarr::errorMessage):
3824         (JSC::Yarr::errorToThrow):
3825         * yarr/YarrErrorCode.h:
3826         * yarr/YarrParser.h:
3827         (JSC::Yarr::Parser::parseTokens):
3828
3829 2020-01-30  Yusuke Suzuki  <ysuzuki@apple.com>
3830
3831         [JSC] Make SourceProviderCacheItem small
3832         https://bugs.webkit.org/show_bug.cgi?id=206987
3833
3834         Reviewed by Mark Lam.
3835
3836         We know this becomes very large when parsing a large script, and it is noticeable in some of RAMification tests.
3837         We should use PackedPtr to shrink size of SourceProviderCacheItem.
3838
3839         * parser/Parser.h:
3840         (JSC::Scope::restoreFromSourceProviderCache):
3841         * parser/SourceProviderCacheItem.h:
3842         (JSC::SourceProviderCacheItem::usedVariables const):
3843         (JSC::SourceProviderCacheItem::SourceProviderCacheItem):
3844
3845 2020-01-30  Keith Miller  <keith_miller@apple.com>
3846
3847         Parser needs to restore unary stack state when backtracking
3848         https://bugs.webkit.org/show_bug.cgi?id=206972
3849
3850         Reviewed by Saam Barati.
3851
3852         Previously we would try to parse possibly stale unary operator
3853         stack entries after backtracking from a parse error.  This would
3854         cause us to think one token was a different token while reparsing
3855         after backtracking. Additionally, this patch fixes an issue where
3856         the syntax checker would think assignment expressions were resolve
3857         expressions. Intrestingly, this was not tested in test262.
3858
3859         Lastly, I tried adding some assertions to improve help diagnose
3860         when our source text locations are incorrect.
3861
3862         * bytecompiler/BytecodeGenerator.h:
3863         (JSC::BytecodeGenerator::emitExpressionInfo):
3864         * bytecompiler/NodesCodegen.cpp:
3865         (JSC::ThisNode::emitBytecode):
3866         (JSC::ResolveNode::emitBytecode):
3867         (JSC::EmptyVarExpression::emitBytecode):
3868         (JSC::EmptyLetExpression::emitBytecode):
3869         (JSC::ForInNode::emitLoopHeader):
3870         (JSC::ForOfNode::emitBytecode):
3871         (JSC::DefineFieldNode::emitBytecode):
3872         * parser/ASTBuilder.h:
3873         (JSC::ASTBuilder::unaryTokenStackDepth const):
3874         (JSC::ASTBuilder::setUnaryTokenStackDepth):
3875         * parser/Lexer.cpp:
3876         (JSC::Lexer<T>::Lexer):
3877         * parser/Lexer.h:
3878         (JSC::Lexer::setLineNumber):
3879         * parser/Nodes.cpp:
3880         (JSC::FunctionMetadataNode::operator== const):
3881         * parser/Nodes.h:
3882         (JSC::ThrowableExpressionData::ThrowableExpressionData):
3883         (JSC::ThrowableExpressionData::setExceptionSourceCode):
3884         (JSC::ThrowableExpressionData::checkConsistency const):
3885         * parser/Parser.cpp:
3886         (JSC::Parser<LexerType>::isArrowFunctionParameters):
3887         (JSC::Parser<LexerType>::parseSourceElements):
3888         (JSC::Parser<LexerType>::parseModuleSourceElements):
3889         (JSC::Parser<LexerType>::parseStatementListItem):
3890         (JSC::Parser<LexerType>::parseAssignmentElement):
3891         (JSC::Parser<LexerType>::parseForStatement):
3892         (JSC::Parser<LexerType>::maybeParseAsyncFunctionDeclarationStatement):
3893         (JSC::Parser<LexerType>::parseFunctionInfo):
3894         (JSC::Parser<LexerType>::parseClass):
3895         (JSC::Parser<LexerType>::parseExportDeclaration):
3896         (JSC::Parser<LexerType>::parseAssignmentExpression):
3897         (JSC::Parser<LexerType>::parseYieldExpression):
3898         (JSC::Parser<LexerType>::parseProperty):
3899         (JSC::Parser<LexerType>::parseMemberExpression):
3900         (JSC::Parser<LexerType>::parseUnaryExpression):
3901         * parser/Parser.h:
3902         (JSC::Parser::lexCurrentTokenAgainUnderCurrentContext):