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