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