Web Inspector: Debugger: lazily create the agent
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-03-19  Devin Rousso  <drousso@apple.com>
2
3         Web Inspector: Debugger: lazily create the agent
4         https://bugs.webkit.org/show_bug.cgi?id=195973
5         <rdar://problem/49039674>
6
7         Reviewed by Joseph Pecoraro.
8
9         * inspector/JSGlobalObjectInspectorController.cpp:
10         (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
11         (Inspector::JSGlobalObjectInspectorController::frontendInitialized):
12         (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
13
14         * inspector/JSGlobalObjectConsoleClient.h:
15         (Inspector::JSGlobalObjectConsoleClient::setInspectorDebuggerAgent): Added.
16         * inspector/JSGlobalObjectConsoleClient.cpp:
17         (Inspector::JSGlobalObjectConsoleClient::JSGlobalObjectConsoleClient):
18         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
19         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
20
21         * inspector/agents/InspectorDebuggerAgent.h:
22         (Inspector::InspectorDebuggerAgent::addListener): Added.
23         (Inspector::InspectorDebuggerAgent::removeListener): Added.
24         (Inspector::InspectorDebuggerAgent::setListener): Deleted.
25         * inspector/agents/InspectorDebuggerAgent.cpp:
26         (Inspector::InspectorDebuggerAgent::InspectorDebuggerAgent):
27         (Inspector::InspectorDebuggerAgent::enable):
28         (Inspector::InspectorDebuggerAgent::disable):
29         (Inspector::InspectorDebuggerAgent::getScriptSource):
30         (Inspector::InspectorDebuggerAgent::schedulePauseOnNextStatement):
31         (Inspector::InspectorDebuggerAgent::didPause):
32         (Inspector::InspectorDebuggerAgent::breakProgram):
33         (Inspector::InspectorDebuggerAgent::clearBreakDetails):
34         Drive-by: reorder some member variables for better sizing.
35         Drive-by: rename some member variables for clarity.
36
37 2019-03-19  Saam barati  <sbarati@apple.com>
38
39         Prune code after ForceOSRExit
40         https://bugs.webkit.org/show_bug.cgi?id=195913
41
42         Reviewed by Keith Miller.
43
44         I removed our original implementation of this in r242989 because
45         it was not sound. It broke backwards propagation because it removed
46         uses of a node that backwards propagation relied on to be sound.
47         Essentially, backwards propagation relies on being able to see uses
48         that would exist in bytecode to be sound.
49         
50         The rollout in r242989 was a 1% Speedometer2 regression. This patch
51         rolls back in the optimization in a sound way.
52         
53         This patch augments the code we had prior to r242989 to be sound. In
54         addition to preserving liveness, we now also convert all uses after
55         the ForceOSRExit to be Phantom. This may pessimize the optimizations
56         we do in backwards propagation, but it will prevent that phase from
57         making unsound optimizations.
58
59         * dfg/DFGByteCodeParser.cpp:
60         (JSC::DFG::ByteCodeParser::addToGraph):
61         (JSC::DFG::ByteCodeParser::parse):
62
63 2019-03-19  Michael Catanzaro  <mcatanzaro@igalia.com>
64
65         Build cleanly with GCC 9
66         https://bugs.webkit.org/show_bug.cgi?id=195920
67
68         Reviewed by Chris Dumez.
69
70         WebKit triggers three new GCC 9 warnings:
71
72         """
73         -Wdeprecated-copy, implied by -Wextra, warns about the C++11 deprecation of implicitly
74         declared copy constructor and assignment operator if one of them is user-provided.
75         """
76
77         Solution is to either add a copy constructor or copy assignment operator, if required, or
78         else remove one if it is redundant.
79
80         """
81         -Wredundant-move, implied by -Wextra, warns about redundant calls to std::move.
82         -Wpessimizing-move, implied by -Wall, warns when a call to std::move prevents copy elision.
83         """
84
85         These account for most of this patch. Solution is to just remove the bad WTFMove().
86
87         Additionally, -Wclass-memaccess has been enhanced to catch a few cases that GCC 8 didn't.
88         These are solved by casting nontrivial types to void* before using memcpy. (Of course, it
89         would be safer to not use memcpy on nontrivial types, but that's too complex for this
90         patch. Searching for memcpy used with static_cast<void*> will reveal other cases to fix.)
91
92         * b3/B3ValueRep.h:
93         * bindings/ScriptValue.cpp:
94         (Inspector::jsToInspectorValue):
95         * bytecode/GetterSetterAccessCase.cpp:
96         (JSC::GetterSetterAccessCase::create):
97         (JSC::GetterSetterAccessCase::clone const):
98         * bytecode/InstanceOfAccessCase.cpp:
99         (JSC::InstanceOfAccessCase::clone const):
100         * bytecode/IntrinsicGetterAccessCase.cpp:
101         (JSC::IntrinsicGetterAccessCase::clone const):
102         * bytecode/ModuleNamespaceAccessCase.cpp:
103         (JSC::ModuleNamespaceAccessCase::clone const):
104         * bytecode/ProxyableAccessCase.cpp:
105         (JSC::ProxyableAccessCase::clone const):
106         * bytecode/StructureSet.h:
107         * debugger/Breakpoint.h:
108         * dfg/DFGRegisteredStructureSet.h:
109         * inspector/agents/InspectorDebuggerAgent.cpp:
110         (Inspector::buildDebuggerLocation):
111         * inspector/scripts/codegen/cpp_generator_templates.py:
112         * parser/UnlinkedSourceCode.h:
113         * wasm/WasmAirIRGenerator.cpp:
114         (JSC::Wasm::parseAndCompileAir):
115         * wasm/WasmB3IRGenerator.cpp:
116         (JSC::Wasm::parseAndCompile):
117         * wasm/WasmNameSectionParser.cpp:
118         (JSC::Wasm::NameSectionParser::parse):
119         * wasm/WasmStreamingParser.cpp:
120         (JSC::Wasm::StreamingParser::consume):
121
122 2019-03-19  Saam Barati  <sbarati@apple.com>
123
124         Style fix: remove C style cast in Instruction.h
125         https://bugs.webkit.org/show_bug.cgi?id=195917
126
127         Reviewed by Filip Pizlo.
128
129         * bytecode/Instruction.h:
130         (JSC::Instruction::wide const):
131
132 2019-03-19  Devin Rousso  <drousso@apple.com>
133
134         Web Inspector: Provide $event in the console when paused on an event listener
135         https://bugs.webkit.org/show_bug.cgi?id=188672
136
137         Reviewed by Timothy Hatcher.
138
139         * inspector/InjectedScript.h:
140         * inspector/InjectedScript.cpp:
141         (Inspector::InjectedScript::setEventValue): Added.
142         (Inspector::InjectedScript::clearEventValue): Added.
143
144         * inspector/InjectedScriptManager.h:
145         * inspector/InjectedScriptManager.cpp:
146         (Inspector::InjectedScriptManager::clearEventValue): Added.
147
148         * inspector/InjectedScriptSource.js:
149         (WI.InjectedScript.prototype.setEventValue): Added.
150         (WI.InjectedScript.prototype.clearEventValue): Added.
151         (BasicCommandLineAPI):
152
153 2019-03-19  Devin Rousso  <drousso@apple.com>
154
155         Web Inspector: ScriptProfiler: lazily create the agent
156         https://bugs.webkit.org/show_bug.cgi?id=195591
157         <rdar://problem/48791756>
158
159         Reviewed by Joseph Pecoraro.
160
161         * inspector/JSGlobalObjectConsoleClient.h:
162         (Inspector::JSGlobalObjectConsoleClient::setInspectorScriptProfilerAgent): Added.
163         * inspector/JSGlobalObjectConsoleClient.cpp:
164         (Inspector::JSGlobalObjectConsoleClient::JSGlobalObjectConsoleClient):
165         (Inspector::JSGlobalObjectConsoleClient::startConsoleProfile):
166         (Inspector::JSGlobalObjectConsoleClient::stopConsoleProfile):
167
168         * inspector/JSGlobalObjectInspectorController.cpp:
169         (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
170         (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
171
172 2019-03-19  Devin Rousso  <drousso@apple.com>
173
174         Web Inspector: Heap: lazily create the agent
175         https://bugs.webkit.org/show_bug.cgi?id=195590
176         <rdar://problem/48791750>
177
178         Reviewed by Joseph Pecoraro.
179
180         * inspector/agents/InspectorHeapAgent.h:
181         * inspector/agents/InspectorHeapAgent.cpp:
182         (Inspector::InspectorHeapAgent::~InspectorHeapAgent): Deleted.
183
184         * inspector/agents/InspectorConsoleAgent.h:
185         (Inspector::InspectorConsoleAgent::setInspectorHeapAgent): Added.
186         * inspector/agents/InspectorConsoleAgent.cpp:
187         (Inspector::InspectorConsoleAgent::InspectorConsoleAgent):
188         (Inspector::InspectorConsoleAgent::takeHeapSnapshot):
189         (Inspector::InspectorConsoleAgent::~InspectorConsoleAgent): Deleted.
190
191         * inspector/JSGlobalObjectInspectorController.cpp:
192         (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
193         (Inspector::JSGlobalObjectInspectorController::createLazyAgents):
194
195 2019-03-19  Caio Lima  <ticaiolima@gmail.com>
196
197         [JSC] LLIntEntryPoint creates same DirectJITCode for all functions
198         https://bugs.webkit.org/show_bug.cgi?id=194648
199
200         Reviewed by Keith Miller.
201
202         1. Making LLIntThunks singleton. 
203
204         Motivation: Former implementation has one LLIntThunk per type per VM.
205         However, the generated code for every kind of thunk is essentially the
206         same and we end up wasting memory (right now jitAllocationGranule = 32 bytes)
207         when we have 2 or more VM instantiated. Turn these thunks into
208         singleton will avoid such wasting.
209
210         Tradeoff: This change comes with a price, because we will keep thunks
211         allocated even when there is no VM instantiated. Considering WebCore use case,
212         the situation of having no VM instantiated is uncommon, since once a
213         VM is created through `commomVM()`, it will never be destroyed. Given
214         that, this change does not impact the overall memory comsumption of
215         WebCore/JSC. It also doesn't impact memory footprint, since thunks are
216         generated lazily (see results below).
217
218         Since we are keeping a static `MacroAssemblerCodeRef<JITThunkPtrTag>`,
219         we have the assurance that JITed code will never be deallocated,
220         given it is being pointed by `RefPtr<ExecutableMemoryHandle> m_executableMemory`.
221         To understand why we decided to make LLIntThunks singleton instead of
222         removing them, please see the comment on `llint/LLIntThunks.cpp`.
223
224         2. Making all LLIntEntrypoints singleton
225
226         Motivation: With singleton LLIntThunks, we also can have singleton
227         DirectJITCodes and NativeJITCodes for each LLIntEntrypoint type and
228         avoid multiple allocations of objects with the same content.
229
230         Tradeoff: As explained before, once we allocate an entrypoint, it
231         will be alive until the program exits. However, the gains we can
232         achieve in some use cases justifies such allocations.
233
234         As DirectJITCode and NativeJITCode are ThreadSafeRefCounted and we are using
235         `codeBlock->setJITCode(makeRef(*jitCode))`, their reference counter
236         will never be less than 1.
237
238         3. Memory usage analysis
239
240         This change reduces memory usage on stress/generate-multiple-llint-entrypoints.js
241         by 2% and is neutral on JetStream 2. Following results were generated
242         running each benchmark 6 times and using 95% Student's t distribution
243         confidence interval.
244
245         microbenchmarks/generate-multiple-llint-entrypoints.js (Changes uses less memory): 
246             Mean of memory peak on ToT: 122576896 bytes (confidence interval: 67747.2316)
247             Mean of memory peak on Changes: 119248213.33 bytes (confidence interval: 50251.2718)
248
249         JetStream2 (Neutral):
250             Mean of memory peak on ToT: 5442742272 bytes (confidence interval: 134381565.9117)
251             Mean of memory peak on Changes: 5384949760 bytes (confidence interval: 158413904.8352)
252
253         4. Performance Analysis
254
255         This change is performance neutral on JetStream 2 and Speedometer 2.
256         See results below.:
257
258         JetStream 2 (Neutral):
259             Mean of score on ToT: 139.58 (confidence interval: 2.44)
260             Mean of score on Changes: 141.46 (confidence interval: 4.24)
261
262         Speedometer run #1
263            ToT: 110 +- 2.9
264            Changes: 110 +- 1.8
265
266         Speedometer run #2
267            ToT: 110 +- 1.6
268            Changes: 108 +- 2.3
269
270         Speedometer run #3
271            ToT: 110 +- 3.0
272            Changes: 110 +- 1.4
273
274         * jit/JSInterfaceJIT.h:
275         (JSC::JSInterfaceJIT::JSInterfaceJIT):
276         * llint/LLIntEntrypoint.cpp:
277
278         Here we are changing the usage or DirectJITCode by NativeJITCode on cases
279         where there is no difference from address of calls with and without
280         ArithCheck.
281
282         (JSC::LLInt::setFunctionEntrypoint):
283         (JSC::LLInt::setEvalEntrypoint):
284         (JSC::LLInt::setProgramEntrypoint):
285         (JSC::LLInt::setModuleProgramEntrypoint):
286         (JSC::LLInt::setEntrypoint):
287         * llint/LLIntEntrypoint.h:
288         * llint/LLIntThunks.cpp:
289         (JSC::LLInt::generateThunkWithJumpTo):
290         (JSC::LLInt::functionForCallEntryThunk):
291         (JSC::LLInt::functionForConstructEntryThunk):
292         (JSC::LLInt::functionForCallArityCheckThunk):
293         (JSC::LLInt::functionForConstructArityCheckThunk):
294         (JSC::LLInt::evalEntryThunk):
295         (JSC::LLInt::programEntryThunk):
296         (JSC::LLInt::moduleProgramEntryThunk):
297         (JSC::LLInt::functionForCallEntryThunkGenerator): Deleted.
298         (JSC::LLInt::functionForConstructEntryThunkGenerator): Deleted.
299         (JSC::LLInt::functionForCallArityCheckThunkGenerator): Deleted.
300         (JSC::LLInt::functionForConstructArityCheckThunkGenerator): Deleted.
301         (JSC::LLInt::evalEntryThunkGenerator): Deleted.
302         (JSC::LLInt::programEntryThunkGenerator): Deleted.
303         (JSC::LLInt::moduleProgramEntryThunkGenerator): Deleted.
304         * llint/LLIntThunks.h:
305         * runtime/ScriptExecutable.cpp:
306         (JSC::setupLLInt):
307         (JSC::ScriptExecutable::prepareForExecutionImpl):
308
309 2019-03-18  Yusuke Suzuki  <ysuzuki@apple.com>
310
311         [JSC] Add missing exception checks revealed by newly added exception checks, follow-up after r243081
312         https://bugs.webkit.org/show_bug.cgi?id=195927
313
314         Reviewed by Mark Lam.
315
316         r243081 adds more exception checks which are previously missing, and it reveals missing exception checks in the caller.
317         This patch is a follow-up patch after r243081, adding missing exception checks more to fix debug test failures.
318
319         * runtime/RegExpConstructor.cpp:
320         (JSC::setRegExpConstructorInput):
321         (JSC::setRegExpConstructorMultiline):
322         * runtime/RegExpGlobalData.cpp:
323         (JSC::RegExpGlobalData::getBackref):
324         (JSC::RegExpGlobalData::getLastParen):
325
326 2019-03-18  Yusuke Suzuki  <ysuzuki@apple.com>
327
328         [JSC] Generator should not create JSLexicalEnvironment if it is not necessary
329         https://bugs.webkit.org/show_bug.cgi?id=195901
330
331         Reviewed by Saam Barati.
332
333         It is not rare that generators do not need to have any registers to be suspended and resumed.
334         Since currently we always emit op_create_lexical_environment for generator code, we sometimes
335         create empty JSLexicalEnvironment while it is not required. We can see that a lot of empty JSLexicalEnvironment
336         are allocated in RAMification's Basic test.
337
338         This patch removes this unnecessary allocation. We introduce op_create_generator_frame_environment, which is
339         a marker, similar to op_yield. And generatorification phase decides whether we should actually emit op_create_lexical_environment,
340         based on the result of the analysis in generatorification. This can remove unnecessary JSLexicalEnvironment allocations.
341
342         We run RAMification in 6 times, use average of them.
343         RAMification's Basic in JIT mode shows 1.4% improvement.
344         ToT
345             Current: 55076864.00, Peak: 55080960.00
346         Patched
347             Current: 54325930.67, Peak: 54329344.00
348
349         RAMification's Basic in non-JIT mode shows 5.0% improvement.
350         ToT
351             Current: 12485290.67, Peak: 12485290.67
352         Patched
353             Current: 11894101.33, Peak: 11894101.33
354
355         * bytecode/BytecodeGeneratorification.cpp:
356         (JSC::BytecodeGeneratorification::BytecodeGeneratorification):
357         (JSC::BytecodeGeneratorification::generatorFrameData const):
358         (JSC::BytecodeGeneratorification::run):
359         * bytecode/BytecodeList.rb:
360         * bytecode/BytecodeUseDef.h:
361         (JSC::computeUsesForBytecodeOffset):
362         (JSC::computeDefsForBytecodeOffset):
363         * bytecompiler/BytecodeGenerator.cpp:
364         (JSC::BytecodeGenerator::BytecodeGenerator):
365         * dfg/DFGCapabilities.cpp:
366         (JSC::DFG::capabilityLevel):
367         * llint/LowLevelInterpreter.asm:
368
369 2019-03-18  Robin Morisset  <rmorisset@apple.com>
370
371         Remove the inline capacity of Operands
372         https://bugs.webkit.org/show_bug.cgi?id=195898
373
374         Reviewed by Yusuke Suzuki.
375
376         Operands currently has a vector with an inline capacity of 24.
377         I tested on JetStream2, and only 4776 functions out of 12035 (that reach the DFG tier) have 24 or fewer elements in it.
378         This is a major problem, because we have 5 Operands in every DFG::BasicBlock, resulting in 2688 bytes of inline capacity per basic block.
379         Still on JetStream 2, functions have an average of 18 BB, but those functions whose operands overflow have an average of 27 BB (so we are wasting 72kB on average when compiling them), and the largest function has 1241 BB (!), for a total of 3.3MB being wasted while it is compiled.
380         
381         So I removed the inline capacity of the vector in Operands, and here are the results:
382         Baseline Jetstream2:
383         159.741
384         159.746
385         159.989
386         Baseline RAMification on grouped and jit tests: (end/peak/score)
387         89.288/89.763/89.526
388         90.166/90.761/90.418
389         89.560/90.014/89.787
390         After optimization Jetstream2:
391         159.342
392         161.812
393         162.037
394         After optimization RAMification:
395         89.147/89.644/89.395
396         89.102.89.585/89.343
397         88.953/89.536/89.2444
398         
399         So it looks like a roughly 1% improvement on RAMification (at least the tests where the JIT is enabled), and more surprisingly also a 1% progression on Jetstream2 (although I have more doubts about this one considering the variability in my numbers).
400         I hope to land this, and get more accurate results from the bots.
401
402         * bytecode/Operands.h:
403
404 2019-03-18  Yusuke Suzuki  <ysuzuki@apple.com>
405
406         [JSC] Add --destroy-vm shell option and dumpHeapStatisticsAtVMDestruction option
407         https://bugs.webkit.org/show_bug.cgi?id=195897
408
409         Reviewed by Keith Miller.
410
411         It is useful if we have an option logging the status of all the existing MarkedBlocks and their objects at VM destruction.
412         I used this feature to find wasting memory, and successfully removed many wasted MarkedBlocks and JS cells like r243081.
413         This patch adds,
414
415         1. --destroy-vm option to JSC shell to destroy main thread JSC::VM
416         2. dumpHeapStatisticsAtVMDestruction to dump MarkedBlocks at VM destruction
417
418         While the current option name is "dumpHeapStatisticsAtVMDestruction", we just dump the status of MarkedBlocks and cells. But eventually,
419         we would like to collect heap statistics and dump them to investigate Heap status more.
420
421         This patch also removes logHeapStatisticsAtExit option since it is no longer used in JSC.
422
423         * heap/Heap.cpp:
424         (JSC::Heap::dumpHeapStatisticsAtVMDestruction):
425         (JSC::Heap::lastChanceToFinalize):
426         * heap/Heap.h:
427         * jsc.cpp:
428         (printUsageStatement):
429         (CommandLine::parseArguments):
430         (runJSC):
431         * runtime/Options.h:
432
433 2019-03-18  Yusuke Suzuki  <ysuzuki@apple.com>
434
435         [JSC] jsSubstring should resolve rope before calling JSRopeString::create
436         https://bugs.webkit.org/show_bug.cgi?id=195840
437
438         Reviewed by Geoffrey Garen.
439
440         jsSubstring always ends up resolving rope of the base string because substring JSRopeString only accepts non-rope JSString
441         as its base. Instead of resolving ropes in finishCreationSubstring, we should resolve before passing it to JSRopeString.
442         So that, we can access string data before creating JSRopeString, and we can introduce optimizations like avoiding creation
443         of single character substrings.
444
445         We can find that a lot of substrings for length = 1 are allocated in RAMification regexp tests. This patch avoids creation of these
446         strings to save memory.
447
448         This patch also strengthen error checks caused by rope resolution for base of substrings. Previously we sometimes miss this checks.
449
450         * dfg/DFGOperations.cpp:
451         * runtime/JSString.cpp:
452         (JSC::JSString::dumpToStream):
453         * runtime/JSString.h:
454         (JSC::jsSubstring):
455         (JSC::jsSubstringOfResolved):
456         (JSC::jsSingleCharacterString):
457         * runtime/RegExpCachedResult.cpp:
458         (JSC::RegExpCachedResult::lastResult): We no longer need to have length = 0 path since jsSubstring returns an empty string if length == 0.
459         (JSC::RegExpCachedResult::leftContext):
460         (JSC::RegExpCachedResult::rightContext):
461         (JSC::RegExpCachedResult::setInput):
462         * runtime/RegExpGlobalData.cpp:
463         (JSC::RegExpGlobalData::getBackref):
464         (JSC::RegExpGlobalData::getLastParen):
465         * runtime/StringObject.h:
466         (JSC::jsStringWithReuse):
467         (JSC::jsSubstring):
468         * runtime/StringPrototype.cpp:
469         (JSC::replaceUsingRegExpSearch):
470         (JSC::operationStringProtoFuncReplaceRegExpEmptyStr):
471         (JSC::replaceUsingStringSearch):
472         (JSC::stringProtoFuncSlice):
473         (JSC::splitStringByOneCharacterImpl):
474         (JSC::stringProtoFuncSplitFast):
475         (JSC::stringProtoFuncSubstr):
476         (JSC::stringProtoFuncSubstring):
477         (JSC::stringProtoFuncToLowerCase):
478         (JSC::stringProtoFuncToUpperCase):
479         Some `const String& value = string->value(exec)` is dangerous if GC happens later. Changed to getting `String` instead of `const String&` here.
480
481         * runtime/StringPrototypeInlines.h:
482         (JSC::stringSlice):
483
484 2019-03-18  Mark Lam  <mark.lam@apple.com>
485
486         Missing a ThrowScope release in JSObject::toString().
487         https://bugs.webkit.org/show_bug.cgi?id=195893
488         <rdar://problem/48970986>
489
490         Reviewed by Michael Saboff.
491
492         Placate the validator with a RELEASE_AND_RETURN().
493
494         * runtime/JSObject.cpp:
495         (JSC::JSObject::toString const):
496
497 2019-03-18  Mark Lam  <mark.lam@apple.com>
498
499         Structure::flattenDictionary() should clear unused property slots.
500         https://bugs.webkit.org/show_bug.cgi?id=195871
501         <rdar://problem/48959497>
502
503         Reviewed by Michael Saboff.
504
505         It currently attempts to do this but fails because it's actually clearing up the
506         preCapacity region instead.  The fix is simply to account for the preCapacity
507         when computing the start address of the property slots.
508
509         * runtime/Structure.cpp:
510         (JSC::Structure::flattenDictionaryStructure):
511
512 2019-03-18  Robin Morisset  <rmorisset@apple.com>
513
514         B3 should reduce Shl(<S|Z>Shr(@x, @const), @const) to BitAnd(@x, -(1<<@const))
515         https://bugs.webkit.org/show_bug.cgi?id=152164
516
517         Reviewed by Filip Pizlo.
518
519         Turn this: Shl(<S|Z>Shr(@x, @const), @const)
520         Into this: BitAnd(@x, -(1<<@const))
521
522         I added two tests: one for ZShr/32 bits, and one for SShr/64 bits, I think it is enough coverage (no reason for any interaction between the signedness of the shift and the bitwidth).
523         I also modified a few adjacent tests to remove undefined behaviours.
524
525         * b3/B3ReduceStrength.cpp:
526         * b3/testb3.cpp:
527         (JSC::B3::testShlImms):
528         (JSC::B3::testShlArgImm):
529         (JSC::B3::testShlSShrArgImm):
530         (JSC::B3::testShlImms32):
531         (JSC::B3::testShlArgImm32):
532         (JSC::B3::testShlZShrArgImm32):
533         (JSC::B3::run):
534
535 2019-03-17  Robin Morisset  <rmorisset@apple.com>
536
537         ParserError can be shrunk by 8 bytes
538         https://bugs.webkit.org/show_bug.cgi?id=195496
539
540         Reviewed by Mark Lam.
541
542         * parser/ParserError.h:
543
544 2019-03-17  Diego Pino Garcia  <dpino@igalia.com>
545
546         Fix WPE and GTK Debug builds after r243049
547         https://bugs.webkit.org/show_bug.cgi?id=195860
548
549         Unreviewed, build fix after r243049.
550
551         * runtime/StringPrototype.cpp:
552         (JSC::normalizationAffects8Bit):
553
554 2019-03-17  Yusuke Suzuki  <ysuzuki@apple.com>
555
556         REGRESSION: !vm.isInitializingObject() void* JSC::tryAllocateCellHelper<JSC::Structure> JSC::Structure::create
557         https://bugs.webkit.org/show_bug.cgi?id=195858
558
559         Reviewed by Mark Lam.
560
561         r243011 changed WebAssembly related structures lazily-allocated. It means that this lazy allocation must not be done in the middle of
562         the other object allocations. This patch changes the signature of wasm related objects' ::create functions to taking Structure*.
563         This prevents us from materializing lazily-allocated structures while allocating wasm related objects, and this style is used in the
564         other places to fix the same problem. This bug is caught by existing debug tests for wasm.
565
566         * runtime/JSGlobalObject.h:
567         * wasm/js/JSWebAssemblyCompileError.cpp:
568         (JSC::createJSWebAssemblyCompileError):
569         * wasm/js/JSWebAssemblyInstance.cpp:
570         (JSC::JSWebAssemblyInstance::finalizeCreation):
571         (JSC::JSWebAssemblyInstance::create):
572         * wasm/js/JSWebAssemblyLinkError.cpp:
573         (JSC::createJSWebAssemblyLinkError):
574         * wasm/js/JSWebAssemblyModule.cpp:
575         (JSC::JSWebAssemblyModule::createStub):
576         (JSC::JSWebAssemblyModule::finishCreation):
577         * wasm/js/WasmToJS.cpp:
578         (JSC::Wasm::wasmToJSException):
579         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
580         (JSC::constructJSWebAssemblyCompileError):
581         (JSC::callJSWebAssemblyCompileError):
582         * wasm/js/WebAssemblyFunction.cpp:
583         (JSC::WebAssemblyFunction::create):
584         * wasm/js/WebAssemblyFunction.h:
585         * wasm/js/WebAssemblyInstanceConstructor.cpp:
586         (JSC::constructJSWebAssemblyInstance):
587         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
588         (JSC::constructJSWebAssemblyLinkError):
589         (JSC::callJSWebAssemblyLinkError):
590         * wasm/js/WebAssemblyMemoryConstructor.cpp:
591         (JSC::constructJSWebAssemblyMemory):
592         * wasm/js/WebAssemblyModuleConstructor.cpp:
593         (JSC::WebAssemblyModuleConstructor::createModule):
594         * wasm/js/WebAssemblyModuleRecord.cpp:
595         (JSC::WebAssemblyModuleRecord::link):
596         (JSC::WebAssemblyModuleRecord::evaluate):
597         * wasm/js/WebAssemblyPrototype.cpp:
598         (JSC::webAssemblyModuleValidateAsyncInternal):
599         (JSC::instantiate):
600         (JSC::compileAndInstantiate):
601         (JSC::webAssemblyModuleInstantinateAsyncInternal):
602         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
603         (JSC::constructJSWebAssemblyRuntimeError):
604         (JSC::callJSWebAssemblyRuntimeError):
605         * wasm/js/WebAssemblyTableConstructor.cpp:
606         (JSC::constructJSWebAssemblyTable):
607         * wasm/js/WebAssemblyToJSCallee.cpp:
608         (JSC::WebAssemblyToJSCallee::create):
609         * wasm/js/WebAssemblyToJSCallee.h:
610         * wasm/js/WebAssemblyWrapperFunction.cpp:
611         (JSC::WebAssemblyWrapperFunction::create):
612         * wasm/js/WebAssemblyWrapperFunction.h:
613
614 2019-03-16  Darin Adler  <darin@apple.com>
615
616         Improve normalization code, including moving from unorm.h to unorm2.h
617         https://bugs.webkit.org/show_bug.cgi?id=195330
618
619         Reviewed by Michael Catanzaro.
620
621         * runtime/JSString.h: Move StringViewWithUnderlyingString to StringView.h.
622
623         * runtime/StringPrototype.cpp: Include unorm2.h instead of unorm.h.
624         (JSC::normalizer): Added. Function to create normalizer object given
625         enumeration value indicating which is selected. Simplified because we
626         know the function will not fail and so we don't need error handling code.
627         (JSC::normalize): Changed this function to take a JSString* so we can
628         optimize the case where no normalization is needed. Added an early exit
629         if the string is stored as 8-bit and another if the string is already
630         normalized, using unorm2_isNormalized. Changed error handling to only
631         check cases that can actually fail in practice. Also did other small
632         optimizations like passing VM rather than ExecState.
633         (JSC::stringProtoFuncNormalize): Used smaller enumeration names that are
634         identical to the names used in the API and normalization parlance rather
635         than longer ones that expand the acronyms. Updated to pass JSString* to
636         the normalize function, so we can optimize 8-bit and already-normalized
637         cases, rather than callling the expensive String::upconvertedCharacters
638         function. Use throwVMRangeError.
639
640 2019-03-15  Mark Lam  <mark.lam@apple.com>
641
642         Need to check ObjectPropertyCondition liveness before accessing it when firing watchpoints.
643         https://bugs.webkit.org/show_bug.cgi?id=195827
644         <rdar://problem/48845513>
645
646         Reviewed by Filip Pizlo.
647
648         m_object in ObjectPropertyCondition may no longer be live by the time the watchpoint fires.
649
650         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp:
651         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
652         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp:
653         (JSC::LLIntPrototypeLoadAdaptiveStructureWatchpoint::fireInternal):
654         * bytecode/ObjectPropertyCondition.cpp:
655         (JSC::ObjectPropertyCondition::dumpInContext const):
656         * bytecode/StructureStubClearingWatchpoint.cpp:
657         (JSC::StructureStubClearingWatchpoint::fireInternal):
658         * dfg/DFGAdaptiveStructureWatchpoint.cpp:
659         (JSC::DFG::AdaptiveStructureWatchpoint::fireInternal):
660         * runtime/StructureRareData.cpp:
661         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
662
663 2019-03-15  Yusuke Suzuki  <ysuzuki@apple.com>
664
665         [JSC] Make more properties lazily-allocated in JSGlobalObject, including properties only used in JIT mode
666         https://bugs.webkit.org/show_bug.cgi?id=195816
667
668         Reviewed by Michael Saboff.
669
670         This patch makes more properties lazily-allocated in JSGlobalObject. This patch makes the following lazily-allocated.
671
672         1. iteratorResultObjectStructure
673         2. WebAssembly related objects except for JSWebAssembly top-level object.
674
675         * CMakeLists.txt:
676         * DerivedSources-input.xcfilelist:
677         * DerivedSources-output.xcfilelist:
678         * DerivedSources.make:
679         * runtime/JSGlobalObject.cpp:
680         (JSC::JSGlobalObject::init):
681         (JSC::JSGlobalObject::visitChildren):
682         * runtime/JSGlobalObject.h:
683         (JSC::JSGlobalObject::iteratorResultObjectStructure const):
684         (JSC::JSGlobalObject::webAssemblyModuleRecordStructure const):
685         (JSC::JSGlobalObject::webAssemblyFunctionStructure const):
686         (JSC::JSGlobalObject::webAssemblyWrapperFunctionStructure const):
687         (JSC::JSGlobalObject::webAssemblyToJSCalleeStructure const):
688         * wasm/js/JSWebAssembly.cpp:
689         * wasm/js/JSWebAssembly.h:
690
691 2019-03-15  Dominik Infuehr  <dinfuehr@igalia.com>
692
693         [CMake] Move test .js files into testapiScripts
694         https://bugs.webkit.org/show_bug.cgi?id=195565
695
696         Reviewed by Yusuke Suzuki.
697
698         testapi expect .js file in the testapiScripts-directory.
699
700         * shell/CMakeLists.txt:
701
702 2019-03-15  Mark Lam  <mark.lam@apple.com>
703
704         Gardening: add a missing exception check after r242991.
705         https://bugs.webkit.org/show_bug.cgi?id=195791
706
707         Unreviewed.
708
709         * tools/JSDollarVM.cpp:
710         (JSC::functionGetGetterSetter):
711
712 2019-03-15  Devin Rousso  <drousso@apple.com>
713
714         Web Inspector: provide a way to capture a screenshot of a node from within the page
715         https://bugs.webkit.org/show_bug.cgi?id=194279
716         <rdar://problem/10731573>
717
718         Reviewed by Joseph Pecoraro.
719
720         Add `console.screenshot` functionality, which displays a screenshot of a given object (if
721         able) within Web Inspector's Console tab. From there, it can be viewed and saved.
722
723         Currently, `console.screenshot` will
724          - capture an image of a `Node` (if provided)
725          - capture an image of the viewport if nothing is provided
726
727         * inspector/protocol/Console.json:
728         Add `Image` enum value to `ConsoleMessage` type.
729         * runtime/ConsoleTypes.h:
730         * inspector/ConsoleMessage.h:
731         * inspector/ConsoleMessage.cpp:
732         (Inspector::messageTypeValue):
733
734         * runtime/ConsoleClient.h:
735         * runtime/ConsoleObject.cpp:
736         (JSC::ConsoleObject::finishCreation):
737         (JSC::consoleProtoFuncScreenshot): Added.
738
739         * inspector/JSGlobalObjectConsoleClient.h:
740         * inspector/JSGlobalObjectConsoleClient.cpp:
741         (Inspector::JSGlobalObjectConsoleClient::screenshot): Added.
742
743 2019-03-14  Yusuke Suzuki  <ysuzuki@apple.com>
744
745         [JSC] Retain PrivateName of Symbol before passing it to operations potentially incurring GC
746         https://bugs.webkit.org/show_bug.cgi?id=195791
747         <rdar://problem/48806130>
748
749         Reviewed by Mark Lam.
750
751         Consider the following example:
752
753             void putByVal(JSObject*, PropertyName propertyName, ...);
754
755             putByVal(object, symbol->privateName(), ...);
756
757         PropertyName does not retain the passed UniquedStringImpl*. It just holds the pointer to UniquedStringImpl*.
758         It means that since `Symbol::privateName()` returns `const PrivateName&` instead of `PrivateName`, putByVal
759         and its caller does not retain UniquedStringImpl* held in PropertyName. The problem happens when the putByVal
760         incurs GC, and when the `symbol` is missing in the conservative GC scan. The underlying UniquedStringImpl* of
761         PropertyName can be accidentally destroyed in the middle of the putByVal operation. We should retain PrivateName
762         before passing it to operations which takes it as PropertyName.
763
764         1. We use the code pattern like this.
765
766             auto propertyName = symbol->privateName();
767             someOperation(..., propertyName);
768
769         This pattern is well aligned to existing `JSValue::toPropertyKey(exec)` and `JSString::toIdentifier(exec)` code patterns.
770
771             auto propertyName = value.toPropertyKey(exec);
772             RETURN_IF_EXCEPTION(scope, { });
773             someOperation(..., propertyName);
774
775         2. We change `Symbol::privateName()` to returning `PrivateName` instead of `const PrivateName&` to avoid
776            potential dangerous use cases. This is OK because the code using `Symbol::privateName()` is not a critical path,
777            and they typically need to retain PrivateName.
778
779         3. We audit similar functions `toPropertyKey(exec)` and `toIdentifier(exec)` for needed but missing exception checks.
780            BTW, these functions are safe to the problem fixed in this patch since they return `Identifier` instead
781            of `const Identifier&`.
782
783         Mark and Robin investigated and offered important data to understand what went wrong. And figured out the reason behind
784         the mysterious behavior shown in the data, and now, we confirm that this is the right fix for this bug.
785
786         * dfg/DFGOperations.cpp:
787         * jit/JITOperations.cpp:
788         (JSC::tryGetByValOptimize):
789         * runtime/JSFunction.cpp:
790         (JSC::JSFunction::setFunctionName):
791         * runtime/JSModuleLoader.cpp:
792         (JSC::printableModuleKey):
793         * runtime/JSONObject.cpp:
794         (JSC::Stringifier::Stringifier):
795         * runtime/Symbol.cpp:
796         (JSC::Symbol::descriptiveString const):
797         (JSC::Symbol::description const):
798         * runtime/Symbol.h:
799         * runtime/SymbolConstructor.cpp:
800         (JSC::symbolConstructorKeyFor):
801         * tools/JSDollarVM.cpp:
802         (JSC::functionGetGetterSetter):
803
804 2019-03-14  Yusuke Suzuki  <ysuzuki@apple.com>
805
806         REGRESSION(r242841): Fix conservative DFG OSR entry validation to accept values which will be stored in AnyInt / Double flush formats
807         https://bugs.webkit.org/show_bug.cgi?id=195752
808
809         Reviewed by Saam Barati.
810
811         We fixed the bug skipping AbstractValue validations when the flush format is Double or AnyInt. But it
812         was too conservative. While validating inputs with AbstractValue is mandatory (without it, whole CFA
813         falls into wrong condition), our validation does not care AnyInt and Double representations in lower
814         tiers. For example, if a value is stored in Double flush format in DFG, its AbstractValue becomes
815         SpecFullDouble. However, it does not include Int32 and OSR entry is rejected if Int32 comes for DoubleRep
816         OSR entry value. This is wrong since we later convert these numbers into DoubleRep representation
817         before entering DFG code.
818
819         This patch performs AbstractValue validation onto the correctly converted value with flush format hint.
820
821         And it still does not fix OSR entry failures in navier-stokes. This is because AbstractValue representation
822         in navier-stokes's lin_solve was too strict. Then, this patch reverts r242627. Instead of removing must handle
823         value handling in CFA, DFG OSR entry now correctly validates inputs with AbstractValues even if the flush format
824         is Double or AnyInt. As long as DFG OSR entry validates inputs, merging must handle values as proven constants is OK.
825
826         We can see that # of OSR entry failures in navier-stokes.js becomes the same to the previous count. And we can see
827         AnyInt OSR entry actually works in microbenchmarks/large-int.js. However, AnyInt effect is hard to observe because this
828         is super rare. Since we inject type prediction based on must handle value, the flush format tends to be SpecAnyIntAsDouble
829         and it accepts JSValues simply.
830
831         * bytecode/SpeculatedType.cpp:
832         (JSC::dumpSpeculation):
833         * dfg/DFGAbstractValue.cpp:
834         (JSC::DFG::AbstractValue::filterValueByType):
835         * dfg/DFGAbstractValue.h:
836         (JSC::DFG::AbstractValue::validateOSREntryValue const):
837         (JSC::DFG::AbstractValue::validateTypeAcceptingBoxedInt52 const):
838         (JSC::DFG::AbstractValue::validate const): Deleted.
839         (JSC::DFG::AbstractValue::validateType const): Deleted.
840         * dfg/DFGCFAPhase.cpp:
841         (JSC::DFG::CFAPhase::run):
842         (JSC::DFG::CFAPhase::injectOSR):
843         (JSC::DFG::CFAPhase::performBlockCFA):
844         * dfg/DFGOSREntry.cpp:
845         (JSC::DFG::prepareOSREntry):
846
847 2019-03-14  Saam barati  <sbarati@apple.com>
848
849         We can't remove code after ForceOSRExit until after FixupPhase
850         https://bugs.webkit.org/show_bug.cgi?id=186916
851         <rdar://problem/41396612>
852
853         Reviewed by Yusuke Suzuki.
854
855         There was an optimization in the bytecode parser I added in r232742 that converted blocks
856         with ForceOSRExit in them to remove all IR after the ForceOSRExit. However,
857         this is incorrect because it breaks backwards propagation. For example, it
858         could incorrectly lead us to think it's safe to not check for overflow in
859         an Add because such Add has no non-int uses. Backwards propagation relies on
860         having a view over bytecode uses, and this optimization broke that. This patch
861         rolls out that optimization, as initial perf data shows it may no longer be
862         needed.
863
864         * dfg/DFGByteCodeParser.cpp:
865         (JSC::DFG::ByteCodeParser::addToGraph):
866         (JSC::DFG::ByteCodeParser::parse):
867
868 2019-03-14  Saam barati  <sbarati@apple.com>
869
870         JSScript should have an accessor saying if it's cached or not
871         https://bugs.webkit.org/show_bug.cgi?id=195783
872
873         Reviewed by Michael Saboff.
874
875         * API/JSScript.h:
876         * API/JSScript.mm:
877         (-[JSScript isUsingBytecodeCache]):
878         * API/tests/testapi.mm:
879         (testIsUsingBytecodeCacheAccessor):
880         (testObjectiveCAPI):
881
882 2019-03-14  Saam barati  <sbarati@apple.com>
883
884         Remove retain cycle from JSScript and also don't keep the cache file descriptor open so many JSScripts can be cached in a loop
885         https://bugs.webkit.org/show_bug.cgi?id=195782
886         <rdar://problem/48880625>
887
888         Reviewed by Michael Saboff.
889
890         This patch fixes two issues with JSScript API:
891         
892         1. There was a retain cycle causing us to never destroy a JSScript once it
893         created a JSSourceCode. The reason for this is that JSScript had a 
894         Strong<JSSourceCode> field. And JSSourceCode transitively had RetainPtr<JSScript>.
895         
896         This patch fixes this issue by making the "jsSourceCode" accessor return a transient object.
897         
898         2. r242585 made it so that JSScript would keep the cache file descriptor open
899         (and locked) for the duration of the lifetime of the JSScript itself. Our
900         anticipation here is that it would make implementing iterative cache updates
901         easier. However, this made using the API super limiting in other ways. For
902         example, if a program had a loop that cached 3000 different JSScripts, it's
903         likely that such a program would exhaust the open file count limit. This patch
904         reverts to the behavior prior to r242585 where we just keep open the file descriptor
905         while we read or write it.
906
907         * API/JSAPIGlobalObject.mm:
908         (JSC::JSAPIGlobalObject::moduleLoaderFetch):
909         * API/JSContext.mm:
910         (-[JSContext evaluateJSScript:]):
911         * API/JSScript.mm:
912         (-[JSScript dealloc]):
913         (-[JSScript readCache]):
914         (-[JSScript init]):
915         (-[JSScript sourceCode]):
916         (-[JSScript jsSourceCode]):
917         (-[JSScript writeCache:]):
918         (-[JSScript forceRecreateJSSourceCode]): Deleted.
919         * API/JSScriptInternal.h:
920         * API/tests/testapi.mm:
921         (testCanCacheManyFilesWithTheSameVM):
922         (testObjectiveCAPI):
923         (testCacheFileIsExclusive): Deleted.
924
925 2019-03-14  Michael Saboff  <msaboff@apple.com>
926
927         ASSERTION FAILED: regexp->isValid() or ASSERTION FAILED: !isCompilationThread()
928         https://bugs.webkit.org/show_bug.cgi?id=195735
929
930         Reviewed by Mark Lam.
931
932         There are two bug fixes here.
933
934         The first bug happens due to a race condition when we are compiling on a separate thread while the
935         main thread is compiling the RegExp at a place where it can run out of stack.  When that happens,
936         the RegExp becomes invalid due to the out of stack error.  If we check the ASSERT condition in the DFG
937         compilation thread, we crash.  After the main thread throws an exception, it resets the RegExp as
938         it might compile successfully the next time we try to execute it on a shallower stack.
939         The main thread will see the regular expression as valid when it executes the JIT'ed code we are compiling
940         or any slow path we call out to.  Therefore ASSERTs like this in compilation code can be eliminated.
941
942         The second bug is due to incorrect logic when we go to run the regexp in the Strength Reduction phase.
943         The current check for "do we have code to run the RegExp?" only checks that the RegExp's state
944         is != NotCompiled.  We also can't run the RegExp if there the state is ParseError.
945         Changing hasCode() to take this into account fixes the second issue.
946
947         (JSC::FTL::DFG::LowerDFGToB3::compileNewRegexp):
948         * runtime/RegExp.h:
949         * dfg/DFGSpeculativeJIT.cpp:
950         (JSC::DFG::SpeculativeJIT::compileNewRegexp):
951         * runtime/RegExp.h:
952
953 2019-03-14  Saam barati  <sbarati@apple.com>
954
955         Fixup uses KnownInt32 incorrectly in some nodes
956         https://bugs.webkit.org/show_bug.cgi?id=195279
957         <rdar://problem/47915654>
958
959         Reviewed by Yusuke Suzuki.
960
961         Fixup was sometimes using KnownInt32 edges when it knew some
962         incoming value is an Int32 based on what the bytecode would return.
963         However, because bytecode may result in Int32 for some node does
964         not mean we'll pick Int32 as the value format for that local. For example,
965         we may choose for a value to be represented as a double. This patch
966         corrects such uses of KnownInt32.
967
968         * dfg/DFGArgumentsEliminationPhase.cpp:
969         * dfg/DFGFixupPhase.cpp:
970         (JSC::DFG::FixupPhase::fixupNode):
971         * dfg/DFGSpeculativeJIT.cpp:
972         (JSC::DFG::SpeculativeJIT::compileArrayPush):
973         (JSC::DFG::SpeculativeJIT::compileGetDirectPname):
974         * ftl/FTLLowerDFGToB3.cpp:
975         (JSC::FTL::DFG::LowerDFGToB3::compileArrayPush):
976
977 2019-03-14  Keith Miller  <keith_miller@apple.com>
978
979         DFG liveness can't skip tail caller inline frames
980         https://bugs.webkit.org/show_bug.cgi?id=195715
981         <rdar://problem/46221598>
982
983         Reviewed by Saam Barati.
984
985         In order to simplify OSR exit/DFG bytecode parsing our bytecode
986         generator always emits an op_ret after any tail call. However, the
987         DFG when computing the liveness of locals, would skip any tail
988         caller inline frames. This mean that if we ended up inserting a
989         Check that would OSR to the op_ret we wouldn't have kept
990         availability data around for it.
991
992         * dfg/DFGGraph.cpp:
993         (JSC::DFG::Graph::isLiveInBytecode):
994         * dfg/DFGGraph.h:
995         (JSC::DFG::Graph::forAllLocalsLiveInBytecode):
996
997 2019-03-14  Robin Morisset  <rmorisset@apple.com>
998
999         DFG::Worklist can be shrunk by 16 bytes
1000         https://bugs.webkit.org/show_bug.cgi?id=195490
1001
1002         Reviewed by Darin Adler.
1003
1004         * dfg/DFGWorklist.cpp:
1005         (JSC::DFG::Worklist::Worklist):
1006         * dfg/DFGWorklist.h:
1007
1008 2019-03-14  Devin Rousso  <drousso@apple.com>
1009
1010         Web Inspector: Audit: provide a way to get the contents of resources
1011         https://bugs.webkit.org/show_bug.cgi?id=195266
1012         <rdar://problem/48550911>
1013
1014         Reviewed by Joseph Pecoraro.
1015
1016         * inspector/InjectedScriptBase.cpp:
1017         (Inspector::InjectedScriptBase::makeAsyncCall):
1018         Drive-by: fix missing `else`.
1019
1020 2019-03-14  Devin Rousso  <drousso@apple.com>
1021
1022         Web Inspector: Styles: `::-webkit-scrollbar*` rules aren't shown
1023         https://bugs.webkit.org/show_bug.cgi?id=195123
1024         <rdar://problem/48450148>
1025
1026         Reviewed by Joseph Pecoraro.
1027
1028         * inspector/protocol/CSS.json:
1029         Add `CSS.PseudoId` enum, rather than send a number, so that we have more knowledge about
1030         which pseudo type the rule corresponds to (e.g. a string is more descriptive than a number).
1031
1032 2019-03-13  Caio Lima  <ticaiolima@gmail.com>
1033
1034         [JSC] CodeBlock::visitChildren is reporting extra memory even when its JITCode is singleton
1035         https://bugs.webkit.org/show_bug.cgi?id=195638
1036
1037         Reviewed by Mark Lam.
1038
1039         This patch introduces a m_isShared flag to track whether the
1040         JITCode is shared between many CodeBlocks. This flag is used in
1041         `CodeBlock::setJITCode` and `CodeBlock::visitChildren` to avoid
1042         reporting duplicated extra memory for singleton JITCodes.
1043         With those changes, we now stop counting singleton LLIntEntrypoints
1044         as extra memory, since they are declared as static variables. This
1045         change can potentially avoid unecessary GC pressure, because
1046         extra memory is used by Heap::updateAllocationLimits() to update Heap
1047         limits.
1048         Even though it is hard to show performance difference for this change
1049         (see results below), it is important to keep extra memory usage
1050         correct. Otherwise, it can be a source of a complicated bug on
1051         GC in the future.
1052
1053         Results from last run of Speedometer 2 comparing ToT and changes. We
1054         collected those numbers running Minibrowser on a MacBook Pro 15-inch
1055         with 2,6 GHz Intel Core i7. Both versions are with JIT disabled,
1056         since these singleton JITCode are only used by this configuration:
1057
1058         Speedometer2 Run #1
1059             ToT: 58.2 +- 1.1
1060             changes: 57.9 +- 0.99
1061
1062         Speedometer2 Run #2
1063             ToT: 58.5 +- 1.7
1064             changes: 58.0 +- 1.5
1065
1066         Speedometer2 Run #2
1067             ToT: 58.5 +- 0.99
1068             changes: 57.1 +- 1.5
1069
1070         * bytecode/CodeBlock.cpp:
1071         (JSC::CodeBlock::estimatedSize):
1072         (JSC::CodeBlock::visitChildren):
1073         * bytecode/CodeBlock.h:
1074         (JSC::CodeBlock::setJITCode):
1075         * jit/JITCode.cpp:
1076         (JSC::JITCode::JITCode):
1077         (JSC::JITCodeWithCodeRef::JITCodeWithCodeRef):
1078         (JSC::DirectJITCode::DirectJITCode):
1079         (JSC::NativeJITCode::NativeJITCode):
1080         * jit/JITCode.h:
1081         (JSC::JITCode::isShared const):
1082         * llint/LLIntEntrypoint.cpp:
1083         (JSC::LLInt::setFunctionEntrypoint):
1084         (JSC::LLInt::setEvalEntrypoint):
1085         (JSC::LLInt::setProgramEntrypoint):
1086         (JSC::LLInt::setModuleProgramEntrypoint):
1087
1088 2019-03-13  Keith Rollin  <krollin@apple.com>
1089
1090         Add support for new StagedFrameworks layout
1091         https://bugs.webkit.org/show_bug.cgi?id=195543
1092
1093         Reviewed by Alexey Proskuryakov.
1094
1095         When creating the WebKit layout for out-of-band Safari/WebKit updates,
1096         use an optional path prefix when called for.
1097
1098         * Configurations/Base.xcconfig:
1099
1100 2019-03-13  Mark Lam  <mark.lam@apple.com>
1101
1102         Remove unneeded --tradeDestructorBlocks option.
1103         https://bugs.webkit.org/show_bug.cgi?id=195698
1104         <rdar://problem/39681388>
1105
1106         Reviewed by Yusuke Suzuki.
1107
1108         There's no reason why we would ever want --tradeDestructorBlocks to be false.
1109
1110         Also, there was an assertion in BlockDirectory::endMarking() for when
1111         (!Options::tradeDestructorBlocks() && needsDestruction()).  This assertion is
1112         outdated because the BlockDirectory's m_empty set used to mean the set of all
1113         blocks that have no live (as in not reachable by GC) objects and dead objects
1114         also do not require destructors to be called on them.  The current meaning of
1115         m_empty is that it is the set of all blocks that have no live objects,
1116         independent of whether they needs destructors to be called on them or not.
1117         The assertion is no longer valid for the new meaning of m_empty as m_empty may
1118         now contain destructible blocks.  This assertion is now removed as part of this
1119         patch.
1120
1121         * heap/BlockDirectory.cpp:
1122         (JSC::BlockDirectory::endMarking):
1123         * heap/LocalAllocator.cpp:
1124         (JSC::LocalAllocator::tryAllocateWithoutCollecting):
1125         * runtime/Options.h:
1126
1127 2019-03-13  Dominik Infuehr  <dinfuehr@igalia.com>
1128
1129         String overflow when using StringBuilder in JSC::createError
1130         https://bugs.webkit.org/show_bug.cgi?id=194957
1131
1132         Reviewed by Mark Lam.
1133
1134         StringBuilder in notAFunctionSourceAppender didn't check
1135         for overflows but just failed.
1136
1137         * runtime/ExceptionHelpers.cpp:
1138         (JSC::notAFunctionSourceAppender):
1139
1140 2019-03-11  Yusuke Suzuki  <ysuzuki@apple.com>
1141
1142         [JSC] Move species watchpoint installation from ArrayPrototype to JSGlobalObject
1143         https://bugs.webkit.org/show_bug.cgi?id=195593
1144
1145         Reviewed by Keith Miller.
1146
1147         This patch moves watchpoints installation and watchpoints themselves from ArrayPrototype to JSGlobalObject because of the following two reasons.
1148
1149         1. ArrayPrototype configures finalizer because of std::unique_ptr<> for watchpoints. If we move them from ArrayPrototype to JSGlobalObject, we do
1150            not need to set finalizer. And we can avoid unnecessary WeakBlock allocation.
1151
1152         2. This code lazily configures watchpoints instead of setting watchpoints eagerly in JSGlobalObject::init. We would like to expand this mechanism
1153            to other watchpoints which are eagerly configured in JSGlobalObject::init. Putting these code in JSGlobalObject instead of scattering them in
1154            each XXXPrototype / XXXConstructor can encourage the reuse of the code.
1155
1156         * runtime/ArrayPrototype.cpp:
1157         (JSC::ArrayPrototype::create):
1158         (JSC::speciesWatchpointIsValid):
1159         (JSC::ArrayPrototype::destroy): Deleted.
1160         (JSC::ArrayPrototype::tryInitializeSpeciesWatchpoint): Deleted.
1161         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::ArrayPrototypeAdaptiveInferredPropertyWatchpoint): Deleted.
1162         (JSC::ArrayPrototypeAdaptiveInferredPropertyWatchpoint::handleFire): Deleted.
1163         * runtime/ArrayPrototype.h:
1164         * runtime/JSGlobalObject.cpp:
1165         (JSC::JSGlobalObject::tryInstallArraySpeciesWatchpoint): Instead of using ArrayPrototypeAdaptiveInferredPropertyWatchpoint,
1166         we use ObjectPropertyChangeAdaptiveWatchpoint. We create watchpoints after touching WatchpointSet since ObjectPropertyChangeAdaptiveWatchpoint
1167         requires WatchpointSet is IsWatched state.
1168         * runtime/JSGlobalObject.h:
1169
1170 2019-03-12  Yusuke Suzuki  <ysuzuki@apple.com>
1171
1172         [JSC] OSR entry should respect abstract values in addition to flush formats
1173         https://bugs.webkit.org/show_bug.cgi?id=195653
1174
1175         Reviewed by Mark Lam.
1176
1177         Let's consider the following graph.
1178
1179         Block #0
1180             ...
1181             27:< 2:loc13> JSConstant(JS|UseAsOther, StringIdent, Strong:String (atomic) (identifier): , StructureID: 42679, bc#10, ExitValid)
1182             ...
1183             28:< 2:loc13> ArithPow(DoubleRep:@437<Double>, Int32:@27, Double|UseAsOther, BytecodeDouble, Exits, bc#10, ExitValid)
1184             29:<!0:->     MovHint(DoubleRep:@28<Double>, MustGen, loc7, W:SideState, ClobbersExit, bc#10, ExitValid)
1185             30:< 1:->     SetLocal(DoubleRep:@28<Double>, loc7(M<Double>/FlushedDouble), machine:loc6, W:Stack(-8), bc#10, exit: bc#14, ExitValid)  predicting BytecodeDouble
1186             ...
1187             73:<!0:->     Jump(MustGen, T:#1, W:SideState, bc#71, ExitValid)
1188
1189         Block #1 (bc#71): (OSR target) pred, #0
1190             ...
1191            102:<!2:loc15> GetLocal(Check:Untyped:@400, Double|MustGen|PureInt, BytecodeDouble, loc7(M<Double>/FlushedDouble), machine:loc6, R:Stack(-8), bc#120, ExitValid)  predicting BytecodeDouble
1192             ...
1193
1194         CFA at @28 says it is invalid since there are type contradiction (Int32:@27 v.s. StringIdent). So, of course, we do not propagate #0's type information to #1 since we become invalid state.
1195         However, #1 is still reachable since it is an OSR target. Since #0 was only the predecessor of #1, loc7's type information becomes None at the head of #1.
1196         Since loc7's AbstractValue is None, @102 GetLocal emits breakpoint. It is OK as long as OSR entry fails because AbstractValue validation requires the given value is None type.
1197
1198         The issue here is that we skipped AbstractValue validation when we have FlushFormat information. Since loc7 has FlushedDouble format, DFG OSR entry code does not validate it against AbstractValue,
1199         which is None. Then, we hit the breakpoint emitted by @102.
1200
1201         This patch performs AbstractValue validation against values even if we have FlushFormat. We should correctly configure AbstractValue for OSR entry's locals too to avoid unnecessary OSR entry
1202         failures in the future but anyway validating locals with AbstractValue is correct behavior here since DFGSpeculativeJIT relies on that.
1203
1204         * dfg/DFGOSREntry.cpp:
1205         (JSC::DFG::prepareOSREntry):
1206
1207 2019-03-12  Michael Saboff  <msaboff@apple.com>
1208
1209         REGRESSION (iOS 12.2): Webpage using CoffeeScript crashes
1210         https://bugs.webkit.org/show_bug.cgi?id=195613
1211
1212         Reviewed by Mark Lam.
1213
1214         The bug here is in Yarr JIT backreference matching code.  We are incorrectly
1215         using a checkedOffset / inputPosition correction when checking for the available
1216         length left in a string.  It is improper to do these corrections as a backreference's
1217         match length is based on what was matched in the referenced capture group and not
1218         part of the checkedOffset and inputPosition computed when we compiled the RegExp.
1219         In some cases, the resulting incorrect calculation would allow us to go past
1220         the subject string's length.  Removed these adjustments.
1221
1222         After writing tests for the first bug, found another bug where the non-greedy
1223         backreference backtracking code didn't do an "are we at the end of the input?" check.
1224         This caused an infinite loop as we'd jump from the backtracking code back to
1225         try matching one more backreference, fail and then backtrack.
1226
1227         * yarr/YarrJIT.cpp:
1228         (JSC::Yarr::YarrGenerator::generateBackReference):
1229         (JSC::Yarr::YarrGenerator::backtrackBackReference):
1230
1231 2019-03-12  Robin Morisset  <rmorisset@apple.com>
1232
1233         A lot more classes have padding that can be reduced by reordering their fields
1234         https://bugs.webkit.org/show_bug.cgi?id=195579
1235
1236         Reviewed by Mark Lam.
1237
1238         * assembler/LinkBuffer.h:
1239         * dfg/DFGArrayifySlowPathGenerator.h:
1240         (JSC::DFG::ArrayifySlowPathGenerator::ArrayifySlowPathGenerator):
1241         * dfg/DFGCallArrayAllocatorSlowPathGenerator.h:
1242         (JSC::DFG::CallArrayAllocatorSlowPathGenerator::CallArrayAllocatorSlowPathGenerator):
1243         (JSC::DFG::CallArrayAllocatorWithVariableSizeSlowPathGenerator::CallArrayAllocatorWithVariableSizeSlowPathGenerator):
1244         * dfg/DFGGraph.h:
1245         * dfg/DFGNode.h:
1246         (JSC::DFG::SwitchData::SwitchData):
1247         * dfg/DFGPlan.cpp:
1248         (JSC::DFG::Plan::Plan):
1249         * dfg/DFGPlan.h:
1250         * dfg/DFGSlowPathGenerator.h:
1251         (JSC::DFG::CallSlowPathGenerator::CallSlowPathGenerator):
1252         * dfg/DFGSpeculativeJIT.cpp:
1253         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
1254         * dfg/DFGSpeculativeJIT.h:
1255         * domjit/DOMJITSignature.h:
1256         (JSC::DOMJIT::Signature::Signature):
1257         (JSC::DOMJIT::Signature::effect):
1258         (JSC::DOMJIT::Signature::argumentCount): Deleted.
1259         * heap/MarkingConstraintSolver.h:
1260         * heap/SlotVisitor.h:
1261         * jit/CallFrameShuffleData.h:
1262         * jit/JITDivGenerator.h:
1263         * jit/SpillRegistersMode.h:
1264         * parser/Nodes.h:
1265         * profiler/ProfilerOSRExit.cpp:
1266         (JSC::Profiler::OSRExit::OSRExit):
1267         * profiler/ProfilerOSRExit.h:
1268         * runtime/ArrayBufferView.h:
1269         * runtime/SamplingProfiler.cpp:
1270         (JSC::SamplingProfiler::SamplingProfiler):
1271         * runtime/SamplingProfiler.h:
1272         * runtime/TypeSet.cpp:
1273         (JSC::StructureShape::StructureShape):
1274         * runtime/TypeSet.h:
1275         * runtime/Watchdog.h:
1276
1277 2019-03-12  Mark Lam  <mark.lam@apple.com>
1278
1279         The HasIndexedProperty node does GC.
1280         https://bugs.webkit.org/show_bug.cgi?id=195559
1281         <rdar://problem/48767923>
1282
1283         Reviewed by Yusuke Suzuki.
1284
1285         HasIndexedProperty can call the slow path operationHasIndexedPropertyByInt(),
1286         which can eventually call JSString::getIndex(), which can resolve a rope.
1287
1288         * dfg/DFGDoesGC.cpp:
1289         (JSC::DFG::doesGC):
1290
1291 2019-03-12  Devin Rousso  <drousso@apple.com>
1292
1293         Web Inspector: Audit: there should be a centralized place for reusable code
1294         https://bugs.webkit.org/show_bug.cgi?id=195265
1295         <rdar://problem/47040673>
1296
1297         Reviewed by Joseph Pecoraro.
1298
1299         * inspector/protocol/Audit.json:
1300         Increment version.
1301
1302 2019-03-12  Robin Morisset  <rmorisset@apple.com>
1303
1304         blocksInPreOrder and blocksInPostOrder should reserve the right capacity for their result vector
1305         https://bugs.webkit.org/show_bug.cgi?id=195595
1306
1307         Reviewed by Saam Barati.
1308
1309         Also change BlockList from being Vector<BasicBlock*, 5> to Vector<BasicBlock*>
1310
1311         * dfg/DFGBasicBlock.h:
1312         * dfg/DFGGraph.cpp:
1313         (JSC::DFG::Graph::blocksInPreOrder):
1314         (JSC::DFG::Graph::blocksInPostOrder):
1315
1316 2019-03-11  Ross Kirsling  <ross.kirsling@sony.com>
1317
1318         Add Optional to Forward.h.
1319         https://bugs.webkit.org/show_bug.cgi?id=195586
1320
1321         Reviewed by Darin Adler.
1322
1323         * b3/B3Common.cpp:
1324         * b3/B3Common.h:
1325         * debugger/DebuggerParseData.cpp:
1326         * debugger/DebuggerParseData.h:
1327         * heap/HeapSnapshot.cpp:
1328         * heap/HeapSnapshot.h:
1329         * jit/PCToCodeOriginMap.cpp:
1330         * jit/PCToCodeOriginMap.h:
1331         * runtime/AbstractModuleRecord.cpp:
1332         * runtime/AbstractModuleRecord.h:
1333         * wasm/WasmInstance.h:
1334         * wasm/WasmModuleParser.h:
1335         * wasm/WasmSectionParser.cpp:
1336         * wasm/WasmSectionParser.h:
1337         * wasm/WasmStreamingParser.cpp:
1338         * wasm/WasmStreamingParser.h:
1339         * yarr/YarrFlags.cpp:
1340         * yarr/YarrFlags.h:
1341         * yarr/YarrUnicodeProperties.cpp:
1342         * yarr/YarrUnicodeProperties.h:
1343         Remove unnecessary includes from headers.
1344
1345 2019-03-11  Justin Fan  <justin_fan@apple.com>
1346
1347         [Web GPU] Update GPUSwapChainDescriptor, GPUSwapChain and implement GPUCanvasContext
1348         https://bugs.webkit.org/show_bug.cgi?id=194406
1349         <rdar://problem/47892466>
1350
1351         Reviewed by Myles C. Maxfield.
1352
1353         Added WebGPU to inspector context types.
1354
1355         * inspector/protocol/Canvas.json:
1356         * inspector/scripts/codegen/generator.py:
1357
1358 2019-03-11  Yusuke Suzuki  <ysuzuki@apple.com>
1359
1360         [JSC] Reduce # of structures in JSGlobalObject initialization
1361         https://bugs.webkit.org/show_bug.cgi?id=195498
1362
1363         Reviewed by Darin Adler.
1364
1365         This patch reduces # of structure allocations in JSGlobalObject initialization. Now it becomes 141, it fits in one
1366         MarkedBlock and this patch drops one MarkedBlock used for Structure previously.
1367
1368         * CMakeLists.txt:
1369         * DerivedSources-output.xcfilelist:
1370         * DerivedSources.make:
1371         * JavaScriptCore.xcodeproj/project.pbxproj:
1372         * runtime/ArrayIteratorPrototype.cpp:
1373         (JSC::ArrayIteratorPrototype::finishCreation): ArrayIteratorPrototype, MapIteratorPrototype, and StringIteratorPrototype's
1374         "next" properties are referenced by JSGlobalObject::init, and it causes reification of the lazy "next" property and structure
1375         transition anyway. So we should put it eagerly "without-transition" configuration to avoid one structure transition.
1376
1377         * runtime/ArrayPrototype.cpp:
1378         (JSC::ArrayPrototype::finishCreation): @@unscopable object's structure should be dictionary because (1) it is used as a dictionary
1379         in with-scope-resolution and (2) since with-scope-resolution is C++ runtime function anyway, non-dictionary structure does not add
1380         any performance benefit. This change saves several structures that are not useful.
1381
1382         * runtime/ClonedArguments.cpp:
1383         (JSC::ClonedArguments::createStructure): Bake CloneArguments's structure with 'without-transition' manner.
1384
1385         * runtime/JSGlobalObject.cpp:
1386         (JSC::JSGlobalObject::init): Previously we are always call resetProtoype at the end of JSGlobalObject::init. But it is not necessary
1387         since we do not change [[Prototype]] of JSGlobalObject. All we want is (1) fixupPrototypeChainWithObjectPrototype's operation and (2) setGlobalThis
1388         operation. Since setGlobalThis part is done in JSGlobalObject::finishCreation, fixupPrototypeChainWithObjectPrototype is only the thing
1389         we should do here.
1390
1391         (JSC::JSGlobalObject::fixupPrototypeChainWithObjectPrototype):
1392         (JSC::JSGlobalObject::resetPrototype): If the [[Prototype]] is the same to the current [[Prototype]], we can skip the operation.
1393
1394         * runtime/JSGlobalObject.h:
1395         * runtime/MapIteratorPrototype.cpp:
1396         (JSC::MapIteratorPrototype::finishCreation):
1397         * runtime/NullGetterFunction.h:
1398         * runtime/NullSetterFunction.h: Since structures of them are allocated per JSGlobalObject and they are per-JSGlobalObject,
1399         we can use without-transition property addition.
1400
1401         * runtime/StringIteratorPrototype.cpp:
1402         (JSC::StringIteratorPrototype::finishCreation):
1403         * runtime/VM.cpp:
1404         (JSC::VM::VM):
1405         (JSC::VM::setIteratorStructureSlow):
1406         (JSC::VM::mapIteratorStructureSlow): These structures are only used in WebCore's main thread.
1407         * runtime/VM.h:
1408         (JSC::VM::setIteratorStructure):
1409         (JSC::VM::mapIteratorStructure):
1410
1411 2019-03-08  Yusuke Suzuki  <ysuzuki@apple.com>
1412
1413         [JSC] BuiltinExecutables should behave like a WeakSet instead of generic WeakHandleOwner for memory footprint
1414         https://bugs.webkit.org/show_bug.cgi?id=195508
1415
1416         Reviewed by Darin Adler.
1417
1418         Weak<> is not cheap in terms of memory footprint. We allocate WeakBlock (256 bytes) for book-keeping Weak<>.
1419         Currently BuiltinExecutables has 203 Weak<> members and many WeakBlocks are actually allocated because
1420         many UnlinkedFunctionExecutables in BuiltinExecutables are allocated during JSGlobalObject initialization process.
1421
1422         This patch changes two things in BuiltinExecutables.
1423
1424         1. Previously we have m_xxxSourceCode fields too. But we do not need to keep it since we know how to produce it when it is required.
1425            We generate SourceCode in xxxSourceCode() method instead of just returning m_xxxSourceCode. This reduces sizeof(BuiltinExecutables) 24 x 203 = 4KB.
1426
1427         2. Instead of using Weak<>, BuiltinExecutables holds raw array of UnlinkedFunctionExecutable*. And Heap::finalizeUnconditionalFinalizers() correctly clears dead executables.
1428            This is similar to JSWeakSet implementation. And it saves WeakBlock allocations.
1429
1430         * builtins/BuiltinExecutables.cpp:
1431         (JSC::BuiltinExecutables::BuiltinExecutables):
1432         (JSC::BuiltinExecutables::finalizeUnconditionally):
1433         (JSC::JSC_FOREACH_BUILTIN_CODE): Deleted.
1434         (JSC::BuiltinExecutables::finalize): Deleted.
1435         * builtins/BuiltinExecutables.h:
1436         (JSC::BuiltinExecutables::static_cast<unsigned>):
1437         (): Deleted.
1438         * heap/Heap.cpp:
1439         (JSC::Heap::finalizeUnconditionalFinalizers):
1440
1441 2019-03-11  Robin Morisset  <rmorisset@apple.com>
1442
1443         IntlDateTimeFormat can be shrunk by 32 bytes
1444         https://bugs.webkit.org/show_bug.cgi?id=195504
1445
1446         Reviewed by Darin Adler.
1447
1448         * runtime/IntlDateTimeFormat.h:
1449
1450 2019-03-11  Robin Morisset  <rmorisset@apple.com>
1451
1452         IntlCollator can be shrunk by 16 bytes
1453         https://bugs.webkit.org/show_bug.cgi?id=195503
1454
1455         Reviewed by Darin Adler.
1456
1457         * runtime/IntlCollator.h:
1458
1459 2019-03-11  Robin Morisset  <rmorisset@apple.com>
1460
1461         IntlNumberFormat can be shrunk by 16 bytes
1462         https://bugs.webkit.org/show_bug.cgi?id=195505
1463
1464         Reviewed by Darin Adler.
1465
1466         * runtime/IntlNumberFormat.h:
1467
1468 2019-03-11  Caio Lima  <ticaiolima@gmail.com>
1469
1470         [ESNext][BigInt] Implement "~" unary operation
1471         https://bugs.webkit.org/show_bug.cgi?id=182216
1472
1473         Reviewed by Keith Miller.
1474
1475         This patch is adding support of BigInt into op_bitnot operations. In
1476         addition, we are changing ArithBitNot to handle only Number operands,
1477         while introducing a new node named ValueBitNot to handle Untyped and
1478         BigInt. This node follows the same approach we are doing into other
1479         arithimetic operations into DFG.
1480
1481         * dfg/DFGAbstractInterpreterInlines.h:
1482         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1483
1484         It is possible that fixup and prediction propagation don't convert a
1485         ValueBitNot(ConstInt32) into ArithBitNot(ConstInt32) because these
1486         analysis are conservative. In such case, we are adding constant
1487         folding rules to ValueBitNot AI.
1488
1489         * dfg/DFGBackwardsPropagationPhase.cpp:
1490         (JSC::DFG::BackwardsPropagationPhase::propagate):
1491
1492         ValueBitNot has same rules as ArithBitNot on backwards propagation.
1493
1494         * dfg/DFGByteCodeParser.cpp:
1495         (JSC::DFG::ByteCodeParser::parseBlock):
1496
1497         We can emit ArithBitNot if we know that operand of op_bitnot is a
1498         Number or any int. Otherwise we fallback to ValueBitNot and rely on
1499         fixup to convert the node to ArithBitNot when it is possible.
1500         ValueBitNot uses heap prediction on prediction propagation and we
1501         collect its type from op_bitnot's value profiler.
1502
1503         * dfg/DFGClobberize.h:
1504         (JSC::DFG::clobberize):
1505
1506         When we have the case with ValueBitNot(BigInt), we don't clobberize
1507         world.
1508
1509         * dfg/DFGDoesGC.cpp:
1510         (JSC::DFG::doesGC):
1511
1512         ValueBitNot can GC on BigIntUse because, right now, all bitNot
1513         operation allocates temporary BigInts to perform calculations and it
1514         can potentially trigger GC.
1515
1516         * dfg/DFGFixupPhase.cpp:
1517         (JSC::DFG::FixupPhase::fixupNode):
1518
1519         ValueBitNot is responsible do handle BigIntUse and UntypedUse. To all
1520         other uses, we fallback to ArithBitNot.
1521
1522         * dfg/DFGNode.h:
1523         (JSC::DFG::Node::hasHeapPrediction):
1524         * dfg/DFGNodeType.h:
1525         * dfg/DFGOperations.cpp:
1526         (JSC::DFG::bitwiseBinaryOp):
1527
1528         This template function is abstracting the new semantics of numeric
1529         values operations on bitwise operations. These operations usually
1530         folow these steps:
1531
1532             1. rhsNumeric = GetInt32OrBigInt(rhs)
1533             2. lhsNumeric = GetInt32OrBigInt(lhs)
1534             3. trhow error if TypeOf(rhsNumeric) != TypeOf(lhsNumeric)
1535             4. return BigInt::bitwiseOp(bitOp, rhs, lhs) if TypeOf(lhsNumeric) == BigInt
1536             5. return rhs <int32BitOp> lhs
1537
1538         Since we have almost the same code for every bitwise op,
1539         we use such template to avoid code duplication. The template receives
1540         Int32 and BigInt operations as parameter. Error message is received as
1541         `const char*` instead of `String&` to avoid String allocation even when
1542         there is no error to throw.
1543
1544         * dfg/DFGOperations.h:
1545         * dfg/DFGPredictionPropagationPhase.cpp:
1546         * dfg/DFGSafeToExecute.h:
1547         (JSC::DFG::safeToExecute):
1548         * dfg/DFGSpeculativeJIT.cpp:
1549         (JSC::DFG::SpeculativeJIT::compileValueBitNot):
1550
1551         ValueBitNot generates speculative code for BigIntUse and this code is a
1552         call to `operationBitNotBigInt`. This operation is faster than
1553         `operationValueBitNot` because there is no need to check types of
1554         operands and execute properly operation. We still need to check
1555         exceptions after `operationBitNotBigInt` because it can throw OOM.
1556
1557         (JSC::DFG::SpeculativeJIT::compileBitwiseNot):
1558         * dfg/DFGSpeculativeJIT.h:
1559         * dfg/DFGSpeculativeJIT32_64.cpp:
1560         (JSC::DFG::SpeculativeJIT::compile):
1561         * dfg/DFGSpeculativeJIT64.cpp:
1562         (JSC::DFG::SpeculativeJIT::compile):
1563         * ftl/FTLCapabilities.cpp:
1564         (JSC::FTL::canCompile):
1565         * ftl/FTLLowerDFGToB3.cpp:
1566         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
1567         (JSC::FTL::DFG::LowerDFGToB3::compileValueBitNot):
1568         (JSC::FTL::DFG::LowerDFGToB3::compileArithBitNot):
1569         * runtime/CommonSlowPaths.cpp:
1570         (JSC::SLOW_PATH_DECL):
1571         * runtime/JSBigInt.cpp:
1572         (JSC::JSBigInt::bitwiseNot):
1573         * runtime/JSBigInt.h:
1574
1575 2019-03-11  Darin Adler  <darin@apple.com>
1576
1577         Specify fixed precision explicitly to prepare to change String::number and StringBuilder::appendNumber floating point behavior
1578         https://bugs.webkit.org/show_bug.cgi?id=195533
1579
1580         Reviewed by Brent Fulgham.
1581
1582         * API/tests/ExecutionTimeLimitTest.cpp:
1583         (testExecutionTimeLimit): Use appendFixedPrecisionNumber.
1584         * runtime/NumberPrototype.cpp:
1585         (JSC::numberProtoFuncToPrecision): Use numberToStringFixedPrecision.
1586         * runtime/Options.cpp:
1587         (JSC::Option::dump const): Use appendFixedPrecisionNumber.
1588
1589 2019-03-10  Ross Kirsling  <ross.kirsling@sony.com>
1590
1591         Invalid flags in a RegExp literal should be an early SyntaxError
1592         https://bugs.webkit.org/show_bug.cgi?id=195514
1593
1594         Reviewed by Darin Adler.
1595
1596         Currently we're throwing a *runtime* SyntaxError; this should occur at parse time. 
1597
1598           12.2.8.1 Static Semantics: Early Errors
1599             PrimaryExpression : RegularExpressionLiteral
1600               - It is a Syntax Error if BodyText of RegularExpressionLiteral cannot be recognized
1601                 using the goal symbol Pattern of the ECMAScript RegExp grammar specified in 21.2.1.
1602               - It is a Syntax Error if FlagText of RegularExpressionLiteral contains any code points
1603                 other than "g", "i", "m",  "s", "u", or "y", or if it contains the same code point more than once.
1604
1605         In fixing this, let's also move flag handling from runtime/ to yarr/.
1606
1607         * yarr/YarrSyntaxChecker.cpp:
1608         (JSC::Yarr::checkSyntax):
1609         Check flags before checking pattern.
1610
1611         * CMakeLists.txt:
1612         * JavaScriptCore.xcodeproj/project.pbxproj:
1613         * Sources.txt:
1614         * bytecompiler/NodesCodegen.cpp:
1615         (JSC::RegExpNode::emitBytecode):
1616         * inspector/ContentSearchUtilities.cpp:
1617         (Inspector::ContentSearchUtilities::findMagicComment):
1618         * runtime/CachedTypes.cpp:
1619         * runtime/RegExp.cpp:
1620         (JSC::RegExp::RegExp):
1621         (JSC::RegExp::createWithoutCaching):
1622         (JSC::RegExp::create):
1623         (JSC::regExpFlags): Deleted.
1624         * runtime/RegExp.h:
1625         * runtime/RegExpCache.cpp:
1626         (JSC::RegExpCache::lookupOrCreate):
1627         (JSC::RegExpCache::ensureEmptyRegExpSlow):
1628         * runtime/RegExpCache.h:
1629         * runtime/RegExpConstructor.cpp:
1630         (JSC::toFlags):
1631         (JSC::regExpCreate):
1632         (JSC::constructRegExp):
1633         * runtime/RegExpKey.h:
1634         (JSC::RegExpKey::RegExpKey):
1635         (WTF::HashTraits<JSC::RegExpKey>::constructDeletedValue):
1636         (WTF::HashTraits<JSC::RegExpKey>::isDeletedValue):
1637         (): Deleted.
1638         * runtime/RegExpPrototype.cpp:
1639         (JSC::regExpProtoFuncCompile):
1640         * testRegExp.cpp:
1641         (parseRegExpLine):
1642         * yarr/RegularExpression.cpp:
1643         (JSC::Yarr::RegularExpression::Private::compile):
1644         * yarr/YarrFlags.cpp: Added.
1645         (JSC::Yarr::parseFlags):
1646         * yarr/YarrFlags.h: Added.
1647         * yarr/YarrInterpreter.h:
1648         (JSC::Yarr::BytecodePattern::ignoreCase const):
1649         (JSC::Yarr::BytecodePattern::multiline const):
1650         (JSC::Yarr::BytecodePattern::sticky const):
1651         (JSC::Yarr::BytecodePattern::unicode const):
1652         (JSC::Yarr::BytecodePattern::dotAll const):
1653         * yarr/YarrPattern.cpp:
1654         (JSC::Yarr::YarrPattern::compile):
1655         (JSC::Yarr::YarrPattern::YarrPattern):
1656         (JSC::Yarr::YarrPattern::dumpPattern):
1657         * yarr/YarrPattern.h:
1658         (JSC::Yarr::YarrPattern::global const):
1659         (JSC::Yarr::YarrPattern::ignoreCase const):
1660         (JSC::Yarr::YarrPattern::multiline const):
1661         (JSC::Yarr::YarrPattern::sticky const):
1662         (JSC::Yarr::YarrPattern::unicode const):
1663         (JSC::Yarr::YarrPattern::dotAll const):
1664         Move flag handling to Yarr and modernize API.
1665
1666 2019-03-09  Robin Morisset  <rmorisset@apple.com>
1667
1668         Compilation can be shrunk by 8 bytes
1669         https://bugs.webkit.org/show_bug.cgi?id=195500
1670
1671         Reviewed by Mark Lam.
1672
1673         * profiler/ProfilerCompilation.cpp:
1674         (JSC::Profiler::Compilation::Compilation):
1675         * profiler/ProfilerCompilation.h:
1676
1677 2019-03-09  Robin Morisset  <rmorisset@apple.com>
1678
1679         BinarySwitch can be shrunk by 8 bytes
1680         https://bugs.webkit.org/show_bug.cgi?id=195493
1681
1682         Reviewed by Mark Lam.
1683
1684         * jit/BinarySwitch.cpp:
1685         (JSC::BinarySwitch::BinarySwitch):
1686         * jit/BinarySwitch.h:
1687
1688 2019-03-09  Robin Morisset  <rmorisset@apple.com>
1689
1690         AsyncStackTrace can be shrunk by 8 bytes
1691         https://bugs.webkit.org/show_bug.cgi?id=195491
1692
1693         Reviewed by Mark Lam.
1694
1695         * inspector/AsyncStackTrace.h:
1696
1697 2019-03-08  Mark Lam  <mark.lam@apple.com>
1698
1699         Stack overflow crash in JSC::JSObject::hasInstance.
1700         https://bugs.webkit.org/show_bug.cgi?id=195458
1701         <rdar://problem/48710195>
1702
1703         Reviewed by Yusuke Suzuki.
1704
1705         * runtime/JSObject.cpp:
1706         (JSC::JSObject::hasInstance):
1707
1708 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1709
1710         IntegerCheckCombiningPhase::Range can be shrunk by 8 bytes
1711         https://bugs.webkit.org/show_bug.cgi?id=195487
1712
1713         Reviewed by Saam Barati.
1714
1715         * dfg/DFGIntegerCheckCombiningPhase.cpp:
1716
1717 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1718
1719         TypeLocation can be shrunk by 8 bytes
1720         https://bugs.webkit.org/show_bug.cgi?id=195483
1721
1722         Reviewed by Mark Lam.
1723
1724         * bytecode/TypeLocation.h:
1725         (JSC::TypeLocation::TypeLocation):
1726
1727 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1728
1729         GetByIdStatus can be shrunk by 16 bytes
1730         https://bugs.webkit.org/show_bug.cgi?id=195480
1731
1732         Reviewed by Saam Barati.
1733
1734         8 bytes from reordering fields
1735         8 more bytes by making the enum State only use 1 byte.
1736
1737         * bytecode/GetByIdStatus.cpp:
1738         (JSC::GetByIdStatus::GetByIdStatus):
1739         * bytecode/GetByIdStatus.h:
1740
1741 2019-03-08  Robin Morisset  <rmorisset@apple.com>
1742
1743         PutByIdVariant can be shrunk by 8 bytes
1744         https://bugs.webkit.org/show_bug.cgi?id=195482
1745
1746         Reviewed by Mark Lam.
1747
1748         * bytecode/PutByIdVariant.h:
1749         (JSC::PutByIdVariant::PutByIdVariant):
1750
1751 2019-03-08  Yusuke Suzuki  <ysuzuki@apple.com>
1752
1753         Unreviewed, follow-up after r242568
1754
1755         Robin pointed that calculation of `numberOfChildren` and `nonEmptyIndex` is unnecessary.
1756
1757         * dfg/DFGAbstractInterpreterInlines.h:
1758         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1759
1760 2019-03-08  Yusuke Suzuki  <ysuzuki@apple.com>
1761
1762         [JSC] We should have more WithoutTransition functions which are usable for JSGlobalObject initialization
1763         https://bugs.webkit.org/show_bug.cgi?id=195447
1764
1765         Reviewed by Filip Pizlo.
1766
1767         This patch reduces # of unnecessary structure transitions in JSGlobalObject initialization to avoid unnecessary allocations
1768         caused by Structure transition. One example is WeakBlock allocation for StructureTransitionTable.
1769         To achieve this, we (1) add putDirectNonIndexAccessorWithoutTransition and putDirectNativeIntrinsicGetterWithoutTransition
1770         to add accessor properties without transition, and (2) add NameAdditionMode::WithoutStructureTransition mode to InternalFunction::finishCreation
1771         to use `putDirectWithoutTransition` instead of `putDirect`.
1772
1773         * inspector/JSInjectedScriptHostPrototype.cpp:
1774         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
1775         * inspector/JSJavaScriptCallFramePrototype.cpp:
1776         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
1777         * runtime/ArrayConstructor.cpp:
1778         (JSC::ArrayConstructor::finishCreation):
1779         * runtime/AsyncFunctionConstructor.cpp:
1780         (JSC::AsyncFunctionConstructor::finishCreation):
1781         * runtime/AsyncGeneratorFunctionConstructor.cpp:
1782         (JSC::AsyncGeneratorFunctionConstructor::finishCreation):
1783         * runtime/BigIntConstructor.cpp:
1784         (JSC::BigIntConstructor::finishCreation):
1785         * runtime/BooleanConstructor.cpp:
1786         (JSC::BooleanConstructor::finishCreation):
1787         * runtime/DateConstructor.cpp:
1788         (JSC::DateConstructor::finishCreation):
1789         * runtime/ErrorConstructor.cpp:
1790         (JSC::ErrorConstructor::finishCreation):
1791         * runtime/FunctionConstructor.cpp:
1792         (JSC::FunctionConstructor::finishCreation):
1793         * runtime/FunctionPrototype.cpp:
1794         (JSC::FunctionPrototype::finishCreation):
1795         (JSC::FunctionPrototype::addFunctionProperties):
1796         (JSC::FunctionPrototype::initRestrictedProperties):
1797         * runtime/FunctionPrototype.h:
1798         * runtime/GeneratorFunctionConstructor.cpp:
1799         (JSC::GeneratorFunctionConstructor::finishCreation):
1800         * runtime/InternalFunction.cpp:
1801         (JSC::InternalFunction::finishCreation):
1802         * runtime/InternalFunction.h:
1803         * runtime/IntlCollatorConstructor.cpp:
1804         (JSC::IntlCollatorConstructor::finishCreation):
1805         * runtime/IntlDateTimeFormatConstructor.cpp:
1806         (JSC::IntlDateTimeFormatConstructor::finishCreation):
1807         * runtime/IntlNumberFormatConstructor.cpp:
1808         (JSC::IntlNumberFormatConstructor::finishCreation):
1809         * runtime/IntlPluralRulesConstructor.cpp:
1810         (JSC::IntlPluralRulesConstructor::finishCreation):
1811         * runtime/JSArrayBufferConstructor.cpp:
1812         (JSC::JSGenericArrayBufferConstructor<sharingMode>::finishCreation):
1813         * runtime/JSArrayBufferPrototype.cpp:
1814         (JSC::JSArrayBufferPrototype::finishCreation):
1815         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
1816         (JSC::JSGenericTypedArrayViewConstructor<ViewClass>::finishCreation):
1817         * runtime/JSGlobalObject.cpp:
1818         (JSC::JSGlobalObject::init):
1819         * runtime/JSObject.cpp:
1820         (JSC::JSObject::putDirectNonIndexAccessorWithoutTransition):
1821         (JSC::JSObject::putDirectNativeIntrinsicGetterWithoutTransition):
1822         * runtime/JSObject.h:
1823         * runtime/JSPromiseConstructor.cpp:
1824         (JSC::JSPromiseConstructor::finishCreation):
1825         * runtime/JSTypedArrayViewConstructor.cpp:
1826         (JSC::JSTypedArrayViewConstructor::finishCreation):
1827         * runtime/JSTypedArrayViewPrototype.cpp:
1828         (JSC::JSTypedArrayViewPrototype::finishCreation):
1829         * runtime/MapConstructor.cpp:
1830         (JSC::MapConstructor::finishCreation):
1831         * runtime/MapPrototype.cpp:
1832         (JSC::MapPrototype::finishCreation):
1833         * runtime/NativeErrorConstructor.cpp:
1834         (JSC::NativeErrorConstructorBase::finishCreation):
1835         * runtime/NullGetterFunction.h:
1836         * runtime/NullSetterFunction.h:
1837         * runtime/NumberConstructor.cpp:
1838         (JSC::NumberConstructor::finishCreation):
1839         * runtime/ObjectConstructor.cpp:
1840         (JSC::ObjectConstructor::finishCreation):
1841         * runtime/ProxyConstructor.cpp:
1842         (JSC::ProxyConstructor::finishCreation):
1843         * runtime/RegExpConstructor.cpp:
1844         (JSC::RegExpConstructor::finishCreation):
1845         * runtime/RegExpPrototype.cpp:
1846         (JSC::RegExpPrototype::finishCreation):
1847         * runtime/SetConstructor.cpp:
1848         (JSC::SetConstructor::finishCreation):
1849         * runtime/SetPrototype.cpp:
1850         (JSC::SetPrototype::finishCreation):
1851         * runtime/StringConstructor.cpp:
1852         (JSC::StringConstructor::finishCreation):
1853         * runtime/SymbolConstructor.cpp:
1854         (JSC::SymbolConstructor::finishCreation):
1855         * runtime/WeakMapConstructor.cpp:
1856         (JSC::WeakMapConstructor::finishCreation):
1857         * runtime/WeakSetConstructor.cpp:
1858         (JSC::WeakSetConstructor::finishCreation):
1859         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
1860         (JSC::WebAssemblyCompileErrorConstructor::finishCreation):
1861         * wasm/js/WebAssemblyInstanceConstructor.cpp:
1862         (JSC::WebAssemblyInstanceConstructor::finishCreation):
1863         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
1864         (JSC::WebAssemblyLinkErrorConstructor::finishCreation):
1865         * wasm/js/WebAssemblyMemoryConstructor.cpp:
1866         (JSC::WebAssemblyMemoryConstructor::finishCreation):
1867         * wasm/js/WebAssemblyModuleConstructor.cpp:
1868         (JSC::WebAssemblyModuleConstructor::finishCreation):
1869         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
1870         (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation):
1871         * wasm/js/WebAssemblyTableConstructor.cpp:
1872         (JSC::WebAssemblyTableConstructor::finishCreation):
1873
1874 2019-03-08  Tadeu Zagallo  <tzagallo@apple.com>
1875
1876         op_check_tdz does not def its argument
1877         https://bugs.webkit.org/show_bug.cgi?id=192880
1878         <rdar://problem/46221598>
1879
1880         Reviewed by Saam Barati.
1881
1882         This prevented the for-in loop optimization in the bytecode generator, since
1883         the analysis sees a redefinition of the loop variable.
1884
1885         * bytecode/BytecodeUseDef.h:
1886         (JSC::computeDefsForBytecodeOffset):
1887
1888 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
1889
1890         [JSC] Make more fields lazy in JSGlobalObject
1891         https://bugs.webkit.org/show_bug.cgi?id=195449
1892
1893         Reviewed by Mark Lam.
1894
1895         This patch makes more fields lazy-allocated in JSGlobalObject to save memory.
1896
1897         1. Some minor structures like moduleRecordStructure.
1898         2. Some functions like parseInt / parseFloat. While they are eagerly created in JIT mode anyway to materialize NumberConstructor, we can lazily allocate them in non JIT mode.
1899         3. ArrayBuffer constructor. While it is eagerly allocated in WebCore, we can make lazily allocated in JSC.
1900
1901         * interpreter/Interpreter.cpp:
1902         (JSC::Interpreter::execute):
1903         * runtime/JSArrayBufferPrototype.h:
1904         * runtime/JSGlobalObject.cpp:
1905         (JSC::JSGlobalObject::init):
1906         (JSC::JSGlobalObject::visitChildren):
1907         * runtime/JSGlobalObject.h:
1908         (JSC::JSGlobalObject::parseIntFunction const):
1909         (JSC::JSGlobalObject::parseFloatFunction const):
1910         (JSC::JSGlobalObject::evalFunction const):
1911         (JSC::JSGlobalObject::strictEvalActivationStructure const):
1912         (JSC::JSGlobalObject::moduleRecordStructure const):
1913         (JSC::JSGlobalObject::moduleNamespaceObjectStructure const):
1914         (JSC::JSGlobalObject::proxyObjectStructure const):
1915         (JSC::JSGlobalObject::callableProxyObjectStructure const):
1916         (JSC::JSGlobalObject::proxyRevokeStructure const):
1917         (JSC::JSGlobalObject::arrayBufferConstructor const):
1918         (JSC::JSGlobalObject::arrayBufferPrototype const):
1919         (JSC::JSGlobalObject::arrayBufferStructure const):
1920         * runtime/ProxyObject.h:
1921         * runtime/StrictEvalActivation.cpp:
1922         (JSC::StrictEvalActivation::StrictEvalActivation):
1923         * runtime/StrictEvalActivation.h:
1924         * wasm/js/JSWebAssemblyMemory.cpp:
1925         (JSC::JSWebAssemblyMemory::buffer):
1926         * wasm/js/WebAssemblyModuleConstructor.cpp:
1927         (JSC::webAssemblyModuleCustomSections):
1928
1929 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
1930
1931         [JSC] Remove merging must handle values into proven types in CFA
1932         https://bugs.webkit.org/show_bug.cgi?id=195444
1933
1934         Reviewed by Saam Barati.
1935
1936         Previously, we are merging must handle values as a proven constant in CFA. This is OK as long as this proven AbstractValue is blurred by merging the other legit AbstractValues
1937         from the successors. But let's consider the following code, this is actually generated DFG graph from the attached test in r242626.
1938
1939             Block #2 (loop header) succ #3, #4
1940             ...
1941             1: ForceOSRExit
1942             ...
1943             2: JSConstant(0)
1944             3: SetLocal(@2, loc6)
1945             ...
1946             4: Branch(#3, #4)
1947
1948             Block #3 (This is OSR entry target) pred #2, #3, must handle value for loc6 => JSConstant(Int32, 31)
1949             ...
1950             5: GetLocal(loc6)
1951             6: StringFromCharCode(@5)
1952             ...
1953
1954         Block #3 is OSR entry target. So we have must handle value for loc6 and it is Int32 constant 31. Then we merge this constant as a proven value in #3's loc6 AbstractValue.
1955         If the value from #2 blurs the value, it is OK. However, #2 has ForceOSRExit. So must handle value suddenly becomes the only source of loc6 in #3. Then we use this constant
1956         as a proven value. But this is not expected behavior since must handle value is just a snapshot of the locals when we kick off the concurrent compilation. In the above example,
1957         we assume that loop index is an constant 31, but it is wrong, and OSR entry fails. Because there is no strong assumption that the must handle value is the proven type or value,
1958         we should not merge it in CFA.
1959
1960         Since (1) this is just an optimization, (2) type information is already propagated in prediction injection phase, and (3) the must handle value does not show the performance
1961         progression in r211461 and we no longer see type misprediction in marsaglia-osr-entry.js, this patch simply removes must handle value type widening in CFA.
1962
1963         * dfg/DFGCFAPhase.cpp:
1964         (JSC::DFG::CFAPhase::run):
1965         (JSC::DFG::CFAPhase::performBlockCFA):
1966         (JSC::DFG::CFAPhase::injectOSR): Deleted.
1967
1968 2019-03-07  Yusuke Suzuki  <ysuzuki@apple.com>
1969
1970         [JSC] StringFromCharCode fast path should accept 0xff in DFG and FTL
1971         https://bugs.webkit.org/show_bug.cgi?id=195429
1972
1973         Reviewed by Saam Barati.
1974
1975         We can create single characters without allocation up to 0xff character code. But currently, DFGSpeculativeJIT and FTLLowerDFGToB3 go to the slow path
1976         for 0xff case. On the other hand, DFG DoesGC phase says GC won't happen if the child is int32 constant and it is <= 0xff. So, if you have `String.fromCharCode(0xff)`,
1977         this breaks the assumption in DFG DoesGC. The correct fix is changing the check in DFGSpeculativeJIT and FTLLowerDFGToB3 from AboveOrEqual to Above.
1978         Note that ThunkGenerators's StringFromCharCode thunk was correct.
1979
1980         * dfg/DFGSpeculativeJIT.cpp:
1981         (JSC::DFG::SpeculativeJIT::compileFromCharCode):
1982         * ftl/FTLLowerDFGToB3.cpp:
1983         (JSC::FTL::DFG::LowerDFGToB3::compileStringFromCharCode):
1984
1985 2019-03-07  Mark Lam  <mark.lam@apple.com>
1986
1987         Follow up refactoring in try-finally code after r242591.
1988         https://bugs.webkit.org/show_bug.cgi?id=195428
1989
1990         Reviewed by Saam Barati.
1991
1992         1. Added some comments in emitFinallyCompletion() to describe each completion case.
1993         2. Converted CatchEntry into a struct.
1994         3. Renamed variable hasBreaksOrContinuesNotCoveredByJumps to hasBreaksOrContinuesThatEscapeCurrentFinally
1995            to be more clear about its purpose.
1996
1997         * bytecompiler/BytecodeGenerator.cpp:
1998         (JSC::BytecodeGenerator::generate):
1999         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
2000         (JSC::BytecodeGenerator::emitFinallyCompletion):
2001         * bytecompiler/BytecodeGenerator.h:
2002
2003 2019-03-07  Saam Barati  <sbarati@apple.com>
2004
2005         CompactVariableMap::Handle's copy operator= leaks the previous data
2006         https://bugs.webkit.org/show_bug.cgi?id=195398
2007
2008         Reviewed by Yusuke Suzuki.
2009
2010         The copy constructor was just assigning |this| to the new value,
2011         forgetting to decrement the ref count of the thing pointed to by
2012         the |this| handle. Based on Yusuke's suggestion, this patch refactors
2013         the move constructor, move operator=, and copy operator= to use the
2014         swap() primitive and the copy constructor primitive.
2015
2016         * parser/VariableEnvironment.cpp:
2017         (JSC::CompactVariableMap::Handle::Handle):
2018         (JSC::CompactVariableMap::Handle::swap):
2019         (JSC::CompactVariableMap::Handle::operator=): Deleted.
2020         * parser/VariableEnvironment.h:
2021         (JSC::CompactVariableMap::Handle::Handle):
2022         (JSC::CompactVariableMap::Handle::operator=):
2023
2024 2019-03-07  Tadeu Zagallo  <tzagallo@apple.com>
2025
2026         Lazily decode cached bytecode
2027         https://bugs.webkit.org/show_bug.cgi?id=194810
2028
2029         Reviewed by Saam Barati.
2030
2031         Like lazy parsing, we should pause at code block boundaries. Instead
2032         of always eagerly decoding UnlinkedFunctionExecutable's UnlinkedCodeBlocks,
2033         we store their offsets in the executable and lazily decode them on the next
2034         call to `unlinkedCodeBlockFor`.
2035
2036         * bytecode/UnlinkedFunctionExecutable.cpp:
2037         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2038         (JSC::UnlinkedFunctionExecutable::~UnlinkedFunctionExecutable):
2039         (JSC::UnlinkedFunctionExecutable::visitChildren):
2040         (JSC::UnlinkedFunctionExecutable::unlinkedCodeBlockFor):
2041         (JSC::UnlinkedFunctionExecutable::decodeCachedCodeBlocks):
2042         * bytecode/UnlinkedFunctionExecutable.h:
2043         * runtime/CachedTypes.cpp:
2044         (JSC::Decoder::Decoder):
2045         (JSC::Decoder::~Decoder):
2046         (JSC::Decoder::create):
2047         (JSC::Decoder::offsetOf):
2048         (JSC::Decoder::cacheOffset):
2049         (JSC::Decoder::ptrForOffsetFromBase):
2050         (JSC::Decoder::handleForEnvironment const):
2051         (JSC::Decoder::setHandleForEnvironment):
2052         (JSC::Decoder::addFinalizer):
2053         (JSC::VariableLengthObject::isEmpty const):
2054         (JSC::CachedWriteBarrier::isEmpty const):
2055         (JSC::CachedFunctionExecutable::unlinkedCodeBlockForCall const):
2056         (JSC::CachedFunctionExecutable::unlinkedCodeBlockForConstruct const):
2057         (JSC::CachedFunctionExecutable::decode const):
2058         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2059         (JSC::decodeCodeBlockImpl):
2060         (JSC::isCachedBytecodeStillValid):
2061         (JSC::decodeFunctionCodeBlock):
2062         * runtime/CachedTypes.h:
2063         (JSC::Decoder::vm):
2064
2065 2019-03-06  Mark Lam  <mark.lam@apple.com>
2066
2067         Exception is a JSCell, not a JSObject.
2068         https://bugs.webkit.org/show_bug.cgi?id=195392
2069
2070         Reviewed by Saam Barati.
2071
2072         Exception is a VM implementation construct to carry a stack trace for the point
2073         where it is thrown from.  As a reminder, an Exception is needed because:
2074         1. JS code can throw primitives as well that are non-cells.
2075         2. Error objects capture the stack trace at the point where they are constructed,
2076            which is not always the same as the point where they are thrown (if they are
2077            thrown).
2078
2079         Hence, Exception should not be visible to JS code, and therefore should not be a
2080         JSObject.  Hence, it should not inherit from JSDestructibleObject.
2081
2082         This patch changes the following:
2083
2084         1. Exception now inherits directly from JSCell instead.
2085
2086         2. Places where we return an Exception masquerading as a JSObject* are now
2087            updated to return a nullptr when we encounter an exception.
2088
2089         3. We still return Exception* as JSValue or EncodedJSValue when we encounter an
2090            exception in functions that return JSValue or EncodedJSValue.  This is because
2091            the number that implements the following pattern is too numerous:
2092
2093                 return throw<Some Error>(...)
2094
2095            We'll leave these as is for now.
2096
2097         * bytecode/CodeBlock.h:
2098         (JSC::ScriptExecutable::prepareForExecution):
2099         * interpreter/Interpreter.cpp:
2100         (JSC::Interpreter::executeProgram):
2101         (JSC::Interpreter::executeCall):
2102         (JSC::Interpreter::executeConstruct):
2103         (JSC::Interpreter::prepareForRepeatCall):
2104         (JSC::Interpreter::execute):
2105         (JSC::Interpreter::executeModuleProgram):
2106         * jit/JITOperations.cpp:
2107         * llint/LLIntSlowPaths.cpp:
2108         (JSC::LLInt::setUpCall):
2109         * runtime/ConstructData.cpp:
2110         (JSC::construct):
2111         * runtime/Error.cpp:
2112         (JSC::throwConstructorCannotBeCalledAsFunctionTypeError):
2113         (JSC::throwTypeError):
2114         (JSC::throwSyntaxError):
2115         * runtime/Error.h:
2116         (JSC::throwRangeError):
2117         * runtime/Exception.cpp:
2118         (JSC::Exception::createStructure):
2119         * runtime/Exception.h:
2120         * runtime/ExceptionHelpers.cpp:
2121         (JSC::throwOutOfMemoryError):
2122         (JSC::throwStackOverflowError):
2123         (JSC::throwTerminatedExecutionException):
2124         * runtime/ExceptionHelpers.h:
2125         * runtime/FunctionConstructor.cpp:
2126         (JSC::constructFunction):
2127         (JSC::constructFunctionSkippingEvalEnabledCheck):
2128         * runtime/IntlPluralRules.cpp:
2129         (JSC::IntlPluralRules::resolvedOptions):
2130         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
2131         (JSC::constructGenericTypedArrayViewWithArguments):
2132         * runtime/JSObject.h:
2133         * runtime/ObjectConstructor.cpp:
2134         (JSC::objectConstructorSeal):
2135         (JSC::objectConstructorFreeze):
2136         * runtime/ProgramExecutable.cpp:
2137         (JSC::ProgramExecutable::initializeGlobalProperties):
2138         * runtime/RegExpConstructor.cpp:
2139         (JSC::regExpCreate):
2140         (JSC::constructRegExp):
2141         * runtime/ScriptExecutable.cpp:
2142         (JSC::ScriptExecutable::newCodeBlockFor):
2143         (JSC::ScriptExecutable::prepareForExecutionImpl):
2144         * runtime/ScriptExecutable.h:
2145         * runtime/ThrowScope.cpp:
2146         (JSC::ThrowScope::throwException):
2147         * runtime/ThrowScope.h:
2148         (JSC::ThrowScope::throwException):
2149         (JSC::throwException):
2150         * runtime/VM.cpp:
2151         (JSC::VM::throwException):
2152         * runtime/VM.h:
2153
2154 2019-03-06  Ross Kirsling  <ross.kirsling@sony.com>
2155
2156         [Win] Remove -DUCHAR_TYPE=wchar_t stopgap and learn to live with char16_t.
2157         https://bugs.webkit.org/show_bug.cgi?id=195346
2158
2159         Reviewed by Fujii Hironori.
2160
2161         * jsc.cpp:
2162         (currentWorkingDirectory):
2163         (fetchModuleFromLocalFileSystem):
2164         * runtime/DateConversion.cpp:
2165         (JSC::formatDateTime):
2166         Use wchar helpers as needed.
2167
2168 2019-03-06  Mark Lam  <mark.lam@apple.com>
2169
2170         Fix incorrect handling of try-finally completion values.
2171         https://bugs.webkit.org/show_bug.cgi?id=195131
2172         <rdar://problem/46222079>
2173
2174         Reviewed by Saam Barati and Yusuke Suzuki.
2175
2176         Consider the following:
2177
2178             function foo() {                        // line 1
2179                 try {
2180                     return 42;                      // line 3
2181                 } finally {
2182                     for (var j = 0; j < 1; j++) {   // line 5
2183                         try {
2184                             throw '';               // line 7
2185                         } finally {
2186                             continue;               // line 9
2187                         }
2188                     }
2189                 }                                   // line 11
2190             }
2191             var result = foo();
2192
2193         With the current (before fix) code base, result will be the exception object thrown
2194         at line 7.  The expected result should be 42, returned at line 3.
2195
2196         The bug is that we were previously only using one set of completion type and
2197         value registers for the entire function.  This is inadequate because the outer
2198         try-finally needs to preserve its own completion type and value ({ Return, 42 }
2199         in this case) in order to be able to complete correctly.
2200
2201         One might be deceived into thinking that the above example should complete with
2202         the exception thrown at line 7.  However, according to Section 13.15.8 of the
2203         ECMAScript spec, the 'continue' in the finally at line 9 counts as an abrupt
2204         completion.  As a result, it overrides the throw from line 7.  After the continue,
2205         execution resumes at the top of the loop at line 5, followed by a normal completion
2206         at line 11.
2207
2208         Also according to Section 13.15.8, given that the completion type of the outer
2209         finally is normal, the resultant completion of the outer try-finally should be
2210         the completion of the outer try block i.e. { Return, 42 }.
2211
2212         This patch makes the following changes:
2213         
2214         1. Fix handling of finally completion to use a unique set of completion
2215            type and value registers for each FinallyContext.
2216
2217         2. Move the setting of Throw completion type to the out of line exception handler.
2218            This makes the mainline code slightly less branchy.
2219
2220         3. Introduce emitOutOfLineCatchHandler(), emitOutOfLineFinallyHandler(), and
2221            emitOutOfLineExceptionHandler() to make it clearer that these are not emitting
2222            bytecode inline.  Also, these make it clearer when we're emitting a handler
2223            for a catch vs a finally.
2224
2225         4. Allocate the FinallyContext on the stack instead of as a member of the
2226            heap allocated ControlFlowScope.  This simplifies its life-cycle management
2227            and reduces the amount of needed copying.
2228
2229         5. Update emitFinallyCompletion() to propagate the completion type and value to
2230            the outer FinallyContext when needed.
2231
2232         6. Fix emitJumpIf() to use the right order of operands.  Previously, we were
2233            only using it to do op_stricteq and op_nstricteq comparisons.  So, the order
2234            wasn't important.  We now use it to also do op_beloweq comparisons.  Hence,
2235            the order needs to be corrected.
2236
2237         7. Remove the unused CompletionType::Break and Continue.  These are encoded with
2238            the jumpIDs of the jump targets instead.
2239
2240         Relevant specifications:
2241         Section 13.15.8: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-try-statement-runtime-semantics-evaluation
2242         Section 6.3.2.4: https://www.ecma-international.org/ecma-262/9.0/index.html#sec-updateempty
2243
2244         * bytecompiler/BytecodeGenerator.cpp:
2245         (JSC::FinallyContext::FinallyContext):
2246         (JSC::BytecodeGenerator::generate):
2247         (JSC::BytecodeGenerator::BytecodeGenerator):
2248         (JSC::BytecodeGenerator::pushFinallyControlFlowScope):
2249         (JSC::BytecodeGenerator::popFinallyControlFlowScope):
2250         (JSC::BytecodeGenerator::emitOutOfLineCatchHandler):
2251         (JSC::BytecodeGenerator::emitOutOfLineFinallyHandler):
2252         (JSC::BytecodeGenerator::emitOutOfLineExceptionHandler):
2253         (JSC::BytecodeGenerator::emitEnumeration):
2254         (JSC::BytecodeGenerator::emitJumpViaFinallyIfNeeded):
2255         (JSC::BytecodeGenerator::emitReturnViaFinallyIfNeeded):
2256         (JSC::BytecodeGenerator::emitFinallyCompletion):
2257         (JSC::BytecodeGenerator::emitJumpIf):
2258         (JSC::BytecodeGenerator::emitCatch): Deleted.
2259         (JSC::BytecodeGenerator::allocateCompletionRecordRegisters): Deleted.
2260         (JSC::BytecodeGenerator::releaseCompletionRecordRegisters): Deleted.
2261         * bytecompiler/BytecodeGenerator.h:
2262         (JSC::FinallyContext::completionTypeRegister const):
2263         (JSC::FinallyContext::completionValueRegister const):
2264         (JSC::ControlFlowScope::ControlFlowScope):
2265         (JSC::BytecodeGenerator::emitLoad):
2266         (JSC::BytecodeGenerator::CompletionRecordScope::CompletionRecordScope): Deleted.
2267         (JSC::BytecodeGenerator::CompletionRecordScope::~CompletionRecordScope): Deleted.
2268         (JSC::BytecodeGenerator::completionTypeRegister const): Deleted.
2269         (JSC::BytecodeGenerator::completionValueRegister const): Deleted.
2270         (JSC::BytecodeGenerator::emitSetCompletionType): Deleted.
2271         (JSC::BytecodeGenerator::emitSetCompletionValue): Deleted.
2272         * bytecompiler/NodesCodegen.cpp:
2273         (JSC::TryNode::emitBytecode):
2274
2275 2019-03-06  Saam Barati  <sbarati@apple.com>
2276
2277         JSScript should keep the cache file locked for the duration of its existence and should truncate the cache when it is out of date
2278         https://bugs.webkit.org/show_bug.cgi?id=195186
2279
2280         Reviewed by Keith Miller.
2281
2282         This patch makes it so that JSScript will keep its bytecode cache file
2283         locked as long as the JSScript is alive. This makes it obvious that it's
2284         safe to update that file, as it will only be used in a single VM, across
2285         all processes, at a single time. We may be able to extend this in the future
2286         if we can atomically update it across VMs/processes. However, we're choosing
2287         more restricted semantics now as it's always easier to extend these semantics
2288         in the future opposed to having to support the more flexible behavior
2289         up front.
2290         
2291         This patch also:
2292         - Adds error messages if writing the cache fails. We don't expect this to
2293           fail, but previously we would say we cached it even if write() fails.
2294         - Removes the unused m_moduleKey field.
2295         - Makes calling cacheBytecodeWithError with an already non-empty cache file fail.
2296           In the future, we should extend this to just fill in the parts of the cache
2297           that are not present. But we don't have the ability to do that yet, so we
2298           just result in an error for now.
2299
2300         * API/JSScript.mm:
2301         (-[JSScript dealloc]):
2302         (-[JSScript readCache]):
2303         (-[JSScript init]):
2304         (-[JSScript writeCache:]):
2305         * API/JSScriptInternal.h:
2306         * API/tests/testapi.mm:
2307         (testCacheFileIsExclusive):
2308         (testCacheFileFailsWhenItsAlreadyCached):
2309         (testObjectiveCAPI):
2310
2311 2019-03-06  Christopher Reid  <chris.reid@sony.com>
2312
2313         Followups to (r242306): Use LockHolder instead of std::lock_guard on Remote Inspector Locks
2314         https://bugs.webkit.org/show_bug.cgi?id=195381
2315
2316         Reviewed by Mark Lam.
2317
2318         Replacing std::lock_guard uses in Remote Inspector with WTF::LockHolder.
2319         Also using `= { }` for struct initialization instead of memeset.
2320
2321         * inspector/remote/RemoteConnectionToTarget.cpp:
2322         * inspector/remote/RemoteInspector.cpp:
2323         * inspector/remote/cocoa/RemoteConnectionToTargetCocoa.mm:
2324         * inspector/remote/cocoa/RemoteInspectorCocoa.mm:
2325         * inspector/remote/cocoa/RemoteInspectorXPCConnection.mm:
2326         * inspector/remote/glib/RemoteInspectorGlib.cpp:
2327         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp:
2328         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp:
2329         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp:
2330         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp:
2331
2332 2019-03-06  Saam Barati  <sbarati@apple.com>
2333
2334         Air::reportUsedRegisters must padInterference
2335         https://bugs.webkit.org/show_bug.cgi?id=195303
2336         <rdar://problem/48270343>
2337
2338         Reviewed by Keith Miller.
2339
2340         reportUsedRegisters uses reg liveness to eliminate loads/moves into dead
2341         registers. However, liveness can report incorrect results in certain 
2342         scenarios when considering liveness at instruction boundaries. For example,
2343         it can go wrong when an Inst has a LateUse of a register and the following
2344         Inst has an EarlyDef of that same register. Such a scenario could lead us
2345         to incorrectly say the register is not live-in to the first Inst. Pad
2346         interference inserts Nops between such instruction boundaries that cause
2347         this issue.
2348         
2349         The test with this patch fixes the issue in reportUsedRegisters. This patch
2350         also conservatively makes it so that lowerAfterRegAlloc calls padInterference
2351         since it also reasons about liveness.
2352
2353         * b3/air/AirLowerAfterRegAlloc.cpp:
2354         (JSC::B3::Air::lowerAfterRegAlloc):
2355         * b3/air/AirPadInterference.h:
2356         * b3/air/AirReportUsedRegisters.cpp:
2357         (JSC::B3::Air::reportUsedRegisters):
2358         * b3/testb3.cpp:
2359         (JSC::B3::testReportUsedRegistersLateUseNotDead):
2360         (JSC::B3::run):
2361
2362 2019-03-06  Yusuke Suzuki  <ysuzuki@apple.com>
2363
2364         [JSC] AI should not propagate AbstractValue relying on constant folding phase
2365         https://bugs.webkit.org/show_bug.cgi?id=195375
2366
2367         Reviewed by Saam Barati.
2368
2369         MakeRope rule in AI attempts to propagate the node, which will be produced after constant folding phase runs.
2370         This is wrong since we do not guarantee that constant folding phase runs after AI runs (e.g. DFGSpeculativeJIT
2371         and FTLLowerDFGToB3 run AI). This results in the bug that the value produced at runtime is different from the
2372         proven constant value in AI. In the attached test, AI says the value is SpecStringIdent while the resulted value
2373         at runtime is SpecStringVar, resulting in wrong MakeRope code. This patch removes the path propagating the node
2374         relying on constant folding phase.
2375
2376         * dfg/DFGAbstractInterpreterInlines.h:
2377         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
2378
2379 2019-03-05  Saam barati  <sbarati@apple.com>
2380
2381         op_switch_char broken for rope strings after JSRopeString layout rewrite
2382         https://bugs.webkit.org/show_bug.cgi?id=195339
2383         <rdar://problem/48592545>
2384
2385         Reviewed by Yusuke Suzuki.
2386
2387         When we did the JSString rewrite, we accidentally broke LLInt's switch_char
2388         for rope strings. That change made it so that we always go to the slow path
2389         for ropes. That's wrong. The slow path should only be taken when the rope
2390         is of length 1. For lengths other than 1, we need to fall through to the
2391         default case. This patch fixes this.
2392
2393         * llint/LowLevelInterpreter32_64.asm:
2394         * llint/LowLevelInterpreter64.asm:
2395         * runtime/JSString.h:
2396
2397 2019-03-05  Yusuke Suzuki  <ysuzuki@apple.com>
2398
2399         [JSC] Should check exception for JSString::toExistingAtomicString
2400         https://bugs.webkit.org/show_bug.cgi?id=195337
2401
2402         Reviewed by Keith Miller, Saam Barati, and Mark Lam.
2403
2404         We missed the exception check for JSString::toExistingAtomicString while it can resolve
2405         a rope and throw an OOM exception. This patch adds necessary exception checks. This patch
2406         fixes test failures in debug build, reported in https://bugs.webkit.org/show_bug.cgi?id=194375#c93.
2407
2408         * dfg/DFGOperations.cpp:
2409         * jit/JITOperations.cpp:
2410         (JSC::getByVal):
2411         * llint/LLIntSlowPaths.cpp:
2412         (JSC::LLInt::getByVal):
2413         * runtime/CommonSlowPaths.cpp:
2414         (JSC::SLOW_PATH_DECL):
2415
2416 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
2417
2418         Unreviewed, build fix for debug builds after r242397
2419
2420         * runtime/JSString.h:
2421
2422 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
2423
2424         [JSC] Store bits for JSRopeString in 3 stores
2425         https://bugs.webkit.org/show_bug.cgi?id=195234
2426
2427         Reviewed by Saam Barati.
2428
2429         This patch cleans up the initialization of JSRopeString fields in DFG and FTL.
2430         Previously, we store some part of data separately. Instead, this patch calculates
2431         the data first by bit operations and store calculated data with fewer stores.
2432
2433         This patch also cleans up is8Bit and isSubstring flags. We put them in lower bits
2434         of the first fiber instead of the upper 16 bits. Since we only have 3 bit flags, (isRope, is8Bit, isSubstring),
2435         we can put them into the lower 3 bits, they are always empty due to alignment.
2436
2437         * bytecode/AccessCase.cpp:
2438         (JSC::AccessCase::generateImpl): A bit clean up of StringLength IC to give a chance of unnecessary mov removal.
2439         * dfg/DFGSpeculativeJIT.cpp:
2440         (JSC::DFG::SpeculativeJIT::canBeRope):
2441         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
2442         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2443         * dfg/DFGSpeculativeJIT.h:
2444         * ftl/FTLAbstractHeapRepository.cpp:
2445         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
2446         * ftl/FTLAbstractHeapRepository.h:
2447         * ftl/FTLLowerDFGToB3.cpp:
2448         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
2449         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
2450         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
2451         * runtime/JSString.cpp:
2452         (JSC::JSString::visitChildren):
2453         * runtime/JSString.h:
2454         (JSC::JSString::is8Bit const):
2455         (JSC::JSString::isSubstring const):
2456         * tools/JSDollarVM.cpp:
2457         (JSC::functionCreateNullRopeString):
2458         (JSC::JSDollarVM::finishCreation):
2459
2460 2019-03-04  Joseph Pecoraro  <pecoraro@apple.com>
2461
2462         ITMLKit Inspector: Data Bindings / Associated Data for nodes
2463         https://bugs.webkit.org/show_bug.cgi?id=195290
2464         <rdar://problem/48304019>
2465
2466         Reviewed by Devin Rousso.
2467
2468         * inspector/protocol/DOM.json:
2469
2470 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
2471
2472         [JSC] Make Reflect lazily-allocated by dropping @Reflect references from builtin JS
2473         https://bugs.webkit.org/show_bug.cgi?id=195250
2474
2475         Reviewed by Saam Barati.
2476
2477         By removing @Reflect from builtin JS, we can make Reflect object allocation lazy.
2478         We move @ownKeys function from @Reflect to @Object to remove @Reflect reference.
2479
2480         We also remove m_intlObject field from JSGlobalObject since we no longer use it.
2481
2482         * builtins/BuiltinNames.h:
2483         * builtins/GlobalOperations.js:
2484         (globalPrivate.copyDataProperties):
2485         (globalPrivate.copyDataPropertiesNoExclusions):
2486         * runtime/JSGlobalObject.cpp:
2487         (JSC::createReflectProperty):
2488         (JSC::JSGlobalObject::init):
2489         (JSC::JSGlobalObject::visitChildren):
2490         * runtime/JSGlobalObject.h:
2491         * runtime/ObjectConstructor.cpp:
2492         (JSC::ObjectConstructor::finishCreation):
2493         (JSC::objectConstructorOwnKeys):
2494         * runtime/ReflectObject.cpp:
2495         (JSC::ReflectObject::finishCreation):
2496
2497 2019-03-04  Yusuke Suzuki  <ysuzuki@apple.com>
2498
2499         [JSC] Offer @makeTypeError instead of exposing @TypeError
2500         https://bugs.webkit.org/show_bug.cgi?id=193858
2501
2502         Reviewed by Mark Lam.
2503
2504         Instead of exposing @TypeError, we expose @makeTypeError function.
2505         And we make TypeError and Error lazily-allocated objects in non JIT environment.
2506         In JIT environment, only TypeError becomes lazily-allocated since WebAssembly errors
2507         touch Error prototype anyway. But we can make them lazy in a subsequent patch.
2508
2509         * builtins/AsyncFromSyncIteratorPrototype.js:
2510         * builtins/AsyncGeneratorPrototype.js:
2511         (globalPrivate.asyncGeneratorEnqueue):
2512         * builtins/BuiltinNames.h:
2513         * builtins/PromiseOperations.js:
2514         (globalPrivate.createResolvingFunctions.resolve):
2515         * runtime/JSGlobalObject.cpp:
2516         (JSC::JSGlobalObject::initializeErrorConstructor):
2517         (JSC::JSGlobalObject::init):
2518         (JSC::JSGlobalObject::visitChildren):
2519         * runtime/JSGlobalObject.h:
2520         (JSC::JSGlobalObject::errorPrototype const):
2521         (JSC::JSGlobalObject::errorStructure const):
2522         * runtime/JSGlobalObjectFunctions.cpp:
2523         (JSC::globalFuncMakeTypeError):
2524         * runtime/JSGlobalObjectFunctions.h:
2525
2526 2019-03-04  Carlos Garcia Campos  <cgarcia@igalia.com>
2527
2528         [GLib] Returning G_TYPE_OBJECT from a constructor does not work
2529         https://bugs.webkit.org/show_bug.cgi?id=195206
2530
2531         Reviewed by Žan Doberšek.
2532
2533         We are freeing the newly created object before returning from the constructor.
2534
2535         * API/glib/JSCCallbackFunction.cpp:
2536         (JSC::JSCCallbackFunction::construct):
2537
2538 2019-03-02  Darin Adler  <darin@apple.com>
2539
2540         Retire legacy dtoa function and DecimalNumber class
2541         https://bugs.webkit.org/show_bug.cgi?id=195253
2542
2543         Reviewed by Daniel Bates.
2544
2545         * runtime/NumberPrototype.cpp:
2546         (JSC::numberProtoFuncToExponential): Removed dependency on NumberToStringBufferLength,
2547         using NumberToStringBuffer instead. Also tweaked style of implementation a bit.
2548
2549 2019-03-01  Darin Adler  <darin@apple.com>
2550
2551         Finish removing String::format
2552         https://bugs.webkit.org/show_bug.cgi?id=194893
2553
2554         Reviewed by Daniel Bates.
2555
2556         * bytecode/CodeBlock.cpp:
2557         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
2558         using the new "pad" function.
2559
2560 2019-03-01  Christopher Reid  <chris.reid@sony.com>
2561
2562         [PlayStation] Upstream playstation's remote inspector server
2563         https://bugs.webkit.org/show_bug.cgi?id=193806
2564
2565         Reviewed by Joseph Pecoraro.
2566
2567         Upstreaming PlayStation's Remote Inspector implementation.
2568         It is using a JSON RPC protocol over TCP sockets.
2569         This inspector implementation is planned to also support running on a WinCairo Client and Server.
2570
2571         * PlatformPlayStation.cmake:
2572         * SourcesGTK.txt:
2573         * SourcesWPE.txt:
2574         * inspector/remote/RemoteConnectionToTarget.cpp: Renamed from Source/JavaScriptCore/inspector/remote/glib/RemoteConnectionToTargetGlib.cpp.
2575         * inspector/remote/RemoteInspector.h:
2576         * inspector/remote/playstation/RemoteInspectorConnectionClient.h: Added.
2577         * inspector/remote/playstation/RemoteInspectorConnectionClientPlayStation.cpp: Added.
2578         * inspector/remote/playstation/RemoteInspectorMessageParser.h: Added.
2579         * inspector/remote/playstation/RemoteInspectorMessageParserPlayStation.cpp: Added.
2580         * inspector/remote/playstation/RemoteInspectorPlayStation.cpp: Added.
2581         * inspector/remote/playstation/RemoteInspectorServer.h: Added.
2582         * inspector/remote/playstation/RemoteInspectorServerPlayStation.cpp: Added.
2583         * inspector/remote/playstation/RemoteInspectorSocket.h: Added.
2584         * inspector/remote/playstation/RemoteInspectorSocketClient.h: Added.
2585         * inspector/remote/playstation/RemoteInspectorSocketClientPlayStation.cpp: Added.
2586         * inspector/remote/playstation/RemoteInspectorSocketPlayStation.cpp: Added.
2587         * inspector/remote/playstation/RemoteInspectorSocketServer.h: Added.
2588         * inspector/remote/playstation/RemoteInspectorSocketServerPlayStation.cpp: Added.
2589
2590 2019-03-01  Saam Barati  <sbarati@apple.com>
2591
2592         Create SPI to crash if a JSC VM is created
2593         https://bugs.webkit.org/show_bug.cgi?id=195231
2594         <rdar://problem/47717990>
2595
2596         Reviewed by Mark Lam.
2597
2598         * API/JSVirtualMachine.mm:
2599         (+[JSVirtualMachine setCrashOnVMCreation:]):
2600         * API/JSVirtualMachinePrivate.h:
2601         * runtime/VM.cpp:
2602         (JSC::VM::VM):
2603         (JSC::VM::setCrashOnVMCreation):
2604         * runtime/VM.h:
2605
2606 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
2607
2608         [JSC] Fix FTL build on ARM32_64 by adding stubs for JSRopeString::offsetOfXXX
2609         https://bugs.webkit.org/show_bug.cgi?id=195235
2610
2611         Reviewed by Saam Barati.
2612
2613         This is a workaround until https://bugs.webkit.org/show_bug.cgi?id=195234 is done.
2614
2615         * runtime/JSString.h:
2616
2617 2019-03-01  Yusuke Suzuki  <ysuzuki@apple.com>
2618
2619         [JSC] Use runtime calls for DFG MakeRope if !CPU(ADDRESS64)
2620         https://bugs.webkit.org/show_bug.cgi?id=195221
2621
2622         Reviewed by Mark Lam.
2623
2624         ARM32_64 builds DFG 64bit, but the size of address is 32bit. Make DFG MakeRope a runtime call not only for DFG 32_64,
2625         but also DFG 64 with !CPU(ADDRESS64). This patch unifies compileMakeRope again, and use a runtime call for !CPU(ADDRESS64).
2626
2627         * dfg/DFGSpeculativeJIT.cpp:
2628         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2629         * dfg/DFGSpeculativeJIT32_64.cpp:
2630         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
2631         * dfg/DFGSpeculativeJIT64.cpp:
2632         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
2633
2634 2019-03-01  Justin Fan  <justin_fan@apple.com>
2635
2636         [Web GPU] 32-bit builds broken by attempt to disable WebGPU on 32-bit
2637         https://bugs.webkit.org/show_bug.cgi?id=195191
2638
2639         Rubber-stamped by Dean Jackson.
2640
2641         Dropping support for 32-bit entirely, so I'm intentionally leaving 32-bit broken.
2642
2643         * Configurations/FeatureDefines.xcconfig:
2644
2645 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
2646
2647         Fix debug builds with GCC
2648         https://bugs.webkit.org/show_bug.cgi?id=195205
2649
2650         Unreviewed. Fix debug builds in GCC by removing
2651         the constexpr-keyword for this function.
2652
2653         * runtime/CachedTypes.cpp:
2654         (JSC::tagFromSourceCodeType):
2655
2656 2019-03-01  Dominik Infuehr  <dinfuehr@igalia.com>
2657
2658         [ARM] Fix assembler warnings in ctiMasmProbeTrampoline
2659         https://bugs.webkit.org/show_bug.cgi?id=195164
2660
2661         Reviewed by Mark Lam.
2662
2663         Short branches in IT blocks are deprecated in AArch32. In addition the
2664         the conditional branch was the only instruction in the IT block. Short
2665         branches are able to encode the condition code themselves, the additional
2666         IT instruction is not needed.
2667
2668         The assembler was also warning that writing into APSR without a bitmask
2669         was deprecated. Therefore use APSR_nzcvq instead, this generates the same
2670         instruction encoding.
2671
2672         * assembler/MacroAssemblerARMv7.cpp:
2673
2674 2019-02-28  Tadeu Zagallo  <tzagallo@apple.com>
2675
2676         Remove CachedPtr::m_isEmpty and CachedOptional::m_isEmpty fields
2677         https://bugs.webkit.org/show_bug.cgi?id=194999
2678
2679         Reviewed by Saam Barati.
2680
2681         These fields are unnecessary, since we can just check that m_offset
2682         has not been initialized (I added VariableLengthObject::isEmpty for
2683         that). They also add 7-byte padding to these classes, which is pretty
2684         bad given how frequently CachedPtr is used.
2685
2686         * runtime/CachedTypes.cpp:
2687         (JSC::CachedObject::operator new[]):
2688         (JSC::VariableLengthObject::allocate):
2689         (JSC::VariableLengthObject::isEmpty const):
2690         (JSC::CachedPtr::encode):
2691         (JSC::CachedPtr::decode const):
2692         (JSC::CachedPtr::get const):
2693         (JSC::CachedOptional::encode):
2694         (JSC::CachedOptional::decode const):
2695         (JSC::CachedOptional::decodeAsPtr const):
2696
2697 2019-02-28  Yusuke Suzuki  <ysuzuki@apple.com>
2698
2699         [JSC] sizeof(JSString) should be 16
2700         https://bugs.webkit.org/show_bug.cgi?id=194375
2701
2702         Reviewed by Saam Barati.
2703
2704         This patch reduces sizeof(JSString) from 24 to 16 to fit it into GC heap cell atom. And it also reduces sizeof(JSRopeString) from 48 to 32.
2705         Both classes cut 16 bytes per instance in GC allocation. This new layout is used in 64bit architectures which has little endianess.
2706
2707         JSString no longer has length and flags directly. JSString has String, and we query information to this String instead of holding duplicate
2708         information in JSString. We embed isRope bit into this String's pointer so that we can convert JSRopeString to JSString in an atomic manner.
2709         We emit store-store fence before we put String pointer. This should exist even before this patch, so this patch also fixes one concurrency issue.
2710
2711         The old JSRopeString separately had JSString* fibers along with String. In this patch, we merge the first JSString* fiber and String pointer
2712         storage into one to reduce the size of JSRopeString. JSRopeString has three pointer width storage. We pick 48bit effective address of JSString*
2713         fibers to compress three fibers + length + flags into three pointer width storage.
2714
2715         In 64bit architecture, JSString and JSRopeString have the following memory layout to make sizeof(JSString) == 16 and sizeof(JSRopeString) == 32.
2716         JSString has only one pointer. We use it for String. length() and is8Bit() queries go to StringImpl. In JSRopeString, we reuse the above pointer
2717         place for the 1st fiber. JSRopeString has three fibers so its size is 48. To keep length and is8Bit flag information in JSRopeString, JSRopeString
2718         encodes these information into the fiber pointers. is8Bit flag is encoded in the 1st fiber pointer. length is embedded directly, and two fibers
2719         are compressed into 12bytes. isRope information is encoded in the first fiber's LSB.
2720
2721         Since length of JSRopeString should be frequently accessed compared to each fiber, we put length in contiguous 32byte field, and compress 2nd
2722         and 3rd fibers into the following 80byte fields. One problem is that now 2nd and 3rd fibers are split. Storing and loading 2nd and 3rd fibers
2723         are not one pointer load operation. To make concurrent collector work correctly, we must initialize 2nd and 3rd fibers at JSRopeString creation
2724         and we must not modify these part later.
2725
2726                      0                        8        10               16                       32                                     48
2727         JSString     [   ID      ][  header  ][   String pointer      0]
2728         JSRopeString [   ID      ][  header  ][ flags ][ 1st fiber    1][  length  ][2nd lower32][2nd upper16][3rd lower16][3rd upper32]
2729                                                                       ^
2730                                                                    isRope bit
2731
2732         Since fibers in JSRopeString are not initialized in atomic pointer store manner, we must initialize all the fiber fields at JSRopeString creation.
2733         To achieve this, we modify our JSRopeString::RopeBuilder implementation not to create half-baked JSRopeString.
2734
2735         This patch also makes an empty JSString singleton per VM. This makes evaluation of JSString in boolean context one pointer comparison. This is
2736         critical in this change since this patch enlarges the code necessary to get length from JSString in JIT. Without this guarantee, our code of boolean
2737         context evaluation is bloated. This patch hides all the JSString::create and JSRopeString::create in the private permission. JSString and JSRopeString
2738         creation is only allowed from jsString and related helper functions and they return a singleton empty JSString if the length is zero. We also change
2739         JSRopeString::RopeBuilder not to construct an empty JSRopeString.
2740
2741         This patch is performance neutral in Speedometer2 and JetStream2. And it improves RAMification by 2.7%.
2742
2743         * JavaScriptCore.xcodeproj/project.pbxproj:
2744         * assembler/MacroAssemblerARM64.h:
2745         (JSC::MacroAssemblerARM64::storeZero16):
2746         * assembler/MacroAssemblerX86Common.h:
2747         (JSC::MacroAssemblerX86Common::storeZero16):
2748         (JSC::MacroAssemblerX86Common::store16):
2749         * bytecode/AccessCase.cpp:
2750         (JSC::AccessCase::generateImpl):
2751         * bytecode/InlineAccess.cpp:
2752         (JSC::InlineAccess::dumpCacheSizesAndCrash):
2753         (JSC::linkCodeInline):
2754         (JSC::InlineAccess::isCacheableStringLength):
2755         (JSC::InlineAccess::generateStringLength):
2756         * bytecode/InlineAccess.h:
2757         (JSC::InlineAccess::sizeForPropertyAccess):
2758         (JSC::InlineAccess::sizeForPropertyReplace):
2759         (JSC::InlineAccess::sizeForLengthAccess):
2760         * dfg/DFGOperations.cpp:
2761         * dfg/DFGOperations.h:
2762         * dfg/DFGSpeculativeJIT.cpp:
2763         (JSC::DFG::SpeculativeJIT::compileStringSlice):
2764         (JSC::DFG::SpeculativeJIT::compileToLowerCase):
2765         (JSC::DFG::SpeculativeJIT::compileGetCharCodeAt):
2766         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
2767         (JSC::DFG::SpeculativeJIT::compileStringEquality):
2768         (JSC::DFG::SpeculativeJIT::compileStringZeroLength):
2769         (JSC::DFG::SpeculativeJIT::compileLogicalNotStringOrOther):
2770         (JSC::DFG::SpeculativeJIT::emitStringBranch):
2771         (JSC::DFG::SpeculativeJIT::emitStringOrOtherBranch):
2772         (JSC::DFG::SpeculativeJIT::compileGetIndexedPropertyStorage):
2773         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
2774         (JSC::DFG::SpeculativeJIT::emitPopulateSliceIndex):
2775         (JSC::DFG::SpeculativeJIT::compileArraySlice):
2776         (JSC::DFG::SpeculativeJIT::compileArrayIndexOf):
2777         (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage):
2778         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
2779         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
2780         (JSC::DFG::SpeculativeJIT::compileMakeRope): Deleted.
2781         * dfg/DFGSpeculativeJIT.h:
2782         * dfg/DFGSpeculativeJIT32_64.cpp:
2783         (JSC::DFG::SpeculativeJIT::compile):
2784         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2785         * dfg/DFGSpeculativeJIT64.cpp:
2786         (JSC::DFG::SpeculativeJIT::compile):
2787         (JSC::DFG::SpeculativeJIT::compileMakeRope):
2788         * ftl/FTLAbstractHeapRepository.cpp:
2789         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
2790         * ftl/FTLAbstractHeapRepository.h:
2791         * ftl/FTLLowerDFGToB3.cpp:
2792         (JSC::FTL::DFG::LowerDFGToB3::compileGetIndexedPropertyStorage):
2793         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
2794         (JSC::FTL::DFG::LowerDFGToB3::compileMakeRope):
2795         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharAt):
2796         (JSC::FTL::DFG::LowerDFGToB3::compileStringCharCodeAt):
2797         (JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):
2798         (JSC::FTL::DFG::LowerDFGToB3::compileStringToUntypedStrictEquality):
2799         (JSC::FTL::DFG::LowerDFGToB3::compileSwitch):
2800         (JSC::FTL::DFG::LowerDFGToB3::mapHashString):
2801         (JSC::FTL::DFG::LowerDFGToB3::compileMapHash):
2802         (JSC::FTL::DFG::LowerDFGToB3::compileHasOwnProperty):
2803         (JSC::FTL::DFG::LowerDFGToB3::compileStringSlice):
2804         (JSC::FTL::DFG::LowerDFGToB3::compileToLowerCase):
2805         (JSC::FTL::DFG::LowerDFGToB3::stringsEqual):
2806         (JSC::FTL::DFG::LowerDFGToB3::boolify):
2807         (JSC::FTL::DFG::LowerDFGToB3::switchString):
2808         (JSC::FTL::DFG::LowerDFGToB3::isRopeString):
2809         (JSC::FTL::DFG::LowerDFGToB3::isNotRopeString):
2810         (JSC::FTL::DFG::LowerDFGToB3::speculateStringIdent):
2811         * jit/AssemblyHelpers.cpp:
2812         (JSC::AssemblyHelpers::emitConvertValueToBoolean):
2813         (JSC::AssemblyHelpers::branchIfValue):
2814         * jit/AssemblyHelpers.h:
2815         (JSC::AssemblyHelpers::branchIfRopeStringImpl):
2816         (JSC::AssemblyHelpers::branchIfNotRopeStringImpl):
2817         * jit/JITInlines.h:
2818         (JSC::JIT::emitLoadCharacterString):
2819         * jit/Repatch.cpp:
2820         (JSC::tryCacheGetByID):
2821         * jit/ThunkGenerators.cpp:
2822         (JSC::stringGetByValGenerator):
2823         (JSC::stringCharLoad):
2824         * llint/LowLevelInterpreter.asm:
2825         * llint/LowLevelInterpreter32_64.asm:
2826         * llint/LowLevelInterpreter64.asm:
2827         * runtime/JSString.cpp:
2828         (JSC::JSString::createEmptyString):
2829         (JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
2830         (JSC::JSString::dumpToStream):
2831         (JSC::JSString::estimatedSize):
2832         (JSC::JSString::visitChildren):
2833         (JSC::JSRopeString::resolveRopeInternal8 const):
2834         (JSC::JSRopeString::resolveRopeInternal8NoSubstring const):
2835         (JSC::JSRopeString::resolveRopeInternal16 const):
2836         (JSC::JSRopeString::resolveRopeInternal16NoSubstring const):
2837         (JSC::JSRopeString::resolveRopeToAtomicString const):
2838         (JSC::JSRopeString::convertToNonRope const):
2839         (JSC::JSRopeString::resolveRopeToExistingAtomicString const):
2840         (JSC::JSRopeString::resolveRopeWithFunction const):
2841         (JSC::JSRopeString::resolveRope const):
2842         (JSC::JSRopeString::resolveRopeSlowCase8 const):
2843         (JSC::JSRopeString::resolveRopeSlowCase const):
2844         (JSC::JSRopeString::outOfMemory const):
2845         (JSC::JSRopeString::visitFibers): Deleted.
2846         (JSC::JSRopeString::clearFibers const): Deleted.
2847         * runtime/JSString.h:
2848         (JSC::JSString::uninitializedValueInternal const):
2849         (JSC::JSString::valueInternal const):
2850         (JSC::JSString::JSString):
2851         (JSC::JSString::finishCreation):
2852         (JSC::JSString::create):
2853         (JSC::JSString::offsetOfValue):
2854         (JSC::JSString::isRope const):
2855         (JSC::JSString::is8Bit const):
2856         (JSC::JSString::length const):
2857         (JSC::JSString::tryGetValueImpl const):
2858         (JSC::JSString::toAtomicString const):
2859         (JSC::JSString::toExistingAtomicString const):
2860         (JSC::JSString::value const):
2861         (JSC::JSString::tryGetValue const):
2862         (JSC::JSRopeString::unsafeView const):
2863         (JSC::JSRopeString::viewWithUnderlyingString const):
2864         (JSC::JSString::unsafeView const):
2865         (JSC::JSString::viewWithUnderlyingString const):
2866         (JSC::JSString::offsetOfLength): Deleted.
2867         (JSC::JSString::offsetOfFlags): Deleted.
2868         (JSC::JSString::setIs8Bit const): Deleted.
2869         (JSC::JSString::setLength): Deleted.
2870         (JSC::JSString::string): Deleted.
2871         (JSC::jsStringBuilder): Deleted.
2872         * runtime/JSStringInlines.h:
2873         (JSC::JSString::~JSString):
2874         (JSC::JSString::equal const):
2875         * runtime/ObjectPrototype.cpp:
2876         (JSC::objectProtoFuncToString):
2877         * runtime/RegExpMatchesArray.h:
2878         (JSC::createRegExpMatchesArray):
2879         * runtime/RegExpObjectInlines.h:
2880         (JSC::collectMatches):
2881         * runtime/RegExpPrototype.cpp:
2882         (JSC::regExpProtoFuncSplitFast):
2883         * runtime/SmallStrings.cpp:
2884         (JSC::SmallStrings::initializeCommonStrings):
2885         (JSC::SmallStrings::createEmptyString): Deleted.
2886         * runtime/SmallStrings.h:
2887         * runtime/StringPrototype.cpp:
2888         (JSC::stringProtoFuncSlice):
2889         * runtime/StringPrototypeInlines.h: Added.
2890         (JSC::stringSlice):
2891
2892 2019-02-28  Saam barati  <sbarati@apple.com>
2893
2894         Unreviewed. Attempt windows build fix after r242239.
2895
2896         * runtime/CachedTypes.cpp:
2897         (JSC::tagFromSourceCodeType):
2898
2899 2019-02-28  Mark Lam  <mark.lam@apple.com>
2900
2901         In cloop.rb, rename :int and :uint to :intptr and :uintptr.
2902         https://bugs.webkit.org/show_bug.cgi?id=195183
2903
2904         Reviewed by Yusuke Suzuki.
2905
2906         Also changed intMemRef and uintMemRef to intptrMemRef and uintptrMemRef respectively.
2907
2908         * offlineasm/cloop.rb:
2909
2910 2019-02-28  Saam barati  <sbarati@apple.com>
2911
2912         Make JSScript:cacheBytecodeWithError update the cache when the script changes
2913         https://bugs.webkit.org/show_bug.cgi?id=194912
2914
2915         Reviewed by Mark Lam.
2916
2917         Prior to this patch, the JSScript SPI would never check if its cached
2918         bytecode were still valid. This would lead the cacheBytecodeWithError
2919         succeeding even if the underlying cache were stale. This patch fixes
2920         that by making JSScript check if the cache is still valid. If it's not,
2921         we will cache bytecode when cacheBytecodeWithError is invoked.
2922
2923         * API/JSScript.mm:
2924         (-[JSScript readCache]):
2925         (-[JSScript writeCache:]):
2926         * API/tests/testapi.mm:
2927         (testBytecodeCacheWithSameCacheFileAndDifferentScript):
2928         (testObjectiveCAPI):
2929         * runtime/CachedTypes.cpp:
2930         (JSC::Decoder::Decoder):
2931         (JSC::VariableLengthObject::buffer const):
2932         (JSC::CachedPtr::decode const):
2933         (JSC::tagFromSourceCodeType):
2934         (JSC::GenericCacheEntry::isUpToDate const):
2935         (JSC::CacheEntry::isStillValid const):
2936         (JSC::GenericCacheEntry::decode const):
2937         (JSC::GenericCacheEntry::isStillValid const):
2938         (JSC::encodeCodeBlock):
2939         (JSC::decodeCodeBlockImpl):
2940         (JSC::isCachedBytecodeStillValid):
2941         * runtime/CachedTypes.h:
2942         * runtime/CodeCache.cpp:
2943         (JSC::sourceCodeKeyForSerializedBytecode):
2944         (JSC::sourceCodeKeyForSerializedProgram):
2945         (JSC::sourceCodeKeyForSerializedModule):
2946         (JSC::serializeBytecode):
2947         * runtime/CodeCache.h:
2948         (JSC::CodeCacheMap::fetchFromDiskImpl):
2949         * runtime/Completion.cpp:
2950         (JSC::generateProgramBytecode):
2951         (JSC::generateBytecode): Deleted.
2952         * runtime/Completion.h:
2953
2954 2019-02-28  Mark Lam  <mark.lam@apple.com>
2955
2956         cloop.rb shift mask should depend on the word size being shifted.
2957         https://bugs.webkit.org/show_bug.cgi?id=195181
2958         <rdar://problem/48484164>
2959
2960         Reviewed by Yusuke Suzuki.
2961
2962         Previously, we're always masking the shift amount with 0x1f.  This is only correct
2963         for 32-bit words.  For 64-bit words, the mask should be 0x3f.  For pointer sized
2964         shifts, the mask depends on sizeof(uintptr_t).
2965
2966         * offlineasm/cloop.rb:
2967
2968 2019-02-28  Justin Fan  <justin_fan@apple.com>
2969
2970         [Web GPU] Enable Web GPU only on 64-bit
2971         https://bugs.webkit.org/show_bug.cgi?id=195139
2972
2973         Because Metal is only supported on 64 bit apps.
2974
2975         Unreviewed build fix.
2976
2977         * Configurations/FeatureDefines.xcconfig:
2978
2979 2019-02-27  Mark Lam  <mark.lam@apple.com>
2980
2981         The parser is failing to record the token location of new in new.target.
2982         https://bugs.webkit.org/show_bug.cgi?id=195127
2983         <rdar://problem/39645578>
2984
2985         Reviewed by Yusuke Suzuki.
2986
2987         Also adjust the token location for the following to be as shown:
2988
2989             new.target
2990             ^
2991             super
2992             ^
2993             import.meta
2994             ^
2995
2996         * parser/Parser.cpp:
2997         (JSC::Parser<LexerType>::parseMemberExpression):
2998
2999 2019-02-27  Yusuke Suzuki  <ysuzuki@apple.com>
3000
3001         [JSC] mustHandleValues for dead bytecode locals should be ignored in DFG phases
3002         https://bugs.webkit.org/show_bug.cgi?id=195144
3003         <rdar://problem/47595961>
3004
3005         Reviewed by Mark Lam.
3006
3007         DFGMaximalFlushInsertionPhase inserts Flush for all the locals at the end of basic blocks. This enlarges the live ranges of
3008         locals in DFG, and it sometimes makes DFG value live while it is dead in bytecode. The issue happens when we use mustHandleValues
3009         to widen AbstractValue in CFAPhase. At that time, DFG tells "this value is live in DFG", but it may be dead in the bytecode level.
3010         At that time, we attempt to merge AbstractValue with dead mustHandleValue, which is cleared as jsUndefined() in
3011         DFG::Plan::cleanMustHandleValuesIfNecessary before start compilation, and crash because jsUndefined() may be irrelevant to the FlushFormat
3012         in VariableAccessData.
3013
3014         This patch makes the type of mustHandleValues Operands<Optional<JSValue>>. We clear dead JSValues in DFG::Plan::cleanMustHandleValuesIfNecessary.
3015         And we skip handling dead mustHandleValue in DFG phases.
3016
3017         * bytecode/Operands.h:
3018         (JSC::Operands::isLocal const):
3019         (JSC::Operands::isVariable const): Deleted.
3020         * dfg/DFGCFAPhase.cpp:
3021         (JSC::DFG::CFAPhase::injectOSR):
3022         * dfg/DFGDriver.cpp:
3023         (JSC::DFG::compileImpl):
3024         (JSC::DFG::compile):
3025         * dfg/DFGDriver.h:
3026         * dfg/DFGJITCode.cpp:
3027         (JSC::DFG::JITCode::reconstruct):
3028         * dfg/DFGJITCode.h:
3029         * dfg/DFGOperations.cpp:
3030         * dfg/DFGPlan.cpp:
3031         (JSC::DFG::Plan::Plan):
3032         (JSC::DFG::Plan::checkLivenessAndVisitChildren):
3033         (JSC::DFG::Plan::cleanMustHandleValuesIfNecessary):
3034         * dfg/DFGPlan.h:
3035         (JSC::DFG::Plan::mustHandleValues const):
3036         * dfg/DFGPredictionInjectionPhase.cpp:
3037         (JSC::DFG::PredictionInjectionPhase::run):
3038         * dfg/DFGTypeCheckHoistingPhase.cpp:
3039         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
3040         * ftl/FTLOSREntry.cpp:
3041         (JSC::FTL::prepareOSREntry):
3042         * jit/JITOperations.cpp:
3043
3044 2019-02-27  Simon Fraser  <simon.fraser@apple.com>
3045
3046         Roll out r242014; it caused crashes in compositing logging (webkit.org/b/195141)
3047
3048         * bytecode/CodeBlock.cpp:
3049         (JSC::CodeBlock::nameForRegister):
3050
3051 2019-02-27  Robin Morisset  <rmorisset@apple.com>
3052
3053         DFG: Loop-invariant code motion (LICM) should not hoist dead code
3054         https://bugs.webkit.org/show_bug.cgi?id=194945
3055         <rdar://problem/48311657>
3056
3057         Reviewed by Saam Barati.
3058
3059         * dfg/DFGLICMPhase.cpp:
3060         (JSC::DFG::LICMPhase::run):
3061
3062 2019-02-27  Antoine Quint  <graouts@apple.com>
3063
3064         Support Pointer Events on macOS
3065         https://bugs.webkit.org/show_bug.cgi?id=195008
3066         <rdar://problem/47454419>
3067
3068         Reviewed by Dean Jackson.
3069
3070         * Configurations/FeatureDefines.xcconfig:
3071
3072 2019-02-26  Mark Lam  <mark.lam@apple.com>
3073
3074         Remove poisons in JSCPoison and uses of them.
3075         https://bugs.webkit.org/show_bug.cgi?id=195082
3076
3077         Reviewed by Yusuke Suzuki.
3078
3079         Also removed unused poisoning code in WriteBarrier, AssemblyHelpers,
3080         DFG::SpeculativeJIT, FTLLowerDFGToB3, and FTL::Output.
3081
3082         * API/JSAPIWrapperObject.h:
3083         (JSC::JSAPIWrapperObject::wrappedObject):
3084         * API/JSCallbackFunction.h:
3085         * API/JSCallbackObject.h:
3086         * API/glib/JSAPIWrapperGlobalObject.h:
3087         * CMakeLists.txt:
3088         * JavaScriptCore.xcodeproj/project.pbxproj:
3089         * Sources.txt:
3090         * bytecode/AccessCase.cpp:
3091         (JSC::AccessCase::generateWithGuard):
3092         * dfg/DFGSpeculativeJIT.cpp:
3093         (JSC::DFG::SpeculativeJIT::compileGetByValOnScopedArguments):
3094         (JSC::DFG::SpeculativeJIT::compileGetArrayLength):
3095         (JSC::DFG::SpeculativeJIT::compileNewFunctionCommon):
3096         (JSC::DFG::SpeculativeJIT::compileGetExecutable):
3097         (JSC::DFG::SpeculativeJIT::compileCreateThis):
3098         * dfg/DFGSpeculativeJIT.h:
3099         (JSC::DFG::SpeculativeJIT::TrustedImmPtr::weakPoisonedPointer): Deleted.
3100         * ftl/FTLLowerDFGToB3.cpp:
3101         (JSC::FTL::DFG::LowerDFGToB3::compileGetExecutable):
3102         (JSC::FTL::DFG::LowerDFGToB3::compileGetArrayLength):
3103         (JSC::FTL::DFG::LowerDFGToB3::compileGetByVal):
3104         (JSC::FTL::DFG::LowerDFGToB3::compileNewFunction):
3105         (JSC::FTL::DFG::LowerDFGToB3::weakPointer):
3106         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoison): Deleted.
3107         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnLoadedType): Deleted.
3108         (JSC::FTL::DFG::LowerDFGToB3::dynamicPoisonOnType): Deleted.
3109         (JSC::FTL::DFG::LowerDFGToB3::weakPoisonedPointer): Deleted.
3110         * ftl/FTLOutput.h:
3111         (JSC::FTL::Output::weakPoisonedPointer): Deleted.
3112         * jit/AssemblyHelpers.cpp:
3113         (JSC::AssemblyHelpers::emitDynamicPoison): Deleted.
3114         (JSC::AssemblyHelpers::emitDynamicPoisonOnLoadedType): Deleted.
3115         (JSC::AssemblyHelpers::emitDynamicPoisonOnType): Deleted.
3116         * jit/AssemblyHelpers.h:
3117         * jit/JITOpcodes.cpp:
3118         (JSC::JIT::emit_op_create_this):
3119         * jit/JITPropertyAccess.cpp:
3120         (JSC::JIT::emitScopedArgumentsGetByVal):
3121         * jit/Repatch.cpp:
3122         (JSC::linkPolymorphicCall):
3123         * jit/ThunkGenerators.cpp:
3124         (JSC::virtualThunkFor):
3125         (JSC::nativeForGenerator):
3126         (JSC::boundThisNoArgsFunctionCallGenerator):
3127         * parser/UnlinkedSourceCode.h:
3128         * runtime/ArrayPrototype.h:
3129         * runtime/CustomGetterSetter.h:
3130         (JSC::CustomGetterSetter::getter const):
3131         (JSC::CustomGetterSetter::setter const):
3132         * runtime/InitializeThreading.cpp:
3133         (JSC::initializeThreading):
3134         * runtime/InternalFunction.cpp:
3135         (JSC::InternalFunction::getCallData):
3136         (JSC::InternalFunction::getConstructData):
3137         * runtime/InternalFunction.h:
3138         (JSC::InternalFunction::nativeFunctionFor):
3139         * runtime/JSArrayBuffer.h:
3140         * runtime/JSBoundFunction.h:
3141         * runtime/JSCPoison.cpp: Removed.
3142         * runtime/JSCPoison.h: Removed.
3143         * runtime/JSFunction.h:
3144         * runtime/JSGlobalObject.h:
3145         * runtime/JSScriptFetchParameters.h:
3146         * runtime/JSScriptFetcher.h:
3147         * runtime/JSString.h:
3148         * runtime/NativeExecutable.cpp:
3149         (JSC::NativeExecutable::hashFor const):
3150         * runtime/NativeExecutable.h:
3151         * runtime/Options.h:
3152         * runtime/ScopedArguments.h:
3153         * runtime/Structure.cpp:
3154         (JSC::StructureTransitionTable::setSingleTransition):
3155         * runtime/StructureTransitionTable.h:
3156         (JSC::StructureTransitionTable::map const):
3157         (JSC::StructureTransitionTable::weakImpl const):
3158         (JSC::StructureTransitionTable::setMap):
3159         * runtime/WriteBarrier.h:
3160         * wasm/WasmB3IRGenerator.cpp:
3161         * wasm/WasmInstance.h:
3162         * wasm/js/JSToWasm.cpp:
3163         (JSC::Wasm::createJSToWasmWrapper):
3164         * wasm/js/JSWebAssemblyCodeBlock.h:
3165         * wasm/js/JSWebAssemblyInstance.cpp:
3166         (JSC::JSWebAssemblyInstance::JSWebAssemblyInstance):
3167         (JSC::JSWebAssemblyInstance::visitChildren):
3168         * wasm/js/JSWebAssemblyInstance.h:
3169         * wasm/js/JSWebAssemblyMemory.h:
3170         * wasm/js/JSWebAssemblyModule.h:
3171         * wasm/js/JSWebAssemblyTable.cpp:
3172         (JSC::JSWebAssemblyTable::JSWebAssemblyTable):
3173         (JSC::JSWebAssemblyTable::grow):
3174         (JSC::JSWebAssemblyTable::clearFunction):
3175         * wasm/js/JSWebAssemblyTable.h:
3176         * wasm/js/WasmToJS.cpp:
3177         (JSC::Wasm::materializeImportJSCell):
3178         (JSC::Wasm::handleBadI64Use):
3179         (JSC::Wasm::wasmToJS):
3180         * wasm/js/WebAssemblyFunctionBase.h:
3181         * wasm/js/WebAssemblyModuleRecord.cpp:
3182         (JSC::WebAssemblyModuleRecord::link):
3183         (JSC::WebAssemblyModuleRecord::evaluate):
3184         * wasm/js/WebAssemblyModuleRecord.h:
3185         * wasm/js/WebAssemblyToJSCallee.h:
3186         * wasm/js/WebAssemblyWrapperFunction.h:
3187
3188 2019-02-26  Mark Lam  <mark.lam@apple.com>
3189
3190         wasmToJS() should purify incoming NaNs.
3191         https://bugs.webkit.org/show_bug.cgi?id=194807
3192         <rdar://problem/48189132>
3193
3194         Reviewed by Saam Barati.
3195
3196         * runtime/JSCJSValue.h:
3197         (JSC::jsNumber):
3198         * runtime/TypedArrayAdaptors.h:
3199         (JSC::IntegralTypedArrayAdaptor::toJSValue):
3200         * wasm/js/WasmToJS.cpp:
3201         (JSC::Wasm::wasmToJS):
3202
3203 2019-02-26  Dominik Infuehr  <dinfuehr@igalia.com>
3204
3205         Fix warnings on ARM and MIPS
3206         https://bugs.webkit.org/show_bug.cgi?id=195049
3207
3208         Reviewed by Mark Lam.
3209
3210         Fix all warnings on ARM and MIPS.
3211
3212         * assembler/MacroAssemblerPrinter.cpp:
3213         (JSC::Printer::printMemory):
3214         * assembler/testmasm.cpp:
3215         (JSC::testProbeModifiesStackValues):
3216         * bytecode/InByIdStatus.cpp:
3217         (JSC::InByIdStatus::computeFor):
3218         * runtime/CachedTypes.cpp:
3219         (JSC::VariableLengthObject::buffer const):
3220         * runtime/JSBigInt.h:
3221         * tools/JSDollarVM.cpp:
3222         (JSC::codeBlockFromArg):
3223
3224 2019-02-26  Mark Lam  <mark.lam@apple.com>
3225
3226         Misc cleanup in StructureIDTable after r242096.
3227         https://bugs.webkit.org/show_bug.cgi?id=195063
3228
3229         Reviewed by Saam Barati.
3230
3231         * runtime/StructureIDTable.cpp:
3232         (JSC::StructureIDTable::allocateID):
3233         - RELEASE_ASSERT that the StructureID allocation will succeed.
3234
3235         * runtime/StructureIDTable.h:
3236         (JSC::StructureIDTable::decode):
3237         (JSC::StructureIDTable::encode):
3238         - Add back a comment that Yusuke requested but was lost when the patch was rolled
3239           out and relanded.
3240         - Applied bitwise_casts that Saam requested.
3241
3242 2019-02-26  Mark Lam  <mark.lam@apple.com>
3243
3244         Gardening: 32-bit build fix after r242096.
3245         https://bugs.webkit.org/show_bug.cgi?id=194989
3246
3247         Not reviewed.
3248
3249         * jit/AssemblyHelpers.cpp:
3250         (JSC::AssemblyHelpers::emitLoadStructure):
3251
3252 2019-02-26  Mark Lam  <mark.lam@apple.com>
3253
3254         Unpoison MacroAssemblerCodePtr, ClassInfo pointers, and a few other things.
3255         https://bugs.webkit.org/show_bug.cgi?id=195039
3256
3257         Reviewed by Saam Barati.
3258
3259         1. Unpoison MacroAssemblerCodePtrs, ReturnAddressPtr.
3260         2. Replace PoisonedClassInfoPtr with ClassInfo*.
3261         3. Replace PoisonedMasmPtr with const void*.
3262         4. Remove all references to CodeBlockPoison, JITCodePoison, and GlobalDataPoison.
3263
3264         * API/JSCallbackObject.h:
3265         * API/JSObjectRef.cpp:
3266         (classInfoPrivate):
3267         * assembler/MacroAssemblerCodeRef.h:
3268         (JSC::FunctionPtr::FunctionPtr):
3269         (JSC::FunctionPtr::executableAddress const):
3270         (JSC::FunctionPtr::retaggedExecutableAddress const):
3271         (JSC::ReturnAddressPtr::ReturnAddressPtr):
3272         (JSC::ReturnAddressPtr::value const):
3273         (JSC::MacroAssemblerCodePtr::MacroAssemblerCodePtr):
3274         (JSC::MacroAssemblerCodePtr::createFromExecutableAddress):
3275         (JSC::MacroAssemblerCodePtr:: const):
3276         (JSC::MacroAssemblerCodePtr::operator! const):
3277         (JSC::MacroAssemblerCodePtr::operator== const):
3278         (JSC::MacroAssemblerCodePtr::hash const):
3279         (JSC::MacroAssemblerCodePtr::emptyValue):
3280         (JSC::MacroAssemblerCodePtr::deletedValue):
3281         (JSC::FunctionPtr<tag>::FunctionPtr):
3282         (JSC::MacroAssemblerCodePtr::poisonedPtr const): Deleted.
3283         * b3/B3LowerMacros.cpp:
3284         * b3/testb3.cpp:
3285         (JSC::B3::testInterpreter):
3286         * dfg/DFGOSRExitCompilerCommon.h:
3287         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
3288         * dfg/DFGSpeculativeJIT.cpp:
3289         (JSC::DFG::SpeculativeJIT::compileCheckSubClass):
3290         (JSC::DFG::SpeculativeJIT::compileNewStringObject):
3291         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
3292         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
3293         (JSC::DFG::SpeculativeJIT::emitSwitchCharStringJump):
3294         (JSC::DFG::SpeculativeJIT::emitSwitchChar):
3295         * dfg/DFGSpeculativeJIT.h:
3296         * ftl/FTLLowerDFGToB3.cpp:
3297         (JSC::FTL::DFG::LowerDFGToB3::compileNewStringObject):
3298         (JSC::FTL::DFG::LowerDFGToB3::compileCheckSubClass):
3299         * jit/AssemblyHelpers.h:
3300         (JSC::AssemblyHelpers::emitAllocateDestructibleObject):
3301         * jit/ThunkGenerators.cpp:
3302         (JSC::virtualThunkFor):
3303         (JSC::boundThisNoArgsFunctionCallGenerator):
3304         * runtime/JSCPoison.h:
3305         * runtime/JSDestructibleObject.h:
3306         (JSC::JSDestructibleObject::classInfo const):
3307         * runtime/JSSegmentedVariableObject.h:
3308         (JSC::JSSegmentedVariableObject::classInfo const):
3309         * runtime/Structure.h:
3310         * runtime/VM.h:
3311         * wasm/WasmB3IRGenerator.cpp:
3312         (JSC::Wasm::B3IRGenerator::addCall):
3313         (JSC::Wasm::B3IRGenerator::addCallIndirect):
3314         * wasm/WasmBinding.cpp:
3315         (JSC::Wasm::wasmToWasm):
3316
3317 2019-02-26  Mark Lam  <mark.lam@apple.com>
3318
3319         [Re-landing] Add some randomness into the StructureID.
3320         https://bugs.webkit.org/show_bug.cgi?id=194989
3321         <rdar://problem/47975563>
3322
3323         Reviewed by Yusuke Suzuki.
3324
3325         1. On 64-bit, the StructureID will now be encoded as:
3326
3327             ----------------------------------------------------------------
3328             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
3329             ----------------------------------------------------------------
3330
3331            The entropy bits are chosen at random and assigned when a StructureID is
3332            allocated.
3333
3334         2. Instead of Structure pointers, the StructureIDTable will now contain
3335            encodedStructureBits, which is encoded as such:
3336
3337             ----------------------------------------------------------------
3338             | 7 entropy bits |                   57 structure pointer bits |
3339             ----------------------------------------------------------------
3340
3341            The entropy bits here are the same 7 bits used in the encoding of the
3342            StructureID for this structure entry in the StructureIDTable.
3343
3344         3. Retrieval of the structure pointer given a StructureID is now computed as
3345            follows:
3346
3347                 index = structureID >> 7; // with arithmetic shift.
3348                 encodedStructureBits = structureIDTable[index];
3349                 structure = encodedStructureBits ^ (structureID << 57);
3350
3351             We use an arithmetic shift for the right shift because that will preserve
3352             the nuke bit in the high bit of the index if the StructureID was not
3353             decontaminated before use as expected.
3354
3355         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
3356
3357         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
3358            instead of always being the same as m_capacity.
3359
3360         6. Change StructureIDTable::s_unusedID's value to 0.
3361
3362            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
3363            StructureID on 64-bit.  Also, there was never any code that initializes unused
3364            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
3365            is the ID we'll get when the freelist is empty, prompting a resize of the
3366            structureIDTable.
3367
3368         This patch appears to be perf neutral on JetStream 2 run via the cli on a
3369         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
3370
3371         * ftl/FTLLowerDFGToB3.cpp:
3372         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
3373         * heap/SlotVisitor.cpp:
3374         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
3375         * jit/AssemblyHelpers.cpp:
3376         (JSC::AssemblyHelpers::emitLoadStructure):
3377         * jit/AssemblyHelpers.h:
3378         * jit/SpecializedThunkJIT.h:
3379         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
3380         * llint/LowLevelInterpreter.asm:
3381         * llint/LowLevelInterpreter64.asm:
3382         * runtime/StructureIDTable.cpp:
3383         (JSC::StructureIDTable::StructureIDTable):
3384         (JSC::StructureIDTable::makeFreeListFromRange):
3385         (JSC::StructureIDTable::resize):
3386         (JSC::StructureIDTable::allocateID):
3387         (JSC::StructureIDTable::deallocateID):
3388         * runtime/StructureIDTable.h:
3389         (JSC::StructureIDTable::decode):
3390         (JSC::StructureIDTable::encode):
3391         (JSC::StructureIDTable::get):
3392         (JSC::StructureIDTable::isValid):
3393
3394 2019-02-26  Ryan Haddad  <ryanhaddad@apple.com>
3395
3396         Unreviewed, rolling out r242071.
3397
3398         Breaks internal builds.
3399
3400         Reverted changeset:
3401
3402         "Add some randomness into the StructureID."
3403         https://bugs.webkit.org/show_bug.cgi?id=194989
3404         https://trac.webkit.org/changeset/242071
3405
3406 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
3407
3408         [JSC] Fix compilation on 32-bit platforms after r242071
3409         https://bugs.webkit.org/show_bug.cgi?id=195042
3410
3411         Reviewed by Carlos Garcia Campos.
3412
3413         * jit/AssemblyHelpers.cpp:
3414         (JSC::AssemblyHelpers::emitLoadStructure):
3415
3416 2019-02-26  Guillaume Emont  <guijemont@igalia.com>
3417
3418         [JSC] Repeat string created from Array.prototype.join() take too much memory
3419         https://bugs.webkit.org/show_bug.cgi?id=193912
3420
3421         Reviewed by Saam Barati.
3422
3423         Added a fast case in Array.prototype.join when the array is
3424         uninitialized.
3425
3426         * runtime/ArrayPrototype.cpp:
3427         (JSC::canUseFastJoin):
3428         (JSC::fastJoin):
3429         * runtime/JSStringInlines.h:
3430         (JSC::repeatCharacter): moved from StringPrototype.cpp
3431         * runtime/StringPrototype.cpp:
3432
3433 2019-02-25  Mark Lam  <mark.lam@apple.com>
3434
3435         Add some randomness into the StructureID.
3436         https://bugs.webkit.org/show_bug.cgi?id=194989
3437         <rdar://problem/47975563>
3438
3439         Reviewed by Yusuke Suzuki.
3440
3441         1. On 64-bit, the StructureID will now be encoded as:
3442
3443             ----------------------------------------------------------------
3444             | 1 Nuke Bit | 24 StructureIDTable index bits | 7 entropy bits |
3445             ----------------------------------------------------------------
3446
3447            The entropy bits are chosen at random and assigned when a StructureID is
3448            allocated.
3449
3450         2. Instead of Structure pointers, the StructureIDTable will now contain
3451            encodedStructureBits, which is encoded as such:
3452
3453             ----------------------------------------------------------------
3454             | 7 entropy bits |                   57 structure pointer bits |
3455             ----------------------------------------------------------------
3456
3457            The entropy bits here are the same 7 bits used in the encoding of the
3458            StructureID for this structure entry in the StructureIDTable.
3459
3460         3. Retrieval of the structure pointer given a StructureID is now computed as
3461            follows:
3462
3463                 index = structureID >> 7; // with arithmetic shift.
3464                 encodedStructureBits = structureIDTable[index];
3465                 structure = encodedStructureBits ^ (structureID << 57);
3466
3467             We use an arithmetic shift for the right shift because that will preserve
3468             the nuke bit in the high bit of the index if the StructureID was not
3469             decontaminated before use as expected.
3470
3471         4. Remove unused function loadArgumentWithSpecificClass() in SpecializedThunkJIT.
3472
3473         5. Define StructureIDTable::m_size to be the number of allocated StructureIDs
3474            instead of always being the same as m_capacity.
3475
3476         6. Change StructureIDTable::s_unusedID's value to 0.
3477
3478            Its previous value of unusedPointer i.e. 0xd1e7beef, does not make sense for
3479            StructureID on 64-bit.  Also, there was never any code that initializes unused
3480            IDs to the s_unusedID.  The only meaningful value for s_unusedID is 0, which
3481            is the ID we'll get when the freelist is empty, prompting a resize of the
3482            structureIDTable.
3483
3484         This patch appears to be perf neutral on JetStream 2 run via the cli on a
3485         11" MacBook Air, 13" MacBook Pro, iPhone 6S, and iPhone XR.
3486
3487         * ftl/FTLLowerDFGToB3.cpp:
3488         (JSC::FTL::DFG::LowerDFGToB3::loadStructure):
3489         * heap/SlotVisitor.cpp:
3490         (JSC::SlotVisitor::appendJSCellOrAuxiliary):
3491         * jit/AssemblyHelpers.cpp:
3492         (JSC::AssemblyHelpers::emitLoadStructure):
3493         * jit/AssemblyHelpers.h:
3494         * jit/SpecializedThunkJIT.h:
3495         (JSC::SpecializedThunkJIT::loadArgumentWithSpecificClass): Deleted.
3496         * llint/LowLevelInterpreter.asm:
3497         * llint/LowLevelInterpreter64.asm:
3498         * runtime/StructureIDTable.cpp:
3499         (JSC::StructureIDTable::StructureIDTable):
3500         (JSC::StructureIDTable::makeFreeListFromRange):
3501         (JSC::StructureIDTable::resize):
3502         (JSC::StructureIDTable::allocateID):
3503         (JSC::StructureIDTable::deallocateID):
3504         * runtime/StructureIDTable.h:
3505         (JSC::StructureIDTable::decode):
3506         (JSC::StructureIDTable::encode):
3507         (JSC::StructureIDTable::get):
3508         (JSC::StructureIDTable::isValid):
3509
3510 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3511
3512         [JSC] Revert r226885 to make SlotVisitor creation lazy
3513         https://bugs.webkit.org/show_bug.cgi?id=195013
3514
3515         Reviewed by Saam Barati.
3516
3517         We once changed SlotVisitor creation apriori to drop the lock. Also, it turns out that SlotVisitor is memory-consuming.
3518         We should defer SlotVisitor creation until it is actually required. This patch reverts r226885. Even with this patch,
3519         we still hold many SlotVisitors after we execute many parallel markers at least once. But recovering the feature of
3520         dynamically allocating SlotVisitors helps further memory optimizations in this area.
3521
3522         * heap/Heap.cpp:
3523         (JSC::Heap::Heap):
3524         (JSC::Heap::runBeginPhase):
3525         * heap/Heap.h:
3526         * heap/HeapInlines.h:
3527         (JSC::Heap::forEachSlotVisitor):
3528         (JSC::Heap::numberOfSlotVisitors):
3529         * heap/MarkingConstraintSolver.cpp:
3530         (JSC::MarkingConstraintSolver::didVisitSomething const):
3531         * heap/SlotVisitor.h:
3532
3533 2019-02-25  Saam Barati  <sbarati@apple.com>
3534
3535         testb3 and testair should test O0/O1/O2
3536         https://bugs.webkit.org/show_bug.cgi?id=194637
3537
3538         Reviewed by Mark Lam.
3539
3540         This patch makes it so that we run all tests in testair and testb3
3541         in O0, O1, and O2. However, some tests are invalid for O0 and O1.
3542         This patch makes it so we only run those tests in O2. These are
3543         often tests that assert certain optimizations have occurred. There
3544         are also a class of tests that rely on using patchpoints to stress 
3545         the register allocator into only a single valid allocation. The
3546         O0, and sometimes O1, register allocators are not always good enough
3547         to allocate such programs. To make these valid allocators to use, we rely
3548         on the FTL and Wasm to not emit such patchpoints.
3549
3550         * b3/air/testair.cpp:
3551         (main):
3552         * b3/testb3.cpp:
3553         (JSC::B3::compileProc):
3554         (JSC::B3::testAddLoadTwice):
3555         (JSC::B3::testMulLoadTwice):
3556         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
3557         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
3558         (JSC::B3::testPatchpointWithEarlyClobber):
3559         (JSC::B3::testSimpleCheck):
3560         (JSC::B3::testCheckFalse):
3561         (JSC::B3::testCheckTrue):
3562         (JSC::B3::testCheckLessThan):
3563         (JSC::B3::testCheckMegaCombo):
3564         (JSC::B3::testCheckTrickyMegaCombo):
3565         (JSC::B3::testCheckTwoMegaCombos):
3566         (JSC::B3::testCheckTwoNonRedundantMegaCombos):
3567         (JSC::B3::testCheckAddImm):
3568         (JSC::B3::testCheckAddImmCommute):
3569         (JSC::B3::testCheckAddImmSomeRegister):
3570         (JSC::B3::testCheckAdd):
3571         (JSC::B3::testCheckAdd64):
3572         (JSC::B3::testCheckAddFold):
3573         (JSC::B3::testCheckAddFoldFail):
3574         (JSC::B3::testCheckAddSelfOverflow64):
3575         (JSC::B3::testCheckAddSelfOverflow32):
3576         (JSC::B3::testCheckSubImm):
3577         (JSC::B3::testCheckSubBadImm):
3578         (JSC::B3::testCheckSub):
3579         (JSC::B3::testCheckSub64):
3580         (JSC::B3::testCheckSubFold):
3581         (JSC::B3::testCheckSubFoldFail):
3582         (JSC::B3::testCheckNeg):
3583         (JSC::B3::testCheckNeg64):
3584         (JSC::B3::testCheckMul):
3585         (JSC::B3::testCheckMulMemory):
3586         (JSC::B3::testCheckMul2):
3587         (JSC::B3::testCheckMul64):
3588         (JSC::B3::testCheckMulFold):
3589         (JSC::B3::testCheckMulFoldFail):
3590         (JSC::B3::testCheckMul64SShr):
3591         (JSC::B3::testLinearScanWithCalleeOnStack):
3592         (JSC::B3::testCheckSelect):
3593         (JSC::B3::testCheckSelectCheckSelect):
3594         (JSC::B3::testCheckSelectAndCSE):
3595         (JSC::B3::testLateRegister):
3596         (JSC::B3::testReduceStrengthCheckBottomUseInAnotherBlock):
3597         (JSC::B3::testSomeEarlyRegister):
3598         (JSC::B3::testTerminalPatchpointThatNeedsToBeSpilled2):
3599         (JSC::B3::testPinRegisters):
3600         (JSC::B3::testX86LeaAddAddShlLeft):
3601         (JSC::B3::testX86LeaAddAddShlRight):
3602         (JSC::B3::testX86LeaAddAdd):
3603         (JSC::B3::testX86LeaAddShlRight):
3604         (JSC::B3::testX86LeaAddShlLeftScale1):
3605         (JSC::B3::testX86LeaAddShlLeftScale2):
3606         (JSC::B3::testX86LeaAddShlLeftScale4):
3607         (JSC::B3::testX86LeaAddShlLeftScale8):
3608         (JSC::B3::testLoadBaseIndexShift2):
3609         (JSC::B3::testOptimizeMaterialization):
3610         (JSC::B3::testLICMPure):
3611         (JSC::B3::testLICMPureSideExits):
3612         (JSC::B3::testLICMPureWritesPinned):
3613         (JSC::B3::testLICMPureWrites):
3614         (JSC::B3::testLICMReadsPinned):
3615         (JSC::B3::testLICMReads):
3616         (JSC::B3::testLICMPureNotBackwardsDominant):
3617         (JSC::B3::testLICMPureNotBackwardsDominantFoiledByChild):
3618         (JSC::B3::testLICMControlDependent):
3619         (JSC::B3::testLICMControlDependentNotBackwardsDominant):
3620         (JSC::B3::testLICMReadsWritesDifferentHeaps):
3621         (JSC::B3::testWasmBoundsCheck):
3622         (JSC::B3::run):
3623         (main):
3624
3625 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3626
3627         [JSC] stress/function-constructor-reading-from-global-lexical-environment.js fails in 32bit arch
3628         https://bugs.webkit.org/show_bug.cgi?id=195030
3629         <rdar://problem/48385088>
3630
3631         Reviewed by Saam Barati.
3632
3633         While LLInt64 has checkTDZInGlobalPutToScopeIfNecessary for op_put_to_scope GlobalLexicalVar to check the value in the variable slot is not empty,
3634         this check is missing in LLInt32_64. Previously, this check was subsumed accidentally by the WatchpointSet check in GlobalLexicalVar in `notifyWrite`:
3635         because no "put" attempt succeeds here, the status WatchpointSet was ClearWatchpoint, we always go to the slow path, and we always throw the TDZ error
3636         before configuring the WatchpointSet in the slow path. But after r241862, WatchpointSet is not used under non-JIT configuration. This skips WatchpointSet
3637         check and LLInt32_64 starts failing tests because of lack of checkTDZInGlobalPutToScopeIfNecessary. This patch adds checkTDZInGlobalPutToScopeIfNecessary
3638         in LLInt32_64 too. This patch fixes the following four failing tests.
3639
3640             stress/function-constructor-reading-from-global-lexical-environment.js.bytecode-cache
3641             stress/function-constructor-reading-from-global-lexical-environment.js.default
3642             stress/global-lexical-variable-tdz.js.bytecode-cache
3643             stress/global-lexical-variable-tdz.js.default
3644
3645         * llint/LowLevelInterpreter32_64.asm:
3646
3647 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3648
3649         [JSC] Make Intl fields lazily-allocated
3650         https://bugs.webkit.org/show_bug.cgi?id=195022
3651
3652         Reviewed by Mark Lam.
3653
3654         This patch makes the following memory footprint optimization in IntlObject.
3655
3656         1. Make IntlObject fields including Intl.Collator lazily-allocated because we already removed direct references from JS builtins to these constructors (@Collator etc.).
3657
3658         2. Move LazyProperty<IntlObject, Structure> structures from IntlObject to JSGlobalObject. This makes sizeof(IntlObject) the same to the other ones of usual runtime Objects,
3659            and drop one MarkedBlock.
3660
3661         * runtime/IntlCollatorConstructor.h:
3662         * runtime/IntlDateTimeFormatConstructor.h:
3663         * runtime/IntlNumberFormatConstructor.h:
3664         * runtime/IntlObject.cpp:
3665         (JSC::createCollatorConstructor):
3666         (JSC::createNumberFormatConstructor):
3667         (JSC::createDateTimeFormatConstructor):
3668         (JSC::createPluralRulesConstructor):
3669         (JSC::IntlObject::finishCreation):
3670         (JSC::IntlObject::visitChildren): Deleted.
3671         * runtime/IntlObject.h:
3672         * runtime/IntlPluralRulesConstructor.h:
3673         * runtime/JSGlobalObject.cpp:
3674         (JSC::JSGlobalObject::init):
3675         (JSC::JSGlobalObject::visitChildren):
3676         (JSC::JSGlobalObject::defaultCollator):
3677         * runtime/JSGlobalObject.h:
3678         (JSC::JSGlobalObject::collatorStructure):
3679         (JSC::JSGlobalObject::numberFormatStructure):
3680         (JSC::JSGlobalObject::dateTimeFormatStructure):
3681         (JSC::JSGlobalObject::pluralRulesStructure):
3682         (JSC::JSGlobalObject::intlObject const): Deleted.
3683         * runtime/JSGlobalObjectFunctions.cpp:
3684         (JSC::globalFuncDateTimeFormat):
3685         * runtime/NumberPrototype.cpp:
3686         (JSC::numberProtoFuncToLocaleString):
3687         * runtime/StringPrototype.cpp:
3688         (JSC::stringProtoFuncLocaleCompare):
3689
3690 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
3691
3692         Avoid hashing CompactVariableEnvironment when decoding CompactVariableMap::Handle
3693         https://bugs.webkit.org/show_bug.cgi?id=194937
3694
3695         Reviewed by Saam Barati.
3696
3697         Hashing the CompactVariableEnvironment is expensive and we could avoid it
3698         when decoding multiple handles to the same environment. This is sound because
3699         a pointer to the same CompactVariableEnvironment will hash the same.
3700
3701         * runtime/CachedTypes.cpp:
3702         (JSC::Decoder::handleForEnvironment const):
3703         (JSC::Decoder::setHandleForEnvironment):
3704         (JSC::CachedCompactVariableMapHandle::decode const):
3705
3706 2019-02-25  Tadeu Zagallo  <tzagallo@apple.com>
3707
3708         Remove unnecessary WTF:: prefixes in CachedTypes
3709         https://bugs.webkit.org/show_bug.cgi?id=194936
3710
3711         Reviewed by Saam Barati.
3712
3713         Cleanup unnecessary prefixes from Optional, roundUpToMultipleOf and
3714         pageSize.
3715
3716         * runtime/CachedTypes.cpp:
3717         (JSC::Encoder::cachedOffsetForPtr):
3718         (JSC::Encoder::Page::malloc):
3719         (JSC::Encoder::allocateNewPage):
3720         (JSC::CachedPtr::encode):
3721         (JSC::CachedPtr::decode const):
3722         (JSC::CachedOptional::encode):
3723         (JSC::CachedOptional::decode const):
3724
3725 2019-02-25  Yusuke Suzuki  <ysuzuki@apple.com>
3726
3727         [JSC] Drop direct references to Intl constructors by rewriting Intl JS builtins in C++
3728         https://bugs.webkit.org/show_bug.cgi?id=194976
3729
3730         Reviewed by Michael Saboff.
3731
3732         This patch paves the way to making IntlObject allocation lazy by removing direct references
3733         to Intl constructors (Intl.Collator etc.) from builtin JS. To achieve that,
3734
3735         1. We implement String.prototype.toLocaleCompare and Number.prototype.toLocaleString in C++
3736            instead of JS builtins. Since these functions end up calling ICU C++ runtime, writing them in
3737            JS does not offer performance improvement.
3738
3739         2. We remove @DateTimeFormat constructor reference, and instead, exposing @dateTimeFormat function,
3740            which returns formatted string directly. We still have JS builtins for DateTimeFormat things
3741            because the initialization of its "options" JSObject involves many get_by_id / put_by_id things,
3742            which are efficient in JS. But we avoid exposing @DateTimeFormat directly, so that Intl constructors
3743            can be lazily allocated.
3744
3745         * CMakeLists.txt:
3746         * DerivedSources-input.xcfilelist:
3747         * DerivedSources.make:
3748         * JavaScriptCore.xcodeproj/project.pbxproj:
3749         * builtins/BuiltinNames.h:
3750         * builtins/DatePrototype.js:
3751         (toLocaleString):
3752         (toLocaleDateString):
3753         (toLocaleTimeString):
3754         * builtins/NumberPrototype.js: Removed.
3755         * builtins/StringPrototype.js:
3756         (intrinsic.StringPrototypeReplaceIntrinsic.replace):
3757         (globalPrivate.getDefaultCollator): Deleted.
3758         * runtime/JSGlobalObject.cpp:
3759         (JSC::JSGlobalObject::init):
3760         (JSC::JSGlobalObject::visitChildren):
3761         (JSC::JSGlobalObject::defaultCollator):
3762         * runtime/JSGlobalObject.h:
3763         * runtime/JSGlobalObjectFunctions.cpp:
3764         (JSC::globalFuncDateTimeFormat):
3765         * runtime/JSGlobalObjectFunctions.h:
3766         * runtime/NumberPrototype.cpp:
3767         (JSC::NumberPrototype::finishCreation):
3768         (JSC::throwVMToThisNumberError):
3769         (JSC::numberProtoFuncToExponential):
3770         (JSC::numberProtoFuncToFixed):
3771         (JSC::numberProtoFuncToPrecision):
3772         (JSC::numberProtoFuncToString):
3773         (JSC::numberProtoFuncToLocaleString):
3774         (JSC::numberProtoFuncValueOf):
3775         * runtime/StringPrototype.cpp:
3776         (JSC::StringPrototype::finishCreation):
3777         (JSC::stringProtoFuncLocaleCompare):
3778
3779 2019-02-24  Devin Rousso  <drousso@apple.com>
3780
3781         Web Inspector: Change the InspectorOverlay to use native rather than canvas
3782         https://bugs.webkit.org/show_bug.cgi?id=105023
3783         <rdar://problem/13443692>
3784
3785         Reviewed by Brian Burg.
3786
3787         * inspector/protocol/OverlayTypes.json: Removed.
3788         Now that the overlay is entirely generated in C++, we no longer need the special prototol
3789         types for transferring data to a JavaScript context.
3790
3791         * inspector/protocol/Debugger.json:
3792         * inspector/agents/InspectorDebuggerAgent.h:
3793         * inspector/agents/InspectorDebuggerAgent.cpp:
3794         (Inspector::InspectorDebuggerAgent::setOverlayMessage): Deleted.
3795         Remove `Debugger.setOverlayMessage` command as it hasn't been used and is no longer supported.
3796
3797         * CMakeLists.txt:
3798         * DerivedSources-input.xcfilelist:
3799         * DerivedSources.make:
3800
3801 2019-02-24  Yusuke Suzuki  <ysuzuki@apple.com>
3802
3803         [JSC] Lazily create sentinel Map and Set buckets
3804         https://bugs.webkit.org/show_bug.cgi?id=194975
3805
3806         Reviewed by Saam Barati.
3807
3808         If VM::canUseJIT() returns false, we can lazily initialize sentinel Map and Set buckets.
3809         This patch adds getters to VM which lazily allocate these buckets. We eagerly initialize
3810         them if VM::canUseJIT() returns true since they can be touched from DFG and FTL.
3811
3812         * bytecode/BytecodeIntrinsicRegistry.cpp:
3813         (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
3814         (JSC::BytecodeIntrinsicRegistry::sentinelMapBucketValue):
3815         (JSC::BytecodeIntrinsicRegistry::sentinelSetBucketValue):
3816         * bytecode/BytecodeIntrinsicRegistry.h:
3817         * dfg/DFGByteCodeParser.cpp:
3818         (JSC::DFG::ByteCodeParser::handleIntrinsicCall):
3819         * dfg/DFGOperations.cpp:
3820         * dfg/DFGSpeculativeJIT.cpp:
3821         (JSC::DFG::SpeculativeJIT::compileGetMapBucketNext):
3822         * dfg/DFGSpeculativeJIT64.cpp:
3823         (JSC::DFG::SpeculativeJIT::compile):
3824         * ftl/FTLLowerDFGToB3.cpp:
3825         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucket):
3826         (JSC::FTL::DFG::LowerDFGToB3::compileGetMapBucketNext):
3827         * runtime/MapConstructor.cpp:
3828         (JSC::mapPrivateFuncMapBucketNext):
3829         * runtime/SetConstructor.cpp:
3830         (JSC::setPrivateFuncSetBucketNext):
3831         * runtime/VM.cpp:
3832         (JSC::VM::VM):
3833         (JSC::VM::sentinelSetBucketSlow):
3834         (JSC::VM::sentinelMapBucketSlow):
3835         * runtime/VM.h:
3836         (JSC::VM::sentinelSetBucket):
3837         (JSC::VM::sentinelMapBucket):
3838
3839 2019-02-20  Darin Adler  <darin@apple.com>
3840
3841         Finish removing String::format
3842         https://bugs.webkit.org/show_bug.cgi?id=194893
3843
3844         Reviewed by Daniel Bates.
3845
3846         * bytecode/CodeBlock.cpp:
3847         (JSC::CodeBlock::nameForRegister): Use makeString instead of String::format,
3848         using the new "pad" function.
3849
3850 2019-02-23  Robin Morisset  <rmorisset@apple.com>
3851
3852         Remove dead code: AdjacencyList::justOneChild()
3853         https://bugs.webkit.org/show_bug.cgi?id=194965
3854
3855         Reviewed by Sam Weinig.
3856
3857         * dfg/DFGAdjacencyList.h:
3858         (JSC::DFG::AdjacencyList::justOneChild const): Deleted.