d874baf699c08c97afa4cc785113c367a5c6a0b4
[WebKit.git] / Source / JavaScriptCore / ChangeLog
1 2019-08-16  Ryan Haddad  <ryanhaddad@apple.com>
2
3         Unreviewed, rolling out r248709.
4
5         Caused test/built-ins/Promise/prototype/finally/this-value-
6         non-promise.js to fail on test262 bot
7
8         Reverted changeset:
9
10         "ProxyObject should not be allow to access its target's
11         private properties."
12         https://bugs.webkit.org/show_bug.cgi?id=200739
13         https://trac.webkit.org/changeset/248709
14
15 2019-08-15  Yusuke Suzuki  <ysuzuki@apple.com>
16
17         [WTF] Add makeUnique<T>, which ensures T is fast-allocated, WTF_MAKE_FAST_ALLOCATED annotation part
18         https://bugs.webkit.org/show_bug.cgi?id=200620
19
20         Reviewed by Geoffrey Garen.
21
22         Three patches including this one were originally one patch. I split it into three pieces to make roll-out easy.
23         This part, we annotate classes / structs with WTF_MAKE_FAST_ALLOCATED and WTF_MAKE_STRUCT_FAST_ALLOCATED if
24         they are allocated from std::make_unique. The second patch will switch `std::make_unique` to `WTF::makeUnique` and
25         the third patch will insert a static_assert that makeUnique-allocated class T is FastMalloc-ed.
26         One insight from this patch is that we tend to forget adding WTF_MAKE_STRUCT_FAST_ALLOCATED if it is just a data struct.
27
28         * debugger/Debugger.h:
29         * inspector/scripts/codegen/objc_generator_templates.py:
30         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
31         * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
32         * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
33         * inspector/scripts/tests/generic/expected/definitions-with-mac-platform.json-result:
34         * inspector/scripts/tests/generic/expected/domain-availability.json-result:
35         * inspector/scripts/tests/generic/expected/domains-with-varying-command-sizes.json-result:
36         * inspector/scripts/tests/generic/expected/enum-values.json-result:
37         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
38         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
39         * inspector/scripts/tests/generic/expected/same-type-id-different-domain.json-result:
40         * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
41         * inspector/scripts/tests/generic/expected/should-strip-comments.json-result:
42         * inspector/scripts/tests/generic/expected/type-declaration-aliased-primitive-type.json-result:
43         * inspector/scripts/tests/generic/expected/type-declaration-array-type.json-result:
44         * inspector/scripts/tests/generic/expected/type-declaration-enum-type.json-result:
45         * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
46         * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
47         * inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result:
48         * inspector/scripts/tests/generic/expected/version.json-result:
49         * inspector/scripts/tests/ios/expected/definitions-with-mac-platform.json-result:
50         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
51
52 2019-08-15  Brent Fulgham  <bfulgham@apple.com>
53
54         [FTW] Enable CoreFoundation use if building for Apple target
55         https://bugs.webkit.org/show_bug.cgi?id=200799
56
57         Reviewed by Alex Christensen.
58
59         * PlatformFTW.cmake: Add missing files.
60
61 2019-08-15  Alexey Shvayka  <shvaikalesh@gmail.com>
62
63         DateConversion::formatDateTime incorrectly formats negative years
64         https://bugs.webkit.org/show_bug.cgi?id=199964
65
66         Reviewed by Ross Kirsling.
67
68         Currently, year is always padded to max length of 4, including the minus sign "-".
69         With this change, only absolute value of year is padded to max length of 4 and
70         preceded by minus sign "-" if the year is negative.
71         (steps 6-10 of https://tc39.es/ecma262/#sec-datestring)
72
73         * runtime/DateConversion.cpp:
74         (JSC::appendNumber):
75
76 2019-08-15  Mark Lam  <mark.lam@apple.com>
77
78         More missing exception checks in String.prototype.
79         https://bugs.webkit.org/show_bug.cgi?id=200762
80         <rdar://problem/54333896>
81
82         Reviewed by Michael Saboff.
83
84         * runtime/StringPrototype.cpp:
85         (JSC::replaceUsingRegExpSearch):
86         (JSC::operationStringProtoFuncReplaceRegExpString):
87         (JSC::stringProtoFuncLastIndexOf):
88         (JSC::stringProtoFuncToLowerCase):
89         (JSC::stringProtoFuncToUpperCase):
90
91 2019-08-15  Joseph Pecoraro  <pecoraro@apple.com>
92
93         for-await-of has bad error message if used in non-async function
94         https://bugs.webkit.org/show_bug.cgi?id=200758
95
96         Reviewed by Ross Kirsling.
97
98         * parser/Parser.cpp:
99         (JSC::Parser<LexerType>::parseForStatement):
100         Improve error message.
101
102 2019-08-14  Yusuke Suzuki  <ysuzuki@apple.com>
103
104         [JSC] Air does not appropriately propagate ConstFloatValue to stackmap
105         https://bugs.webkit.org/show_bug.cgi?id=200759
106
107         Reviewed by Saam Barati.
108
109         In B3MoveConstant phase, we convert ConstFloatValue and ConstDoubleValue to memory access to the table
110         to avoid large immediates *except for* stackmap argument case. This is because materializing constant doubles
111         and floats as memory-access before passing it to stackmap is wasteful: the stackmap may not use it actually, or
112         stackmap can do better job if it knows the parameter is constant.
113
114         Based on the above operation, B3LowerToAir phase strongly assumes that all ConstFloatValue and ConstDoubleValue
115         are removed except for the case used for parameter of stackmap. With r192377, B3LowerToAir catch this case, and
116         propagate constant double value as ValueRep in stackmap. While B3LowerToAir does this correctly for ConstDoubleValue,
117         we missed adding this support for ConstFloatValue.
118
119         This patch adds r192377's support for ConstFloatValue to propagate ConstFloatValue correctly to the stackmap.
120         This issue starts appearing since Wasm BBQ-B3 OSR starts putting ConstFloatValue to OSR-tier-up patchpoint.
121
122         * b3/B3LowerToAir.cpp:
123         * b3/B3ValueKey.h:
124         (JSC::B3::ValueKey::ValueKey):
125         (JSC::B3::ValueKey::floatValue const):
126         * b3/B3ValueRep.h:
127         (JSC::B3::ValueRep::constantFloat):
128         (JSC::B3::ValueRep::floatValue const):
129         * b3/testb3.h:
130         * b3/testb3_1.cpp:
131         (run):
132         * b3/testb3_5.cpp:
133         (testPatchpointManyWarmAnyImms):
134         (testPatchpointManyColdAnyImms):
135         (testPatchpointManyImms): Deleted.
136
137 2019-08-14  Keith Rollin  <krollin@apple.com>
138
139         Remove support for macOS < 10.13
140         https://bugs.webkit.org/show_bug.cgi?id=200694
141         <rdar://problem/54278851>
142
143         Reviewed by Youenn Fablet.
144
145         Update conditionals that reference __MAC_OS_X_VERSION_MIN_REQUIRED and
146         __MAC_OS_X_VERSION_MAX_ALLOWED, assuming that they both have values >=
147         101300. This means that expressions like
148         "__MAC_OS_X_VERSION_MIN_REQUIRED < 101300" are always False and
149         "__MAC_OS_X_VERSION_MIN_REQUIRED >= 101300" are always True.
150
151         * API/WebKitAvailability.h:
152
153 2019-08-14  Mark Lam  <mark.lam@apple.com>
154
155         ProxyObject should not be allow to access its target's private properties.
156         https://bugs.webkit.org/show_bug.cgi?id=200739
157         <rdar://problem/53972768>
158
159         Reviewed by Yusuke Suzuki.
160
161         * runtime/ProxyObject.cpp:
162         (JSC::performProxyGet):
163         (JSC::ProxyObject::performInternalMethodGetOwnProperty):
164         (JSC::ProxyObject::performHasProperty):
165         (JSC::ProxyObject::performPut):
166         (JSC::ProxyObject::performDelete):
167         (JSC::ProxyObject::performDefineOwnProperty):
168
169 2019-08-14  Mark Lam  <mark.lam@apple.com>
170
171         Missing exception check in string compare.
172         https://bugs.webkit.org/show_bug.cgi?id=200743
173         <rdar://problem/53975356>
174
175         Reviewed by Michael Saboff.
176
177         * runtime/JSString.cpp:
178         (JSC::JSString::equalSlowCase const):
179
180 2019-08-14  Yusuke Suzuki  <ysuzuki@apple.com>
181
182         Unreviewed, build fix for MacroAssemblerARM64E change
183         https://bugs.webkit.org/show_bug.cgi?id=200703
184
185         * assembler/MacroAssemblerARM64E.h:
186         (JSC::MacroAssemblerARM64E::farJump):
187
188 2019-08-14  Yusuke Suzuki  <ysuzuki@apple.com>
189
190         [JSC] Less contended MetaAllocator
191         https://bugs.webkit.org/show_bug.cgi?id=200278
192
193         Reviewed by Mark Lam.
194
195         The profiler result of JetStream2/bomb-workers shows that we are having contention under MetaAllocator::currentStatistics.
196         This function is called in ExecutableAllocator::memoryPressureMultiplier, and it is called from ExecutableCounter's threshold
197         calculation. But MetaAllocator::currentStatistics takes a global lock inside MetaAllocator and causes contention. However,
198         we do not need to have a lock actually: clients of MetaAllocator::currentStatistics typically use bytesReserved and bytesAllocated
199         information. However, since our executable allocator is fixed-sized, bytesReserved is always the fixed size. So just reading bytesAllocated
200         racily is enough.
201
202         This patch attempts to reduce the contention by the following two things.
203
204         1. Read bytesAllocated racily instead of calling MetaAllocator::currentStatistics. Then ExecutableCounter does not need to take a lock.
205         2. page lifetime management APIs of MetaAllocator should take a second `count` parameter to batch the system calls.
206
207         * jit/ExecutableAllocator.cpp:
208         (JSC::ExecutableAllocator::underMemoryPressure):
209         (JSC::ExecutableAllocator::memoryPressureMultiplier):
210         (JSC::ExecutableAllocator::allocate):
211         (JSC::FixedVMPoolExecutableAllocator::FixedVMPoolExecutableAllocator): Deleted.
212         (JSC::FixedVMPoolExecutableAllocator::memoryStart): Deleted.
213         (JSC::FixedVMPoolExecutableAllocator::memoryEnd): Deleted.
214         (JSC::FixedVMPoolExecutableAllocator::isJITPC): Deleted.
215         (JSC::FixedVMPoolExecutableAllocator::initializeSeparatedWXHeaps): Deleted.
216         (JSC::FixedVMPoolExecutableAllocator::jitWriteThunkGenerator): Deleted.
217         (JSC::FixedVMPoolExecutableAllocator::genericWriteToJITRegion): Deleted.
218
219 2019-08-14  Yusuke Suzuki  <ysuzuki@apple.com>
220
221         [JSC] Make PAC jump and return more explicit
222         https://bugs.webkit.org/show_bug.cgi?id=200703
223
224         Reviewed by Mark Lam.
225
226         This patch refactors our macro assembler, mainly related to PAC.
227
228         1. Make far-jump explicit by renaming `jump` to `farJump`.
229         2. Remove unused makeTailRecursiveCall and tailRecursiveCall.
230         3. Do not make `ARM64EAssembler::ret` as `retab`. MacroAssemblerARM64E should call `retab` explicitly instead.
231
232         * assembler/ARM64EAssembler.h:
233         (JSC::ARM64EAssembler::ret): Deleted.
234         * assembler/MacroAssembler.h:
235         * assembler/MacroAssemblerARM64.h:
236         (JSC::MacroAssemblerARM64::farJump):
237         (JSC::MacroAssemblerARM64::makeTailRecursiveCall): Deleted.
238         (JSC::MacroAssemblerARM64::tailRecursiveCall): Deleted.
239         * assembler/MacroAssemblerARM64E.h:
240         (JSC::MacroAssemblerARM64E::farJump):
241         (JSC::MacroAssemblerARM64E::ret):
242         * assembler/MacroAssemblerARMv7.h:
243         (JSC::MacroAssemblerARMv7::farJump):
244         (JSC::MacroAssemblerARMv7::relativeTableJump):
245         (JSC::MacroAssemblerARMv7::tailRecursiveCall): Deleted.
246         (JSC::MacroAssemblerARMv7::makeTailRecursiveCall): Deleted.
247         * assembler/MacroAssemblerMIPS.h:
248         (JSC::MacroAssemblerMIPS::farJump):
249         (JSC::MacroAssemblerMIPS::tailRecursiveCall): Deleted.
250         (JSC::MacroAssemblerMIPS::makeTailRecursiveCall): Deleted.
251         * assembler/MacroAssemblerX86.h:
252         (JSC::MacroAssemblerX86::farJump):
253         (JSC::MacroAssemblerX86::jump): Deleted.
254         (JSC::MacroAssemblerX86::tailRecursiveCall): Deleted.
255         (JSC::MacroAssemblerX86::makeTailRecursiveCall): Deleted.
256         * assembler/MacroAssemblerX86Common.h:
257         (JSC::MacroAssemblerX86Common::farJump):
258         * assembler/MacroAssemblerX86_64.h:
259         (JSC::MacroAssemblerX86_64::farJump):
260         (JSC::MacroAssemblerX86_64::jump): Deleted.
261         (JSC::MacroAssemblerX86_64::tailRecursiveCall): Deleted.
262         (JSC::MacroAssemblerX86_64::makeTailRecursiveCall): Deleted.
263         * b3/B3LowerMacros.cpp:
264         * b3/testb3_6.cpp:
265         (testInterpreter):
266         * dfg/DFGOSRExitCompilerCommon.cpp:
267         (JSC::DFG::adjustAndJumpToTarget):
268         * dfg/DFGSpeculativeJIT.cpp:
269         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
270         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
271         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
272         * dfg/DFGSpeculativeJIT64.cpp:
273         (JSC::DFG::SpeculativeJIT::compile):
274         * dfg/DFGThunks.cpp:
275         (JSC::DFG::osrExitGenerationThunkGenerator):
276         (JSC::DFG::osrEntryThunkGenerator):
277         * jit/CCallHelpers.h:
278         (JSC::CCallHelpers::jumpToExceptionHandler):
279         * jit/JIT.cpp:
280         (JSC::JIT::emitEnterOptimizationCheck):
281         * jit/JITOpcodes.cpp:
282         (JSC::JIT::emit_op_catch):
283         (JSC::JIT::emit_op_switch_imm):
284         (JSC::JIT::emit_op_switch_char):
285         (JSC::JIT::emit_op_switch_string):
286         (JSC::JIT::emitSlow_op_loop_hint):
287         * jit/JITOpcodes32_64.cpp:
288         (JSC::JIT::emit_op_catch):
289         (JSC::JIT::emit_op_switch_imm):
290         (JSC::JIT::emit_op_switch_char):
291         (JSC::JIT::emit_op_switch_string):
292         * jit/ThunkGenerators.cpp:
293         (JSC::slowPathFor):
294         (JSC::virtualThunkFor):
295         * llint/LLIntThunks.cpp:
296         (JSC::LLInt::generateThunkWithJumpTo):
297         * wasm/WasmBinding.cpp:
298         (JSC::Wasm::wasmToWasm):
299         * wasm/WasmThunks.cpp:
300         (JSC::Wasm::throwExceptionFromWasmThunkGenerator):
301         * wasm/js/WasmToJS.cpp:
302         (JSC::Wasm::emitThrowWasmToJSException):
303         * yarr/YarrJIT.cpp:
304         (JSC::Yarr::YarrGenerator::loadFromFrameAndJump):
305
306 2019-08-14  Joseph Pecoraro  <pecoraro@apple.com>
307
308         Web Inspector: Remove bad semicolon in generation of ObjC methods
309         https://bugs.webkit.org/show_bug.cgi?id=200655
310
311         Reviewed by Devin Rousso.
312
313         * inspector/scripts/codegen/generate_objc_frontend_dispatcher_implementation.py:
314         (ObjCFrontendDispatcherImplementationGenerator._generate_event_dispatcher_implementations):
315         Do not include a semicolon in the method implementation.
316
317         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
318         * inspector/scripts/tests/generic/expected/enum-values.json-result:
319         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
320         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
321         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
322         Updated results.
323
324 2019-08-13  Saam Barati  <sbarati@apple.com>
325
326         Add a way to opt out of kern TCSM for layout tests
327         https://bugs.webkit.org/show_bug.cgi?id=200649
328         <rdar://problem/51304923>
329
330         Reviewed by Alexey Proskuryakov.
331
332         * assembler/CPU.cpp:
333         (JSC::isKernTCSMAvailable):
334         * runtime/Options.h:
335
336 2019-08-13  Sam Weinig  <weinig@apple.com>
337
338         Rename StringBuilder::append(UChar32) to StringBuilder::appendCharacter(UChar32) to avoid accidental change in behavior when replacing append with flexibleAppend
339         https://bugs.webkit.org/show_bug.cgi?id=200675
340
341         Reviewed by Darin Adler.
342
343         * yarr/YarrParser.h:
344         (JSC::Yarr::Parser::tryConsumeGroupName):
345         (JSC::Yarr::Parser::tryConsumeUnicodePropertyExpression):
346         Update for rename from StringBuilder::append(UChar32) to StringBuilder::appendCharacter(UChar32).
347
348 2019-08-13  Mark Lam  <mark.lam@apple.com>
349
350         Add phase, block, and node numbers to left margin of DFG graph dumps.
351         https://bugs.webkit.org/show_bug.cgi?id=200693
352
353         Reviewed by Saam Barati.
354
355         When scrolling through the DFG graph dumps, it's easy to get lost as to which phase
356         or block one is looking at, especially if the blocks are long.  This patch adds
357         node index, block number, and phase number on the left margin of the dumps.
358         Here's a sample:
359
360                53:     %Bd:Function                   = 0x1079fd960:[Function, {}, NonArray, Proto:0x1079d8000, Leaf]
361                53:     %Bf:Function                   = 0x1079b0700:[Function, {name:100, prototype:101, length:102, stackTraceLimit:103}, NonArray, Proto:0x1079d8000, Leaf]
362                53:     %Bj:Function                   = 0x1079fd5e0:[Function, {name:100, length:101, toString:102, apply:103, call:104, bind:105, Symbol.hasInstance:106, caller:107, arguments:108, constructor:109}, NonArray, Proto:0x1079c0000, Leaf]
363                53:     %CV:JSGlobalLexicalEnvironment = 0x1079fd6c0:[JSGlobalLexicalEnvironment, {}, NonArray, Leaf]
364
365                53: Phase liveness analysis changed the IR.
366
367                54: Beginning DFG phase OSR availability analysis.
368                54: Before OSR availability analysis:
369
370                54: DFG for foo#DXMNag:[0x1079a4850->0x1079a4130->0x1079c7600, DFGFunctionCall, 204 (NeverInline)]:
371                54:   Fixpoint state: FixpointConverged; Form: SSA; Unification state: GloballyUnified; Ref count state: ExactRefCount
372                54:   Argument formats for entrypoint index: 0 : FlushedJSValue, FlushedCell, FlushedJSValue
373
374              0 54: Block #0 (bc#0): (OSR target)
375              0 54:   Execution count: 1.000000
376              0 54:   Predecessors:
377              0 54:   Successors:
378              0 54:   Dominated by: #0
379              0 54:   Dominates: #0
380              0 54:   Dominance Frontier: 
381              0 54:   Iterated Dominance Frontier: 
382              0 54:   Backwards dominates by: #root #0
383              0 54:   Backwards dominates: #0
384              0 54:   Control equivalent to: #0
385              0 54:   States: StructuresAreWatched
386              0 54:   Live:
387              0 54:   Values 
388           0  0 54:   53:< 1:-> JSConstant(JS|UseAsOther, Other, Null, bc#0, ExitValid)
389           1  0 54:   64:< 2:-> JSConstant(JS|UseAsOther, NonBoolInt32, Int32: 10, bc#0, ExitValid)
390           2  0 54:    3:< 5:-> JSConstant(JS|PureInt, Other, Undefined, bc#0, ExitValid)
391           3  0 54:   32:< 1:-> JSConstant(JS|UseAsOther, Bool, False, bc#0, ExitValid)
392           4  0 54:   19:< 2:-> JSConstant(JS|UseAsOther, OtherObj, Weak:Object: 0x1079d4000 with butterfly 0x0 (Structure %CV:JSGlobalLexicalEnvironment), StructureID: 31423, bc#0, ExitValid)
393
394         The numbers in the left margin before the ':' are node index (i.e. the index of the
395         node in the block, not to be confused with node->index() which is the node ID), block
396         number, and phase number respectively.  Now, we can scroll thru the dumps quickly
397         and tell at a glance when we've scrolled passed the end of a phase, or block.
398         These sets of numbers can also serve as a positional marker that we can search for
399         to return to a node in the dump after scrolling away.
400
401         Currently, these numbers are only added to the DFG part.  The FTL (from lowering
402         to B3 onwards) does not have this feature yet.
403
404         * dfg/DFGDesiredWatchpoints.cpp:
405         (JSC::DFG::DesiredWatchpoints::dumpInContext const):
406         * dfg/DFGDesiredWatchpoints.h:
407         * dfg/DFGGraph.cpp:
408         (JSC::DFG::Graph::dumpCodeOrigin):
409         (JSC::DFG::Graph::dump):
410         (JSC::DFG::Graph::dumpBlockHeader):
411         (JSC::DFG::Prefix::dump const):
412         * dfg/DFGGraph.h:
413         (JSC::DFG::Prefix::Prefix):
414         (JSC::DFG::Prefix::clearBlockIndex):
415         (JSC::DFG::Prefix::clearNodeIndex):
416         (JSC::DFG::Prefix::enable):
417         (JSC::DFG::Prefix::disable):
418         (JSC::DFG::Graph::prefix):
419         (JSC::DFG::Graph::nextPhase):
420         * dfg/DFGPhase.cpp:
421         (JSC::DFG::Phase::beginPhase):
422         * dfg/DFGPhase.h:
423         (JSC::DFG::runAndLog):
424         * dfg/DFGPlan.cpp:
425         (JSC::DFG::Plan::compileInThreadImpl):
426         * dfg/DFGValueRepReductionPhase.cpp:
427         (JSC::DFG::ValueRepReductionPhase::convertValueRepsToDouble):
428
429 2019-08-13  Michael Saboff  <msaboff@apple.com>
430
431         REGRESSION (r248533): JSC Command - Need to initializeMainThread() before processing config file
432         https://bugs.webkit.org/show_bug.cgi?id=200677
433
434         Reviewed by Mark Lam.
435
436         We need to initialize the main thread before calling processConfigFile() since it uses RefCounted objects
437         which have "is main thread" ASSERTS.
438
439         * jsc.cpp:
440         (jscmain):
441
442 2019-08-13  Devin Rousso  <drousso@apple.com>
443
444         Web Inspector: Styles: show @supports CSS groupings
445         https://bugs.webkit.org/show_bug.cgi?id=200419
446         <rdar://problem/53971948>
447
448         Reviewed by Joseph Pecoraro.
449
450         * inspector/protocol/CSS.json:
451         Rename `CSSMedia` to `Grouping` and remove the `sourceLine` value, as it was never populated
452         and wasn't used by Web Inspector.
453
454         * inspector/scripts/codegen/objc_generator_templates.py:
455         * inspector/scripts/codegen/generate_objc_header.py:
456         (ObjCHeaderGenerator.generate_output):
457         Add support for including files at the end of <WebInspector/RWIProtocol.h> for compatibility
458         statements so that changes to the Web Inspector protocol don't break other clients.
459
460 2019-08-13  Joseph Pecoraro  <pecoraro@apple.com>
461
462         JSContext Inspector: Basic CommandLineAPI doesn't work
463         https://bugs.webkit.org/show_bug.cgi?id=200659
464         <rdar://problem/54245476>
465
466         Reviewed by Brian Burg.
467
468         * inspector/InjectedScriptSource.js:
469         (BasicCommandLineAPI):
470         Use `method` directly since it already has been setup nicely and doesn't
471         need to be bound. Technically this allows someone to add properties to
472         the CommandLineAPI methods in basic mode (`dir.property = 1`) but that
473         seems harmless.
474
475 2019-08-12  Sam Weinig  <weinig@apple.com>
476
477         Replace multiparameter overloads of append() in StringBuilder as a first step toward standardizinging on the flexibleAppend() implementation
478         https://bugs.webkit.org/show_bug.cgi?id=200614
479
480         Reviewed by Darin Adler.
481
482         Renames StringBuilder::append(const LChar*, unsigned), StringBuilder::append(const UChar*, unsigned) and 
483         StringBuilder::append(const char*, unsigned) to StringBuilder::appendCharacters(...).
484         
485         Renames StringBuilder::append(const String& string, unsigned offset, unsigned length) to 
486         StringBuilder::appendSubstring(...).
487
488         * dfg/DFGStrengthReductionPhase.cpp:
489         (JSC::DFG::StrengthReductionPhase::handleNode):
490         * runtime/ConfigFile.cpp:
491         (JSC::ConfigFile::parse):
492         * runtime/LiteralParser.cpp:
493         (JSC::LiteralParser<CharType>::Lexer::lexStringSlow):
494         * tools/FunctionOverrides.cpp:
495         (JSC::parseClause):
496         Update for renames.
497
498 2019-08-12  Adrian Perez de Castro  <aperez@igalia.com>
499
500         [WPE][GTK] Fix building without unified sources
501         https://bugs.webkit.org/show_bug.cgi?id=200641
502
503         Reviewed by Žan Doberšek.
504
505         * b3/B3PatchpointSpecial.cpp: Add missing inclusion of the B3ProcedureInlines.h header.
506         * heap/SlotVisitor.cpp: Add missing inclusion of the BlockDirectoryInlines.h header.
507
508 2019-08-12  Yusuke Suzuki  <ysuzuki@apple.com>
509
510         [WTF][JSC] Make JSC and WTF aggressively-fast-malloced
511         https://bugs.webkit.org/show_bug.cgi?id=200611
512
513         Reviewed by Saam Barati.
514
515         This patch aggressively puts many classes into FastMalloc. In JSC side, we grep `std::make_unique` etc. to find potentially system-malloc-allocated classes.
516         After this patch, all the JSC related allocations in JetStream2 cli is done from bmalloc. In the future, it would be nice that we add `WTF::makeUnique<T>` helper
517         function and throw a compile error if `T` is not FastMalloc annotated[1].
518
519         Putting WebKit classes in FastMalloc has many benefits.
520
521         1. Simply, it is fast.
522         2. vmmap can tell the amount of memory used for WebKit.
523         3. bmalloc can isolate WebKit memory allocation from the rest of the world. This is useful since we can know more about what component is corrupting the memory
524            from the memory corruption crash.
525
526         [1]: https://bugs.webkit.org/show_bug.cgi?id=200620
527
528         * API/ObjCCallbackFunction.mm:
529         * assembler/AbstractMacroAssembler.h:
530         * b3/B3PhiChildren.h:
531         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h:
532         * b3/air/AirDisassembler.h:
533         * bytecode/AccessCaseSnippetParams.h:
534         * bytecode/CallVariant.h:
535         * bytecode/DeferredSourceDump.h:
536         * bytecode/ExecutionCounter.h:
537         * bytecode/GetByIdStatus.h:
538         * bytecode/GetByIdVariant.h:
539         * bytecode/InByIdStatus.h:
540         * bytecode/InByIdVariant.h:
541         * bytecode/InstanceOfStatus.h:
542         * bytecode/InstanceOfVariant.h:
543         * bytecode/PutByIdStatus.h:
544         * bytecode/PutByIdVariant.h:
545         * bytecode/ValueProfile.h:
546         * dfg/DFGAbstractInterpreter.h:
547         * dfg/DFGByteCodeParser.cpp:
548         (JSC::DFG::ByteCodeParser::newVariableAccessData):
549         * dfg/DFGFlowIndexing.h:
550         * dfg/DFGFlowMap.h:
551         * dfg/DFGLiveCatchVariablePreservationPhase.cpp:
552         (JSC::DFG::LiveCatchVariablePreservationPhase::newVariableAccessData):
553         * dfg/DFGMaximalFlushInsertionPhase.cpp:
554         (JSC::DFG::MaximalFlushInsertionPhase::newVariableAccessData):
555         * dfg/DFGOSRExit.h:
556         * dfg/DFGSpeculativeJIT.h:
557         * dfg/DFGVariableAccessData.h:
558         * disassembler/ARM64/A64DOpcode.h:
559         * inspector/remote/socket/RemoteInspectorMessageParser.h:
560         * inspector/remote/socket/RemoteInspectorSocket.h:
561         * inspector/remote/socket/RemoteInspectorSocketEndpoint.h:
562         * jit/PCToCodeOriginMap.h:
563         * runtime/BasicBlockLocation.h:
564         * runtime/DoublePredictionFuzzerAgent.h:
565         * runtime/JSRunLoopTimer.h:
566         * runtime/PromiseDeferredTimer.h:
567         (JSC::PromiseDeferredTimer::create): PromiseDeferredTimer should be allocated as `Ref<>` instead of `std::unique_ptr` since it is inheriting ThreadSafeRefCounted<>.
568         Holding such a class with std::unique_ptr could lead to potentially dangerous operations (like, someone holds it with Ref<> while it is deleted by std::unique_ptr<>).
569         * runtime/RandomizingFuzzerAgent.h:
570         * runtime/SymbolTable.h:
571         * runtime/VM.cpp:
572         (JSC::VM::VM):
573         * runtime/VM.h:
574         * tools/JSDollarVM.cpp:
575         * tools/SigillCrashAnalyzer.cpp:
576         * wasm/WasmFormat.h:
577         * wasm/WasmMemory.cpp:
578         * wasm/WasmSignature.h:
579         * yarr/YarrJIT.h:
580
581 2019-08-12  Chris Dumez  <cdumez@apple.com>
582
583         Add threading assertions to RefCounted
584         https://bugs.webkit.org/show_bug.cgi?id=200507
585
586         Reviewed by Ryosuke Niwa.
587
588         * dfg/DFGPlan.cpp:
589         (JSC::DFG::Plan::Plan):
590         Disable threading assertions for DFG::Plan::m_inlineCallFrames while the JSC team
591         investigates.
592
593 2019-08-12  Chris Dumez  <cdumez@apple.com>
594
595         Unreviewed, rolling out r248525.
596
597         Revert new threading assertions while I work on fixing the
598         issues they exposed
599
600         Reverted changeset:
601
602         "Add threading assertions to RefCounted"
603         https://bugs.webkit.org/show_bug.cgi?id=200507
604         https://trac.webkit.org/changeset/248525
605
606 2019-08-11  Chris Dumez  <cdumez@apple.com>
607
608         Add threading assertions to RefCounted
609         https://bugs.webkit.org/show_bug.cgi?id=200507
610
611         Reviewed by Ryosuke Niwa.
612
613         * dfg/DFGPlan.cpp:
614         (JSC::DFG::Plan::Plan):
615         Disable threading assertions for DFG::Plan::m_inlineCallFrames while the JSC team
616         investigates.
617
618 2019-08-09  Yusuke Suzuki  <ysuzuki@apple.com>
619
620         Universal XSS in JSObject::putInlineSlow and JSValue::putToPrimitive
621         https://bugs.webkit.org/show_bug.cgi?id=199864
622
623         Reviewed by Saam Barati.
624
625         Our JSObject::put implementation is not correct in term of the spec. Our [[Put]] implementation is something like this.
626
627             JSObject::put(object):
628                 if (can-do-fast-path(object))
629                     return fast-path(object);
630                 // slow-path
631                 do {
632                     object-put-check-and-setter-calls(object); // (1)
633                     object = object->prototype;
634                 } while (is-object(object));
635                 return do-put(object);
636
637         Since JSObject::put is registered in the methodTable, the derived classes can override it. Some of classes are adding
638         extra checks to this put.
639
640             Derived::put(object):
641                 if (do-extra-check(object))
642                     fail
643                 return JSObject::put(object)
644
645         The problem is that Derived::put is only called when the |this| object is the Derived class. When traversing [[Prototype]] in
646         JSObject::put, at (1), we do not perform the extra checks added in Derived::put even if `object` is Derived one. This means that
647         we skip the check.
648
649         Currently, JSObject::put and WebCore checking mechanism are broken. JSObject::put should call getOwnPropertySlot at (1) to
650         perform the additional checks. This behavior is matching against the spec. However, currently, our JSObject::getOwnPropertySlot
651         does not propagate setter information. This is required to cache cacheable [[Put]] at (1) for CustomValue, CustomAccessor, and
652         Accessors. We also need to reconsider how to integrate static property setters to this mechanism. So, basically, this involves
653         large refactoring to renew our JSObject::put and JSObject::getOwnPropertySlot.
654
655         To work-around for now, we add a new TypeInfo flag, HasPutPropertySecurityCheck . And adding this flag to DOM objects
656         that implements the addition checks. We also add doPutPropertySecurityCheck method hook to perform the check in JSObject.
657         When we found this flag at (1), we perform doPutPropertySecurityCheck to properly perform the checks.
658
659         Since our JSObject::put code is old and it does not match against the spec now, we should refactor it largely. This is tracked separately in [1].
660
661         [1]: https://bugs.webkit.org/show_bug.cgi?id=200562
662
663         * runtime/ClassInfo.h:
664         * runtime/JSCJSValue.cpp:
665         (JSC::JSValue::putToPrimitive):
666         * runtime/JSCell.cpp:
667         (JSC::JSCell::doPutPropertySecurityCheck):
668         * runtime/JSCell.h:
669         * runtime/JSObject.cpp:
670         (JSC::JSObject::putInlineSlow):
671         (JSC::JSObject::getOwnPropertyDescriptor):
672         * runtime/JSObject.h:
673         (JSC::JSObject::doPutPropertySecurityCheck):
674         * runtime/JSTypeInfo.h:
675         (JSC::TypeInfo::hasPutPropertySecurityCheck const):
676
677 2019-08-08  Per Arne Vollan  <pvollan@apple.com>
678
679         [Win] Fix internal build
680         https://bugs.webkit.org/show_bug.cgi?id=200519
681
682         Reviewed by Alex Christensen.
683
684         The script 'generate-js-builtins.py' cannot be found when building WebCore. Copy the JavaScriptCore Scripts
685         folder after building JSC.
686
687         * JavaScriptCore.vcxproj/JavaScriptCore.proj:
688
689 2019-08-08  Devin Rousso  <drousso@apple.com>
690
691         Web Inspector: Page: don't allow the domain to be disabled
692         https://bugs.webkit.org/show_bug.cgi?id=200109
693
694         Reviewed by Brian Burg.
695
696         The `PageAgent` is relied on by many of the other agents, so much so that it doesn't make
697         sense to support the ability to "disable" (as well as "enable") the agent.
698
699         When the first frontend connects, we should treat the `PageAgent` as active and available.
700
701         * inspector/protocol/Page.json:
702         Remove `enable`/`disable`.
703
704 2019-08-08  Michael Saboff  <msaboff@apple.com>
705
706         OpenSource MemoryFootprint API for JSC command line tool
707         https://bugs.webkit.org/show_bug.cgi?id=200541
708
709         Reviewed by Saam Barati.
710
711         Use wtf/spi/darwin/ProcessMemoryFootprint.h instead of WebKitAdditions/MemoryFootprint.h
712         for process memory stats.
713
714         * jsc.cpp:
715         (MemoryFootprint::MemoryFootprint):
716
717 2019-08-08  Devin Rousso  <drousso@apple.com>
718
719         Web Inspector: rename `queryObjects` to `queryInstances` for clarity
720         https://bugs.webkit.org/show_bug.cgi?id=200520
721
722         Reviewed by Brian Burg.
723
724         * inspector/InjectedScriptSource.js:
725         (queryInstances): Added.
726         (queryObjects):
727         * inspector/JSInjectedScriptHost.h:
728         * inspector/JSInjectedScriptHost.cpp:
729         (Inspector::JSInjectedScriptHost::queryInstances): Added.
730         (Inspector::JSInjectedScriptHost::queryObjects): Deleted.
731         * inspector/JSInjectedScriptHostPrototype.cpp:
732         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
733         (Inspector::jsInjectedScriptHostPrototypeFunctionQueryInstances): Added.
734         (Inspector::jsInjectedScriptHostPrototypeFunctionQueryObjects): Deleted.
735
736 2019-08-08  Ross Kirsling  <ross.kirsling@sony.com>
737
738         [JSC] Add "jump if (not) undefined or null" bytecode ops
739         https://bugs.webkit.org/show_bug.cgi?id=200480
740
741         Reviewed by Saam Barati.
742
743         This patch introduces fused jumps for op_is_undefined_or_null, which ignores "masquerade as undefined" behavior.
744
745         This lets us fix a edge-case bug in RequireObjectCoercible (where `({ length } = document.all)` was a TypeError)
746         and moreover provides a very useful optimization for the new ?. and ?? operators, which have semantics centered
747         around op_jundefined_or_null and op_jnundefined_or_null, respectively.
748
749         * bytecode/BytecodeList.rb:
750         * bytecode/BytecodeUseDef.h:
751         (JSC::computeUsesForBytecodeOffset):
752         (JSC::computeDefsForBytecodeOffset):
753         * bytecode/Opcode.h:
754         (JSC::isBranch):
755         * bytecode/PreciseJumpTargetsInlines.h:
756         * bytecompiler/BytecodeGenerator.cpp:
757         (JSC::Label::setLocation):
758         (JSC::BytecodeGenerator::emitJumpIfTrue):
759         (JSC::BytecodeGenerator::emitJumpIfFalse):
760         (JSC::BytecodeGenerator::emitRequireObjectCoercible):
761         * dfg/DFGByteCodeParser.cpp:
762         (JSC::DFG::ByteCodeParser::parseBlock):
763         * dfg/DFGCapabilities.cpp:
764         (JSC::DFG::capabilityLevel):
765         * jit/JIT.cpp:
766         (JSC::JIT::privateCompileMainPass):
767         * jit/JIT.h:
768         * jit/JITOpcodes.cpp:
769         (JSC::JIT::emit_op_jundefined_or_null): Added.
770         (JSC::JIT::emit_op_jnundefined_or_null): Added.
771         * jit/JITOpcodes32_64.cpp:
772         (JSC::JIT::emit_op_jundefined_or_null): Added.
773         (JSC::JIT::emit_op_jnundefined_or_null): Added.
774         * llint/LowLevelInterpreter32_64.asm:
775         * llint/LowLevelInterpreter64.asm:
776
777 2019-08-07  Devin Rousso  <drousso@apple.com>
778
779         Rebase inspector generator tests.
780
781         Rubber-stamped by Brian Burg.
782
783         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
784         * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
785         * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
786         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
787         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
788         * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
789         * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
790         * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
791         * inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result:
792         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
793
794 2019-08-07  Caio Lima  <ticaiolima@gmail.com>
795
796         High number of cache miss on localTimeOffset
797         https://bugs.webkit.org/show_bug.cgi?id=200444
798
799         Reviewed by Darin Adler.
800
801         This patch is separating the `LocalTimeOffsetCache` for each
802         `WTF::TimeType` to avoid constant cache miss on pathological cases
803         where `gregorianDateTimeToMS` and `msToGregorianDateTime` are
804         intercaleted with `inputTimeType ==  WTF::LocalTime`. Such case
805         happens during execution of Facebook Messenger
806         (https://www.messenger.com).
807
808         * runtime/JSDateMath.cpp:
809         (JSC::localTimeOffset):
810         (JSC::gregorianDateTimeToMS):
811         * runtime/VM.cpp:
812         (JSC::VM::resetDateCache):
813         * runtime/VM.h:
814         (JSC::LocalTimeOffsetCache::LocalTimeOffsetCache):
815         (JSC::LocalTimeOffsetCache::reset):
816
817 2019-08-06  Yusuke Suzuki  <ysuzuki@apple.com>
818
819         [JSC] sampling-profiler can see garbage Wasm::Callee* pointer which is HashTable deleted / empty values
820         https://bugs.webkit.org/show_bug.cgi?id=200494
821
822         Reviewed by Saam Barati.
823
824         The sampling-profiler can see a garbage pointer which is like Wasm::Callee*. This can be filtered by HashSet<Callee*>.
825         But this is safe only when the garbage pointer is not deleted / empty values. We saw occasional crash with JetStream2/tsf-wasm.
826         This patch filters out these values with `HashSet<Callee*>::isValidValue`.
827
828         * wasm/WasmCalleeRegistry.h:
829         (JSC::Wasm::CalleeRegistry::isValidCallee):
830
831 2019-08-06  Commit Queue  <commit-queue@webkit.org>
832
833         Unreviewed, rolling out r248289.
834         https://bugs.webkit.org/show_bug.cgi?id=200488
835
836         Broke internal builds (Requested by drousso on #webkit).
837
838         Reverted changeset:
839
840         "Web Inspector: Styles: show @supports CSS groupings"
841         https://bugs.webkit.org/show_bug.cgi?id=200419
842         https://trac.webkit.org/changeset/248289
843
844 2019-08-06  Devin Rousso  <drousso@apple.com>
845
846         Web Inspector: allow comments in protocol JSON
847         https://bugs.webkit.org/show_bug.cgi?id=200104
848
849         Reviewed by Brian Burg.
850
851         * inspector/scripts/generate-inspector-protocol-bindings.py:
852         (generate_from_specification.load_specification):
853
854         * inspector/scripts/tests/generic/should-strip-comments.json: Added.
855         * inspector/scripts/tests/generic/expected/should-strip-comments.json-result: Added.
856
857 2019-08-06  Per Arne Vollan  <pvollan@apple.com>
858
859         [Win] Fix AppleWin build
860         https://bugs.webkit.org/show_bug.cgi?id=200455
861
862         Reviewed by Alex Christensen.
863
864         * CMakeLists.txt:
865         * shell/CMakeLists.txt:
866
867 2019-08-05  Devin Rousso  <drousso@apple.com>
868
869         Web Inspector: Styles: show @supports CSS groupings
870         https://bugs.webkit.org/show_bug.cgi?id=200419
871
872         Reviewed by Joseph Pecoraro.
873
874         * inspector/protocol/CSS.json:
875         Rename `CSSMedia` to `Grouping` and remove the `sourceLine` value, as it was never populated
876         and wasn't used by Web Inspector.
877
878 2019-08-05  Devin Rousso  <drousso@apple.com>
879
880         Can't use $0, $1 etc when inspecting Google Docs pages because the content uses these for function names
881         https://bugs.webkit.org/show_bug.cgi?id=195834
882
883         Reviewed by Joseph Pecoraro.
884
885         Allow the user to alias saved results by providing a different prefix (e.g. "$") from within
886         Web Inspector. When changing the alias, all existing saved results will update to be
887         reference-able from the new alias.
888
889         * inspector/protocol/Runtime.json:
890         Add `setSavedResultAlias` command.
891
892         * inspector/agents/InspectorRuntimeAgent.h:
893         * inspector/agents/InspectorRuntimeAgent.cpp:
894         (Inspector::InspectorRuntimeAgent::setSavedResultAlias): Added.
895
896         * inspector/InjectedScriptHost.h:
897         (Inspector::InjectedScriptHost::setSavedResultAlias): Added.
898         (Inspector::InjectedScriptHost::savedResultAlias const): Added.
899         * inspector/JSInjectedScriptHost.h:
900         * inspector/JSInjectedScriptHost.cpp:
901         (Inspector::JSInjectedScriptHost::savedResultAlias const): Added.
902         * inspector/JSInjectedScriptHostPrototype.cpp:
903         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
904         (Inspector::jsInjectedScriptHostPrototypeAttributeSavedResultAlias): Added.
905         Store the saved result alias on the `InjectedScriptHost` since it is a shared object among
906         all `InjectedScript`.
907
908         * inspector/InjectedScriptSource.js:
909         (BasicCommandLineAPI):
910
911 2019-08-05  Devin Rousso  <drousso@apple.com>
912
913         Web Inspector: Timelines: disable related agents when the tab is closed
914         https://bugs.webkit.org/show_bug.cgi?id=200118
915
916         Reviewed by Joseph Pecoraro.
917
918         Rework how `enable`/`disable` is used for timeline-related agents so that events are not sent
919         and data isn't kept alive when the Timelines tab isn't enabled.
920
921         * inspector/protocol/Timeline.json:
922         Add `enable`/`disable` commands.
923
924         * inspector/agents/InspectorHeapAgent.cpp:
925         (Inspector::InspectorHeapAgent::willDestroyFrontendAndBackend):
926         (Inspector::InspectorHeapAgent::enable):
927         (Inspector::InspectorHeapAgent::disable):
928
929 2019-08-05  Devin Rousso  <drousso@apple.com>
930
931         Web Inspector: rename "Stylesheet" to "Style Sheet" to match spec text
932         https://bugs.webkit.org/show_bug.cgi?id=200422
933
934         Reviewed by Joseph Pecoraro.
935
936         * inspector/protocol/Page.json:
937
938 2019-08-05  Michael Saboff  <msaboff@apple.com>
939
940         JSC: assertion failure in SpeculativeJIT::compileGetByValOnIntTypedArray
941         https://bugs.webkit.org/show_bug.cgi?id=199997
942
943         Reviewed by Saam Barati.
944
945         No need to ASSERT(node->arrayMode().alreadyChecked(...)) in SpeculativeJIT::compileGetByValOnIntTypedArray()
946         and compileGetByValOnFloatTypedArray() as the abstract interpreter is conservative and can insert a
947         CheckStructureOrEmpty which will fail the ASSERT as it checks for the SpecType of the array
948         and not for SpecEmpty.  If we added a check for the SpecEmpty in the ASSERT, there are cases where
949         it won't be set.
950
951         * dfg/DFGSpeculativeJIT.cpp:
952         (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray):
953         (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray):
954
955 2019-08-03  Devin Rousso  <drousso@apple.com>
956
957         Web Inspector: DOM: add a special breakpoint for "All Events"
958         https://bugs.webkit.org/show_bug.cgi?id=200285
959
960         Reviewed by Joseph Pecoraro.
961
962         Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint
963         that would pause for any DOM event, regardless of the event's name. This is useful for
964         situations where the event name isn't known, or where one simply wants to pause on the next
965         entry to the event loop.
966
967         Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval"
968         event breakpoints into special breakpoints that can be added/removed via the create
969         breakpoint context menu. This simplifies the process for setting these breakpoints, and also
970         makes them more discoverable (most people wouldn't consider them to be "events").
971
972         * inspector/protocol/Debugger.json:
973          - Rename the `EventListener` pause reason to `Listener`.
974          - Split the `Timer` pause reason into `Interval` and `Timeout`.
975
976         * inspector/protocol/DOMDebugger.json:
977          - Split the `timer` type into `interval` and `timeout`.
978          - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted,
979            the corresponding breakpoint that is added/removed is treated as a global breakpoint that
980            applies to all events of that type (e.g. a global `listener` breakpoint would pause for
981            any event that is fired).
982
983 2019-08-02  Keith Miller  <keith_miller@apple.com>
984
985         Address comments on r248178
986         https://bugs.webkit.org/show_bug.cgi?id=200411
987
988         Reviewed by Saam Barati.
989
990         * b3/B3Opcode.h:
991         * b3/B3Procedure.h:
992         (JSC::B3::Procedure::tuples const):
993         * b3/B3Validate.cpp:
994         * b3/testb3_1.cpp:
995         (main):
996
997 2019-08-02  Mark Lam  <mark.lam@apple.com>
998
999         [ARM64E] Harden the diversity of the DOMJIT::Signature::unsafeFunction pointer.
1000         https://bugs.webkit.org/show_bug.cgi?id=200292
1001         <rdar://problem/53706881>
1002
1003         Reviewed by Geoffrey Garen.
1004
1005         Previously, DOMJIT::Signature::functionWithoutTypeCheck was signed as a C function
1006         pointer.  We can do better by signing it like a vtbl function pointer.
1007
1008         No new tests needed.  The DOMJIT mechanism is covered by existing tests.
1009
1010         I also manually confirmed that DOMJIT::Signature::functionWithoutTypeCheck is signed
1011         exactly as expected by reading its bits out of memory (not letting Clang have a
1012         chance to resign it into a C function pointer) and comparing it against manually
1013         signed bits with the expected diversifier.
1014
1015         * assembler/MacroAssemblerCodeRef.h:
1016         (JSC::CFunctionPtr::CFunctionPtr):
1017         (JSC::CFunctionPtr::get const):
1018         (JSC::CFunctionPtr::address const):
1019         (JSC::CFunctionPtr::operator bool const):
1020         (JSC::CFunctionPtr::operator! const):
1021         (JSC::CFunctionPtr::operator== const):
1022         (JSC::CFunctionPtr::operator!= const):
1023
1024         - Introduce a CFunctionPtr abstraction that is used to hold pointers to C functions.
1025           It can instantiated in 4 ways:
1026
1027           1. The default constructor.
1028           2. A constructor that takes a nullptr_t.
1029
1030              These 2 forms will instantiate a CFunctionPtr with a nullptr.
1031
1032           3. A constructor that takes the name of a function.
1033           4. A constructor that takes a function pointer.
1034
1035               Form 3 already knows that we're initializing with a real function, and
1036               that Clang will give it to use signed as a C function pointer.  So, it
1037               doesn't do any assertions.  This form is useful for initializing CFunctionPtrs
1038               embedded in const data structures.
1039
1040               Form 4 is an explicit constructor that takes an arbitrary function
1041               pointer, but does not know if that pointer is already signed as a C function
1042               pointer.  Hence, this form will do a RELEASE_ASSERT that the given function
1043               pointer is actually signed as a C function pointer.
1044
1045           Once instantiated, we are guaranteed that a C function pointer is either null
1046           or contains a signed C function pointer.
1047
1048         * domjit/DOMJITSignature.h:
1049         (JSC::DOMJIT::Signature::Signature):
1050         - Sign functionWithoutTypeCheck as WTF_VTBL_FUNCPTR_PTRAUTH(DOMJITFunctionPtrTag).
1051
1052         * dfg/DFGSpeculativeJIT.cpp:
1053         (JSC::DFG::SpeculativeJIT::compileCallDOM):
1054         * ftl/FTLLowerDFGToB3.cpp:
1055         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOM):
1056         - Use the new CFunctionPtr to document that the retrieved signature->functionWithoutTypeCheck
1057           is signed as a C function pointer.
1058
1059         * runtime/ClassInfo.h:
1060         - Update MethodTable to sign its function pointers using the new WTF_VTBL_FUNCPTR_PTRAUTH_STR
1061           to be consistent.  No longer need to roll its own PTRAUTH macro.
1062
1063         * runtime/JSCPtrTag.h:
1064         - Add DOMJITFunctionPtrTag.
1065
1066         * tools/JSDollarVM.cpp:
1067         - Update to work with the new DOMJIT::Signature constructor.
1068
1069 2019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
1070
1071         [JSC] Support WebAssembly in SamplingProfiler
1072         https://bugs.webkit.org/show_bug.cgi?id=200329
1073
1074         Reviewed by Saam Barati.
1075
1076         The sampling profiler support is critical to investigate what is actually time-consuming. This patch adds the sampling profiler support for Wasm functions
1077         to list up hot Wasm functions with compilation mode (BBQ or OMG). This allows us to investigate the hot functions in JetStream2 wasm tests.
1078
1079         In order to retrieve wasm function information from the sampling profiler safely, we need to know whether the given Wasm CalleeBits is valid in the call frame.
1080         To achieve this, we start collecting valid Wasm::Callee pointers in a global hash set. Previously, each Wasm::Callee registered its code region to a hash set
1081         for wasm fault signal handler to know whether the faulted program-counter is in wasm region. We reuse and change this mechanism. Instead of registering code region,
1082         we register Wasm::Callee* to a hash set. The sampling profiler reuses this hash set to determine whether the given bits is a valid Wasm::Callee.
1083
1084         The sampling profiler retrieves the information safely from valid Wasm::Callee* pointer. It is possible that this Wasm::Callee is about to be dead: ref-count is 0,
1085         now in the middle of the destructor of Wasm::Callee. Even in that case, fields of Wasm::Callee are still valid and can be accessed since destroying these fields happens
1086         after we unregister Wasm::Callee from the global hash set.
1087
1088         We retrieve Wasm::IndexOrName and Wasm::CompilationMode. Copying them does not involve any allocations, locking etc. So we can safely copy them while some of threads are suspended.
1089
1090         This patch also fixes the issue that we never called `unregisterCode` while every Wasm::Calllee registers its code region through `registerCode`.
1091
1092         * CMakeLists.txt:
1093         * JavaScriptCore.xcodeproj/project.pbxproj:
1094         * Sources.txt:
1095         * runtime/InitializeThreading.cpp:
1096         (JSC::initializeThreading):
1097         * runtime/SamplingProfiler.cpp:
1098         (JSC::FrameWalker::FrameWalker):
1099         (JSC::FrameWalker::recordJSFrame):
1100         (JSC::CFrameWalker::CFrameWalker):
1101         (JSC::SamplingProfiler::takeSample):
1102         (JSC::SamplingProfiler::processUnverifiedStackTraces):
1103         (JSC::SamplingProfiler::StackFrame::displayName):
1104         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
1105         (JSC::SamplingProfiler::StackFrame::functionStartLine):
1106         (JSC::SamplingProfiler::StackFrame::functionStartColumn):
1107         (JSC::SamplingProfiler::StackFrame::sourceID):
1108         (JSC::SamplingProfiler::StackFrame::url):
1109         (JSC::SamplingProfiler::reportTopBytecodes):
1110         (WTF::printInternal):
1111         * runtime/SamplingProfiler.h:
1112         * tools/JSDollarVM.cpp:
1113         (JSC::functionIsWasmSupported):
1114         (JSC::JSDollarVM::finishCreation):
1115         * wasm/WasmB3IRGenerator.h:
1116         * wasm/WasmBBQPlan.cpp:
1117         (JSC::Wasm::BBQPlan::complete):
1118         * wasm/WasmBBQPlanInlines.h:
1119         (JSC::Wasm::BBQPlan::initializeCallees):
1120         * wasm/WasmCallee.cpp:
1121         (JSC::Wasm::Callee::Callee):
1122         (JSC::Wasm::Callee::~Callee):
1123         * wasm/WasmCallee.h:
1124         (JSC::Wasm::Callee::create): Deleted.
1125         (JSC::Wasm::Callee::entrypoint const): Deleted.
1126         (JSC::Wasm::Callee::calleeSaveRegisters): Deleted.
1127         (JSC::Wasm::Callee::indexOrName const): Deleted.
1128         * wasm/WasmCalleeRegistry.cpp: Copied from Source/JavaScriptCore/wasm/WasmFaultSignalHandler.h.
1129         (JSC::Wasm::CalleeRegistry::initialize):
1130         (JSC::Wasm::CalleeRegistry::singleton):
1131         * wasm/WasmCalleeRegistry.h: Copied from Source/JavaScriptCore/wasm/WasmCallee.cpp.
1132         (JSC::Wasm::CalleeRegistry::getLock):
1133         (JSC::Wasm::CalleeRegistry::registerCallee):
1134         (JSC::Wasm::CalleeRegistry::unregisterCallee):
1135         (JSC::Wasm::CalleeRegistry::isValidCallee):
1136         * wasm/WasmCompilationMode.cpp: Copied from Source/JavaScriptCore/wasm/WasmFaultSignalHandler.h.
1137         (JSC::Wasm::makeString):
1138         * wasm/WasmCompilationMode.h: Copied from Source/JavaScriptCore/wasm/WasmFaultSignalHandler.h.
1139         * wasm/WasmFaultSignalHandler.cpp:
1140         (JSC::Wasm::trapHandler):
1141         (JSC::Wasm::enableFastMemory):
1142         (JSC::Wasm::registerCode): Deleted.
1143         (JSC::Wasm::unregisterCode): Deleted.
1144         * wasm/WasmFaultSignalHandler.h:
1145         * wasm/WasmIndexOrName.h:
1146         * wasm/WasmOMGPlan.cpp:
1147         (JSC::Wasm::OMGPlan::work):
1148
1149 2019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
1150
1151         [JSC] LazyJSValue should be robust for empty JSValue
1152         https://bugs.webkit.org/show_bug.cgi?id=200388
1153
1154         Reviewed by Saam Barati.
1155
1156         If the Switch DFG node is preceded by ForceOSRExit or something that invalidates the basic block,
1157         it can take a FrozenValue as a child which includes empty value instead of string, number etc.
1158         If this Switch node is kept and we reached to DFGCFGSimplificationPhase, it will use this FrozenValue.
1159         However, LazyJSValue using this FrozenValue strongly assumes that FrozenValue is never holding empty value.
1160         But this assumption is wrong. This patch makes LazyJSValue robust for empty value.
1161
1162         * dfg/DFGLazyJSValue.cpp:
1163         (JSC::DFG::LazyJSValue::tryGetStringImpl const):
1164         (JSC::DFG::LazyJSValue::tryGetString const):
1165         (JSC::DFG::LazyJSValue::strictEqual const):
1166         (JSC::DFG::LazyJSValue::switchLookupValue const):
1167
1168 2019-08-02  Devin Rousso  <drousso@apple.com>
1169
1170         Web Inspector: Storage: disable related agents when the tab is closed
1171         https://bugs.webkit.org/show_bug.cgi?id=200117
1172
1173         Reviewed by Joseph Pecoraro.
1174
1175         Rework how `enable`/`disable` is used for storage-related agents so that events are not sent
1176         and data isn't kept alive when the Storage tab isn't enabled.
1177
1178         * inspector/protocol/ApplicationCache.json:
1179         Add `disable` command.
1180
1181 2019-08-01  Keith Miller  <keith_miller@apple.com>
1182
1183         B3 should support tuple types
1184         https://bugs.webkit.org/show_bug.cgi?id=200327
1185
1186         Reviewed by Filip Pizlo.
1187
1188         As part of the Wasm multi-value proposal, we need to teach B3 that
1189         patchpoints can return more than one value.  This is done by
1190         adding a new B3::Type called Tuple. Unlike, other B3 types Tuple
1191         is actually an encoded index into a numeric B3::Type vector on the
1192         procedure. This lets us distinguish any two tuples from each
1193         other, moreover, it's possible to get the vector of types with
1194         just the B3::Tuple type and the procedure.
1195
1196         Since most B3 operations only expect to see a single numeric child
1197         there is a new Opcode, Extract, that takes yields the some, fixed,
1198         entry from a tuple value. Extract would be the only other change
1199         needed to make tuples work in B3 except that some optimizations
1200         expect to be able to take any non-Void value and stick it into a
1201         Variable of the same type. This means both Get/Set from a variable
1202         have to support Tuples as well. For simplicity and consistency,
1203         the ability to accept tuples is also applied to Phi and Upsilon.
1204
1205         In order to lower a Tuple, B3Lowering needs to have a Tmp for each
1206         nested type in a Tuple. While we could reuse the existing
1207         IndexedTables to hold the extra information we need to lower
1208         Tuples, we instead use a two new HashTables for Value->Tmp(s) and
1209         Phi->Tmp(s). It's expected that Tuples will be sufficiently
1210         uncommon the overhead of tracking everything together would be
1211         prohibitive. On the other hand, we don't worry about this for
1212         Variables because we don't expect those to make it to lowering.
1213
1214         * JavaScriptCore.xcodeproj/project.pbxproj:
1215         * Sources.txt:
1216         * b3/B3Bank.h:
1217         (JSC::B3::bankForType):
1218         * b3/B3CheckValue.cpp:
1219         (JSC::B3::CheckValue::CheckValue):
1220         * b3/B3ExtractValue.cpp: Copied from Source/JavaScriptCore/b3/B3ProcedureInlines.h.
1221         (JSC::B3::ExtractValue::~ExtractValue):
1222         (JSC::B3::ExtractValue::dumpMeta const):
1223         * b3/B3ExtractValue.h: Copied from Source/JavaScriptCore/b3/B3FixSSA.h.
1224         * b3/B3FixSSA.h:
1225         * b3/B3LowerMacros.cpp:
1226         * b3/B3LowerMacrosAfterOptimizations.cpp:
1227         * b3/B3LowerToAir.cpp:
1228         * b3/B3NativeTraits.h:
1229         * b3/B3Opcode.cpp:
1230         (JSC::B3::invertedCompare):
1231         (WTF::printInternal):
1232         * b3/B3Opcode.h:
1233         (JSC::B3::opcodeForConstant):
1234         * b3/B3PatchpointSpecial.cpp:
1235         (JSC::B3::PatchpointSpecial::forEachArg):
1236         (JSC::B3::PatchpointSpecial::isValid):
1237         (JSC::B3::PatchpointSpecial::admitsStack):
1238         (JSC::B3::PatchpointSpecial::generate):
1239         * b3/B3PatchpointValue.cpp:
1240         (JSC::B3::PatchpointValue::dumpMeta const):
1241         (JSC::B3::PatchpointValue::PatchpointValue):
1242         * b3/B3PatchpointValue.h:
1243         * b3/B3Procedure.cpp:
1244         (JSC::B3::Procedure::addTuple):
1245         (JSC::B3::Procedure::isValidTuple const):
1246         (JSC::B3::Procedure::tupleForType const):
1247         (JSC::B3::Procedure::addIntConstant):
1248         (JSC::B3::Procedure::addConstant):
1249         * b3/B3Procedure.h:
1250         (JSC::B3::Procedure::returnCount const):
1251         * b3/B3ProcedureInlines.h:
1252         (JSC::B3::Procedure::extractFromTuple const):
1253         * b3/B3ReduceStrength.cpp:
1254         * b3/B3StackmapSpecial.cpp:
1255         (JSC::B3::StackmapSpecial::isValidImpl):
1256         (JSC::B3::StackmapSpecial::isArgValidForType):
1257         (JSC::B3::StackmapSpecial::isArgValidForRep):
1258         (JSC::B3::StackmapSpecial::isArgValidForValue): Deleted.
1259         * b3/B3StackmapSpecial.h:
1260         * b3/B3StackmapValue.h:
1261         * b3/B3Type.cpp:
1262         (WTF::printInternal):
1263         * b3/B3Type.h:
1264         (JSC::B3::Type::Type):
1265         (JSC::B3::Type::tupleFromIndex):
1266         (JSC::B3::Type::kind const):
1267         (JSC::B3::Type::tupleIndex const):
1268         (JSC::B3::Type::hash const):
1269         (JSC::B3::Type::operator== const):
1270         (JSC::B3::Type::operator!= const):
1271         (JSC::B3::Type::isInt const):
1272         (JSC::B3::Type::isFloat const):
1273         (JSC::B3::Type::isNumeric const):
1274         (JSC::B3::Type::isTuple const):
1275         (JSC::B3::sizeofType):
1276         (JSC::B3::isInt): Deleted.
1277         (JSC::B3::isFloat): Deleted.
1278         * b3/B3TypeMap.h:
1279         (JSC::B3::TypeMap::at):
1280         * b3/B3Validate.cpp:
1281         * b3/B3Value.cpp:
1282         (JSC::B3::Value::isRounded const):
1283         (JSC::B3::Value::effects const):
1284         (JSC::B3::Value::typeFor):
1285         * b3/B3Value.h:
1286         * b3/B3ValueInlines.h:
1287         * b3/B3ValueKey.cpp:
1288         (JSC::B3::ValueKey::intConstant):
1289         * b3/B3ValueKey.h:
1290         (JSC::B3::ValueKey::hash const):
1291         * b3/B3ValueRep.h:
1292         * b3/B3Width.h:
1293         (JSC::B3::widthForType):
1294         * b3/air/AirArg.cpp:
1295         (JSC::B3::Air::Arg::canRepresent const):
1296         * b3/air/AirArg.h:
1297         * b3/air/AirCCallingConvention.cpp:
1298         (JSC::B3::Air::cCallResult):
1299         * b3/air/AirLowerMacros.cpp:
1300         (JSC::B3::Air::lowerMacros):
1301         * b3/testb3.h:
1302         (populateWithInterestingValues):
1303         * b3/testb3_1.cpp:
1304         (run):
1305         * b3/testb3_3.cpp:
1306         (testStorePartial8BitRegisterOnX86):
1307         * b3/testb3_5.cpp:
1308         (testPatchpointWithRegisterResult):
1309         (testPatchpointWithStackArgumentResult):
1310         (testPatchpointWithAnyResult):
1311         * b3/testb3_6.cpp:
1312         (testPatchpointDoubleRegs):
1313         (testSomeEarlyRegister):
1314         * b3/testb3_7.cpp:
1315         (testShuffleDoesntTrashCalleeSaves):
1316         (testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead):
1317         (testSimpleTuplePair):
1318         (testSimpleTuplePairUnused):
1319         (testSimpleTuplePairStack):
1320         (tailDupedTuplePair):
1321         (tuplePairVariableLoop):
1322         (tupleNestedLoop):
1323         (addTupleTests):
1324         * b3/testb3_8.cpp:
1325         (testLoad):
1326         (addLoadTests):
1327         * ftl/FTLAbbreviatedTypes.h:
1328         * ftl/FTLLowerDFGToB3.cpp:
1329         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct):
1330         (JSC::FTL::DFG::LowerDFGToB3::compileDirectCallOrConstruct):
1331         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread):
1332         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs):
1333         (JSC::FTL::DFG::LowerDFGToB3::compileCallEval):
1334         (JSC::FTL::DFG::LowerDFGToB3::compileCPUIntrinsic):
1335         (JSC::FTL::DFG::LowerDFGToB3::compileInstanceOf):
1336         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOMGetter):
1337         (JSC::FTL::DFG::LowerDFGToB3::emitBinarySnippet):
1338         (JSC::FTL::DFG::LowerDFGToB3::emitBinaryBitOpSnippet):
1339         (JSC::FTL::DFG::LowerDFGToB3::emitRightShiftSnippet):
1340         (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell):
1341         * wasm/WasmAirIRGenerator.cpp:
1342         (JSC::Wasm::AirIRGenerator::emitPatchpoint):
1343         * wasm/WasmB3IRGenerator.cpp:
1344         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1345         * wasm/WasmCallingConvention.h:
1346         (JSC::Wasm::CallingConvention::marshallArgument const):
1347         (JSC::Wasm::CallingConvention::setupFrameInPrologue const):
1348         (JSC::Wasm::CallingConvention::setupCall const):
1349         (JSC::Wasm::CallingConventionAir::setupCall const):
1350
1351 2019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
1352
1353         [JSC] Use "destroy" function directly for JSWebAssemblyCodeBlock and WebAssemblyFunction
1354         https://bugs.webkit.org/show_bug.cgi?id=200385
1355
1356         Reviewed by Mark Lam.
1357
1358         These CellTypes are not using classInfo stored in the cells, so we can just call JSWebAssemblyCodeBlock::destroy
1359         and WebAssemblyFunction::destroy directly.
1360
1361         * wasm/js/JSWebAssemblyCodeBlockHeapCellType.cpp:
1362         (JSC::JSWebAssemblyCodeBlockDestroyFunc::operator() const):
1363         * wasm/js/WebAssemblyFunctionHeapCellType.cpp:
1364         (JSC::WebAssemblyFunctionDestroyFunc::operator() const):
1365
1366 2019-08-02  Mark Lam  <mark.lam@apple.com>
1367
1368         Gardening: build fix.
1369         https://bugs.webkit.org/show_bug.cgi?id=200149
1370         <rdar://problem/53570112>
1371
1372         Not reviewed.
1373
1374         * assembler/CPU.cpp:
1375         (JSC::hwPhysicalCPUMax):
1376
1377 2019-08-01  Yusuke Suzuki  <ysuzuki@apple.com>
1378
1379         GetterSetter type confusion during DFG compilation
1380         https://bugs.webkit.org/show_bug.cgi?id=199903
1381
1382         Reviewed by Mark Lam.
1383
1384         In AI, we are strongly assuming that GetGetter's child constant value should be GetterSetter if it exists.
1385         However, this can be wrong since nobody ensures that. AI assumed so because the control-flow and preceding
1386         CheckStructure ensures that. But this preceding check can be eliminated if the node becomes (at runtime) unreachable.
1387
1388         Let's consider the following graph.
1389
1390             129:<!0:->     PutByOffset(KnownCell:@115, KnownCell:@115, Check:Untyped:@124, MustGen, id5{length}, 0, W:NamedProperties(5), ClobbersExit, bc#154, ExitValid)
1391             130:<!0:->     PutStructure(KnownCell:@115, MustGen, %C8:Object -> %C3:Object, ID:7726, R:JSObject_butterfly, W:JSCell_indexingType,JSCell_structureID,JSCell_typeInfoFlags,JSCell_typeInfoType, ClobbersExit, bc#154, ExitInvalid)
1392             ...
1393             158:<!0:->     GetLocal(Check:Untyped:@197, JS|MustGen|UseAsOther, Final, loc7(R<Final>/FlushedCell), R:Stack(-8), bc#187, ExitValid)  predicting Final
1394             210:< 1:->     DoubleRep(Check:NotCell:@158, Double|PureInt, BytecodeDouble, Exits, bc#187, ExitValid)
1395             ...
1396             162:<!0:->     CheckStructure(Cell:@158, MustGen, [%Ad:Object], R:JSCell_structureID, Exits, bc#192, ExitValid)
1397             163:< 1:->     GetGetterSetterByOffset(KnownCell:@158, KnownCell:@158, JS|UseAsOther, OtherCell, id5{length}, 0, R:NamedProperties(5), Exits, bc#192, ExitValid)
1398             164:< 1:->     GetGetter(KnownCell:@163, JS|UseAsOther, Function, R:GetterSetter_getter, Exits, bc#192, ExitValid)
1399
1400         At @163 and @164, AI proves that @158's AbstractValue is None because @210's edge filters out Cells @158 is a cell. But we do not invalidate graph status as "Invalid" even if edge filters out all possible value.
1401         This is because the result of edge can be None in a valid program. For example, we can put a dependency edge between a consuming node and a producing node, where the producing node is just like a check and it
1402         does not produce a value actually. So, @163 and @164 are not invalidated. This is totally fine in our compiler pipeline right now.
1403
1404         But after that, global CSE phase found that @115 and @158 are same and @129 dominates @158. As a result, we can replace GetGetter child's @163 with @124. Since CheckStructure is already removed (and now, at runtime,
1405         @163 and @164 are never executed), we do not have any structure guarantee on @158 and the result of @163. This means that @163's CSE result can be non-GetterSetter value.
1406
1407             124:< 2:->     JSConstant(JS|UseAsOther, Final, Weak:Object: 0x1199e82a0 with butterfly 0x0 (Structure %B4:Object), StructureID: 49116, bc#0, ExitValid)
1408             ...
1409             126:< 2:->     GetGetter(KnownCell:Kill:@124, JS|UseAsOther, Function, R:GetterSetter_getter, Exits, bc#192, ExitValid)
1410
1411         AI filters out @124's non-cell values. But @126 can get non-GetterSetter cell at AI phase. But our AI code is like the following.
1412
1413
1414             JSValue base = forNode(node->child1()).m_value;
1415             if (base) {
1416                 GetterSetter* getterSetter = jsCast<GetterSetter*>(base);
1417                 ...
1418
1419         Then, jsCast casts the above object with GetterSetter accidentally.
1420
1421         In general, DFG AI can get a proven constant value, which could not be shown at runtime. This happens if the processing node is unreachable at runtime while the graph is not invalid yet, because preceding edge
1422         filters already filter out all the possible execution. DFG AI already considered about this possibility, and it attempts to fold a node into a constant only when the constant input matches against the expected one.
1423         But several DFG nodes are not handling this correctly: GetGetter, GetSetter, and SkipScope.
1424
1425         In this patch, we use `jsDynamicCast` to ensure that the constant input matches against the expected (foldable) one, and fold it only when the expectation is met.
1426         We also remove DFG::Node::castConstant and its use. We should not rely on the constant folded value based on graph's control-flow.
1427
1428         * dfg/DFGAbstractInterpreterInlines.h:
1429         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1430         * dfg/DFGNode.h:
1431         (JSC::DFG::Node::castConstant): Deleted.
1432         * ftl/FTLLowerDFGToB3.cpp:
1433         (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeCreateActivation):
1434
1435 2019-08-01  Mark Lam  <mark.lam@apple.com>
1436
1437         Add crash diagnostics for debugging unexpected zapped cells.
1438         https://bugs.webkit.org/show_bug.cgi?id=200149
1439         <rdar://problem/53570112>
1440
1441         Reviewed by Yusuke Suzuki.
1442
1443         Add a check for zapped cells in SlotVisitor::appendToMarkStack() and
1444         SlotVisitor::visitChildren().  If a zapped cell is detected, we will crash with
1445         some diagnostic info.
1446
1447         To facilitate this, we've made the following changes:
1448         1. Changed FreeCell to preserve the 1st 8 bytes.  This is fine to do because all
1449            cells are at least 16 bytes long.
1450         2. Changed HeapCell::zap() to only zap the structureID.  Leave the rest of the
1451            cell header info intact (including the cell JSType).
1452         3. Changed HeapCell::zap() to record the reason for zapping the cell.  We stash
1453            the reason immediately after the first 8 bytes.  This is the same location as
1454            FreeCell::scrambledNext.  However, since a cell is not expected to be zapped
1455            and on the free list at the same time, it is also fine to do this.
1456         4. Added a few utility functions to MarkedBlock for checking if a cell points
1457            into the block.
1458         5. Added VMInspector and JSDollarVM utilities to dump in-use subspace hashes.
1459         6. Added some comments to document the hashes of known subspaces.
1460         7. Added Options::dumpZappedCellCrashData() to make this check conditional.
1461            We use this option to disable this check for slower machines so that their
1462            PLT5 performance is not impacted.
1463
1464         * assembler/CPU.cpp:
1465         (JSC::hwL3CacheSize):
1466         (JSC::hwPhysicalCPUMax):
1467         * assembler/CPU.h:
1468         (JSC::hwL3CacheSize):
1469         (JSC::hwPhysicalCPUMax):
1470         * heap/FreeList.h:
1471         (JSC::FreeCell::offsetOfScrambledNext):
1472         * heap/HeapCell.h:
1473         (JSC::HeapCell::zap):
1474         (JSC::HeapCell::isZapped const):
1475         * heap/MarkedBlock.cpp:
1476         (JSC::MarkedBlock::Handle::stopAllocating):
1477         * heap/MarkedBlock.h:
1478         (JSC::MarkedBlock::Handle::start const):
1479         (JSC::MarkedBlock::Handle::end const):
1480         (JSC::MarkedBlock::Handle::contains const):
1481         * heap/MarkedBlockInlines.h:
1482         (JSC::MarkedBlock::Handle::specializedSweep):
1483         * heap/MarkedSpace.h:
1484         (JSC::MarkedSpace::forEachSubspace):
1485         * heap/SlotVisitor.cpp:
1486         (JSC::SlotVisitor::appendToMarkStack):
1487         (JSC::SlotVisitor::visitChildren):
1488         (JSC::SlotVisitor::reportZappedCellAndCrash):
1489         * heap/SlotVisitor.h:
1490         * jit/AssemblyHelpers.cpp:
1491         (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
1492         * runtime/Options.cpp:
1493         (JSC::Options::initialize):
1494         * runtime/Options.h:
1495         * runtime/VM.cpp:
1496         (JSC::VM::VM):
1497         * tools/JSDollarVM.cpp:
1498         (JSC::functionDumpSubspaceHashes):
1499         (JSC::JSDollarVM::finishCreation):
1500         * tools/VMInspector.cpp:
1501         (JSC::VMInspector::dumpSubspaceHashes):
1502         * tools/VMInspector.h:
1503
1504 2019-08-01  Keith Miller  <keith_miller@apple.com>
1505
1506         Fix bug in testMulImm32SignExtend
1507         https://bugs.webkit.org/show_bug.cgi?id=200358
1508
1509         Reviewed by Mark Lam.
1510
1511         Also, have it run in more configurations.
1512
1513         * b3/testb3_2.cpp:
1514         (testMulImm32SignExtend):
1515         * b3/testb3_3.cpp:
1516         (addArgTests):
1517
1518 2019-07-31  Mark Lam  <mark.lam@apple.com>
1519
1520         Rename DOMJIT safe/unsafeFunction to functionWithTypeChecks and functionWithoutTypeChecks.
1521         https://bugs.webkit.org/show_bug.cgi?id=200323
1522
1523         Reviewed by Yusuke Suzuki.
1524
1525         The DOMJIT has a notion of a safeFunction and an unsafeFunction.  The safeFunction
1526         is effectively the same as the unsafeFunction with added type check.  The DFG/FTL
1527         will emit code to call the unsafeFunction if it has already emitted the needed
1528         type check or proven that it isn't needed.  Otherwise, the DFG/FTL will emit
1529         code to call the safeFunction (which does its own type check) instead.
1530
1531         This patch renames these functions to better describe their difference.
1532
1533         * dfg/DFGSpeculativeJIT.cpp:
1534         (JSC::DFG::SpeculativeJIT::compileCallDOM):
1535         * domjit/DOMJITSignature.h:
1536         (JSC::DOMJIT::Signature::Signature):
1537         * ftl/FTLLowerDFGToB3.cpp:
1538         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOM):
1539         * tools/JSDollarVM.cpp:
1540         (JSC::DOMJITFunctionObject::functionWithTypeCheck):
1541         (JSC::DOMJITFunctionObject::functionWithoutTypeCheck):
1542         (JSC::DOMJITFunctionObject::finishCreation):
1543         (JSC::DOMJITCheckSubClassObject::functionWithTypeCheck):
1544         (JSC::DOMJITCheckSubClassObject::functionWithoutTypeCheck):
1545         (JSC::DOMJITCheckSubClassObject::finishCreation):
1546         (JSC::DOMJITFunctionObject::safeFunction): Deleted.
1547         (JSC::DOMJITFunctionObject::unsafeFunction): Deleted.
1548         (JSC::DOMJITCheckSubClassObject::safeFunction): Deleted.
1549         (JSC::DOMJITCheckSubClassObject::unsafeFunction): Deleted.
1550
1551 2019-07-31  Alex Christensen  <achristensen@webkit.org>
1552
1553         Begin organizing b3 tests
1554         https://bugs.webkit.org/show_bug.cgi?id=200330
1555
1556         Reviewed by Keith Miller.
1557
1558         * b3/testb3.h:
1559         * b3/testb3_1.cpp:
1560         (run):
1561         (zero): Deleted.
1562         (negativeZero): Deleted.
1563         * b3/testb3_2.cpp:
1564         (testBitXorTreeArgs):
1565         (testBitXorTreeArgsEven):
1566         (testBitXorTreeArgImm):
1567         (testBitAndTreeArg32):
1568         (testBitOrTreeArg32):
1569         (testBitAndArgs):
1570         (testBitAndSameArg):
1571         (testBitAndNotNot):
1572         (testBitAndNotImm):
1573         (testBitAndImms):
1574         (testBitAndArgImm):
1575         (testBitAndImmArg):
1576         (testBitAndBitAndArgImmImm):
1577         (testBitAndImmBitAndArgImm):
1578         (testBitAndArgs32):
1579         (testBitAndSameArg32):
1580         (testBitAndImms32):
1581         (testBitAndArgImm32):
1582         (testBitAndImmArg32):
1583         (testBitAndBitAndArgImmImm32):
1584         (testBitAndImmBitAndArgImm32):
1585         (testBitAndWithMaskReturnsBooleans):
1586         (testBitAndArgDouble):
1587         (testBitAndArgsDouble):
1588         (testBitAndArgImmDouble):
1589         (testBitAndImmsDouble):
1590         (testBitAndArgFloat):
1591         (testBitAndArgsFloat):
1592         (testBitAndArgImmFloat):
1593         (testBitAndImmsFloat):
1594         (testBitAndArgsFloatWithUselessDoubleConversion):
1595         (testBitOrArgs):
1596         (testBitOrSameArg):
1597         (testBitOrAndAndArgs):
1598         (testBitOrAndSameArgs):
1599         (testBitOrNotNot):
1600         (testBitOrNotImm):
1601         (testBitOrImms):
1602         (testBitOrArgImm):
1603         (testBitOrImmArg):
1604         (testBitOrBitOrArgImmImm):
1605         (testBitOrImmBitOrArgImm):
1606         (testBitOrArgs32):
1607         (testBitOrSameArg32):
1608         (testBitOrImms32):
1609         (testBitOrArgImm32):
1610         (testBitOrImmArg32):
1611         (addBitTests):
1612         * b3/testb3_3.cpp:
1613         (testSShrArgs):
1614         (testSShrImms):
1615         (testSShrArgImm):
1616         (testSShrArg32):
1617         (testSShrArgs32):
1618         (testSShrImms32):
1619         (testSShrArgImm32):
1620         (testZShrArgs):
1621         (testZShrImms):
1622         (testZShrArgImm):
1623         (testZShrArg32):
1624         (testZShrArgs32):
1625         (testZShrImms32):
1626         (testZShrArgImm32):
1627         (zero):
1628         (negativeZero):
1629         (addArgTests):
1630         (addCallTests):
1631         (addShrTests):
1632         * b3/testb3_4.cpp:
1633         (addSExtTests):
1634         * b3/testb3_6.cpp:
1635         (testSShrShl32):
1636         (testSShrShl64):
1637         (addSShrShTests):
1638
1639 2019-07-31  Devin Rousso  <drousso@apple.com>
1640
1641         Web Inspector: Debugger: support emulateUserGesture parameter in Debugger.evaluateOnCallFrame
1642         https://bugs.webkit.org/show_bug.cgi?id=200272
1643
1644         Reviewed by Joseph Pecoraro.
1645
1646         When paused, evaluating in the console should still respect the "Emulate User Gesture" checkbox.
1647
1648         * inspector/protocol/Debugger.json:
1649         * inspector/agents/InspectorDebuggerAgent.h:
1650         * inspector/agents/InspectorDebuggerAgent.cpp:
1651         (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame):
1652
1653 2019-07-31  Alex Christensen  <achristensen@webkit.org>
1654
1655         Split testb3 into multiple files
1656         https://bugs.webkit.org/show_bug.cgi?id=200326
1657
1658         Reviewed by Keith Miller.
1659
1660         * JavaScriptCore.xcodeproj/project.pbxproj:
1661         * b3/testb3.cpp: Removed.
1662         * b3/testb3.h: Added.
1663         (hiddenTruthBecauseNoReturnIsStupid):
1664         (usage):
1665         (shouldBeVerbose):
1666         (compileProc):
1667         (invoke):
1668         (compileAndRun):
1669         (lowerToAirForTesting):
1670         (checkDisassembly):
1671         (checkUsesInstruction):
1672         (checkDoesNotUseInstruction):
1673         (populateWithInterestingValues):
1674         (floatingPointOperands):
1675         (int64Operands):
1676         (int32Operands):
1677         (add32):
1678         (modelLoad):
1679         (float>):
1680         (double>):
1681         * b3/testb3_1.cpp: Added.
1682         (zero):
1683         (negativeZero):
1684         (shouldRun):
1685         (testRotR):
1686         (testRotL):
1687         (testRotRWithImmShift):
1688         (testRotLWithImmShift):
1689         (testComputeDivisionMagic):
1690         (run):
1691         (main):
1692         (dllLauncherEntryPoint):
1693         * b3/testb3_2.cpp: Added.
1694         (test42):
1695         (testLoad42):
1696         (testLoadAcq42):
1697         (testLoadWithOffsetImpl):
1698         (testLoadOffsetImm9Max):
1699         (testLoadOffsetImm9MaxPlusOne):
1700         (testLoadOffsetImm9MaxPlusTwo):
1701         (testLoadOffsetImm9Min):
1702         (testLoadOffsetImm9MinMinusOne):
1703         (testLoadOffsetScaledUnsignedImm12Max):
1704         (testLoadOffsetScaledUnsignedOverImm12Max):
1705         (testBitXorTreeArgs):
1706         (testBitXorTreeArgsEven):
1707         (testBitXorTreeArgImm):
1708         (testAddTreeArg32):
1709         (testMulTreeArg32):
1710         (testBitAndTreeArg32):
1711         (testBitOrTreeArg32):
1712         (testArg):
1713         (testReturnConst64):
1714         (testReturnVoid):
1715         (testAddArg):
1716         (testAddArgs):
1717         (testAddArgImm):
1718         (testAddImmArg):
1719         (testAddArgMem):
1720         (testAddMemArg):
1721         (testAddImmMem):
1722         (testAddArg32):
1723         (testAddArgs32):
1724         (testAddArgMem32):
1725         (testAddMemArg32):
1726         (testAddImmMem32):
1727         (testAddNeg1):
1728         (testAddNeg2):
1729         (testAddArgZeroImmZDef):
1730         (testAddLoadTwice):
1731         (testAddArgDouble):
1732         (testAddArgsDouble):
1733         (testAddArgImmDouble):
1734         (testAddImmArgDouble):
1735         (testAddImmsDouble):
1736         (testAddArgFloat):
1737         (testAddArgsFloat):
1738         (testAddFPRArgsFloat):
1739         (testAddArgImmFloat):
1740         (testAddImmArgFloat):
1741         (testAddImmsFloat):
1742         (testAddArgFloatWithUselessDoubleConversion):
1743         (testAddArgsFloatWithUselessDoubleConversion):
1744         (testAddArgsFloatWithEffectfulDoubleConversion):
1745         (testAddMulMulArgs):
1746         (testMulArg):
1747         (testMulArgStore):
1748         (testMulAddArg):
1749         (testMulArgs):
1750         (testMulArgNegArg):
1751         (testMulNegArgArg):
1752         (testMulArgImm):
1753         (testMulImmArg):
1754         (testMulArgs32):
1755         (testMulArgs32SignExtend):
1756         (testMulImm32SignExtend):
1757         (testMulLoadTwice):
1758         (testMulAddArgsLeft):
1759         (testMulAddArgsRight):
1760         (testMulAddArgsLeft32):
1761         (testMulAddArgsRight32):
1762         (testMulSubArgsLeft):
1763         (testMulSubArgsRight):
1764         (testMulSubArgsLeft32):
1765         (testMulSubArgsRight32):
1766         (testMulNegArgs):
1767         (testMulNegArgs32):
1768         (testMulArgDouble):
1769         (testMulArgsDouble):
1770         (testMulArgImmDouble):
1771         (testMulImmArgDouble):
1772         (testMulImmsDouble):
1773         (testMulArgFloat):
1774         (testMulArgsFloat):
1775         (testMulArgImmFloat):
1776         (testMulImmArgFloat):
1777         (testMulImmsFloat):
1778         (testMulArgFloatWithUselessDoubleConversion):
1779         (testMulArgsFloatWithUselessDoubleConversion):
1780         (testMulArgsFloatWithEffectfulDoubleConversion):
1781         (testDivArgDouble):
1782         (testDivArgsDouble):
1783         (testDivArgImmDouble):
1784         (testDivImmArgDouble):
1785         (testDivImmsDouble):
1786         (testDivArgFloat):
1787         (testDivArgsFloat):
1788         (testDivArgImmFloat):
1789         (testDivImmArgFloat):
1790         (testDivImmsFloat):
1791         (testModArgDouble):
1792         (testModArgsDouble):
1793         (testModArgImmDouble):
1794         (testModImmArgDouble):
1795         (testModImmsDouble):
1796         (testModArgFloat):
1797         (testModArgsFloat):
1798         (testModArgImmFloat):
1799         (testModImmArgFloat):
1800         (testModImmsFloat):
1801         (testDivArgFloatWithUselessDoubleConversion):
1802         (testDivArgsFloatWithUselessDoubleConversion):
1803         (testDivArgsFloatWithEffectfulDoubleConversion):
1804         (testUDivArgsInt32):
1805         (testUDivArgsInt64):
1806         (testUModArgsInt32):
1807         (testUModArgsInt64):
1808         (testSubArg):
1809         (testSubArgs):
1810         (testSubArgImm):
1811         (testSubNeg):
1812         (testNegSub):
1813         (testNegValueSubOne):
1814         (testSubSub):
1815         (testSubSub2):
1816         (testSubAdd):
1817         (testSubFirstNeg):
1818         (testSubImmArg):
1819         (testSubArgMem):
1820         (testSubMemArg):
1821         (testSubImmMem):
1822         (testSubMemImm):
1823         (testSubArgs32):
1824         (testSubArgImm32):
1825         (testSubImmArg32):
1826         (testSubMemArg32):
1827         (testSubArgMem32):
1828         (testSubImmMem32):
1829         (testSubMemImm32):
1830         (testNegValueSubOne32):
1831         (testNegMulArgImm):
1832         (testSubMulMulArgs):
1833         (testSubArgDouble):
1834         (testSubArgsDouble):
1835         (testSubArgImmDouble):
1836         (testSubImmArgDouble):
1837         (testSubImmsDouble):
1838         (testSubArgFloat):
1839         (testSubArgsFloat):
1840         (testSubArgImmFloat):
1841         (testSubImmArgFloat):
1842         (testSubImmsFloat):
1843         (testSubArgFloatWithUselessDoubleConversion):
1844         (testSubArgsFloatWithUselessDoubleConversion):
1845         (testSubArgsFloatWithEffectfulDoubleConversion):
1846         (testTernarySubInstructionSelection):
1847         (testNegDouble):
1848         (testNegFloat):
1849         (testNegFloatWithUselessDoubleConversion):
1850         (testBitAndArgs):
1851         (testBitAndSameArg):
1852         (testBitAndNotNot):
1853         (testBitAndNotImm):
1854         (testBitAndImms):
1855         (testBitAndArgImm):
1856         (testBitAndImmArg):
1857         (testBitAndBitAndArgImmImm):
1858         (testBitAndImmBitAndArgImm):
1859         (testBitAndArgs32):
1860         (testBitAndSameArg32):
1861         (testBitAndImms32):
1862         (testBitAndArgImm32):
1863         (testBitAndImmArg32):
1864         (testBitAndBitAndArgImmImm32):
1865         (testBitAndImmBitAndArgImm32):
1866         (testBitAndWithMaskReturnsBooleans):
1867         (bitAndDouble):
1868         (testBitAndArgDouble):
1869         (testBitAndArgsDouble):
1870         (testBitAndArgImmDouble):
1871         (testBitAndImmsDouble):
1872         (bitAndFloat):
1873         (testBitAndArgFloat):
1874         (testBitAndArgsFloat):
1875         (testBitAndArgImmFloat):
1876         (testBitAndImmsFloat):
1877         (testBitAndArgsFloatWithUselessDoubleConversion):
1878         (testBitOrArgs):
1879         (testBitOrSameArg):
1880         (testBitOrAndAndArgs):
1881         (testBitOrAndSameArgs):
1882         (testBitOrNotNot):
1883         (testBitOrNotImm):
1884         (testBitOrImms):
1885         (testBitOrArgImm):
1886         (testBitOrImmArg):
1887         (testBitOrBitOrArgImmImm):
1888         (testBitOrImmBitOrArgImm):
1889         (testBitOrArgs32):
1890         (testBitOrSameArg32):
1891         (testBitOrImms32):
1892         (testBitOrArgImm32):
1893         (testBitOrImmArg32):
1894         * b3/testb3_3.cpp: Added.
1895         (testBitOrBitOrArgImmImm32):
1896         (testBitOrImmBitOrArgImm32):
1897         (bitOrDouble):
1898         (testBitOrArgDouble):
1899         (testBitOrArgsDouble):
1900         (testBitOrArgImmDouble):
1901         (testBitOrImmsDouble):
1902         (bitOrFloat):
1903         (testBitOrArgFloat):
1904         (testBitOrArgsFloat):
1905         (testBitOrArgImmFloat):
1906         (testBitOrImmsFloat):
1907         (testBitOrArgsFloatWithUselessDoubleConversion):
1908         (testBitXorArgs):
1909         (testBitXorSameArg):
1910         (testBitXorAndAndArgs):
1911         (testBitXorAndSameArgs):
1912         (testBitXorImms):
1913         (testBitXorArgImm):
1914         (testBitXorImmArg):
1915         (testBitXorBitXorArgImmImm):
1916         (testBitXorImmBitXorArgImm):
1917         (testBitXorArgs32):
1918         (testBitXorSameArg32):
1919         (testBitXorImms32):
1920         (testBitXorArgImm32):
1921         (testBitXorImmArg32):
1922         (testBitXorBitXorArgImmImm32):
1923         (testBitXorImmBitXorArgImm32):
1924         (testBitNotArg):
1925         (testBitNotImm):
1926         (testBitNotMem):
1927         (testBitNotArg32):
1928         (testBitNotImm32):
1929         (testBitNotMem32):
1930         (testNotOnBooleanAndBranch32):
1931         (testBitNotOnBooleanAndBranch32):
1932         (testShlArgs):
1933         (testShlImms):
1934         (testShlArgImm):
1935         (testShlSShrArgImm):
1936         (testShlArg32):
1937         (testShlArgs32):
1938         (testShlImms32):
1939         (testShlArgImm32):
1940         (testShlZShrArgImm32):
1941         (testSShrArgs):
1942         (testSShrImms):
1943         (testSShrArgImm):
1944         (testSShrArg32):
1945         (testSShrArgs32):
1946         (testSShrImms32):
1947         (testSShrArgImm32):
1948         (testZShrArgs):
1949         (testZShrImms):
1950         (testZShrArgImm):
1951         (testZShrArg32):
1952         (testZShrArgs32):
1953         (testZShrImms32):
1954         (testZShrArgImm32):
1955         (countLeadingZero):
1956         (testClzArg64):
1957         (testClzMem64):
1958         (testClzArg32):
1959         (testClzMem32):
1960         (testAbsArg):
1961         (testAbsImm):
1962         (testAbsMem):
1963         (testAbsAbsArg):
1964         (testAbsNegArg):
1965         (testAbsBitwiseCastArg):
1966         (testBitwiseCastAbsBitwiseCastArg):
1967         (testAbsArgWithUselessDoubleConversion):
1968         (testAbsArgWithEffectfulDoubleConversion):
1969         (testCeilArg):
1970         (testCeilImm):
1971         (testCeilMem):
1972         (testCeilCeilArg):
1973         (testFloorCeilArg):
1974         (testCeilIToD64):
1975         (testCeilIToD32):
1976         (testCeilArgWithUselessDoubleConversion):
1977         (testCeilArgWithEffectfulDoubleConversion):
1978         (testFloorArg):
1979         (testFloorImm):
1980         (testFloorMem):
1981         (testFloorFloorArg):
1982         (testCeilFloorArg):
1983         (testFloorIToD64):
1984         (testFloorIToD32):
1985         (testFloorArgWithUselessDoubleConversion):
1986         (testFloorArgWithEffectfulDoubleConversion):
1987         (correctSqrt):
1988         (testSqrtArg):
1989         (testSqrtImm):
1990         (testSqrtMem):
1991         (testSqrtArgWithUselessDoubleConversion):
1992         (testSqrtArgWithEffectfulDoubleConversion):
1993         (testCompareTwoFloatToDouble):
1994         (testCompareOneFloatToDouble):
1995         (testCompareFloatToDoubleThroughPhi):
1996         (testDoubleToFloatThroughPhi):
1997         (testReduceFloatToDoubleValidates):
1998         (testDoubleProducerPhiToFloatConversion):
1999         (testDoubleProducerPhiToFloatConversionWithDoubleConsumer):
2000         (testDoubleProducerPhiWithNonFloatConst):
2001         (testDoubleArgToInt64BitwiseCast):
2002         (testDoubleImmToInt64BitwiseCast):
2003         (testTwoBitwiseCastOnDouble):
2004         (testBitwiseCastOnDoubleInMemory):
2005         (testBitwiseCastOnDoubleInMemoryIndexed):
2006         (testInt64BArgToDoubleBitwiseCast):
2007         (testInt64BImmToDoubleBitwiseCast):
2008         (testTwoBitwiseCastOnInt64):
2009         (testBitwiseCastOnInt64InMemory):
2010         (testBitwiseCastOnInt64InMemoryIndexed):
2011         (testFloatImmToInt32BitwiseCast):
2012         (testBitwiseCastOnFloatInMemory):
2013         (testInt32BArgToFloatBitwiseCast):
2014         (testInt32BImmToFloatBitwiseCast):
2015         (testTwoBitwiseCastOnInt32):
2016         (testBitwiseCastOnInt32InMemory):
2017         (testConvertDoubleToFloatArg):
2018         (testConvertDoubleToFloatImm):
2019         (testConvertDoubleToFloatMem):
2020         (testConvertFloatToDoubleArg):
2021         (testConvertFloatToDoubleImm):
2022         (testConvertFloatToDoubleMem):
2023         (testConvertDoubleToFloatToDoubleToFloat):
2024         (testLoadFloatConvertDoubleConvertFloatStoreFloat):
2025         (testFroundArg):
2026         (testFroundMem):
2027         (testIToD64Arg):
2028         (testIToF64Arg):
2029         (testIToD32Arg):
2030         (testIToF32Arg):
2031         (testIToD64Mem):
2032         (testIToF64Mem):
2033         (testIToD32Mem):
2034         (testIToF32Mem):
2035         (testIToD64Imm):
2036         (testIToF64Imm):
2037         (testIToD32Imm):
2038         (testIToF32Imm):
2039         (testIToDReducedToIToF64Arg):
2040         (testIToDReducedToIToF32Arg):
2041         (testStore32):
2042         (testStoreConstant):
2043         (testStoreConstantPtr):
2044         (testStore8Arg):
2045         (testStore8Imm):
2046         (testStorePartial8BitRegisterOnX86):
2047         (testStore16Arg):
2048         (testStore16Imm):
2049         (testTrunc):
2050         (testAdd1):
2051         (testAdd1Ptr):
2052         (testNeg32):
2053         (testNegPtr):
2054         (testStoreAddLoad32):
2055         * b3/testb3_4.cpp: Added.
2056         (testStoreRelAddLoadAcq32):
2057         (testStoreAddLoadImm32):
2058         (testStoreAddLoad8):
2059         (testStoreRelAddLoadAcq8):
2060         (testStoreRelAddFenceLoadAcq8):
2061         (testStoreAddLoadImm8):
2062         (testStoreAddLoad16):
2063         (testStoreRelAddLoadAcq16):
2064         (testStoreAddLoadImm16):
2065         (testStoreAddLoad64):
2066         (testStoreRelAddLoadAcq64):
2067         (testStoreAddLoadImm64):
2068         (testStoreAddLoad32Index):
2069         (testStoreAddLoadImm32Index):
2070         (testStoreAddLoad8Index):
2071         (testStoreAddLoadImm8Index):
2072         (testStoreAddLoad16Index):
2073         (testStoreAddLoadImm16Index):
2074         (testStoreAddLoad64Index):
2075         (testStoreAddLoadImm64Index):
2076         (testStoreSubLoad):
2077         (testStoreAddLoadInterference):
2078         (testStoreAddAndLoad):
2079         (testStoreNegLoad32):
2080         (testStoreNegLoadPtr):
2081         (testAdd1Uncommuted):
2082         (testLoadOffset):
2083         (testLoadOffsetNotConstant):
2084         (testLoadOffsetUsingAdd):
2085         (testLoadOffsetUsingAddInterference):
2086         (testLoadOffsetUsingAddNotConstant):
2087         (testLoadAddrShift):
2088         (testFramePointer):
2089         (testOverrideFramePointer):
2090         (testStackSlot):
2091         (testLoadFromFramePointer):
2092         (testStoreLoadStackSlot):
2093         (testStoreFloat):
2094         (testStoreDoubleConstantAsFloat):
2095         (testSpillGP):
2096         (testSpillFP):
2097         (testInt32ToDoublePartialRegisterStall):
2098         (testInt32ToDoublePartialRegisterWithoutStall):
2099         (testBranch):
2100         (testBranchPtr):
2101         (testDiamond):
2102         (testBranchNotEqual):
2103         (testBranchNotEqualCommute):
2104         (testBranchNotEqualNotEqual):
2105         (testBranchEqual):
2106         (testBranchEqualEqual):
2107         (testBranchEqualCommute):
2108         (testBranchEqualEqual1):
2109         (testBranchEqualOrUnorderedArgs):
2110         (testBranchNotEqualAndOrderedArgs):
2111         (testBranchEqualOrUnorderedDoubleArgImm):
2112         (testBranchEqualOrUnorderedFloatArgImm):
2113         (testBranchEqualOrUnorderedDoubleImms):
2114         (testBranchEqualOrUnorderedFloatImms):
2115         (testBranchEqualOrUnorderedFloatWithUselessDoubleConversion):
2116         (testBranchFold):
2117         (testDiamondFold):
2118         (testBranchNotEqualFoldPtr):
2119         (testBranchEqualFoldPtr):
2120         (testBranchLoadPtr):
2121         (testBranchLoad32):
2122         (testBranchLoad8S):
2123         (testBranchLoad8Z):
2124         (testBranchLoad16S):
2125         (testBranchLoad16Z):
2126         (testBranch8WithLoad8ZIndex):
2127         (testComplex):
2128         (testBranchBitTest32TmpImm):
2129         (testBranchBitTest32AddrImm):
2130         (testBranchBitTest32TmpTmp):
2131         (testBranchBitTest64TmpTmp):
2132         (testBranchBitTest64AddrTmp):
2133         (testBranchBitTestNegation):
2134         (testBranchBitTestNegation2):
2135         (testSimplePatchpoint):
2136         (testSimplePatchpointWithoutOuputClobbersGPArgs):
2137         (testSimplePatchpointWithOuputClobbersGPArgs):
2138         (testSimplePatchpointWithoutOuputClobbersFPArgs):
2139         (testSimplePatchpointWithOuputClobbersFPArgs):
2140         (testPatchpointWithEarlyClobber):
2141         (testPatchpointCallArg):
2142         (testPatchpointFixedRegister):
2143         (testPatchpointAny):
2144         (testPatchpointGPScratch):
2145         (testPatchpointFPScratch):
2146         (testPatchpointLotsOfLateAnys):
2147         (testPatchpointAnyImm):
2148         * b3/testb3_5.cpp: Added.
2149         (testPatchpointManyImms):
2150         (testPatchpointWithRegisterResult):
2151         (testPatchpointWithStackArgumentResult):
2152         (testPatchpointWithAnyResult):
2153         (testSimpleCheck):
2154         (testCheckFalse):
2155         (testCheckTrue):
2156         (testCheckLessThan):
2157         (testCheckMegaCombo):
2158         (testCheckTrickyMegaCombo):
2159         (testCheckTwoMegaCombos):
2160         (testCheckTwoNonRedundantMegaCombos):
2161         (testCheckAddImm):
2162         (testCheckAddImmCommute):
2163         (testCheckAddImmSomeRegister):
2164         (testCheckAdd):
2165         (testCheckAdd64):
2166         (testCheckAddFold):
2167         (testCheckAddFoldFail):
2168         (testCheckAddArgumentAliasing64):
2169         (testCheckAddArgumentAliasing32):
2170         (testCheckAddSelfOverflow64):
2171         (testCheckAddSelfOverflow32):
2172         (testCheckSubImm):
2173         (testCheckSubBadImm):
2174         (testCheckSub):
2175         (doubleSub):
2176         (testCheckSub64):
2177         (testCheckSubFold):
2178         (testCheckSubFoldFail):
2179         (testCheckNeg):
2180         (testCheckNeg64):
2181         (testCheckMul):
2182         (testCheckMulMemory):
2183         (testCheckMul2):
2184         (testCheckMul64):
2185         (testCheckMulFold):
2186         (testCheckMulFoldFail):
2187         (testCheckMulArgumentAliasing64):
2188         (testCheckMulArgumentAliasing32):
2189         (testCheckMul64SShr):
2190         (genericTestCompare):
2191         (modelCompare):
2192         (testCompareLoad):
2193         (testCompareImpl):
2194         (testCompare):
2195         (testEqualDouble):
2196         (simpleFunction):
2197         (testCallSimple):
2198         (testCallRare):
2199         (testCallRareLive):
2200         (testCallSimplePure):
2201         (functionWithHellaArguments):
2202         (testCallFunctionWithHellaArguments):
2203         (functionWithHellaArguments2):
2204         (testCallFunctionWithHellaArguments2):
2205         (functionWithHellaArguments3):
2206         (testCallFunctionWithHellaArguments3):
2207         (testReturnDouble):
2208         (testReturnFloat):
2209         (simpleFunctionDouble):
2210         (testCallSimpleDouble):
2211         (simpleFunctionFloat):
2212         (testCallSimpleFloat):
2213         (functionWithHellaDoubleArguments):
2214         (testCallFunctionWithHellaDoubleArguments):
2215         (functionWithHellaFloatArguments):
2216         (testCallFunctionWithHellaFloatArguments):
2217         (testLinearScanWithCalleeOnStack):
2218         (testChillDiv):
2219         (testChillDivTwice):
2220         (testChillDiv64):
2221         (testModArg):
2222         (testModArgs):
2223         (testModImms):
2224         (testModArg32):
2225         (testModArgs32):
2226         (testModImms32):
2227         (testChillModArg):
2228         (testChillModArgs):
2229         (testChillModImms):
2230         (testChillModArg32):
2231         (testChillModArgs32):
2232         (testChillModImms32):
2233         (testLoopWithMultipleHeaderEdges):
2234         (testSwitch):
2235         (testSwitchSameCaseAsDefault):
2236         (testSwitchChillDiv):
2237         (testSwitchTargettingSameBlock):
2238         (testSwitchTargettingSameBlockFoldPathConstant):
2239         (testTruncFold):
2240         (testZExt32):
2241         (testZExt32Fold):
2242         (testSExt32):
2243         (testSExt32Fold):
2244         (testTruncZExt32):
2245         (testTruncSExt32):
2246         (testSExt8):
2247         (testSExt8Fold):
2248         (testSExt8SExt8):
2249         (testSExt8SExt16):
2250         (testSExt8BitAnd):
2251         (testBitAndSExt8):
2252         (testSExt16):
2253         (testSExt16Fold):
2254         (testSExt16SExt16):
2255         (testSExt16SExt8):
2256         (testSExt16BitAnd):
2257         (testBitAndSExt16):
2258         (testSExt32BitAnd):
2259         * b3/testb3_6.cpp: Added.
2260         (testBitAndSExt32):
2261         (testBasicSelect):
2262         (testSelectTest):
2263         (testSelectCompareDouble):
2264         (testSelectCompareFloat):
2265         (testSelectCompareFloatToDouble):
2266         (testSelectDouble):
2267         (testSelectDoubleTest):
2268         (testSelectDoubleCompareDouble):
2269         (testSelectDoubleCompareFloat):
2270         (testSelectFloatCompareFloat):
2271         (testSelectDoubleCompareDoubleWithAliasing):
2272         (testSelectFloatCompareFloatWithAliasing):
2273         (testSelectFold):
2274         (testSelectInvert):
2275         (testCheckSelect):
2276         (testCheckSelectCheckSelect):
2277         (testCheckSelectAndCSE):
2278         (b3Pow):
2279         (testPowDoubleByIntegerLoop):
2280         (testTruncOrHigh):
2281         (testTruncOrLow):
2282         (testBitAndOrHigh):
2283         (testBitAndOrLow):
2284         (testBranch64Equal):
2285         (testBranch64EqualImm):
2286         (testBranch64EqualMem):
2287         (testBranch64EqualMemImm):
2288         (testStore8Load8Z):
2289         (testStore16Load16Z):
2290         (testSShrShl32):
2291         (testSShrShl64):
2292         (testTrivialInfiniteLoop):
2293         (testFoldPathEqual):
2294         (testLShiftSelf32):
2295         (testRShiftSelf32):
2296         (testURShiftSelf32):
2297         (testLShiftSelf64):
2298         (testRShiftSelf64):
2299         (testURShiftSelf64):
2300         (testPatchpointDoubleRegs):
2301         (testSpillDefSmallerThanUse):
2302         (testSpillUseLargerThanDef):
2303         (testLateRegister):
2304         (interpreterPrint):
2305         (testInterpreter):
2306         (testReduceStrengthCheckBottomUseInAnotherBlock):
2307         (testResetReachabilityDanglingReference):
2308         (testEntrySwitchSimple):
2309         (testEntrySwitchNoEntrySwitch):
2310         (testEntrySwitchWithCommonPaths):
2311         (testEntrySwitchWithCommonPathsAndNonTrivialEntrypoint):
2312         (testEntrySwitchLoop):
2313         (testSomeEarlyRegister):
2314         (testBranchBitAndImmFusion):
2315         (testTerminalPatchpointThatNeedsToBeSpilled):
2316         (testTerminalPatchpointThatNeedsToBeSpilled2):
2317         (testPatchpointTerminalReturnValue):
2318         (testMemoryFence):
2319         (testStoreFence):
2320         (testLoadFence):
2321         (testTrappingLoad):
2322         (testTrappingStore):
2323         (testTrappingLoadAddStore):
2324         (testTrappingLoadDCE):
2325         (testTrappingStoreElimination):
2326         (testMoveConstants):
2327         (testPCOriginMapDoesntInsertNops):
2328         * b3/testb3_7.cpp: Added.
2329         (testPinRegisters):
2330         (testX86LeaAddAddShlLeft):
2331         (testX86LeaAddAddShlRight):
2332         (testX86LeaAddAdd):
2333         (testX86LeaAddShlRight):
2334         (testX86LeaAddShlLeftScale1):
2335         (testX86LeaAddShlLeftScale2):
2336         (testX86LeaAddShlLeftScale4):
2337         (testX86LeaAddShlLeftScale8):
2338         (testAddShl32):
2339         (testAddShl64):
2340         (testAddShl65):
2341         (testReduceStrengthReassociation):
2342         (testLoadBaseIndexShift2):
2343         (testLoadBaseIndexShift32):
2344         (testOptimizeMaterialization):
2345         (generateLoop):
2346         (makeArrayForLoops):
2347         (generateLoopNotBackwardsDominant):
2348         (oneFunction):
2349         (noOpFunction):
2350         (testLICMPure):
2351         (testLICMPureSideExits):
2352         (testLICMPureWritesPinned):
2353         (testLICMPureWrites):
2354         (testLICMReadsLocalState):
2355         (testLICMReadsPinned):
2356         (testLICMReads):
2357         (testLICMPureNotBackwardsDominant):
2358         (testLICMPureFoiledByChild):
2359         (testLICMPureNotBackwardsDominantFoiledByChild):
2360         (testLICMExitsSideways):
2361         (testLICMWritesLocalState):
2362         (testLICMWrites):
2363         (testLICMFence):
2364         (testLICMWritesPinned):
2365         (testLICMControlDependent):
2366         (testLICMControlDependentNotBackwardsDominant):
2367         (testLICMControlDependentSideExits):
2368         (testLICMReadsPinnedWritesPinned):
2369         (testLICMReadsWritesDifferentHeaps):
2370         (testLICMReadsWritesOverlappingHeaps):
2371         (testLICMDefaultCall):
2372         (testDepend32):
2373         (testDepend64):
2374         (testWasmBoundsCheck):
2375         (testWasmAddress):
2376         (testFastTLSLoad):
2377         (testFastTLSStore):
2378         (doubleEq):
2379         (doubleNeq):
2380         (doubleGt):
2381         (doubleGte):
2382         (doubleLt):
2383         (doubleLte):
2384         (testDoubleLiteralComparison):
2385         (testFloatEqualOrUnorderedFolding):
2386         (testFloatEqualOrUnorderedFoldingNaN):
2387         (testFloatEqualOrUnorderedDontFold):
2388         (functionNineArgs):
2389         (testShuffleDoesntTrashCalleeSaves):
2390         (testDemotePatchpointTerminal):
2391         (testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead):
2392         (testInfiniteLoopDoesntCauseBadHoisting):
2393         * b3/testb3_8.cpp: Added.
2394         (testAtomicWeakCAS):
2395         (testAtomicStrongCAS):
2396         (testAtomicXchg):
2397         (addAtomicTests):
2398         (testLoad):
2399         (addLoadTests):
2400
2401 2019-07-30  Yusuke Suzuki  <ysuzuki@apple.com>
2402
2403         [JSC] Emit write barrier after storing instead of before storing
2404         https://bugs.webkit.org/show_bug.cgi?id=200193
2405
2406         Reviewed by Saam Barati.
2407
2408         I reviewed tricky GC-related code including visitChildren and manual writeBarrier, and I found that we have several problems with write-barriers.
2409
2410         1. Some write-barriers are emitted before stores happen
2411
2412             Some code like LazyProperty emits write-barrier before we store the value. This is wrong since JSC has concurrent collector. Let's consider the situation like this.
2413
2414                 1. Cell "A" is not marked yet
2415                 2. Write-barrier is emitted onto "A"
2416                 3. Concurrent collector scans "A"
2417                 4. Store to "A"'s field happens
2418                 5. (4)'s field is not rescaned
2419
2420             We should emit write-barrier after stores. This patch places write-barriers after stores happen.
2421
2422         2. Should emit write-barrier after the stored fields are reachable from the owner.
2423
2424             We have code that is logically the same to the following.
2425
2426                 ```
2427                 auto data = std::make_unique<XXX>();
2428                 data->m_field.set(vm, owner, value);
2429
2430                 storeStoreBarrier();
2431                 owner->m_data = WTFMove(data);
2432                 ```
2433
2434             This is not correct. When write-barrier is emitted, the owner cannot reach to the field that is stored.
2435             The actual example is AccessCase. We are emitting write-barriers with owner when creating AccessCase, but this is not
2436             effective until this AccessCase is chained to StructureStubInfo, which is reachable from CodeBlock.
2437
2438             I don't think this is actually an issue because currently AccessCase generation is guarded by CodeBlock->m_lock. And CodeBlock::visitChildren takes this lock.
2439             But emitting a write-barrier at the right place is still better. This patch places write-barriers when StructureStubInfo::addAccessCase is called.
2440
2441         Speculative GC fix, it was hard to reproduce the crash since we need to control concurrent collector and main thread's scheduling in an instruction-level.
2442
2443         * bytecode/BytecodeList.rb:
2444         * bytecode/CodeBlock.cpp:
2445         (JSC::CodeBlock::finishCreation):
2446         * bytecode/StructureStubInfo.cpp:
2447         (JSC::StructureStubInfo::addAccessCase):
2448         * bytecode/StructureStubInfo.h:
2449         (JSC::StructureStubInfo::considerCaching):
2450         * dfg/DFGPlan.cpp:
2451         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
2452         * jit/JITOperations.cpp:
2453         * llint/LLIntSlowPaths.cpp:
2454         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2455         (JSC::LLInt::setupGetByIdPrototypeCache):
2456         * runtime/CommonSlowPaths.cpp:
2457         (JSC::SLOW_PATH_DECL):
2458         * runtime/LazyPropertyInlines.h:
2459         (JSC::ElementType>::setMayBeNull):
2460         * runtime/RegExpCachedResult.h:
2461         (JSC::RegExpCachedResult::record):
2462
2463 2019-07-30  Yusuke Suzuki  <ysuzuki@apple.com>
2464
2465         [JSC] Make StructureChain less-tricky by using Auxiliary Buffer
2466         https://bugs.webkit.org/show_bug.cgi?id=200192
2467
2468         Reviewed by Saam Barati.
2469
2470         StructureChain has a bit tricky write barrier / mutator fence to use UniqueArray for its underlying storage.
2471         But, since the size of StructureChain is fixed at initialization, we should allocate an underlying storage from auxiliary memory and
2472         set it in its constructor instead of finishCreation. We can store values in the finishCreation so that we do not need to have
2473         a hacky write-barrier and mutator fence. Furthermore, we can make StructureChain non-destructible.
2474
2475         This patch leverages auxiliary buffer for the implementation of StructureChain. And it also adds a test that stresses StructureChain creation.
2476
2477         * runtime/StructureChain.cpp:
2478         (JSC::StructureChain::StructureChain):
2479         (JSC::StructureChain::create):
2480         (JSC::StructureChain::finishCreation):
2481         (JSC::StructureChain::visitChildren):
2482         (JSC::StructureChain::destroy): Deleted.
2483         * runtime/StructureChain.h:
2484
2485 2019-07-29  Yusuke Suzuki  <ysuzuki@apple.com>
2486
2487         [JSC] Increment bytecode age only when SlotVisitor is first-visit
2488         https://bugs.webkit.org/show_bug.cgi?id=200196
2489
2490         Reviewed by Robin Morisset.
2491
2492         WriteBarrier can cause multiple visits for the same UnlinkedCodeBlock. But this does not mean that we are having multiple cycles of GC.
2493         We should increment the age of the UnlinkedCodeBlock only when the SlotVisitor is saying that this is the first visit.
2494
2495         In practice,this almost never happens. Multiple visits can happen only when the marked UnlinkedCodeBlock gets a write-barrier. But, mutation
2496         of UnlinkedCodeBlock is rare or none after it is initialized. I ran all the JSTests and I cannot find any tests that get re-visiting of UnlinkedCodeBlock.
2497         This patch extends JSTests/stress/reparsing-unlinked-codeblock.js to ensure that UnlinkedCodeBlockJettisoning feature is working after this change.
2498
2499         * bytecode/UnlinkedCodeBlock.cpp:
2500         (JSC::UnlinkedCodeBlock::visitChildren):
2501         * heap/SlotVisitor.h:
2502         (JSC::SlotVisitor::isFirstVisit const):
2503         * parser/Parser.cpp:
2504         * parser/Parser.h:
2505         (JSC::parse):
2506         (JSC::parseFunctionForFunctionConstructor):
2507         * runtime/Options.h:
2508         * tools/JSDollarVM.cpp:
2509         (JSC::functionParseCount):
2510         (JSC::JSDollarVM::finishCreation):
2511
2512 2019-07-28  Commit Queue  <commit-queue@webkit.org>
2513
2514         Unreviewed, rolling out r247886.
2515         https://bugs.webkit.org/show_bug.cgi?id=200214
2516
2517         "Causes PLT5 regression on some machines" (Requested by mlam|a
2518         on #webkit).
2519
2520         Reverted changeset:
2521
2522         "Add crash diagnostics for debugging unexpected zapped cells."
2523         https://bugs.webkit.org/show_bug.cgi?id=200149
2524         https://trac.webkit.org/changeset/247886
2525
2526 2019-07-27  Justin Michaud  <justin_michaud@apple.com>
2527
2528         [X86] Emit BT instruction for shift + mask in B3
2529         https://bugs.webkit.org/show_bug.cgi?id=199891
2530
2531         Reviewed by Keith Miller.
2532
2533         - Add a new BranchTestBit air opcode, matching the intel bt instruction
2534         - Select this instruction for the following patterns:
2535           if (a & (1<<b))
2536           if ((a>>b)&1)
2537           if ((~a>>b)&1)
2538           if (~a & (1<<b))
2539         - 15% perf progression on the nonconstant microbenchmark, neutral otherwise.
2540         - Note: we cannot fuse loads when we have bitBase=Load, bitOffset=Tmp, since the X86 instruction has 
2541           different behaviour in this mode. It will read past the current dword/qword instead of wrapping around.
2542
2543         * assembler/MacroAssemblerX86Common.h:
2544         (JSC::MacroAssemblerX86Common::branchTestBit32):
2545         * assembler/MacroAssemblerX86_64.h:
2546         (JSC::MacroAssemblerX86_64::branchTestBit64):
2547         * assembler/X86Assembler.h:
2548         (JSC::X86Assembler::bt_ir):
2549         (JSC::X86Assembler::bt_im):
2550         (JSC::X86Assembler::btw_ir):
2551         (JSC::X86Assembler::btw_im):
2552         * assembler/testmasm.cpp:
2553         (JSC::int64Operands):
2554         (JSC::testBranchTestBit32RegReg):
2555         (JSC::testBranchTestBit32RegImm):
2556         (JSC::testBranchTestBit32AddrImm):
2557         (JSC::testBranchTestBit64RegReg):
2558         (JSC::testBranchTestBit64RegImm):
2559         (JSC::testBranchTestBit64AddrImm):
2560         (JSC::run):
2561         * b3/B3LowerToAir.cpp:
2562         * b3/air/AirOpcode.opcodes:
2563         * b3/testb3.cpp:
2564         (JSC::B3::testBranchBitTest32TmpImm):
2565         (JSC::B3::testBranchBitTest32AddrImm):
2566         (JSC::B3::testBranchBitTest32TmpTmp):
2567         (JSC::B3::testBranchBitTest64TmpTmp):
2568         (JSC::B3::testBranchBitTest64AddrTmp):
2569         (JSC::B3::run):
2570
2571 2019-07-26  Yusuke Suzuki  <ysuzuki@apple.com>
2572
2573         [JSC] Potential GC fix for JSPropertyNameEnumerator
2574         https://bugs.webkit.org/show_bug.cgi?id=200151
2575
2576         Reviewed by Mark Lam.
2577
2578         We have been seeing some JSPropertyNameEnumerator::visitChildren crashes for a long time. The crash frequency itself is not high, but it has existed for a long time.
2579         The crash happens when visiting m_propertyNames. It is also possible that this crash is caused by random corruption somewhere, but JSPropertyNameEnumerator
2580         has some tricky (and potentially dangerous) implementations anyway.
2581
2582         1. JSPropertyNameEnumerator have Vector<WriteBarrier<JSString>> and it is extended in finishCreation with a lock.
2583            We should use Auxiliary memory for this use case. And we should set this memory in the constructor so that
2584            we do not extend it in finishCreation, and we do not need a lock.
2585         2. JSPropertyNameEnumerator gets StructureID before allocating JSPropertyNameEnumerator. This is potentially dangerous because the conservative scan
2586            cannot find the Structure* since we could only have StructureID. Since allocation code happens after StructureID is retrieved, it is possible that
2587            the allocation causes GC and Structure* is collected.
2588
2589         In this patch, we align JSPropertyNameEnumerator implementation to the modern one to avoid using Vector<WriteBarrier<JSString>>. And we can make JSPropertyNameEnumerator
2590         a non-destructible cell. Since JSCell's destructor is one of the cause of various issues, we should avoid it if we can.
2591
2592         No behavior change. This patch adds a test stressing JSPropertyNameEnumerator.
2593
2594         * dfg/DFGOperations.cpp:
2595         * runtime/CommonSlowPaths.cpp:
2596         (JSC::SLOW_PATH_DECL):
2597         * runtime/JSPropertyNameEnumerator.cpp:
2598         (JSC::JSPropertyNameEnumerator::create):
2599         (JSC::JSPropertyNameEnumerator::JSPropertyNameEnumerator):
2600         (JSC::JSPropertyNameEnumerator::finishCreation):
2601         (JSC::JSPropertyNameEnumerator::visitChildren):
2602         (JSC::JSPropertyNameEnumerator::destroy): Deleted.
2603         * runtime/JSPropertyNameEnumerator.h:
2604         * runtime/VM.cpp:
2605         (JSC::VM::emptyPropertyNameEnumeratorSlow):
2606         * runtime/VM.h:
2607         (JSC::VM::emptyPropertyNameEnumerator):
2608
2609 2019-07-26  Mark Lam  <mark.lam@apple.com>
2610
2611         Add crash diagnostics for debugging unexpected zapped cells.
2612         https://bugs.webkit.org/show_bug.cgi?id=200149
2613         <rdar://problem/53570112>
2614
2615         Reviewed by Yusuke Suzuki, Saam Barati, and Michael Saboff.
2616
2617         Add a check for zapped cells in SlotVisitor::appendToMarkStack() and
2618         SlotVisitor::visitChildren().  If a zapped cell is detected, we will crash with
2619         some diagnostic info.
2620
2621         To facilitate this, we've made the following changes:
2622         1. Changed FreeCell to preserve the 1st 8 bytes.  This is fine to do because all
2623            cells are at least 16 bytes long.
2624         2. Changed HeapCell::zap() to only zap the structureID.  Leave the rest of the
2625            cell header info intact (including the cell JSType).
2626         3. Changed HeapCell::zap() to record the reason for zapping the cell.  We stash
2627            the reason immediately after the first 8 bytes.  This is the same location as
2628            FreeCell::scrambledNext.  However, since a cell is not expected to be zapped
2629            and on the free list at the same time, it is also fine to do this.
2630         4. Added a few utility functions to MarkedBlock for checking if a cell points
2631            into the block.
2632         5. Added VMInspector and JSDollarVM utilities to dump in-use subspace hashes.
2633         6. Added some comments to document the hashes of known subspaces.
2634
2635         * heap/FreeList.h:
2636         (JSC::FreeCell::offsetOfScrambledNext):
2637         * heap/HeapCell.h:
2638         (JSC::HeapCell::zap):
2639         (JSC::HeapCell::isZapped const):
2640         * heap/MarkedBlock.cpp:
2641         (JSC::MarkedBlock::Handle::stopAllocating):
2642         * heap/MarkedBlock.h:
2643         (JSC::MarkedBlock::Handle::start const):
2644         (JSC::MarkedBlock::Handle::end const):
2645         (JSC::MarkedBlock::Handle::contains const):
2646         * heap/MarkedBlockInlines.h:
2647         (JSC::MarkedBlock::Handle::specializedSweep):
2648         * heap/MarkedSpace.h:
2649         (JSC::MarkedSpace::forEachSubspace):
2650         * heap/SlotVisitor.cpp:
2651         (JSC::SlotVisitor::appendToMarkStack):
2652         (JSC::SlotVisitor::visitChildren):
2653         (JSC::SlotVisitor::reportZappedCellAndCrash):
2654         * heap/SlotVisitor.h:
2655         * jit/AssemblyHelpers.cpp:
2656         (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
2657         * runtime/VM.cpp:
2658         (JSC::VM::VM):
2659         * tools/JSDollarVM.cpp:
2660         (JSC::functionDumpSubspaceHashes):
2661         (JSC::JSDollarVM::finishCreation):
2662         * tools/VMInspector.cpp:
2663         (JSC::VMInspector::dumpSubspaceHashes):
2664         * tools/VMInspector.h:
2665
2666 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2667
2668         [JSC] Use unalignedLoad for JSRopeString fiber accesses
2669         https://bugs.webkit.org/show_bug.cgi?id=200148
2670
2671         Reviewed by Mark Lam.
2672
2673         JSRopeString always have some subsequent bytes that can be accessible because MarkedBlock has Footer.
2674         We use WTF::unalignedLoad to get fibers. And it will be converted to one load CPU instruction.
2675
2676         * heap/MarkedBlock.h:
2677         * runtime/JSString.h:
2678
2679 2019-07-25  Ross Kirsling  <ross.kirsling@sony.com>
2680
2681         Legacy numeric literals should not permit separators or BigInt
2682         https://bugs.webkit.org/show_bug.cgi?id=199984
2683
2684         Reviewed by Keith Miller.
2685
2686         * parser/Lexer.cpp:
2687         (JSC::Lexer<T>::parseOctal):
2688         (JSC::Lexer<T>::parseDecimal):
2689
2690 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2691
2692         Unreviewed, build fix due to C++17's std::invoke_result_t
2693         https://bugs.webkit.org/show_bug.cgi?id=200139
2694
2695         Use std::result_of for now until all the supported environments implement it.
2696
2697         * heap/IsoSubspace.h:
2698
2699 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2700
2701         [JSC] Ensure PackedCellPtr only takes non-large-allocation pointers
2702         https://bugs.webkit.org/show_bug.cgi?id=200139
2703
2704         Reviewed by Mark Lam.
2705
2706         PackedCellPtr will compact a pointer by leveraging the fact that JSCell pointers are 16byte aligned.
2707         But this fact only holds when the JSCell is not large allocation. Currently, we are using PackedCellPtr
2708         only for the cell types which meets the above requirement. But we would like to ensure that statically.
2709
2710         In this patch, we add additional static/runtime assertions to ensure this invariant. We accept a cell
2711         type of either (1) it is "final" annotated and sizeof(T) is <= MarkedSpace::largeCutoff or (2) it
2712         is allocated from IsoSubspace.
2713
2714         This patch does not change any behaviors. It just adds extra static/runtime assertions.
2715
2716         * bytecode/CodeBlock.h:
2717         (JSC::CodeBlock::subspaceFor):
2718         * bytecode/CodeBlockJettisoningWatchpoint.h:
2719         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
2720         * dfg/DFGAdaptiveStructureWatchpoint.h:
2721         * heap/IsoSubspace.h:
2722         * heap/PackedCellPtr.h:
2723         (JSC::PackedCellPtr::PackedCellPtr):
2724         * runtime/FunctionRareData.h:
2725         (JSC::FunctionRareData::createAllocationProfileClearingWatchpoint):
2726         * runtime/ObjectToStringAdaptiveStructureWatchpoint.h:
2727
2728 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2729
2730         [JSC] Make visitChildren implementation more idiomatic
2731         https://bugs.webkit.org/show_bug.cgi?id=200121
2732
2733         Reviewed by Mark Lam.
2734
2735         This patch makes visitChildren implementations more idiomatic: cast, assert, and calling Base::visitChildren.
2736         While this does not find interesting issues, it is still nice to have consistent implementations.
2737         StructureChain::visitChildren missed Base::visitChildren, but it does not have much effect since StructureChain
2738         is immortal cell.
2739
2740         * bytecode/ExecutableToCodeBlockEdge.cpp:
2741         (JSC::ExecutableToCodeBlockEdge::visitChildren):
2742         * runtime/AbstractModuleRecord.cpp:
2743         (JSC::AbstractModuleRecord::visitChildren):
2744         * runtime/FunctionRareData.cpp:
2745         (JSC::FunctionRareData::visitChildren):
2746         * runtime/JSArrayBufferView.cpp:
2747         (JSC::JSArrayBufferView::visitChildren):
2748         * runtime/JSGenericTypedArrayViewInlines.h:
2749         (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren):
2750         * runtime/JSImmutableButterfly.cpp:
2751         (JSC::JSImmutableButterfly::visitChildren):
2752         * runtime/JSModuleEnvironment.cpp:
2753         (JSC::JSModuleEnvironment::visitChildren):
2754         * runtime/JSModuleRecord.cpp:
2755         (JSC::JSModuleRecord::visitChildren):
2756         * runtime/JSPropertyNameEnumerator.cpp:
2757         (JSC::JSPropertyNameEnumerator::visitChildren):
2758         * runtime/JSString.cpp:
2759         (JSC::JSString::visitChildren):
2760         * runtime/SparseArrayValueMap.cpp:
2761         (JSC::SparseArrayValueMap::visitChildren):
2762         * runtime/StructureChain.cpp:
2763         (JSC::StructureChain::visitChildren):
2764         * runtime/SymbolTable.cpp:
2765         (JSC::SymbolTable::visitChildren):
2766         * tools/JSDollarVM.cpp:
2767         (JSC::Root::visitChildren):
2768         (JSC::ImpureGetter::visitChildren):
2769         * wasm/js/WebAssemblyModuleRecord.cpp:
2770         (JSC::WebAssemblyModuleRecord::visitChildren):
2771
2772 2019-07-25  Ross Kirsling  <ross.kirsling@sony.com>
2773
2774         [ESNext] Implement nullish coalescing
2775         https://bugs.webkit.org/show_bug.cgi?id=200072
2776
2777         Reviewed by Darin Adler.
2778
2779         Implement the nullish coalescing proposal, which has now reached Stage 3 at TC39.
2780
2781         This introduces a ?? operator which:
2782           - acts like || but checks for nullishness instead of truthiness
2783           - has a precedence lower than || (or any other binary operator)
2784           - must be disambiguated with parentheses when combined with || or &&
2785
2786         * bytecompiler/NodesCodegen.cpp:
2787         (JSC::CoalesceNode::emitBytecode): Added.
2788         Bytecode must use OpIsUndefinedOrNull and not OpNeqNull because of document.all.
2789
2790         * parser/ASTBuilder.h:
2791         (JSC::ASTBuilder::makeBinaryNode):
2792         * parser/Lexer.cpp:
2793         (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
2794         * parser/NodeConstructors.h:
2795         (JSC::CoalesceNode::CoalesceNode): Added.
2796         * parser/Nodes.h:
2797         Introduce new token and AST node.
2798
2799         * parser/Parser.cpp:
2800         (JSC::Parser<LexerType>::parseBinaryExpression):
2801         Implement early error.
2802
2803         * parser/ParserTokens.h:
2804         Since this patch needs to shift the value of every binary operator token anyway,
2805         let's only bother to increment their LSBs when we actually have a precedence conflict.
2806
2807         * parser/ResultType.h:
2808         (JSC::ResultType::definitelyIsNull const): Added.
2809         (JSC::ResultType::mightBeUndefinedOrNull const): Added.
2810         (JSC::ResultType::forCoalesce): Added.
2811         We can do better than forLogicalOp here; let's be as accurate as possible.
2812
2813         * runtime/Options.h:
2814         Add runtime feature flag.
2815
2816 2019-07-24  Alexey Shvayka  <shvaikalesh@gmail.com>
2817
2818         Three checks are missing in Proxy internal methods
2819         https://bugs.webkit.org/show_bug.cgi?id=198630
2820
2821         Reviewed by Darin Adler.
2822
2823         Add three missing checks in Proxy internal methods.
2824         These checks are necessary to maintain the invariants of the essential internal methods.
2825         (https://github.com/tc39/ecma262/pull/666)
2826
2827         1. [[GetOwnProperty]] shouldn't return non-configurable and non-writable descriptor when the target's property is writable.
2828         2. [[Delete]] should return `false` when the target has property and is not extensible.
2829         3. [[DefineOwnProperty]] should return `true` for a non-writable input descriptor when the target's property is non-configurable and writable.
2830
2831         Shipping in SpiderMonkey since https://hg.mozilla.org/integration/autoland/rev/3a06bc818bc4 (version 69)
2832         Shipping in V8 since https://chromium.googlesource.com/v8/v8.git/+/e846ad9fa5109428be50b1989314e0e4e7267919
2833
2834         * runtime/ProxyObject.cpp:
2835         (JSC::ProxyObject::performInternalMethodGetOwnProperty): Add writability check.
2836         (JSC::ProxyObject::performDelete): Add extensibility check.
2837         (JSC::ProxyObject::performDefineOwnProperty): Add writability check.
2838
2839 2019-07-24  Mark Lam  <mark.lam@apple.com>
2840
2841         Remove some unused code.
2842         https://bugs.webkit.org/show_bug.cgi?id=200101
2843
2844         Reviewed by Yusuke Suzuki.
2845
2846         * heap/MarkedBlock.cpp:
2847         (JSC::MarkedBlock::Handle::zap): Deleted.
2848         * heap/MarkedBlock.h:
2849         * heap/SlotVisitor.cpp:
2850         (JSC::SlotVisitor::appendToMutatorMarkStack): Deleted.
2851         * heap/SlotVisitor.h:
2852
2853 2019-07-24  Mark Lam  <mark.lam@apple.com>
2854
2855         performJITMemcpy should be PACed with a non-zero diversifier when passed and called via a pointer.
2856         https://bugs.webkit.org/show_bug.cgi?id=200100
2857         <rdar://problem/53474939>
2858
2859         Reviewed by Yusuke Suzuki.
2860
2861         * assembler/ARM64Assembler.h:
2862         (JSC::ARM64Assembler::CopyFunction::CopyFunction):
2863         (JSC::ARM64Assembler::CopyFunction::operator()):
2864         - I choose to use ptrauth_auth_function() here instead of retagCodePtr() because
2865           retagCodePtr() would auth, assert, and re-pac the pointer.  This is needed in
2866           general because retagCodePtr() doesn't know that you will consume the pointer
2867           immediately (and therefore crash imminently if a failed auth is encountered).
2868           Since we know here that we will call with the auth'ed pointer immediately, we
2869           can skip the assert.
2870
2871           This also has the benefit of letting Clang do a peephole optimization to emit
2872           a blrab instruction with the intended diversifier, instead of emitting multiple
2873           instructions to auth the pointer into a C function, and then using a blraaz to
2874           do a C function call.
2875
2876         (JSC::ARM64Assembler::linkJumpOrCall):
2877         (JSC::ARM64Assembler::linkCompareAndBranch):
2878         (JSC::ARM64Assembler::linkConditionalBranch):
2879         (JSC::ARM64Assembler::linkTestAndBranch):
2880         * assembler/LinkBuffer.cpp:
2881         (JSC::LinkBuffer::copyCompactAndLinkCode):
2882         * runtime/JSCPtrTag.h:
2883
2884 2019-07-24  Devin Rousso  <drousso@apple.com>
2885
2886         Web Inspector: print the target of `console.screenshot` last so the target is the closest item to the image
2887         https://bugs.webkit.org/show_bug.cgi?id=199308
2888
2889         Reviewed by Joseph Pecoraro.
2890
2891         * inspector/ConsoleMessage.h:
2892         (Inspector::ConsoleMessage::arguments const):
2893
2894         * inspector/ScriptArguments.h:
2895         * inspector/ScriptArguments.cpp:
2896         (Inspector::ScriptArguments::getFirstArgumentAsString const): Added.
2897         (Inspector::ScriptArguments::getFirstArgumentAsString): Deleted.
2898
2899 2019-07-23  Justin Michaud  <justin_michaud@apple.com>
2900
2901         Sometimes we miss removable CheckInBounds
2902         https://bugs.webkit.org/show_bug.cgi?id=200018
2903
2904         Reviewed by Saam Barati.
2905
2906         We failed to remove the CheckInBounds bounds because we did not see that the index was nonnegative. This is because we do not see the relationship between the two
2907         separate zero constants that appear in the IR for the given test case. This patch re-adds the hack to de-duplicate m_zero that was removed in 
2908         <https://trac.webkit.org/changeset/241228/webkit>.
2909
2910         * dfg/DFGIntegerRangeOptimizationPhase.cpp:
2911
2912 2019-07-22  Yusuke Suzuki  <ysuzuki@apple.com>
2913
2914         [bmalloc] Each IsoPage gets 1MB VA because VMHeap::tryAllocateLargeChunk rounds up
2915         https://bugs.webkit.org/show_bug.cgi?id=200024
2916
2917         Reviewed by Saam Barati.
2918
2919         Discussed and we decided to use this VM tag for IsoHeap instead of CLoop stack.
2920
2921         * interpreter/CLoopStack.cpp:
2922         (JSC::CLoopStack::CLoopStack):
2923
2924 2019-07-22  Saam Barati  <sbarati@apple.com>
2925
2926         Turn off Wasm fast memory on iOS
2927         https://bugs.webkit.org/show_bug.cgi?id=200016
2928         <rdar://problem/53417726>
2929
2930         Reviewed by Yusuke Suzuki.
2931
2932         We turned them on when we disabled Gigacage on iOS. However, we re-enabled
2933         Gigacage on iOS, but forgot to turn wasm fast memories back off.
2934
2935         * runtime/Options.h:
2936
2937 2019-07-22  Ross Kirsling  <ross.kirsling@sony.com>
2938
2939         Unreviewed non-unified build fix.
2940
2941         * runtime/CachedTypes.h:
2942
2943 2019-07-20  Yusuke Suzuki  <ysuzuki@apple.com>
2944
2945         [JSC] Make DFG Local CSE and AI conservative for huge basic block
2946         https://bugs.webkit.org/show_bug.cgi?id=199929
2947         <rdar://problem/49309924>
2948
2949         Reviewed by Filip Pizlo.
2950
2951         In CNN page, the main thread hangs several seconds. On less-powerful devices (like iPhone7), it hangs for ~11 seconds. This is not an acceptable behavior.
2952         The reason of this is that the DFG compiler takes too long time in the compilation for a particular function. It takes 8765 ms even in powerful x64 machine!
2953         DFG compiler is concurrent one. However, when GC requires all the peripheral threads to be stopped, the main thread needs to wait for the DFG compiler's stop.
2954         DFG compiler stops at GC safepoints, and they are inserted between DFG phases. So, if some of DFG phases take very long time, the main thread is blocked during that.
2955         As a result, the main thread is blocked due to this pathological compilation.
2956
2957         By measuring the time taken in each DFG phase, we found that our AI and CSE phase have a problem having quadratic complexity for # of DFG nodes in a basic block.
2958         In this patch, we add a threshold for # of DFG nodes in a basic block. If a basic block exceeds this threshold, we use conservative but O(1) algorithm for AI and Local CSE phase.
2959         We did not add this threshold for Global CSE since FTL has another bytecode cost threshold which prevents us from compiling the large functions. But on the other hand,
2960         DFG should compile them because DFG is intended to be a fast compiler even for a bit larger CodeBlock.
2961
2962         We first attempted to reduce the threshold for DFG compilation. We are using 100000 bytecode cost for DFG compilation and it is very large. However, we found that bytecode cost
2963         is not the problem in CNN page. The problematic function has 67904 cost, and it takes 8765 ms in x64 machine. However, JetStream2/octane-zlib has 61949 function and it only takes
2964         ~400 ms. This difference comes from the # of DFG nodes in a basic block. The problematic function has 43297 DFG nodes in one basic block and it makes AI and Local CSE super time-consuming.
2965         Rather than relying on the bytecode cost which a bit indirectly related to this pathological compile-time, we should look into # of DFG nodes in a basic block which is more directly
2966         related to this problem. And we also found that 61949's Octane-zlib function is very critical for performance. This fact makes a bit hard to pick a right threshold: 67904 causes the problem,
2967         and 61949 must be compiled. This is why this patch is introducing conservative analysis instead of adjusting the threshold for DFG.
2968
2969         This patch has two changes.
2970
2971         1. DFG AI has structure transition tracking which has quadratic complexity
2972
2973         Structure transition tracking takes very long time since its complexity is O(N^2) where N is # of DFG nodes in a basic block.
2974         CNN has very pathological script and it shows 43297 DFG nodes. We should reduce the complexity of this algorithm.
2975         For now, we just say "structures are clobbered" if # of DFG nodes in a basic block exceeds the threshold (20000).
2976         We could improve the current algorithm from O(N^2) to O(2N) without being conservative, and I'm tracking this in [1].
2977
2978         2. DFG Local CSE has quadratic complexity
2979
2980         Local CSE's clobbering iterates all the impure heap values to remove the clobbered one. Since # of impure heap values tend to be proportional to # of DFG nodes we visited,
2981         each CSE for a basic block gets O(N^2) complexity. To avoid this, we introduce HugeMap. This has the same interface to LargeMap and SmallMap in CSE, but its clobbering
2982         implementation just clears the map completely. We can further make this O(N) without introducing conservative behavior by using epochs. For now, we do not see such a huge basic block in
2983         JetStream2 and Speedometer2 so I'll track it in a separate bug[2].
2984
2985         This patch reduces the compilation time from ~11 seconds to ~200 ms.
2986
2987         [1]: https://bugs.webkit.org/show_bug.cgi?id=199959
2988         [2]: https://bugs.webkit.org/show_bug.cgi?id=200014
2989
2990         * dfg/DFGAbstractInterpreterInlines.h:
2991         (JSC::DFG::AbstractInterpreter<AbstractStateType>::observeTransition):
2992         (JSC::DFG::AbstractInterpreter<AbstractStateType>::observeTransitions):
2993         * dfg/DFGCSEPhase.cpp:
2994         * runtime/Options.h:
2995
2996 2019-07-22  Zhifei Fang  <zhifei_fang@apple.com>
2997
2998         Need to skip test cache directory data vault for non internal build
2999         https://bugs.webkit.org/show_bug.cgi?id=199951
3000
3001         Reviewed by Alexey Proskuryakov.
3002
3003         * API/tests/testapi.mm:
3004         (testBytecodeCacheValidation): "Cache directory `/private/tmp` is not a data vault" this error message will only be created for internal build see JSScript.mm:97
3005
3006 2019-07-17  Antoine Quint  <graouts@apple.com>
3007
3008         Disable Pointer Events prior to watchOS 6
3009         https://bugs.webkit.org/show_bug.cgi?id=199890
3010         <rdar://problem/53206113>
3011
3012         Reviewed by Dean Jackson.
3013
3014         * Configurations/FeatureDefines.xcconfig:
3015
3016 2019-07-17  Keith Miller  <keith_miller@apple.com>
3017
3018         Force useLLInt to true on arm64_32
3019         https://bugs.webkit.org/show_bug.cgi?id=199882
3020         <rdar://problem/53207586>
3021
3022         Reviewed by Yusuke Suzuki.
3023
3024         Some jsc tests set useLLInt=false but on arm64_32 we don't support the JIT.
3025         This causes the option coherency checker to get angry. We should force
3026         useLLInt=true on arm64_32 unless useJIT=true.
3027
3028         * runtime/Options.cpp:
3029         (JSC::recomputeDependentOptions):
3030
3031 2019-07-17  Christopher Reid  <chris.reid@sony.com>
3032
3033         Bytecode cache should use FileSystem
3034         https://bugs.webkit.org/show_bug.cgi?id=199759
3035
3036         Reviewed by Yusuke Suzuki.
3037
3038         Update bytecode cache to use platform generic FileSystem calls.
3039
3040         * API/JSScript.mm:
3041         * CMakeLists.txt:
3042         * jsc.cpp:
3043         * runtime/CachePayload.cpp:
3044         * runtime/CachePayload.h:
3045         * runtime/CachedBytecode.h:
3046         * runtime/CachedTypes.cpp:
3047         * runtime/CachedTypes.h:
3048         * runtime/CodeCache.cpp:
3049         * runtime/CodeCache.h:
3050         * runtime/Completion.cpp:
3051         * runtime/Completion.h:
3052
3053 2019-07-17  Mark Lam  <mark.lam@apple.com>
3054
3055         ArgumentsEliminationPhase should insert KillStack nodes before PutStack nodes that it adds.
3056         https://bugs.webkit.org/show_bug.cgi?id=199821
3057         <rdar://problem/52452328>
3058
3059         Reviewed by Filip Pizlo.
3060
3061         Excluding the ArgumentsEliminationPhase, PutStack nodes are converted from SetLocal
3062         nodes in the SSAConversionPhase.  SetLocal nodes are always preceded by MovHint nodes,
3063         and the SSAConversionPhase always inserts a KillStack node before a MovHint node.
3064         Hence, a PutStack node is always preceded by a KillStack node.
3065
3066         However, the ArgumentsEliminationPhase can convert LoadVarargs nodes into a series
3067         of one or more PutStacks nodes, and it prepends MovHint nodes before the PutStack
3068         nodes.  However, it neglects to prepend KillStack nodes as well.  Since the
3069         ArgumentsEliminationPhase runs after the SSAConversionPhase, the PutStack nodes
3070         added during ArgumentsElimination will not be preceded by KillStack nodes.
3071
3072         This patch fixes this by inserting a KillStack in the ArgumentsEliminationPhase
3073         before it inserts a MovHint and a PutStack node.
3074
3075         Consider this test case which can manifest the above issue as a crash:
3076
3077             function inlinee(value) {
3078                 ...
3079                 let tmp = value + 1;
3080             }
3081
3082             function reflect() {
3083                 return inlinee.apply(undefined, arguments);
3084             }
3085
3086             function test(arr) {
3087                 let object = inlinee.apply(undefined, arr);   // Uses a lot of SetArgumentMaybe nodes.
3088                 reflect();    // Calls with a LoadVararg, which gets converted into a PutStack of a constant.
3089             }
3090
3091         In this test case, we have a scenario where a SetArgumentMaybe's stack
3092         slot is reused as the stack slot for a PutStack later.  Here, the PutStack will
3093         put a constant undefined value.  Coincidentally, the SetArgumentMaybe may also
3094         initialize that stack slot to a constant undefined value.  Note that by the time
3095         the PutStack executes, the SetArgumentMaybe's stack slot is dead.  The liveness of
3096         these 2 values are distinct.
3097
3098         However, because we were missing a KillStack before the PutStack, OSR availability
3099         analysis gets misled into thinking that the PutStack constant value is still in the
3100         stack slot because the value left there by the SetArgumentMaybe hasn't been killed
3101         off yet.  As a result, OSR exit code will attempt to recover the PutStack's undefined
3102         constant by loading from the stack slot instead of materializing it.  Since
3103         SetArgumentMaybe may not actually initialize the stack slot, we get a crash in OSR
3104         exit when we try to recover the PutStack constant value from the stack slot, and
3105         end up using what ever junk value we read from there.
3106
3107         Fixing the ArgumentsEliminationPhase to insert KillStack before the PutStack
3108         removes this conflation of the PutStack's constant value with the SetArgumentMaybe's
3109         constant value in the same stack slot.  And, OSR availability analysis will no
3110         longer be misled to load the PutStack's constant value from the stack, but will
3111         materialize the constant instead.
3112
3113         * dfg/DFGArgumentsEliminationPhase.cpp:
3114
3115 2019-07-17  Commit Queue  <commit-queue@webkit.org>
3116
3117         Unreviewed, rolling out r247505.
3118         https://bugs.webkit.org/show_bug.cgi?id=199871
3119
3120         "Caused failed ASSERT in stress test" (Requested by creid on
3121         #webkit).
3122
3123         Reverted changeset:
3124
3125         "Bytecode cache should use FileSystem"
3126         https://bugs.webkit.org/show_bug.cgi?id=199759
3127         https://trac.webkit.org/changeset/247505
3128
3129 2019-07-16  Christopher Reid  <chris.reid@sony.com>
3130
3131         Bytecode cache should use FileSystem
3132         https://bugs.webkit.org/show_bug.cgi?id=199759
3133
3134         Reviewed by Yusuke Suzuki.
3135
3136         Update bytecode cache to use platform generic FileSystem calls.
3137
3138         * API/JSScript.mm:
3139         * CMakeLists.txt:
3140         * jsc.cpp:
3141         * runtime/CachePayload.cpp:
3142         * runtime/CachePayload.h:
3143         * runtime/CachedBytecode.h:
3144         * runtime/CachedTypes.cpp:
3145         * runtime/CachedTypes.h:
3146         * runtime/CodeCache.cpp:
3147         * runtime/CodeCache.h:
3148         * runtime/Completion.cpp:
3149         * runtime/Completion.h:
3150
3151 2019-07-16  Joonghun Park  <pjh0718@gmail.com>
3152
3153         [GTK] Fix a build warning in JavaScriptCore/API/tests/testapi.c
3154         https://bugs.webkit.org/show_bug.cgi?id=199824
3155
3156         Reviewed by Alex Christensen.
3157
3158         * API/tests/testapi.c:
3159         (main):
3160
3161 2019-07-15  Keith Miller  <keith_miller@apple.com>
3162
3163         JSGlobalObject type macros should support feature flags and WeakRef should have one
3164         https://bugs.webkit.org/show_bug.cgi?id=199601
3165
3166         Reviewed by Mark Lam.
3167
3168         This patch refactors the various builtin type macros to have a
3169         parameter, which is the feature flag enabling it.  Since most
3170         builtin types are enabled by default this patch adds a new global
3171         bool typeExposedByDefault for clarity. Note, because static hash
3172         tables have no concept of feature flags we can't use feature flags
3173         with lazy properties. This is probably not a big deal as features
3174         that are off by default won't be allocated anywhere we care about
3175         memory usage anyway.
3176
3177         * runtime/CommonIdentifiers.h:
3178         * runtime/JSGlobalObject.cpp:
3179         (JSC::JSGlobalObject::init):
3180         (JSC::JSGlobalObject::visitChildren):
3181         * runtime/JSGlobalObject.h:
3182         (JSC::JSGlobalObject::stringObjectStructure const):
3183         (JSC::JSGlobalObject::bigIntObjectStructure const): Deleted.
3184         * runtime/Options.h:
3185         * wasm/js/JSWebAssembly.cpp:
3186
3187 2019-07-15  Keith Miller  <keith_miller@apple.com>
3188
3189         A Possible Issue of Object.create method
3190         https://bugs.webkit.org/show_bug.cgi?id=199744
3191
3192         Reviewed by Yusuke Suzuki.
3193
3194         We should call toObject on the properties argument if it was not undefined.
3195         See: https://tc39.es/ecma262/#sec-object.create
3196
3197         * runtime/ObjectConstructor.cpp:
3198         (JSC::objectConstructorCreate):
3199
3200 2019-07-15  Saagar Jha  <saagarjha@apple.com>
3201
3202         Keyword lookup can use memcmp to get around unaligned load undefined behavior
3203         https://bugs.webkit.org/show_bug.cgi?id=199650
3204
3205         Reviewed by Yusuke Suzuki.
3206
3207         Replace KeywordLookup's hand-rolled "memcmp" with the standard version, which reduces the need to deal with
3208         endianness and unaligned loads.
3209
3210         * KeywordLookupGenerator.py:
3211         (Trie.printSubTreeAsC): Use memcmp instead of macros to test for matches.
3212         (Trie.printAsC): Unspecialize Lexer::parseKeyword as templating over the character type reduces the amount of
3213         code we need to generate and moves this task out of the Python script and into the C++ compiler.
3214
3215 2019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
3216
3217         [JSC] Improve wasm wpt test results by fixing miscellaneous issues
3218         https://bugs.webkit.org/show_bug.cgi?id=199783
3219
3220         Reviewed by Mark Lam.
3221
3222         This patch fixes miscellaneous issues in our Wasm JS API implementation to improve WPT score.
3223         I picked trivial ones in this patch to make this easily reviewable.
3224
3225         1. Remove WebAssemblyPrototype. It does not exist in the spec. Merging WebAssemblyPrototype into JSWebAssembly.
3226         2. Fix various attributes. It does not match to the usual JSC builtin's convention. But this change
3227            is correct because they are changed to be matched against WebIDL definition, and WebAssembly implementation
3228            follows WebIDL. In the future, we could move WebCore WebIDL things into WTF layer and even use (or leverage
3229            some of utility functions) in our WebAssembly JS API implementation.
3230         3. Fix how we interpret "present" in WebAssembly spec. This does not mean [[HasProperty]] result. It follows to
3231            WebIDL spec, and it means that [[Get]] result is not undefined.
3232         4. Add argument count check to Module.customSections, which is required because the method is defined in WebIDL.
3233         5. Fix toNonWrappingUint32 to match it to WebIDL's conversion rule.
3234
3235         * CMakeLists.txt:
3236         * DerivedSources-input.xcfilelist:
3237         * DerivedSources-output.xcfilelist:
3238         * DerivedSources.make:
3239         * JavaScriptCore.xcodeproj/project.pbxproj:
3240         * Sources.txt:
3241         * builtins/WebAssembly.js: Renamed from Source/JavaScriptCore/builtins/WebAssemblyPrototype.js.
3242         * jit/Repatch.cpp:
3243         * runtime/JSGlobalObject.cpp:
3244         (JSC::JSGlobalObject::init):
3245         * runtime/JSModuleLoader.cpp:
3246         (JSC::moduleLoaderParseModule):
3247         * wasm/js/JSWebAssembly.cpp:
3248         (JSC::JSWebAssembly::create):
3249         (JSC::JSWebAssembly::finishCreation):
3250         (JSC::reject):
3251         (JSC::webAssemblyModuleValidateAsyncInternal):
3252         (JSC::webAssemblyCompileFunc):
3253         (JSC::resolve):
3254         (JSC::JSWebAssembly::webAssemblyModuleValidateAsync):
3255         (JSC::instantiate):
3256         (JSC::compileAndInstantiate):
3257         (JSC::JSWebAssembly::instantiate):
3258         (JSC::webAssemblyModuleInstantinateAsyncInternal):
3259         (JSC::JSWebAssembly::webAssemblyModuleInstantinateAsync):
3260         (JSC::webAssemblyInstantiateFunc):
3261         (JSC::webAssemblyValidateFunc):
3262         (JSC::webAssemblyCompileStreamingInternal):
3263         (JSC::webAssemblyInstantiateStreamingInternal):
3264         * wasm/js/JSWebAssembly.h:
3265         * wasm/js/JSWebAssemblyHelpers.h:
3266         (JSC::toNonWrappingUint32):
3267         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
3268         (JSC::WebAssemblyCompileErrorConstructor::finishCreation):
3269         * wasm/js/WebAssemblyInstanceConstructor.cpp:
3270         (JSC::WebAssemblyInstanceConstructor::finishCreation):
3271         * wasm/js/WebAssemblyInstancePrototype.cpp:
3272         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
3273         (JSC::WebAssemblyLinkErrorConstructor::finishCreation):
3274         * wasm/js/WebAssemblyMemoryConstructor.cpp:
3275         (JSC::constructJSWebAssemblyMemory):
3276         (JSC::WebAssemblyMemoryConstructor::finishCreation):
3277         * wasm/js/WebAssemblyMemoryPrototype.cpp:
3278         * wasm/js/WebAssemblyModuleConstructor.cpp:
3279         (JSC::webAssemblyModuleCustomSections):
3280         (JSC::WebAssemblyModuleConstructor::finishCreation):
3281         * wasm/js/WebAssemblyPrototype.cpp: Removed.
3282         * wasm/js/WebAssemblyPrototype.h: Removed.
3283         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
3284         (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation):
3285         * wasm/js/WebAssemblyTableConstructor.cpp:
3286         (JSC::constructJSWebAssemblyTable):
3287         (JSC::WebAssemblyTableConstructor::finishCreation):
3288         * wasm/js/WebAssemblyTablePrototype.cpp:
3289
3290 2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
3291
3292         Unreviewed, rolling out r247440.
3293
3294         Broke builds
3295
3296         Reverted changeset:
3297
3298         "[JSC] Improve wasm wpt test results by fixing miscellaneous
3299         issues"
3300         https://bugs.webkit.org/show_bug.cgi?id=199783
3301         https://trac.webkit.org/changeset/247440
3302
3303 2019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
3304
3305         [JSC] Improve wasm wpt test results by fixing miscellaneous issues
3306         https://bugs.webkit.org/show_bug.cgi?id=199783
3307
3308         Reviewed by Mark Lam.
3309
3310         This patch fixes miscellaneous issues in our Wasm JS API implementation to improve WPT score.
3311         I picked trivial ones in this patch to make this easily reviewable.
3312
3313         1. Remove WebAssemblyPrototype. It does not exist in the spec. Merging WebAssemblyPrototype into JSWebAssembly.
3314         2. Fix various attributes. It does not match to the usual JSC builtin's convention. But this change
3315            is correct because they are changed to be matched against WebIDL definition, and WebAssembly implementation
3316            follows WebIDL. In the future, we could move WebCore WebIDL things into WTF layer and even use (or leverage
3317            some of utility functions) in our WebAssembly JS API implementation.
3318         3. Fix how we interpret "present" in WebAssembly spec. This does not mean [[HasProperty]] result. It follows to
3319            WebIDL spec, and it means that [[Get]] result is not undefined.
3320         4. Add argument count check to Module.customSections, which is required because the method is defined in WebIDL.
3321         5. Fix toNonWrappingUint32 to match it to WebIDL's conversion rule.
3322
3323         * CMakeLists.txt:
3324         * DerivedSources-input.xcfilelist:
3325         * DerivedSources-output.xcfilelist:
3326         * DerivedSources.make:
3327         * JavaScriptCore.xcodeproj/project.pbxproj:
3328         * Sources.txt:
3329         * builtins/WebAssembly.js: Renamed from Source/JavaScriptCore/builtins/WebAssemblyPrototype.js.
3330         * jit/Repatch.cpp:
3331         * runtime/JSGlobalObject.cpp:
3332         (JSC::JSGlobalObject::init):
3333         * runtime/JSModuleLoader.cpp:
3334         (JSC::moduleLoaderParseModule):
3335         * wasm/js/JSWebAssembly.cpp:
3336         (JSC::JSWebAssembly::create):
3337         (JSC::JSWebAssembly::finishCreation):
3338         (JSC::reject):
3339         (JSC::webAssemblyModuleValidateAsyncInternal):
3340         (JSC::webAssemblyCompileFunc):
3341         (JSC::resolve):
3342         (JSC::JSWebAssembly::webAssemblyModuleValidateAsync):
3343         (JSC::instantiate):
3344         (JSC::compileAndInstantiate):
3345         (JSC::JSWebAssembly::instantiate):
3346         (JSC::webAssemblyModuleInstantinateAsyncInternal):
3347         (JSC::JSWebAssembly::webAssemblyModuleInstantinateAsync):
3348         (JSC::webAssemblyInstantiateFunc):
3349         (JSC::webAssemblyValidateFunc):
3350         (JSC::webAssemblyCompileStreamingInternal):
3351         (JSC::webAssemblyInstantiateStreamingInternal):
3352         * wasm/js/JSWebAssembly.h:
3353         * wasm/js/JSWebAssemblyHelpers.h:
3354         (JSC::toNonWrappingUint32):
3355         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
3356         (JSC::WebAssemblyCompileErrorConstructor::finishCreation):
3357         * wasm/js/WebAssemblyInstanceConstructor.cpp:
3358         (JSC::WebAssemblyInstanceConstructor::finishCreation):
3359         * wasm/js/WebAssemblyInstancePrototype.cpp:
3360         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
3361         (JSC::WebAssemblyLinkErrorConstructor::finishCreation):
3362         * wasm/js/WebAssemblyMemoryConstructor.cpp:
3363         (JSC::constructJSWebAssemblyMemory):
3364         (JSC::WebAssemblyMemoryConstructor::finishCreation):
3365         * wasm/js/WebAssemblyMemoryPrototype.cpp:
3366         * wasm/js/WebAssemblyModuleConstructor.cpp:
3367         (JSC::webAssemblyModuleCustomSections):
3368         (JSC::WebAssemblyModuleConstructor::finishCreation):
3369         * wasm/js/WebAssemblyPrototype.cpp: Removed.
3370         * wasm/js/WebAssemblyPrototype.h: Removed.
3371         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
3372         (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation):
3373         * wasm/js/WebAssemblyTableConstructor.cpp:
3374         (JSC::constructJSWebAssemblyTable):
3375         (JSC::WebAssemblyTableConstructor::finishCreation):
3376         * wasm/js/WebAssemblyTablePrototype.cpp:
3377
3378 2019-07-15  Youenn Fablet  <youenn@apple.com>
3379
3380         Enable a debug WebRTC mode without any encryption
3381         https://bugs.webkit.org/show_bug.cgi?id=199177
3382         <rdar://problem/52074986>
3383
3384         Reviewed by Eric Carlson.
3385
3386         * inspector/protocol/Page.json:
3387
3388 2019-07-15  Ryan Haddad  <ryanhaddad@apple.com>
3389
3390         Unreviewed, attempt to fix production builds after r247403.
3391
3392         * JavaScriptCore.xcodeproj/project.pbxproj:
3393
3394 2019-07-15  Tadeu Zagallo  <tzagallo@apple.com>
3395
3396         Concurrent GC should not rely on current phase to determine if it's safe to steal conn
3397         https://bugs.webkit.org/show_bug.cgi?id=199786
3398         <rdar://problem/52505197>
3399
3400         Reviewed by Saam Barati.
3401
3402         In r246507, we fixed a race condition in the concurrent GC where the mutator might steal
3403         the conn from the collector thread while it transitions from the End phase to NotRunning.
3404         However, that fix was not sufficient. In the case that the mutator steals the conn, and the
3405         execution interleaves long enough for the mutator to progress to a different collection phase,
3406         the collector will resume in a phase other than NotRunning, and hence the check added to
3407         NotRunning will not suffice. To fix that, we add a new variable to track whether the collector
3408         thread is running (m_collectorThreadIsRunning) and use it to determine whether it's safe to
3409         steal the conn, rather than relying on m_currentPhase.
3410
3411         * heap/Heap.cpp:
3412         (JSC::Heap::runNotRunningPhase):
3413         (JSC::Heap::requestCollection):
3414         * heap/Heap.h:
3415
3416 2019-07-12  Keith Miller  <keith_miller@apple.com>
3417
3418         Add API to get all the dependencies of a given JSScript
3419         https://bugs.webkit.org/show_bug.cgi?id=199746
3420
3421         Reviewed by Saam Barati.
3422
3423         The method only returns the dependencies if the module was
3424         actually evaluated. Technically, we know what the dependencies are
3425         at the satisfy phase but for API simplicity we only provide that
3426         information if the module graph was complete enough to at least
3427         run.
3428
3429         This patch also fixes an issue where we would allow import
3430         specifiers that didn't start "./" or "/". For reference, We have
3431         this restriction to be consistent with the web/node. The
3432         restriction exists in order to preserve namespace for
3433         builtin-modules.
3434
3435         Lastly, this patch makes it so that we copy all scripts in the
3436         API/tests/testapiScripts directory so they don't have to be
3437         individually added to the xcode project.
3438
3439         * API/JSAPIGlobalObject.mm:
3440         (JSC::computeValidImportSpecifier):
3441         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
3442         (JSC::JSAPIGlobalObject::moduleLoaderImportModule):
3443         * API/JSContext.mm:
3444         (-[JSContext dependencyIdentifiersForModuleJSScript:]):
3445         * API/JSContextPrivate.h:
3446         * API/JSScript.h:
3447         * API/tests/testapi.mm:
3448         (testFetchWithTwoCycle):
3449         (testFetchWithThreeCycle):
3450         (testModuleBytecodeCache):
3451         (+[JSContextFileLoaderDelegate newContext]):
3452         (-[JSContextFileLoaderDelegate fetchModuleScript:]):
3453         (-[JSContextFileLoaderDelegate findScriptForKey:]):
3454         (-[JSContextFileLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
3455         (testDependenciesArray):
3456         (testDependenciesEvaluationError):
3457         (testDependenciesSyntaxError):
3458         (testDependenciesBadImportId):
3459         (testDependenciesMissingImport):
3460         (testObjectiveCAPI):
3461         * API/tests/testapiScripts/dependencyListTests/badModuleImportId.js: Added.
3462         * API/tests/testapiScripts/dependencyListTests/bar.js: Added.
3463         * API/tests/testapiScripts/dependencyListTests/dependenciesEntry.js: Added.
3464         * API/tests/testapiScripts/dependencyListTests/foo.js: Added.
3465         * API/tests/testapiScripts/dependencyListTests/missingImport.js: Added.
3466         * API/tests/testapiScripts/dependencyListTests/referenceError.js: Added.
3467         * API/tests/testapiScripts/dependencyListTests/syntaxError.js: Added.
3468         * API/tests/testapiScripts/testapi-function-overrides.js: Renamed from Source/JavaScriptCore/API/tests/testapi-function-overrides.js.
3469         * API/tests/testapiScripts/testapi.js: Renamed from Source/JavaScriptCore/API/tests/testapi.js.
3470         * JavaScriptCore.xcodeproj/project.pbxproj:
3471         * builtins/ModuleLoader.js:
3472         (dependencyKeysIfEvaluated):
3473         * runtime/JSModuleLoader.cpp:
3474         (JSC::JSModuleLoader::dependencyKeysIfEvaluated):
3475         * runtime/JSModuleLoader.h:
3476         * shell/CMakeLists.txt:
3477
3478 2019-07-12  Justin Michaud  <justin_michaud@apple.com>
3479
3480         B3 should reduce (integer) Sub(Neg(x), y) to Neg(Add(x, y))
3481         https://bugs.webkit.org/show_bug.cgi?id=196371
3482
3483         Reviewed by Keith Miller.
3484
3485         Adding these strength reductions gives 2x a (x86) and 3x (arm64) performance improvement
3486         on the microbenchmark.
3487
3488         * b3/B3ReduceStrength.cpp:
3489         * b3/testb3.cpp:
3490         (JSC::B3::testSubSub):
3491         (JSC::B3::testSubSub2):
3492         (JSC::B3::testSubAdd):
3493         (JSC::B3::testSubFirstNeg):
3494         (JSC::B3::run):
3495
3496 2019-07-12  Caio Lima  <ticaiolima@gmail.com>
3497
3498         [BigInt] Add ValueBitLShift into DFG
3499         https://bugs.webkit.org/show_bug.cgi?id=192664
3500
3501         Reviewed by Saam Barati.
3502
3503         This patch is splitting the `BitLShift` into `ArithBitLShift` and
3504         `ValueBitLShift` to handle BigInt speculation more efficiently during
3505         DFG and FTL layers. Following the same approach of other `ValueBitOps`,
3506         `ValueBitLShift` handles Untyped and BigInt speculations, while
3507         `ArithBitLShift` handles number and boolean operands and always results into
3508         Int32. 
3509
3510         * bytecode/BytecodeList.rb:
3511         * bytecode/CodeBlock.cpp:
3512         (JSC::CodeBlock::finishCreation):
3513         * bytecode/Opcode.h:
3514         * dfg/DFGAbstractInterpreter.h:
3515         * dfg/DFGAbstractInterpreterInlines.h:
3516         (JSC::DFG::AbstractInterpreter<AbstractStateType>::handleConstantBinaryBitwiseOp):
3517         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3518
3519         We moved `BitLShift` constant fold rules to a new method
3520         `handleConstantBinaryBitwiseOp` to be reused by `ArithBitLShift` and
3521         `ValueBitLShift`. This also enables support of constant folding on other
3522         bitwise operations like `ValueBitAnd`, `ValueBitOr` and `ValueBitXor`, when
3523         their binary use kind is UntypedUse. Such cases can happen on those
3524         nodes because fixup phase is conservative.
3525
3526         * dfg/DFGBackwardsPropagationPhase.cpp:
3527         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwo):
3528         (JSC::DFG::BackwardsPropagationPhase::propagate):
3529         * dfg/DFGByteCodeParser.cpp:
3530         (JSC::DFG::ByteCodeParser::handleIntrinsicGetter):
3531         (JSC::DFG::ByteCodeParser::parseBlock):
3532
3533         We parse `op_lshift` as `ArithBitLShift` when its operands are numbers.
3534         Otherwise, we fallback to `ValueBitLShift` and rely on fixup phase to
3535         convert `ValueBitLShift` into `ArithBitLShift` when possible.
3536
3537         * dfg/DFGClobberize.h:
3538         (JSC::DFG::clobberize):
3539
3540         `ArithBitLShift` has the same clobberize rules as former `BitLShift`.
3541         `ValueBitLShift` only clobberize world when it is UntypedUse.
3542
3543         * dfg/DFGDoesGC.cpp:
3544         (JSC::DFG::doesGC):
3545
3546         `ValueBitLShift` can GC when `BigIntUse` because it allocates new
3547         JSBigInts to perform this operation. It also can GC on UntypedUse
3548         because of observable user code.
3549
3550         * dfg/DFGFixupPhase.cpp:
3551         (JSC::DFG::FixupPhase::fixupNode):
3552
3553         `ValueBitLShift` and `ArithBitLShift` has the same fixup rules of
3554         other binary bitwise operations. In the case of `ValueBitLShift`
3555         We check if we should speculate on BigInt or Untyped and fallback to
3556         `ArithBitLShift` when both cheks fail.
3557
3558         * dfg/DFGNode.h:
3559         (JSC::DFG::Node::hasHeapPrediction):
3560         * dfg/DFGNodeType.h:
3561         * dfg/DFGOperations.cpp:
3562
3563         We updated `operationValueBitLShift` to handle BigInt cases. Also, we
3564         added `operationBitLShiftBigInt` that is used when we compile
3565         `ValueBitLValueBitLShift(BigIntUse)`.
3566
3567         * dfg/DFGOperations.h:
3568         * dfg/DFGPredictionPropagationPhase.cpp:
3569
3570         `ValueBitLShift`'s prediction propagation rules differs from other
3571         bitwise operations, because using only heap prediction for this node causes
3572         significant performance regression on Octane's zlib and mandreel.
3573         The reason is because of cases where a function is compiled but the
3574         instruction `op_lshift` was never executed before. If we use
3575         `getPrediction()` we will emit a `ForceOSRExit`, resulting in more OSR
3576         than desired. To solve such issue, we are then using
3577         `getPredictionWithoutOSR()` and falling back to `getHeapPrediction()`
3578         only on cases where we can't rely on node's input types.
3579
3580         * dfg/DFGSafeToExecute.h:
3581         (JSC::DFG::safeToExecute):
3582         * dfg/DFGSpeculativeJIT.cpp:
3583         (JSC::DFG::SpeculativeJIT::compileValueLShiftOp):
3584         (JSC::DFG::SpeculativeJIT::compileShiftOp):
3585         * dfg/DFGSpeculativeJIT.h:
3586         (JSC::DFG::SpeculativeJIT::shiftOp):
3587         * dfg/DFGSpeculativeJIT32_64.cpp:
3588         (JSC::DFG::SpeculativeJIT::compile):
3589         * dfg/DFGSpeculativeJIT64.cpp:
3590         (JSC::DFG::SpeculativeJIT::compile):
3591         * dfg/DFGStrengthReductionPhase.cpp:
3592         (JSC::DFG::StrengthReductionPhase::handleNode):
3593         * ftl/FTLCapabilities.cpp:
3594         (JSC::FTL::canCompile):
3595         * ftl/FTLLowerDFGToB3.cpp:
3596         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
3597         (JSC::FTL::DFG::LowerDFGToB3::compileArithBitLShift):
3598         (JSC::FTL::DFG::LowerDFGToB3::compileValueBitLShift):
3599         (JSC::FTL::DFG::LowerDFGToB3::compileBitLShift): Deleted.
3600         * llint/LowLevelInterpreter32_64.asm:
3601         * llint/LowLevelInterpreter64.asm:
3602         * runtime/CommonSlowPaths.cpp:
3603         (JSC::SLOW_PATH_DECL):
3604
3605 2019-07-12  Keith Miller  <keith_miller@apple.com>
3606
3607         getIndexQuickly should be const
3608         https://bugs.webkit.org/show_bug.cgi?id=199747
3609
3610         Reviewed by Yusuke Suzuki.
3611
3612         * runtime/Butterfly.h:
3613         (JSC::Butterfly::indexingPayload const):
3614         (JSC::Butterfly::arrayStorage const):
3615         (JSC::Butterfly::contiguousInt32 const):
3616         (JSC::Butterfly::contiguousDouble const):
3617         (JSC::Butterfly::contiguous const):
3618         * runtime/JSObject.h:
3619         (JSC::JSObject::canGetIndexQuickly const):
3620         (JSC::JSObject::getIndexQuickly const):
3621         (JSC::JSObject::tryGetIndexQuickly const):
3622         (JSC::JSObject::canGetIndexQuickly): Deleted.
3623         (JSC::JSObject::getIndexQuickly): Deleted.
3624
3625 2019-07-11  Justin Michaud  <justin_michaud@apple.com>
3626
3627         Add b3 macro lowering for CheckMul on arm64
3628         https://bugs.webkit.org/show_bug.cgi?id=199251
3629
3630         Reviewed by Robin Morisset.
3631
3632         - Lower CheckMul for 32-bit arguments on arm64 into a mul and then an overflow check.
3633         - Add a new opcode to air on arm64 for smull (multiplySignExtend32).
3634         - Fuse sign extend 32 + mul into smull (taking two 32-bit arguments and producing 64 bits). 
3635         - 1.25x speedup on power of two microbenchmark, 1.15x speedup on normal constant microbenchmark, 
3636           and no change on the no-constant benchmark.
3637         Also, skip some of the b3 tests that were failing before this patch so that the new tests can run
3638         to completion.
3639
3640         * assembler/MacroAssemblerARM64.h:
3641         (JSC::MacroAssemblerARM64::multiplySignExtend32):
3642         * assembler/testmasm.cpp:
3643         (JSC::testMul32SignExtend):
3644         (JSC::run):
3645         * b3/B3LowerMacros.cpp:
3646         * b3/B3LowerToAir.cpp:
3647         * b3/air/AirOpcode.opcodes:
3648         * b3/testb3.cpp:
3649         (JSC::B3::testMulArgs32SignExtend):
3650         (JSC::B3::testMulImm32SignExtend):
3651         (JSC::B3::testMemoryFence):
3652         (JSC::B3::testStoreFence):
3653         (JSC::B3::testLoadFence):
3654         (JSC::B3::testPinRegisters):
3655         (JSC::B3::run):
3656
3657 2019-07-11  Yusuke Suzuki  <ysuzuki@apple.com>
3658
3659         Unreviewed, revert r243617.
3660         https://bugs.webkit.org/show_bug.cgi?id=196341
3661
3662         Mark pointed out that JSVirtualMachine can be gone in the other thread while we are executing GC constraint-solving.
3663         This patch does not account that JavaScriptCore.framework is multi-thread safe: JSVirtualMachine wrapper can be destroyed,
3664         and [JSVirtualMachine dealloc] can be executed in any threads while the VM is retained and used in the other thread (e.g.
3665         destroyed from AutoReleasePool in some thread).
3666
3667         * API/JSContext.mm:
3668         (-[JSContext initWithVirtualMachine:]):
3669         (-[JSContext dealloc]):
3670         (-[JSContext initWithGlobalContextRef:]):
3671         (-[JSContext wrapperMap]):
3672         (+[JSContext contextWithJSGlobalContextRef:]):
3673         * API/JSVirtualMachine.mm:
3674         (initWrapperCache):
3675         (wrapperCache):
3676         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]):
3677         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]):
3678         (-[JSVirtualMachine initWithContextGroupRef:]):
3679         (-[JSVirtualMachine dealloc]):
3680         (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
3681         (-[JSVirtualMachine contextForGlobalContextRef:]):
3682         (-[JSVirtualMachine addContext:forGlobalContextRef:]):
3683         (scanExternalObjectGraph):
3684         (scanExternalRememberedSet):
3685         * API/JSVirtualMachineInternal.h:
3686         * runtime/JSGlobalObject.h:
3687         (JSC::JSGlobalObject::setWrapperMap):
3688         (JSC::JSGlobalObject::setAPIWrapper): Deleted.
3689         (JSC::JSGlobalObject::apiWrapper const): Deleted.
3690         * runtime/VM.h:
3691
3692 2019-07-10  Tadeu Zagallo  <tzagallo@apple.com>
3693
3694         Optimize join of large empty arrays
3695         https://bugs.webkit.org/show_bug.cgi?id=199636
3696
3697         Reviewed by Mark Lam.
3698
3699         Replicate the behavior of `str.repeat(count)` when performing `new Array(count + 1).join(str)`.
3700         I added two new microbenchmarks:
3701         - large-empty-array-join, which does not use the result of the join and runs ~44x faster and uses ~18x less memory.
3702         - large-empty-array-join-resolve-rope, which uses the result of the join and runs 2x faster.
3703
3704                                                     baseline                    diff
3705         large-empty-array-join                2713.9698+-72.7621    ^     61.2335+-10.4836       ^ definitely 44.3217x faster
3706         large-empty-array-join-resolve-string   26.5517+-0.3995     ^     12.9309+-0.5516        ^ definitely 2.0533x faster
3707
3708         large-empty-array-join memory usage with baseline (dirty):
3709             733012 kB current_mem
3710             756824 kB lifetime_peak
3711
3712         large-empty-array-join memory usage with diff (dirty):
3713             41904 kB current_mem
3714             41972 kB lifetime_peak
3715
3716         Additionally, I ran JetStream2, sunspider and v8-spider and all were neutral.
3717
3718         * runtime/ArrayPrototype.cpp:
3719         (JSC::fastJoin):
3720
3721 2019-07-08  Keith Miller  <keith_miller@apple.com>
3722
3723         Enable Intl.PluralRules and Intl.NumberFormatToParts by default
3724         https://bugs.webkit.org/show_bug.cgi?id=199288
3725
3726         Reviewed by Yusuke Suzuki.
3727
3728         These features have been around for a while. We should turn them on by default.
3729
3730         * runtime/IntlNumberFormatPrototype.cpp:
3731         (JSC::IntlNumberFormatPrototype::finishCreation):
3732         * runtime/IntlObject.cpp:
3733         (JSC::IntlObject::finishCreation): Deleted.
3734         * runtime/IntlObject.h:
3735         * runtime/Options.h:
3736
3737 2019-07-08  Antoine Quint  <graouts@apple.com>
3738
3739         [Pointer Events] Enable only on the most recent version of the supported iOS family
3740         https://bugs.webkit.org/show_bug.cgi?id=199562
3741         <rdar://problem/52766511>
3742
3743         Reviewed by Dean Jackson.
3744
3745         * Configurations/FeatureDefines.xcconfig:
3746
3747 2019-07-06  Michael Saboff  <msaboff@apple.com>
3748
3749         switch(String) needs to check for exceptions when resolving the string
3750         https://bugs.webkit.org/show_bug.cgi?id=199541
3751
3752         Reviewed by Mark Lam.
3753
3754         Added exception checks for resolved Strings in switch processing for all tiers.
3755
3756         * dfg/DFGOperations.cpp:
3757         * jit/JITOperations.cpp:
3758         * llint/LLIntSlowPaths.cpp:
3759         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
3760
3761 2019-07-05  Mark Lam  <mark.lam@apple.com>
3762
3763         ArgumentsEliminationPhase::eliminateCandidatesThatInterfere() should not decrement nodeIndex pass zero.
3764         https://bugs.webkit.org/show_bug.cgi?id=199533
3765         <rdar://problem/52669111>
3766
3767         Reviewed by Filip Pizlo.
3768
3769         * dfg/DFGArgumentsEliminationPhase.cpp:
3770
3771 2019-07-05  Yusuke Suzuki  <ysuzuki@apple.com>
3772
3773         Unreviewed, fix build failure on ARM64_32
3774         https://bugs.webkit.org/show_bug.cgi?id=182434
3775
3776         Implicit narrowing from uint64_t to uint32_t happens. We should explicitly narrow it because we already checked
3777         the `length` is <= UINT32_MAX.
3778
3779         * runtime/ArrayPrototype.cpp:
3780         (JSC::arrayProtoFuncSpeciesCreate):
3781
3782 2019-07-05  Alexey Shvayka  <shvaikalesh@gmail.com>
3783
3784         [JSC] Clean up ArraySpeciesCreate
3785         https://bugs.webkit.org/show_bug.cgi?id=182434
3786
3787         Reviewed by Yusuke Suzuki.
3788
3789         We have duplicate code in arraySpeciesCreate, filter, map, concatSlowPath of ArrayPrototype.js
3790         and speciesConstructArray of ArrayPrototype.cpp. This patch fixes cross-realm Array constructor
3791         detection in native speciesConstructArray, upgrades `length` type to correctly handle large integers,
3792         and exposes it as @arraySpeciesCreate. Also removes now unused @isArrayConstructor private function.
3793         Native speciesConstructArray is preferred because it has fast path via speciesWatchpointIsValid.
3794
3795         Thoroughly benchmarked: this change progresses ARES-6 by 0-1%.
3796
3797         * builtins/ArrayPrototype.js:
3798         (filter):
3799         (map):
3800         (globalPrivate.concatSlowPath):
3801         (globalPrivate.arraySpeciesCreate): Deleted.
3802         * builtins/BuiltinNames.h:
3803         * runtime/ArrayConstructor.cpp:
3804         (JSC::arrayConstructorPrivateFuncIsArrayConstructor): Deleted.
3805         * runtime/ArrayConstructor.h:
3806         * runtime/ArrayPrototype.cpp:
3807         (JSC::arrayProtoFuncSpeciesCreate):
3808         * runtime/ArrayPrototype.h:
3809         * runtime/JSGlobalObject.cpp:
3810         (JSC::JSGlobalObject::init):
3811
3812 2019-07-05  Tadeu Zagallo  <tzagallo@apple.com>
3813
3814         Unreviewed, change the value used to scribble Heap::m_worldState
3815         https://bugs.webkit.org/show_bug.cgi?id=199498
3816
3817         Follow-up after r247160. The value used to scribble should have the
3818         conn bit set.
3819
3820         * heap/Heap.cpp:
3821         (JSC::Heap::~Heap):
3822
3823 2019-07-05  Ryan Haddad  <ryanhaddad@apple.com>
3824
3825         Unreviewed, rolling out r247115.
3826
3827         Breaks lldbWebKitTester (and by extension, test-webkitpy)
3828
3829         Reverted changeset:
3830
3831         "[WHLSL] Standard library is too big to directly include in
3832         WebCore"
3833         https://bugs.webkit.org/show_bug.cgi?id=198186
3834         https://trac.webkit.org/changeset/247115
3835
3836 2019-07-05  Tadeu Zagallo  <tzagallo@apple.com>
3837
3838         Scribble Heap::m_worldState on destructor
3839         https://bugs.webkit.org/show_bug.cgi?id=199498
3840
3841         Reviewed by Sam Weinig.
3842
3843         The worldState is dumped when we crash due to a failed checkConn, and
3844         this will make it clear if the heap has already been destroyed.
3845
3846         * heap/Heap.cpp:
3847         (JSC::Heap::~Heap):
3848
3849 2019-07-03  Sam Weinig  <weinig@apple.com>
3850
3851         Adopt simple structured bindings in more places
3852         https://bugs.webkit.org/show_bug.cgi?id=199247
3853
3854         Reviewed by Alex Christensen.
3855
3856         Replaces simple uses of std::tie() with structured bindings. Does not touch
3857         uses of std::tie() that are not initial declarations, use std::ignore or in
3858         case where the binding is captured by a lambda, as structured bindings don't
3859         work for those cases yet.
3860
3861         * runtime/PromiseDeferredTimer.cpp:
3862         (JSC::PromiseDeferredTimer::doWork):
3863         * wasm/WasmFaultSignalHandler.cpp:
3864         (JSC::Wasm::trapHandler):
3865         * wasm/js/JSWebAssemblyHelpers.h:
3866         (JSC::createSourceBufferFromValue):
3867         * wasm/js/WebAssemblyPrototype.cpp:
3868         (JSC::webAssemblyValidateFunc):
3869
3870 2019-07-03  Keith Miller  <keith_miller@apple.com>
3871
3872         PACCage should first cage leaving PAC bits intact then authenticate
3873         https://bugs.webkit.org/show_bug.cgi?id=199372
3874
3875         Reviewed by Saam Barati.
3876
3877         This ordering prevents someone from taking a signed pointer from
3878         outside the gigacage and using it in a struct that expects a caged
3879         pointer. Previously, the PACCaging just double checked that the PAC
3880         bits were valid for the original pointer.
3881
3882
3883                +---------------------------+
3884                |       |        |          |
3885                | "PAC" | "base" | "offset" +----+
3886                |       |        |          |    |
3887                +---------------------------+    | Caging
3888                 |                               |
3889                 |                               |
3890                 |                               v
3891                 |                +---------------------------+
3892                 |                |       |        |          |
3893                 | Bit Merge      | 00000 |  base  | "offset" |
3894                 |                |       |        |          |
3895                 |                +---------------------------+
3896                 |                               |
3897                 |                               |
3898                 v                               |  Bit Merge
3899           +---------------------------+         |
3900           |       |        |          |         |
3901           | "PAC" |  base  | "offset" +<--------+
3902           |       |        |          |
3903           +---------------------------+
3904                       |
3905                       |
3906                       | Authenticate
3907                       |
3908                       v
3909           +---------------------------+
3910           |       |        |          |
3911           | Auth  |  base  | "offset" |
3912           |       |        |          |
3913           +---------------------------+
3914
3915         The above ascii art graph shows how the PACCage system works. The
3916         key take away is that even if someone passes in a valid, signed
3917         pointer outside the cage it will still fail to authenticate as the
3918         "base" bits will change before authentication.
3919
3920
3921         * assembler/MacroAssemblerARM64E.h:
3922         * assembler/testmasm.cpp:
3923         (JSC::testCagePreservesPACFailureBit):
3924         * ftl/FTLLowerDFGToB3.cpp:
3925         (JSC::FTL::DFG::LowerDFGToB3::caged):
3926         * jit/AssemblyHelpers.h:
3927         (JSC::AssemblyHelpers::cageConditionally):
3928         * llint/LowLevelInterpreter64.asm:
3929
3930 2019-07-03  Paulo Matos  <pmatos@igalia.com>
3931
3932         Refactoring of architectural Register Information
3933         https://bugs.webkit.org/show_bug.cgi?id=198604
3934
3935         Reviewed by Keith Miller.
3936
3937         The goal of this patch is to centralize the register information per platform
3938         but access it in a platform independent way. The patch as been implemented for all
3939         known platforms: ARM64, ARMv7, MIPS, X86 and X86_64. Register information has
3940         been centralized in an architecture per-file: each file is called assembler/<arch>Registers.h.
3941
3942         RegisterInfo.h is used as a forwarding header to choose which register information to load.
3943         assembler/<arch>Assembler.h and jit/RegisterSet.cpp use this information in a platform
3944         independent way.
3945
3946         * CMakeLists.txt:
3947         * JavaScriptCore.xcodeproj/project.pbxproj:
3948         * assembler/ARM64Assembler.h:
3949         (JSC::ARM64Assembler::gprName): Use register names from register info file.
3950         (JSC::ARM64Assembler::sprName): likewise.
3951         (JSC::ARM64Assembler::fprName): likewise.
3952         * assembler/ARM64Registers.h: Added.
3953         * assembler/ARMv7Assembler.h:
3954         (JSC::ARMv7Assembler::gprName): Use register names from register info file.
3955         (JSC::ARMv7Assembler::sprName): likewise.
3956         (JSC::ARMv7Assembler::fprName): likewise.
3957         * assembler/ARMv7Registers.h: Added.
3958         * assembler/MIPSAssembler.h:
3959         (JSC::MIPSAssembler::gprName): Use register names from register info file.
3960         (JSC::MIPSAssembler::sprName): likewise.
3961         (JSC::MIPSAssembler::fprName): likewise.
3962         * assembler/MIPSRegisters.h: Added.
3963         * assembler/RegisterInfo.h: Added.
3964         * assembler/X86Assembler.h:
3965         (JSC::X86Assembler::gprName): Use register names from register info file.
3966         (JSC::X86Assembler::sprName): likewise.
3967         (JSC::X86Assembler::fprName): likewise.
3968         * assembler/X86Registers.h: Added.
3969         * assembler/X86_64Registers.h: Added.
3970         * jit/GPRInfo.h: Fix typo in comment (s/basline/baseline).
3971         * jit/RegisterSet.cpp:
3972         (JSC::RegisterSet::reservedHardwareRegisters): Use register properties from register info file.
3973         (JSC::RegisterSet::calleeSaveRegisters): likewise.
3974
3975 2019-07-02  Michael Saboff  <msaboff@apple.com>
3976
3977         Exception from For..of loop destructured assignment eliminates TDZ checks in subsequent code
3978         https://bugs.webkit.org/show_bug.cgi?id=199395
3979
3980         Reviewed by Filip Pizlo.
3981
3982         For destructuring assignmests, the assignment might throw a reference error if
3983         the RHS cannot be coerced.  The current bytecode generated for such assignments
3984         optimizes out the TDZ check after the coercible check.