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